文章来源于CVPR 2017: Image-to-Image translation with conditional adversarial networks。这篇文章基本可以认为是图像转换领域的一个转折点,其采用的条件生成对抗网络cGAN作为一种通用的图像变换方法,具有很高的参考价值。
问题的提出
换个角度看,现在很多计算机视觉问题可以看成是image-to-image translation问题。对于不同的任务,一般深度学习框架相比如传统的机器学习算法将特征的提取纳入学习框架中,但是仍然需要handcraft的loss function。那么自然而然,是不是可以将损失函数也加入深度学习框架中?这样真正意义上的end-to-end的网络提供了更加general的框架,且学习得到的loss function可能比handcraft的loss function具有更好的效果。
——– GAN / cGAN 就能够解决这样的问题
Conditional GAN 简述
1. 于传统GAN的区别
传统的GAN在进行判别器构建的时候,仅仅考虑生成器的模拟结果,并不能考虑原始图像。而conditional GAN的判别器不仅仅能够考虑生成器的结果,同时能够其与考虑原始图像之间的match程度。如下图:
这样更加精细的discriminator使得cGAN相比于传统的GAN更加适合image-to-image的转换。
2. cGAN隐含的loss function的优势
其实除了上述的cGAN学习的loss function具有的普适性之外,cGAN学习的loss function一般能够考虑structured loss,相反这种结构化的特性并不能在深度学习框架中被考虑——在给定的图像中,每个像素认为是相对于其他所有像素来说是条件独立的。
cGAN学习得到的structured loss对于整个图像变换结构的configuration具有联合的惩罚,从理论上来说,惩罚生成器输出结构和训练生成目标图像之间任何差异。
网络构架
Objective
得到的生成器: G=
上面的公式乍一看有点难~ 其实剖开来从代码的实现角度并不是很难理解:
- 首先训练 判别器 D:discriminator。判别器想要 D(x,y) —— 真正的输入输出对,尽可能大;想要D(x,G(x,z)) —— 生成器结构和输入对,尽可能小。直观理解就是判别器想要最好的判别结果,能够识别到底是y还是G(x,z)。
- 然后训练 生成器 G:generator。 生成器就是想要尽可能的瞒天过海,欺骗判别器。其目标是使得D(x,G(x,z))尽可能大。这恰恰就体现了生成器和判别器之间对抗的过程。
- 一般还需要加上 L1-loss 是生成器模拟的结果尽可能的和目标图像一致:
具体构架
生成器构架
一般image-to-image转换需要input和output之间需要有一致的underlying structures。所以我们在生成器的构架中就需要确保尽量不损失结构 —— skip connection的构架。(dropout的引入需要在测试过程中也要,注意注意!!!)
Markovian discriminator
仅仅考虑L2-loss或者L1-loss会导致图像转换结果出现blurry的现象——表示缺乏高频信息。因此我们需要在此低频信息的基础上,采用cGAN提高高频信息的提取能力。高频信息也是cGAN的保持图像structure,matching等等优势的一个体现。
为了建模高频信息,我们需要在local patch里面考虑图像信息 —— PatchGAN,仅仅在patch的尺度上惩罚结构。判别器需要判断N*N的图像块(图像块尺寸可能很小)是真还是假,如果是假的话就给惩罚。
从另一个角度分析,这样的判别器将图像建模成markov random field,pixel之间距离超过图像块大小的才被认为是条件独立的。
总结
cGAN可以作为一种通用的图像转换的方法,尤其它还有很好的结构化图像结构输出。这样的自适应学习loss function的框架使得cGAN的运用之处变得越来越广泛。