在CycleGAN出现之前,pix2pix网络在处理image-image translation问题上比较state-of-the-art。但是pix2pix需要利用成对(pair)的数据进行模型训练,如下图所示:

cv风格迁移典型案例pytorch附带完整代码_数据


成对的数据在自然界中是非常稀有的,因此pix2pix对数据的要求很高,一般而言不具备通用性。CycleGAN的出现可以解决这一问题,也就是说,CycleGAN可利用unpaired数据,在source domain cv风格迁移典型案例pytorch附带完整代码_Image_02和target domain cv风格迁移典型案例pytorch附带完整代码_数据_03之间建立一个映射:cv风格迁移典型案例pytorch附带完整代码_数据_04,从而使得源域cv风格迁移典型案例pytorch附带完整代码_Image_02的图像转化为与目标域cv风格迁移典型案例pytorch附带完整代码_数据_03分布相似的图像。也就是说,图像cv风格迁移典型案例pytorch附带完整代码_最小化_07无法被分辨出是从cv风格迁移典型案例pytorch附带完整代码_数据_03中采样的还是由cv风格迁移典型案例pytorch附带完整代码_Image_09生成的。

通过这个操作,我们就可以将自然图像转化为具有莫奈风格的图像,可以将斑马转变成普通的骏马,将冬天转变为夏天等等。也就是说,CycleGAN可以实现图像的风格迁移,更广义地来说,实现了图像间的翻译。

但是如果仅有cv风格迁移典型案例pytorch附带完整代码_数据_04,显然是不能完成这一任务的。因为这个映射只能确保cv风格迁移典型案例pytorch附带完整代码_最小化_07神似目标域cv风格迁移典型案例pytorch附带完整代码_数据_03中的样本,并不能确保它与生成前的图像是对应的。举个不太恰当例子,现在的源域cv风格迁移典型案例pytorch附带完整代码_Image_02表示“中文”,目标域cv风格迁移典型案例pytorch附带完整代码_数据_03表示“英文”。从cv风格迁移典型案例pytorch附带完整代码_Image_02中采样一个样本「你好吗」,经过cv风格迁移典型案例pytorch附带完整代码_数据_04得到的cv风格迁移典型案例pytorch附带完整代码_最小化_07理应是「How are you」。但是,由于该映射只是希望cv风格迁移典型案例pytorch附带完整代码_数据_18拥有目标域“英文”的特征,所以它可以是任意一句英文,如「I’m fine」。这样就失去了translation的意义。同时,GAN网络为了保证最小化Loss,宁愿所有样本的都生成同一个输出,也不会冒险去生成多样的结果,这就造成了Mode Collapse.

为了解决这个问题,CycleGAN中引入了循环一致性损失。仅仅有 cv风格迁移典型案例pytorch附带完整代码_数据_04是不够的,还需要再引入一个映射 cv风格迁移典型案例pytorch附带完整代码_最小化_20,以将cv风格迁移典型案例pytorch附带完整代码_最小化_07重新映射回源域cv风格迁移典型案例pytorch附带完整代码_Image_02,并衡量cv风格迁移典型案例pytorch附带完整代码_数据_23cv风格迁移典型案例pytorch附带完整代码_Image_02之间的差距,希望这个差距越小越好。这种思想相当于是一种Autoencoder,cv风格迁移典型案例pytorch附带完整代码_最小化_07相当于AE中的编码,如果这个编码能够还原出与cv风格迁移典型案例pytorch附带完整代码_Image_02相似的cv风格迁移典型案例pytorch附带完整代码_数据_23,那么就可以认为cv风格迁移典型案例pytorch附带完整代码_最小化_07虽然接近目标域分布cv风格迁移典型案例pytorch附带完整代码_数据_03,但原始图像上的语义特征并没丢失。

有了这一重约束,上面例子中的「你好吗」就不会翻译成「I’m fine」,因为「I’m fine」的语义特征和「你好吗」不同,不易从「I’m fine」还原到「你好吗」。

因此,整个网络的模型架构如下图所示:

cv风格迁移典型案例pytorch附带完整代码_Image_30


图(a)展示的是 cv风格迁移典型案例pytorch附带完整代码_数据_04cv风格迁移典型案例pytorch附带完整代码_最小化_20两个生成器映射过程,cv风格迁移典型案例pytorch附带完整代码_Image_33鉴别的是cv风格迁移典型案例pytorch附带完整代码_最小化_07属于目标域分布cv风格迁移典型案例pytorch附带完整代码_数据_03的确定性,和GAN中的鉴别器原理一致;cv风格迁移典型案例pytorch附带完整代码_最小化_36与之同理;图(b)展示的正向循环一致性损失,即cv风格迁移典型案例pytorch附带完整代码_Image_37;图(c)展示的反向循环一致性损失,即cv风格迁移典型案例pytorch附带完整代码_Image_38

因此整个训练过程的损失函数定义如下:

cv风格迁移典型案例pytorch附带完整代码_数据_39

其中前两项是常规生成对抗网络中的损失函数,最后一项是循环一致性损失函数,cv风格迁移典型案例pytorch附带完整代码_最小化_40是一个调节系数。对于前两项,这里采用了LSGAN的思想,可以进一步表达为:

cv风格迁移典型案例pytorch附带完整代码_最小化_41

cv风格迁移典型案例pytorch附带完整代码_最小化_42

对于循环一致性损失,其相当于自动编码器的重构误差,可以表达为:

cv风格迁移典型案例pytorch附带完整代码_最小化_43

CycleGAN的理论到这里就差不多了,可以看出理论并不是很复杂,而是非常精妙。巧妙的引入了循环一致性改变了网络的结构,不再需要成对的数据,从而使得CycleGAN非常的generalized。下面是论文中CycleGAN的一些实验结果:

cv风格迁移典型案例pytorch附带完整代码_数据_44


根据上图,CycleGAN可以实现斑马和马,冬天夏天即橙子苹果间的转换,论文中还做了很多有趣的实验,如图像增强,将随机拍摄的自然图像转换为专业的摄影图片,或融入莫奈的画风。

但是CycleGAN仍然存在一些问题,例如在将马转化为斑马的时候,很可能会将骑马的人也加上斑纹。因为原始训练集都是大自然中的马,因此模型学习不到人的相关知识。笔者也做过CycleGAN的实验,发现有些时候模型会将一些比较突出的背景也加上斑纹,如石头,醒目的植物等等,因此在稳定性方面还是有提升空间的。此外,CycleGAN不易实现形状的改变,比如将猫改成狗,外表形状上必然要发生变化,而CycleGAN不易实现,这也是可以改进之处。

总结

CycleGAN的精髓就是利用循环一致性,对网络进行改造,使得网络类似于两个相互对抗的自动编码器,从而实现了用unpaired数据进行图像到图像的翻译。理论不难,主要是这个idea太巧妙了。