雷鋒網 AI科技評論按:本文作者何之源 ,原文載于知乎專欄AI Insight ,雷鋒網獲其授權發布。
CycleGAN是在今年三月底放在arxiv(地址:https://arxiv.org/abs/1703.10593 )的一篇文章,文章名為Learning to Discover Cross-Domain Relations with Generative Adversarial Networks ,同一時期還有兩篇非常類似的DualGAN (地址:https://arxiv.org/abs/1704.02510)和DiscoGAN (地址:https://arxiv.org/abs/1703.05192),簡單來說,它們的功能就是:自動將某一類圖片轉換成另外一類圖片。
作者在論文中也舉了一些例子,比如將普通的馬和斑馬進行互相轉換,將蘋果和橘子進行互相轉換:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/2d01528ee42c49b2d283031d713ba147.jpg" data-rawwidth="1953" data-rawheight="1415" class="origin_image zh-lightbox-thumb" width="1953" data-original="https://pic2.zhimg.com/v2-fb0d72ed12b81aad165ddc5aa8897479_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/2d01528ee42c49b2d283031d713ba147.jpg"/>
把照片轉換成油畫風格:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/bbc4e236e087e661bb8ce483dc3cf7e8.jpg" data-rawwidth="1655" data-rawheight="980" class="origin_image zh-lightbox-thumb" width="1655" data-original="https://pic3.zhimg.com/v2-4d78b4c2906f526aa7b9a53db19fd01e_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/bbc4e236e087e661bb8ce483dc3cf7e8.jpg"/>将油画中的场景还原成现实中的照片: 將油畫中的場景還原成現實中的照片:
由于CycleGAN這個框架具有較強的通用性,因此一經發表就吸引了大量注意,很快,腦洞大開的網友想出了各種各樣神奇的應用。
比如將貓變成狗:
讓圖片中的人露出笑容:<img src="https://static.leiphone.com/uploads/new/article/pic/201709/c214affdc09e8ea8b5e8f8822d1ad99e.jpg" data-rawwidth="1280" data-rawheight="670" class="origin_image zh-lightbox-thumb" width="1280" data-original="https://pic3.zhimg.com/v2-10d935280918fb198b19aacaa5b98896_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/c214affdc09e8ea8b5e8f8822d1ad99e.jpg"/>
國外網友Jack Clark 還搜集了巴比倫、耶路撒冷以及倫敦的古代地圖,利用CycleGAN將它們還原成了真實衛星圖像:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/fd77f9fdbf467194b4e6b5e13c8a48df.png" data-rawwidth="835" data-rawheight="559" class="origin_image zh-lightbox-thumb" width="835" data-original="https://pic1.zhimg.com/v2-c458d4979bf89b1ef0078958d046ee3c_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/fd77f9fdbf467194b4e6b5e13c8a48df.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/6a00094d25cae7976cc8642dcbe6aeca.png" data-rawwidth="841" data-rawheight="420" class="origin_image zh-lightbox-thumb" width="841" data-original="https://pic4.zhimg.com/v2-1ec0e2acd756d3f689269aec6ad596c3_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/6a00094d25cae7976cc8642dcbe6aeca.png"/>
還有人使用CycleGAN將人臉轉換成娃娃:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/725180e4988053b95e700747cb86883d.png" data-rawwidth="704" data-rawheight="525" class="origin_image zh-lightbox-thumb" width="704" data-original="https://pic2.zhimg.com/v2-f4e2a3c290ff32e8f6f577157288cbc9_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/725180e4988053b95e700747cb86883d.png"/>
將男人變成女人:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/4b5aaac44b4ecfc4cc5780146dc5590a.png" data-rawwidth="641" data-rawheight="648" class="origin_image zh-lightbox-thumb" width="641" data-original="https://pic4.zhimg.com/v2-5c32c81bac522a4de1022d39afe9783b_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/4b5aaac44b4ecfc4cc5780146dc5590a.png"/>
把你自己變成一個“肌肉文身猛男”也是可以的:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/6d43a79cbac5df039e3c10fe6b8b259b.jpg" data-rawwidth="529" data-rawheight="514" class="origin_image zh-lightbox-thumb" width="529" data-original="https://pic3.zhimg.com/v2-a44dd6937d766f23408ed7a930a46cea_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/6d43a79cbac5df039e3c10fe6b8b259b.jpg"/>
如果說這些應用多少可以理解,那么下面的應用就有點“匪夷所思”了:你可以想象將人和拉面做轉換嗎? 日本網友加藤卓哉(Takuya Kato)就訓練了這樣一個模型,它可以從拉面中生成人像,此外將人臉變成拉面的圖片。鑒于生成的結果比較鬼畜,如果有興趣的可以點擊這個鏈接 (地址:https://junyanz.github.io/CycleGAN/images/faces_and_ramens.jpg)觀看生成結果。
此外,知乎上的 @達聞西 還用CycleGAN訓練了可以脫掉女優衣服的模型(可以參考提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服 ),其腦洞之大,實在是讓人驚嘆了一番。
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/4d629dccef1a54ccd7941a0b5c4baa2e.jpg" data-rawwidth="768" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="768" data-original="https://pic2.zhimg.com/v2-da6e908fbff06e8e14c60d86d776d225_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/4d629dccef1a54ccd7941a0b5c4baa2e.jpg"/>
今天這篇文章主要分成三個部分:
CycleGAN的原理 我們之前已經說過,CycleGAN的原理可以概述為:將一類圖片轉換成另一類圖片 。也就是說,現在有兩個樣本空間,X和Y,我們希望把X空間中的樣本轉換成Y空間中的樣本。
因此,實際的目標就是學習從X到Y的映射。我們設這個映射為F。它就對應著GAN中的生成器,F可以將X中的圖片x轉換為Y中的圖片F(x)。對于生成的圖片,我們還需要GAN中的判別器來判別它是否為真實圖片,由此構成對抗生成網絡。設這個判別器為 。這樣的話,根據這里的生成器和判別器,我們就可以構造一個GAN損失,表達式為:
這個損失實際上和原始的GAN損失是一模一樣的,如果這一步不是很理解的可以參考我之前的一篇專欄:GAN學習指南:從原理入門到制作生成Demo 。
但單純的使用這一個損失是無法進行訓練的。原因在于,映射F完全可以將所有x都映射為Y空間中的同一張圖片,使損失無效化。對此,作者又提出了所謂的“循環一致性損失”(cycle consistency loss)。
我們再假設一個映射G,它可以將Y空間中的圖片y轉換為X中的圖片G(y)。CycleGAN同時學習F和G兩個映射,并要求 ,以及 。也就是說,將X的圖片轉換到Y空間后,應該還可以轉換回來。這樣就杜絕模型把所有X的圖片都轉換為Y空間中的同一張圖片了。根據 和 ,循環一致性損失就定義為:
同時,我們為G也引入一個判別器 ,由此可以同樣定義一個GAN的損失 ,最終的損失就由三部分組成:
CycleGAN與DCGAN的對比 為了進一步搞清楚CycleGAN的原理,我們可以拿它和其他幾個GAN模型,如DCGAN、pix2pix模型進行對比。
先來看下DCGAN,它的整體框架和最原始的那篇GAN是一模一樣的,在這個框架下,輸入是一個噪聲z,輸出是一張圖片(如下圖),因此,我們實際只能隨機生成圖片,沒有辦法控制輸出圖片的樣子,更不用說像CycleGAN一樣做圖片變換了。
CycleGAN與pix2pix模型的對比 pix2pix也可以做圖像變換,它和CycleGAN的區別在于,pix2pix模型必須要求成對數據(paired data),而CycleGAN利用非成對數據也能進行訓練(unpaired data)。
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/0f75114663971b03f937286d9e5c9435.png" data-rawwidth="693" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="693" data-original="https://pic3.zhimg.com/v2-d3e41b467e76891d763f7d9a15aa260a_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/0f75114663971b03f937286d9e5c9435.png"/>
比如,我們希望訓練一個將白天的照片轉換為夜晚的模型。如果使用pix2pix模型,那么我們必須在搜集大量地點在白天和夜晚的兩張對應圖片,而使用CycleGAN只需同時搜集白天的圖片和夜晚的圖片,不必滿足對應關系。因此CycleGAN的用途要比pix2pix更廣泛,利用CycleGAN就可以做出更多有趣的應用。
在TensorFlow中實驗CycleGAN 最后來講一講如何在TensorFlow中實驗CycleGAN,打開全球最大的同性交友網站Github ,我們可以發現CycleGAN在TensorFlow中已經有很多輪子了,我使用的代碼是:vanhuyz/CycleGAN-TensorFlow (地址:https://github.com/vanhuyz/CycleGAN-TensorFlow)。
利用這個代碼,我訓練了一個從男性和女性圖片互換的模型,比如將男人轉換成女人(左側為原圖,右側為模型自動生成的圖片):
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/512c9c3892133866751834ae4cc1c01a.png" data-rawwidth="652" data-rawheight="643" class="origin_image zh-lightbox-thumb" width="652" data-original="https://pic3.zhimg.com/v2-dace98659b3f39eedd7b574d51fd4426_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/512c9c3892133866751834ae4cc1c01a.png"/>
還可以將女性轉換成男性:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/ee62d097bcc8003abee1d774d1a18130.png" data-rawwidth="636" data-rawheight="645" class="origin_image zh-lightbox-thumb" width="636" data-original="https://pic3.zhimg.com/v2-0828b25a2ea4c82d4ce7b5f47adebb6a_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/ee62d097bcc8003abee1d774d1a18130.png"/>
為了訓練這么一個模型,我們需要分別準備好男性的圖片和女性的圖片。在實踐中,我使用了CelebA數據集,分別取出其中男性和女性的圖片并統一縮放到256x256的大小,然后存入兩個文件夾中:
<img src="https://static.leiphone.com/uploads/new/article/pic/201709/ffbaef3cb0fcfce7fc852ba3bc04fcc2.jpg" data-rawwidth="407" data-rawheight="199" class="content_image" width="407" _src="https://static.leiphone.com/uploads/new/article/pic/201709/ffbaef3cb0fcfce7fc852ba3bc04fcc2.jpg"/>
如果你對這個實驗有興趣,可以直接在地址https://pan.baidu.com/s/1i5qY3yt 下載到我使用的數據集。當然,也可以使用自己的數據,只需要將它們存為jpg格式并統一縮放到256x256的大小就可以了。接下來的步驟為:
1. 下載項目代碼
git clone https://github.com/vanhuyz/CycleGAN-TensorFlow.git
2. 將圖片轉換成tfrecords格式
這個項目中提供了一個build_data腳本,用于將圖片轉換成tfrecords形式。假設我們的圖片存放在~/datasets/man2woman/a_resized/和 ~/datasets/man2woman/b_resized目錄下,對應的命令就是:
python build_data.py \ --X_input_dir ~/datasets/man2woman/a_resized/ \ --Y_input_dir ~/datasets/man2woman/b_resized/ \ --X_output_file ~/datasets/man2woman/man.tfrecords \ --Y_output_file ~/datasets/man2woman/woman.tfrecords
3. 訓練
訓練的命令為:
python train.py \ --X ~/datasets/man2woman/man.tfrecords \ --Y ~/datasets/man2woman/woman.tfrecords \ --image_size 256
訓練的過程比較漫長,此時可以打開TensorBoard來觀察訓練情況(運行這個命令時需要將“20170715-1622”改成機器中對應的文件夾,下同):
tensorboard --logdir checkpoints/20170715-1622
4. 導出模型并執行單張圖片
導出模型的方法為:
python export_graph.py \ --checkpoint_dir checkpoints/20170715-1622 \ --XtoY_model man2woman.pb \ --YtoX_model woman2man.pb \ --image_size 256
對單張圖片進行轉換(將data/test.jpg替換為對應的輸入圖片地址):
python inference.py \ --model pretrained/man2woman.pb \ --input data/test.jpg \ --output data/output.jpg \ --image_size 256
總結 因為CycleGAN只需要兩類圖片就可以訓練出一個模型,所以它的應用十分廣泛,個人感覺是近期最好玩的一個深度學習模型。這篇文章介紹了CycleGAN的一些有趣的應用、Cycle的原理以及和其他模型的對比,最后加了一個TensorFlow中的CycleGAN小實驗,希望大家喜歡~
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知 。