天天看點

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

本文來自AI新媒體量子位(QbitAI)

作為一名久經片場的老司機,早就想寫一些探讨駕駛技術的文章。這篇就介紹利用生成式對抗網絡(GAN)的兩個基本駕駛技能:

1) 去除(愛情)動作片中的馬賽克

2) 給(愛情)動作片中的女孩穿(tuo)衣服

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

我在文章《用GAN生成二維樣本的小例子》中已經簡單介紹了GAN,這篇再簡要回顧一下生成式模型,算是補全一個來龍去脈。

《用GAN生成二維樣本的小例子》位址:

https://zhuanlan.zhihu.com/p/27343585

生成模型就是能夠産生指定分布資料的模型,常見的生成式模型一般都會有一個用于産生樣本的簡單分布。例如一個均勻分布,根據要生成分布的機率密度函數,進行模組化,讓均勻分布中的樣本經過變換得到指定分布的樣本,這就可以算是最簡單的生成式模型。比如下面例子:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

圖中左邊是一個自定義的機率密度函數,右邊是相應的1w個樣本的直方圖,自定義分布和生成這些樣本的代碼如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

對于一些簡單的情況,我們會假設已知有模型可以很好的對分布進行模組化,缺少的隻是合适的參數。這時候很自然隻要根據觀測到的樣本,學習參數讓目前觀測到的樣本下的似然函數最大,這就是最大似然估計(Maximum Likelihood Estimation):

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

MLE是一個最基本的思路,實踐中用得很多的還有KL散度(Kullback–Leibler divergence),假設真實分布是P,采樣分布是Q,則KL散度為:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

從公式也能看出來,KL散度描述的是兩個分布的差異程度。換個角度來看,讓産生的樣本和原始分布接近,也就是要讓這倆的差異減小,是以最小化KL散度就等同于MLE。從公式上來看的話,我們考慮把公式具體展開一下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

公式的第二項就是熵,先不管這項,用H(P)表示。接下來考慮一個小trick:從Q中抽樣n個樣本

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

,來估算P(x)的經驗值(empirical density function):

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

其中

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

是狄拉克

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

函數,把這項替換到上面公式的P(x):

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

因為是離散的采樣值,是以

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

中隻有

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

的時候狄拉克

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

函數才為1,是以考慮

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

時這項直接化為1:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

第一項正是似然的負對數形式。

說了些公式似乎跑得有點遠了,其實要表達還是那個簡單的意思:通過減小兩個分布的差異可以讓一個分布逼近另一個分布。仔細想想,這正是GAN裡面adversarial loss的做法。

很多情況下我們面臨的是更為複雜的分布,比如實際場景中更複雜的情況,比如生成不同人臉的圖像。這時候,作為具有universal approximation性質的神經網絡是一個看上去不錯的選擇[1]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

是以雖然GAN裡面同時包含了生成網絡和判别網絡,但本質來說GAN的目的還是生成模型。從生成式模型的角度,Ian Goodfellow總結過一個和神經網絡相關生成式方法的“家譜”[1]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

在這其中,當下最流行的就是GAN和Variational AutoEncoder(VAE),兩種方法的一個簡明示意如下[3]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

本篇不打算展開講什麼是VAE,不過通過這個圖,和名字中的autoencoder也大概能知道,VAE中生成的loss是基于重建誤差的。

而隻基于重建誤差的圖像生成,都或多或少會有圖像模糊的缺點,因為誤差通常都是針對全局。比如基于MSE(Mean Squared Error)的方法用來生成超分辨率圖像,容易出現下面的情況[4]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

在這個二維示意中,真實資料分布在一個U形的流形上,而MSE系的方法因為loss的形式往往會得到一個接近平均值所在的位置(藍色框)。

GAN在這方面則完爆其他方法,因為目标分布在流形上。是以隻要大概收斂了,就算生成的圖像都看不出是個啥,清晰度常常是有保證的,而這正是去除女優身上馬賽克的理想特性!

說了好些鋪墊,終于要進入正題了。首先明确,去馬賽克其實是個圖像超分辨率問題,也就是如何在低分辨率圖像基礎上得到更高分辨率的圖像:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

視訊中超分辨率實作的一個套路是通過不同幀的低分辨率畫面猜測超分辨率的畫面,有興趣了解這個思想的朋友可以參考我之前的一個知乎回答:如何通過多幀影像進行超分辨率重構? 

不過基于多幀影像的方法對于女優身上的馬賽克并不是很适用,是以這篇要講的是基于單幀圖像的超分辨率方法。

說到基于GAN的超分辨率的方法,就不能不提到SRGAN[4]:《Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network》。

這個工作的思路是:基于像素的MSE loss往往會得到大體正确,但是高頻成分模糊的結果。是以隻要重建低頻成分的圖像内容,然後靠GAN來補全高頻的細節内容,就可以了:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

這個思路其實和最早基于深度網絡的風格遷移的思路很像,其中重建内容的content loss是原始圖像和低分辨率圖像在VGG網絡中的各個ReLU層的激活值的差異:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

生成細節adversarial loss就是GAN用來判别是原始圖還是生成圖的loss:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

把這兩種loss放一起,取個名叫perceptual loss。訓練的網絡結構如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

正是上篇文章中講過的C-GAN,條件C就是低分辨率的圖檔。SRGAN生成的超分辨率圖像雖然PSNR等和原圖直接比較的傳統量化名額并不是最好,但就視覺效果,尤其是細節上,勝過其他方法很多。比如下面是作者對比bicubic插值和基于ResNet特征重建的超分辨率的結果:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

可以看到雖然很多細節都和原始圖檔不一樣,不過看上去很和諧,并且細節的豐富程度遠勝于SRResNet。這些栩栩如生的細節,可以看作是GAN根據學習到的分布資訊“聯想”出來的。

對于更看重“看上去好看”的超分辨率應用,SRGAN顯然是很合适的。當然對于一些更看重重建名額的應用,比如超分辨率恢複嫌疑犯面部細節,SRGAN就不可以了。

雖然專門用了一節講SRGAN,但本文用的方法其實是pix2pix[5]。這項工作剛在arxiv上釋出就引起了不小的關注,它巧妙的利用GAN的架構解決了通用的Image-to-Image translation的問題。

舉例來說,在不改變分辨率的情況下:把照片變成油畫風格;把白天的照片變成晚上;用色塊對圖檔進行分割或者倒過來;為黑白照片上色;…每個任務都有專門針對性的方法和相關研究,但其實總體來看,都是像素到像素的一種映射啊,其實可以看作是一個問題。

這篇文章的巧妙,就在于提出了pix2pix的方法,一個架構,解決所有這些問題。方法的示意圖如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

就是一個Conditional GAN,條件C是輸入的圖檔。除了直接用C-GAN,這項工作還有兩個改進:

1)利用U-Net結構生成細節更好的圖檔[6]

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

U-Net是德國Freiburg大學模式識别和圖像處理組提出的一種全卷積結構。和常見的先降采樣到低次元,再升采樣到原始分辨率的編解碼(Encoder-Decoder)結構的網絡相比,U-Net的差別是加入skip-connection,對應的feature maps和decode之後的同樣大小的feature maps按通道拼(concatenate)一起,用來保留不同分辨率下像素級的細節資訊。

U-Net對提升細節的效果非常明顯,下面是pix2pix文中給出的一個效果對比:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

可以看到,各種不同尺度的資訊都得到了很大程度的保留。

2)利用馬爾科夫性的判别器(PatchGAN)

pix2pix和SRGAN的一個異曲同工的地方是都有用重建解決低頻成分,用GAN解決高頻成分的想法。在pix2pix中,這個思想主要展現在兩個地方。一個是loss函數,加入了L1 loss用來讓生成的圖檔和訓練的目标圖檔盡量相似,而圖像中高頻的細節部分則交由GAN來處理:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

還有一個就是PatchGAN,也就是具體的GAN中用來判别是否生成圖的方法。PatchGAN的思想是,既然GAN隻負責處理低頻成分,那麼判别器就沒必要以一整張圖作為輸入,隻需要對NxN的一個圖像patch去進行判别就可以了。這也是為什麼叫Markovian discriminator,因為在patch以外的部分認為和本patch互相獨立。

具體實作的時候,作者使用的是一個NxN輸入的全卷積小網絡,最後一層每個像素過sigmoid輸出為真的機率,然後用BCEloss計算得到最終loss。

這樣做的好處是因為輸入的次元大大降低,是以參數量少,運算速度也比直接輸入一張快,并且可以計算任意大小的圖。

作者對比了不同大小patch的結果,對于256x256的輸入,patch大小在70x70的時候,從視覺上看結果就和直接把整張圖檔作為判别器輸入沒什麼差別了:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

利用pix2pix,隻要準備好無碼和相應的有碼圖檔就可以訓練去馬賽克的模型了,就是這麼簡單。那麼問題是,如何生成有馬賽克的圖檔?

有毅力的話,可以手動加馬賽克,這樣最為精準。這節介紹一個不那麼準,但是比随機強的方法:利用分類模型的激活區域進行自動馬賽克标注。

基本思想是利用一個可以識别需要打碼圖像的分類模型,提取出這個模型中對應類的CAM(Class Activation Map)[7],然後用馬賽克遮住響應最高的區域即可。

這裡簡單說一下什麼是CAM,對于最後一層是全局池化(平均或最大都可以)的CNN結構,池化後的feature map相當于是做了個權重相加來計算最終的每個類别進入softmax之前的激活值。

CAM的思路是,把這個權重在池化前的feature map上按像素權重相加,最後得到的單張的激活圖就可以攜帶激活目前類别的一些位置資訊,這相當于一種弱監督(classification→localization):

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

上圖是一個CAM的示意,用澳洲梗類别的CAM,放大到原圖大小,可以看到小狗所在的區域大緻是激活響應最高的區域。

那麼就缺一個可以識别XXX圖檔的模型了,網上還恰好就有個現成的,yahoo于2016年釋出的開源色情圖檔識别模型Open NSFW(Not Safe For Work):

https://github.com/yahoo/open_nsfw

CAM的實作并不難,結合Open NSFW自動打碼的代碼和使用放在了這裡:

http://t.cn/Rop9Ak6

(成功打碼的)效果差不多是下面這樣子:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

這沒什麼好說的了,一行代碼都不用改,隻需要按照前面的步驟把資料準備好,然後按照pix2pix官方的使用方法訓練就可以了:

https://github.com/phillipi/pix2pix

pyTorch版pix2pix(Cycle-GAN二合一版):

https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

從D盤裡随随便便找了幾千張圖檔,用來執行了一下自動打碼和pix2pix訓練(預設參數),效果是下面這樣:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

什麼?你問說好給女優去馬賽克呢?女優照片呢?

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

還是要說一下,在真人照片上的效果比蘑菇和花強。

去馬賽克已經講完了,接下來就是給女孩穿(tuo)衣服了,動手之前,還是先講一下鋪墊:對偶學習和Cycle-GAN。

對偶學習是MSRA于2016年提出的一種用于機器翻譯的增強學習方法[8],目的是解決海量資料配對标注的難題,個人覺得算是一種弱監督方法(不過看到大多數文獻算作無監督)。以機器翻譯為例,對偶學習基本思想如下圖[9]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

左邊的灰衣男隻懂英語,右邊的黑衣女隻懂中文,現在的任務就是,要學習如何翻譯英語到中文。對偶學習解決這個問題的思路是:給定一個模型

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

一上來無法知道f翻譯得是否正确,但是如果考慮上

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

的對偶問題

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

,那麼我可以嘗試翻譯一個英文句子到中文,再翻譯回來。

這種轉了一圈的結果

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

,灰衣男是可以用一個标準(BLEU)判斷x’和x是否一個意思,并且把結果的一緻性回報給這兩個模型進行改進。同樣的,從中文取個句子,這樣循環翻譯一遍,兩個模型又能從黑衣女那裡擷取回報并改進模型。

其實這就是強化學習的過程,每次翻譯就是一個action,每個action會從環境(灰衣男或黑衣女)中擷取reward,對模型進行改進,直至收斂。

也許有的人看到這裡會覺得和上世紀提出的Co-training很像,這個在知乎上也有讨論:

如何了解劉鐵岩老師團隊在NIPS 2016上提出的對偶學習(Dual Learning)?

https://www.zhihu.com/question/53777523

個人覺得還是不一樣的,Co-Training是一種multi-view方法,比如一個輸入x,如果看作是兩個拼一起的特征

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

,并且假設

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

互相獨立,那麼這時候訓練兩個分類器

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服
提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

對于任意樣本x應該有

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

。這對沒有标注的樣本是很有用的,相當于利用了同一個樣本分類結果就應該一樣的隐含限制。

是以,Co-Training的典型場景是少量标注+大量未标注的半監督場景。并且

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服
提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

其實是兩個不同,但是domain指向相同的任務。而Dual Learning中f和g是對偶任務,利用的隐含限制是

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

的cycle consistency。對輸入的特征也沒有像Co-Training有那麼明确的假設,學習方法上也不一樣,Dual Learning算是強化學習。

CycleGAN,翻譯過來就是:輪着幹,是結合了對偶學習和GAN一個很直接而巧妙的想法[10],示意圖如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

X和Y分别是兩種不同類型圖的集合,比如穿衣服的女優和沒穿衣服的女優。是以給定一張穿了衣服的女優,要變成沒穿衣服的樣子,就是個圖檔翻譯問題。CycleGAN示意圖中(b)和(c)就是Dual Learning:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

在Dual Learning基礎上,又加入了兩個判别器

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服
提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

用來進行對抗訓練,讓翻譯過來的圖檔盡量逼近目前集合中的圖檔:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

全考慮一起,最終的loss是:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

也許有人會問,那不加cycle-consistency,直接用GAN學習一個

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

的映射,讓生成的Y的樣本盡量畢竟Y裡本身的樣本可不可以呢?這個作者在文中也讨論了,會産生GAN訓練中容易發生的mode collapse問題。mode collapse問題的一個簡單示意如下[1]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

上邊的是真實分布,下邊的是學習到的分布,可以看到學習到的分布隻是完整分布的一部分,這個叫做partial mode collapse,是訓練不收斂情況中常見的一種。如果是完全的mode collapse,就是說生成模型得到的都是幾乎一樣的輸出。而加入Cycle-consistency會讓一個domain裡不同的樣本都盡量映射到另一個domain裡不同的地方,理想情況就是雙射(bijection)。

直覺來了解,如果通過都映射在Y中同一個點,那麼這個點y通過映射回來顯然不可能是多個不同的x,是以加入cycle-consistency就幫助避免了mode collapse。這個問題在另一篇和CycleGAN其實本質上沒什麼不同的方法DiscoGAN中有更詳細的讨論[11],有興趣的話可以參考。

有一點值得注意的是,雖然名字叫CycleGAN,并且套路也和C-GAN很像,但是其實隻有adversarial,并沒有generative。因為嚴格來說隻是學習了和的mapping,所謂的generative network裡并沒有随機性。

有一個和CycleGAN以及DiscoGAN其實本質上也沒什麼不同的方法叫DualGAN[12],倒是通過dropout把随機性加上了。不過所有加了随機性産生的樣本和原始樣本間的cycle-consistency用的還是l1 loss,總覺得這樣不是很對勁。當然現在GAN這麼熱門,其實隻要是用了adversarial loss的基本都會取個名字叫XXGAN,也許是可以增加投稿命中率。

另外上節中提到了Co-Training,感覺這裡也應該提一下CoGAN[13],因為名字有些相似,并且也可以用于未配對的圖像翻譯。CoGAN的大體思想是:如果兩個Domain之間可以互相映射,那麼一定有一些特征是共有的。比如男人和女人,雖然普遍可以從長相區分,但不變的是都有兩個眼睛一個鼻子一張嘴等等。

是以可以在生成的時候,把生成共有特征和各自特征的部分分開,示意圖如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

其實就是兩個GAN結構,其中生成網絡和判别網絡中比較高層的部分都采用了權值共享(虛線相連的部分),沒有全職共享的部分分别處理不同的domain。這樣每次就可以根據訓練的domain生成一個樣本在兩個domain中不同的對應,比如戴眼鏡和沒戴眼鏡:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

分别有了共有特征和各自domain特征,那麼做mapping的思路也就很直接了[14]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

在GAN前邊加了個domain encoder,然後對每個domain能得到三種樣本給判别器區分:直接采樣,重建采樣,從另一個domain中transfer後的重建采樣。訓練好之後,用一個domain的encoder+另一個domain的generator就很自然的實作了不同domain的轉換。用在圖像翻譯上的效果如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

還有個巧妙的思路,是把CoGAN拆開,不同domain作為C-GAN條件的更加顯式的做法[15]:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

第一步用噪聲Z作為和domain無關的共享表征對應的latent noise,domain資訊作為條件C訓練一個C-GAN。第二步,訓練一個encoder,利用和常見的encode-decode結構相反的decode(generate)-encode結構。

學習好的encoder可以結合domain資訊,把輸入圖像中和domain無關的共享特征提取出來。第三步,把前兩步訓練好的encoder和decoder(generator)連一起,就可以根據domain進行圖像翻譯了。

CoGAN一系的方法雖然結構看起來更複雜,但個人感覺了解起來要比dual系的方法更直接,并且有latent space,可解釋性和屬性對應也好一些。

又扯遠了,還是回到正題:

其實同樣沒什麼好說的,Cycle-GAN和pix2pix的作者是一撥人,文檔都寫得非常棒,準備好資料,分成穿衣服的和沒穿衣服的兩組,按照文檔的步驟訓練就可以:

Torch版Cycle-GAN:

https://github.com/junyanz/CycleGAN

pyTorch版Cycle-GAN(pix2pix二合一版):

Cycle-GAN收斂不易,我用了128x128分辨率訓練了各穿衣服和沒穿衣服的女優各一千多張,同樣是預設參數訓練了120個epoch,最後小部分成功“穿衣服”的結果如下:

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服
提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

雖然都有些突兀,但好歹是穿上衣服了。注意馬賽克不是圖檔裡就有的,是我後來加上去的。

那麼,脫衣服的例子在哪裡?

提高駕駛技術:用GAN去除(愛情)動作片中的馬賽克和衣服生成式模型馬賽克->清晰畫面:超分辨率(Super Resolution)問題生成帶局部馬賽克的訓練資料去除(愛情)動作片中的馬賽克對偶學習(Dual Learning)CycleGAN和未配對圖像翻譯(Unpaired Image-to-Image Translation)給女優穿上衣服

點選左下角“閱讀全文”,可以直接閱讀帶參考文獻的完整文章

今天的駕駛技能你學會了嗎

本文作者:達聞西

原文釋出時間:2017-06-29 

繼續閱讀