轉載請注明出處:
https://www.cnblogs.com/darkknightzh/p/9175281.html
論文:
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
pix2pix使用的是Conditional GAN(cGAN)。傳統的GAN通過隨機向量z學習到圖像y:$G:z\to y$;cGAN則是通過輸入圖像x及隨機向量z學到圖像y:$G:\{x,z\}\to y$。其目標函數是
${{L}_{cGAN}}(G,D)={{E}_{x,y\sim {{p}_{data}}(x,y)}}\left[ \log D(x,y) \right]+{{E}_{x\sim {{p}_{data}}(x),z\sim {{p}_{z}}(z)}}\left[ \log (1-D(x,G(x,z))) \right]$
如下圖所示,左側為正樣本,右側為負樣本。其中真實圖像為y,真是圖像對應的航空圖像為x,這兩張圖像通過判別器,得到正樣本。右圖中將航空圖像x通過生成器G,得到重建的圖像G(x,z),而后將重構圖像及真實航空圖像輸入判別器D,作為負樣本。
由於以前的研究中發現,對於cGAN,增加一個額外的損失,如L2距離(真實圖像和生成圖像),效果更好。此時判別器的損失不變,生成器的損失變了。該論文中使用L1距離,原因是相比於L2距離,L1距離產生的模糊更小。
${{L}_{L1}}(G)={{E}_{x,y\sim {{p}_{data}}(x,y),z\sim {{p}_{z}}(z)}}\left[ {{\left\| y-G(x,z) \right\|}_{1}} \right]$
因而,pix2pix最終的目標函數是:
${{G}^{*}}=\arg \underset{G}{\mathop{\min }}\,\underset{D}{\mathop{\max }}\,{{L}_{cGAN}}(G,D)+\lambda {{L}_{L1}}(G)$
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]之內的生成圖像。