天天看點

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

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),簡單來說,它們的功能就是:自動将某一類圖檔轉換成另外一類圖檔。

作者在論文中也舉了一些例子,比如将普通的馬和斑馬進行互相轉換,将蘋果和橘子進行互相轉換:

把照片轉換成油畫風格:

将油畫中的場景還原成現實中的照片:

由于CycleGAN這個架構具有較強的通用性,是以一經發表就吸引了大量注意,很快,腦洞大開的網友想出了各種各樣神奇的應用。

比如将貓變成狗:

讓圖檔中的人露出笑容:

國外網友Jack Clark還搜集了巴比倫、耶路撒冷以及倫敦的古代地圖,利用CycleGAN将它們還原成了真實衛星圖像:

還有人使用CycleGAN将人臉轉換成娃娃:

将男人變成女人:

把你自己變成一個“肌肉文身猛男”也是可以的:

如果說這些應用多少可以了解,那麼下面的應用就有點“匪夷所思”了:你可以想象将人和拉面做轉換嗎?日本網友加藤卓哉(Takuya Kato)就訓練了這樣一個模型,它可以從拉面中生成人像,此外将人臉變成拉面的圖檔。鑒于生成的結果比較鬼畜,如果有興趣的可以點選這個連結(位址:https://junyanz.github.io/CycleGAN/images/faces_and_ramens.jpg)觀看生成結果。

此外,知乎上的 @達聞西 還用CycleGAN訓練了可以脫掉女優衣服的模型(可以參考提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服),其腦洞之大,實在是讓人驚歎了一番。

今天這篇文章主要分成三個部分:

CycleGAN的原了解析

CycleGAN與原始的GAN、DCGAN、pix2pix模型的對比

如何在TensorFlow中用CycleGAN訓練模型

我們之前已經說過,CycleGAN的原理可以概述為:将一類圖檔轉換成另一類圖檔。也就是說,現在有兩個樣本空間,X和Y,我們希望把X空間中的樣本轉換成Y空間中的樣本。

是以,實際的目标就是學習從X到Y的映射。我們設這個映射為F。它就對應着GAN中的生成器,F可以将X中的圖檔x轉換為Y中的圖檔F(x)。對于生成的圖檔,我們還需要GAN中的判别器來判别它是否為真實圖檔,由此構成對抗生成網絡。設這個判别器為 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

 。這樣的話,根據這裡的生成器和判别器,我們就可以構造一個GAN損失,表達式為:

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

這個損失實際上和原始的GAN損失是一模一樣的,如果這一步不是很了解的可以參考我之前的一篇專欄:GAN學習指南:從原理入門到制作生成Demo。

但單純的使用這一個損失是無法進行訓練的。原因在于,映射F完全可以将所有x都映射為Y空間中的同一張圖檔,使損失無效化。對此,作者又提出了所謂的“循環一緻性損失”(cycle consistency loss)。

我們再假設一個映射G,它可以将Y空間中的圖檔y轉換為X中的圖檔G(y)。CycleGAN同時學習F和G兩個映射,并要求 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

 ,以及 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

  。也就是說,将X的圖檔轉換到Y空間後,應該還可以轉換回來。這樣就杜絕模型把所有X的圖檔都轉換為Y空間中的同一張圖檔了。根據 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

 和 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

 ,循環一緻性損失就定義為:

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

同時,我們為G也引入一個判别器 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

 ,由此可以同樣定義一個GAN的損失 

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

 ,最終的損失就由三部分組成:

可能是近期最好玩的深度學習模型:CycleGAN的原理與實驗詳解

為了進一步搞清楚CycleGAN的原理,我們可以拿它和其他幾個GAN模型,如DCGAN、pix2pix模型進行對比。

先來看下DCGAN,它的整體架構和最原始的那篇GAN是一模一樣的,在這個架構下,輸入是一個噪聲z,輸出是一張圖檔(如下圖),是以,我們實際隻能随機生成圖檔,沒有辦法控制輸出圖檔的樣子,更不用說像CycleGAN一樣做圖檔變換了。

pix2pix也可以做圖像變換,它和CycleGAN的差別在于,pix2pix模型必須要求成對資料(paired data),而CycleGAN利用非成對資料也能進行訓練(unpaired data)。

比如,我們希望訓練一個将白天的照片轉換為夜晚的模型。如果使用pix2pix模型,那麼我們必須在搜集大量地點在白天和夜晚的兩張對應圖檔,而使用CycleGAN隻需同時搜集白天的圖檔和夜晚的圖檔,不必滿足對應關系。是以CycleGAN的用途要比pix2pix更廣泛,利用CycleGAN就可以做出更多有趣的應用。

最後來講一講如何在TensorFlow中實驗CycleGAN,打開全球最大的同性交友網站Github,我們可以發現CycleGAN在TensorFlow中已經有很多輪子了,我使用的代碼是:vanhuyz/CycleGAN-TensorFlow(位址:https://github.com/vanhuyz/CycleGAN-TensorFlow)。

利用這個代碼,我訓練了一個從男性和女性圖檔互換的模型,比如将男人轉換成女人(左側為原圖,右側為模型自動生成的圖檔):

還可以将女性轉換成男性:

為了訓練這麼一個模型,我們需要分别準備好男性的圖檔和女性的圖檔。在實踐中,我使用了CelebA資料集,分别取出其中男性和女性的圖檔并統一縮放到256x256的大小,然後存入兩個檔案夾中:

如果你對這個實驗有興趣,可以直接在位址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  \

對單張圖檔進行轉換(将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小實驗,希望大家喜歡~

本文作者:Non