pix2pix解析以及pytorch实现

原始论文:https://arxiv.org/pdf/1611.07004.pdf

原始pytorch版本的代码:GitHub - junyanz/pytorch-CycleGAN-and-pix2pix: Image-to-Image Translation in PyTorch

我的复现代码:

pix2pix就是用cGAN(Conditional GAN)实现成对的图像转换。例如下图

具体方法和网络结构

pix2pix与传统的GAN方法有一定区别(读者最好先了解一下传统GAN),它运用了cGAN的方法:

在生成器(G)上,通过随机噪声z和真实图像x生成图像y, G: \left \{ x, z \right \} \rightarrow y

在判别器上与传统的GAN一样;

在loss上,与传统的GAN_Loss不同,pix2pix的loss除了加上了conditional特性,还增加了L1_Loss让目标域的图像更加接近源域的图像:

传统的GAN_Loss:L_{GAN}(G, D) = \mathbb{E}_{y}[logD(y)] + \mathbb{E}_{x, z}[log(1-D(G(z)))] 

cGAN_Loss: L_{cGAN}(G, D) = \mathbb{E}_{x,y}[logD(x,y)] + \mathbb{E}_{x, z}[log(1-D(x,G(x,z)))]

G = arg\underset{G}{min}\underset{D}{max}L_{cGAN}(G, D)

 

 

  1. x是指原始图像(上图的左边),y是指目标真实图像(上图的右边),G(x,z)是指根据噪声和原始图像生成的图像(fake);
  2. D(x,y)代表通过判别器得到的真实图片是否真实的概率,同理D(x,G(x,z))代表生成的图像是否真实的概率;
  3. 判别器的最终目的是D(x,y)尽可能的接近于1,判别器的能力越强D(x,y)越大,D(x,G(x,z))越小,1-D(x,G(x,z))越大,因此 L_{cGAN}(G, D) 越大,这也解释了为什么要  \underset{D}{max};生成器的最终目的是使G(x,z)越像真实图片,即D(x,G(x,z))越大,此时1-D(x,G(x,z))越小,同理这也说明了为什么要  \underset{G}{min}

 再加上L1约束,最终的需要优化的目标函数如下:

G = arg\underset{G}{min}\underset{D}{max}L_{cGAN}(G, D) + \lambda L_{L1}(G)

网络结构 

pix2pix在网络结构上的亮点主要是在生成器上运用了U-net的网络结构,同时加入跳链接(skip connections),第i层与第n-i层直接连接,具体细节可以参考U-net原论文。除此之外,pix2pix还运用了dropout操作。

 

PatchGAN

L1_Loss有利于对于低频信息建模,pix2pix使用L1_Loss作为辅助loss加入总loss中会使生成的图像更加清晰,论文中作者也进行了对比实验:

 对于高频信息,作者提出了一种PatchGAN对高频信息进行建模,就是针对同一个图像中不同N*N大小的区域进行真伪鉴别,最后将他们平均值作为输出。N*N的区域可以比整个图像小的多,但是任然能得到高质量的结果。使用PatchGAN能减少参数量,加快训练速度,同时能应用于任意大尺度的图像。经过作者的探索,当N=70时,得到的结果最好。

 上述就是pix2pix这篇论文的核心方法以及一些setting,论文中有更加详细的网络结构和PatchGAN的分析,有兴趣可以去阅读原论文。最后附上一些我自己复现的代码训出来的一些例子(代码我就先不放了,后面还会讲一下cycleGAN,到时一起放出来),部分还没训好(太费时了,懒得训了),从左到右:input,label,gen_image