pix2pix 学习笔记
論文:
Image-to-Image Translation with Conditional Adversarial Networks
https://arxiv.org/pdf/1611.07004v1.pdf
?
代碼:
官方project:https://phillipi.github.io/pix2pix/
官方torch代碼:https://github.com/phillipi/pix2pix
官方pytorch代碼(CycleGAN、pix2pix):https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
第三方的tensorflow版本:https://github.com/yenchenlin/pix2pix-tensorflow
?
如下圖所示,左側為正樣本,右側為負樣本。其中真實圖像為y,真是圖像對應的航空圖像為x,這兩張圖像通過判別器,得到正樣本。右圖中將航空圖像x通過生成器G,得到重建的圖像G(x,z),而后將重構圖像及真實航空圖像輸入判別器D,作為負樣本。
?
?
1. 介紹:
圖像處理的很多問題都是將一張輸入的圖片轉變為一張對應的輸出圖片,比如灰度圖、梯度圖、彩色圖之間的轉換等。通常每一種問題都使用特定的算法(如:使用CNN來解決圖像轉換問題時,要根據每個問題設定一個特定的loss function 來讓CNN去優化,而一般的方法都是訓練CNN去縮小輸入跟輸出的歐氏距離,但這樣通常會得到比較模糊的輸出)。這些方法的本質其實都是從像素到像素的映射。于是論文在GAN的基礎上提出一個通用的方法:pix2pix 來解決這一類問題。通過pix2pix來完成成對的圖像轉換(Labels to Street Scene, Aerial to Map,Day to Night等),可以得到比較清晰的結果。
先看一張效果圖:
?
2. 方法
training procedure
訓練大致過程如上圖所示。圖片 x 作為此cGAN的條件,需要輸入到G和D中。G的輸入是{x,z}(其中,x 是需要轉換的圖片,z 是隨機噪聲),輸出是生成的圖片G(x,z)。D則需要分辨出{x,G(x,z)}和{x,y}。
?
2.1 目標函數
pix2pix使用的是Conditional GAN(cGAN)。傳統的GAN通過隨機向量z學習到圖像y:G:z→yG:z→y;cGAN則是通過輸入圖像x及隨機向量z學到圖像y:G:{x,z}→yG:{x,z}→y。一般的cGAN的目標函數如下,生成器 G 不斷的嘗試minimize下面的目標函數,而D則通過不斷的迭代去maximize這個目標函數。
cGAN的目標函數
為了測試輸入的條件x對于D的影響,論文也訓練一個普通的GAN,判別器D只用于判別生成的圖像是否真實。
?
GAN
前人的一些工作中發現,將GAN的目標函數和傳統的loss結合,可以帶來更好的效果。由于以前的研究中發現,對于cGAN,增加一個額外的損失,如L2距離(真實圖像和生成圖像),效果更好。此時判別器的損失不變,生成器的損失變了。該論文中使用L1距離,原因是相比于L2距離,L1距離產生的模糊更小。所以論文增加了一個L1 loss交給生成器G去最小化。
L1 loss
?
所以最終的目標函數是:
?
final objective
?
文中對于不同的loss的效果做了一個對比,可以看到L1 + cGAN的效果相對于只用L1或者cGAN都是比較好的。
?
different loss
2.2 網絡結構
論文對DCGAN的生成器和判別器的結構做了一些改進。
2.2.1 生成器結構
?
pix2pix未使用傳統的encoder-decoder的模式(下圖左側),而是使用了U-Net(下圖右側)網絡。U-Net論文為:U-net: Convolutional networks for biomedical image segmentation。U-net在decoder部分,每個conv層之前將輸入和decoder對應的鏡像層進行了拼接,因而輸入的通道數增加了1倍,但是不嚴謹的說,輸入的通道數不會影響卷積的輸出維度,因而網絡不會出問題。
網絡中的判別器結構比較容易理解,生成器按照上面U-Net理解之后,也比較容易理解(開始沒有理解U-Net,導致對生成器中encoder的理解有困難)。具體網絡結構如下圖所示(對應于第三方的tensorflow代碼)。當輸入為256*256的圖像時,第一行為圖像寬高(未考慮batchsize及channel),第二行中e1…e8和第三行d1…d8為generator函數中對應的變量。第三行d1t…d7t為generator函數中encoder的臨時變量。其和e8…e2在channel維度進行concat后得到最終的d1…d7。最終d8經過tanh后,得到輸入范圍為[-1,1]之內的生成圖像。
U-Net
U-Net是德國Freiburg大學模式識別和圖像處理組提出的一種全卷積結構。和常見的先降采樣到低維度,再升采樣到原始分辨率的編解碼(Encoder-Decoder)結構的網絡相比,U-Net的區別是加入skip-connection,對應的feature maps和decode之后的同樣大小的feature maps按通道拼(concatenate)一起,用來保留不同分辨率下像素級的細節信息。U-Net對提升細節的效果非常明顯,下面是文中給出的一個效果對比,可以看到不同尺度的信息都得到了很好的保留。
不同結構的G與不同的目標函數組合的效果對比
?
2.2.2 判別器結構
利用馬爾科夫性的判別器(PatchGAN)
pix2pix采用的一個想法是,用重建來解決低頻成分,用GAN來解決高頻成分。一方面,使用傳統的L1 loss來讓生成的圖片跟訓練的圖片盡量相似,用GAN來構建高頻部分的細節。
final objective
另一方面,使用PatchGAN來判別是否是生成的圖片。PatchGAN的思想是,既然GAN只用于構建高頻信息,那么就不需要將整張圖片輸入到判別器中,讓判別器對圖像的每個大小為N x N的patch做真假判別就可以了。因為不同的patch之間可以認為是相互獨立的。pix2pix對一張圖片切割成不同的N x N大小的patch,判別器對每一個patch做真假判別,將一張圖片所有patch的結果取平均作為最終的判別器輸出。
具體實現的時候,作者使用的是一個NxN輸入的全卷積小網絡,最后一層每個像素過sigmoid輸出為真的概率,然后用BCEloss計算得到最終loss。這樣做的好處是因為輸入的維度大大降低,所以參數量少,運算速度也比直接輸入一張快,并且可以計算任意大小的圖。論文對比了不同大小patch的結果,對于256x256的輸入,patch大小在70x70的時候,從視覺上看結果就和直接把整張圖片作為判別器輸入沒有多大區別了:
patchGAN
3. 效果
?
?
?
4. 總結
?
優點:pix2pix巧妙的利用了GAN的框架來為“Image-to-Image translation”的一類問題提供了通用框架。利用U-Net提升細節,并且利用PatchGAN來處理圖像的高頻部分。
缺點:訓練需要大量的成對圖片,比如白天轉黑夜,則需要大量的同一個地方的白天和黑夜的照片。
作者:AlanPaul
鏈接:https://www.jianshu.com/p/8c7a7cb7198c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
總結
以上是生活随笔為你收集整理的pix2pix 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运行报错error: (-215:Ass
- 下一篇: WGAN-GP 学习笔记