CycleGAN的一个重要应用领域是Domain Adaptation(域迁移:可以通俗的理解为画风迁移),比如可以把一张普通的风景照变化成梵高化作,或者将游戏画面变化成真实世界画面等等。以下是原论文中给出的一些应用:
当我们固定住生成器的参数训练判别器时,判别器便能学到更好的判别技巧,当我们固定住判别器参数训练生成器时,生成器为了骗过现在更厉害的判别器,被迫产生出更好质量的图片。两者便在这迭代学习的过程中逐步进化,最终达到动态平衡。
这是一开始GAN被提出时的思想,而在CycleGAN中,我们不仅想要生成器产生的图片y'跟数据集Y中的图片画风一样,我们还希望生成器产生的y'图片跟他的输入图片x 内容一样(比如我们输入一张带房子的照片,我们希望产生梵高画风的房子图片,而不是其他内容的图片,比如向日葵、星夜等等,否则意义就不是很大了。因为在一些APP中,我们通常想把自己拍摄的照片变成梵高画作嘛~)。
为了做到这一点,论文作者提出了Cycle Consistency Loss,即将图片y'再放入生成器 F中,产生的新图片X' 和最开始的图片 X 尽可能的相似
即我们希望 F(G(x)) = x
有了这样的约束,我们才能希望生成器将我们的输入照片的风格转化为梵高画风,而不是从梵高的作品中随便挑一张图片来应付我们了事。Cycle Consistency Loss在原论文中的插图解释为
因此,CycleGAN的Loss由两部分组成,
即
- 保证生成器和判别器相互进化,进而保证生成器能产生更真实的图片
- 保证生成器的输出图片与输入图片只是风格不同,而内容相同
- 训练生成器时, Dx ,Dy参数被固定,只有G,F 的参数可调,因此:
LOSSgan 保证了生成器产生的图片越来越真实(风格越来越像另一个种类型的图片)
LOSScycle保证了生成器产生的图片内容大致不变
即训练判别器Dx时,应最大化 D(x) 的值(让判别器给真实图像 x 高分)
同时,应该极小化D(F(y))的值(让判别器给生成的图像F(y) 低分),从而提升判别器的判别能力。更新的Dy过程与此类似。
用L1和L2 loss重建的图像很模糊,也就是说L1和L2并不能很好的恢复图像的高频部分(图像中的边缘等),但能较好地恢复图像的低频部分(图像中的色块)。为了能更好得对图像的局部做判断,作者提出patchGAN的结构,也就是说把图像等分成patch,分别判断每个Patch的真假,最后再取平均!作者最后说,文章提出的这个PatchGAN可以看成所以另一种形式的纹理损失或样式损失。在具体实验时,不同尺寸的patch,最后发现70x70的尺寸比较合适。因为更小的PatchGAN具有更少的参数,运行速度更快,并且可以应用于任意大的图像。