冒泡!拖延的小李要补上上一周的论文阅读笔记
上周事情压力大 人丧丧的就一直拖着 现在就来更新一下。
——————
论文名称:
《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》
论文地址:
https://arxiv.org/pdf/1703.10593.pdf
论文翻译:
https://blog.csdn.net/luojun2007/article/details/81157378
https://zhuanlan.zhihu.com/p/45394148
代码地址:
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
————————
Background
先交代一下背景,论文涉及到的领域是:Image-to-image translation即图像到图像的转换,就是将图像从一个领域(例如,斑马的图像)转换成另一个领域(例如,马的图像)理想情况下,图像的其他功能 - 任何与这两个域都不直接相关的功能(例如背景)都应该保持相同。(如下图所示)
那么,在这个过程中我们的目标是:使用成对的图片训练数据集来学习输入图片和输出图片之间的映射,然而现实中,寻找成对的数据比较困难而且花费较为昂贵,那么问题来了--没有成对的图片下要如何去完成我们的训练?
Assume
因此,我们需要寻求一种算法,它可以在没有成对的输入输出例子的情况下在域之间进行转换。这里作者做了一个假设:在源域和目标域存在一种潜在的关系。其实就是两者从分布上而言,是存在相似性的。
那么就可以联想到生成对抗的思想(GAN):给定源域的图片集合X以及另一个域的图片集合Y,我们使用对抗的思想学习一个映射G:X→Y,其输出=G(x),x∈X,与y∈Y无法区分。
但是如果单纯的只是用GAN又会出现一些问题:
1.无法保证对于一个输入x,可以得到有意义的输出y,因为使用了不成对的训练集,可以学到无数种的映射G,而这些G都可以使生成的分布y^逼近与目标域。
2.单独优化对抗损失非常困难,导致了一些问题,如模型崩溃。举例说明一下模型崩溃:例如训练集有很多种类别(如猫狗牛羊),但是我们只能生成狗(或猫或牛或羊),虽然生成的狗的图片质量特别好,但是整个G就只能生成狗,根本没法生成猫牛羊,陷入一种训练结果不好的状态。
那么面对新的问题,又该如何解决?回到问题的本身,我们做的是图像到图像的翻译,那么在联系到现实中文本的翻译,从英文翻译到中文,再从中文翻译回去,这两个翻译之间要有一致性,双射互逆循环,基于这样的特点作者提出了:
Cycle-Consistent Adversarial Networks(CycleGan)实现了非配对的图像到图像转换
CycleGan
Model
用数学符号来表示下:
在这个图中,我们可以看到:A通过G生成一个造假的B图,这个造假的B图通过F重构再生成一个假的A,这个假的A和输入的原始A之间的损失即为循环一致损失,判别器此时判断的是假B和真B之间的差异。通过这个过程我们可以看到:实际上它把生成的图片引入另一个训练的过程 中,是另一个生成器训练的训练集,所以假的B相当于一个中间表示,A通过中间表示把图像映射到自身。
我们有一个转换器(映射):G:X→Y,和另一个转换器F:Y→X。
那么根据刚刚所说的翻译的性质来看:G和F应该是互逆的,即两者是一个双向映射。于是可以同时训练G和F来确保这个性质,在这其中增加一个循环一致性损失,使得F(G(x))≈x以及G(F(x))≈y。组合该损失和对抗损失,得到了整体的非正对的图像到图像迁移的优化目标。此外,我们还引入了两个对抗性判别器Dx 和 Dy, Dx的目的是区别图像x和翻译后的图像F(y),Dy的目的是区分y和G(x)。
图解:
刚刚图是一个单向的过程,完整如下: 此图中,
前向:X→G→Y1→F→X1 X≈x1
反向:Y→F→X1→G→y1 Y≈y1
这两个训练是交替进行的,随机选取数据集,共享两个生成器G、F。(注意:不成对是A/B两个数据集都存在,但没有成对出现,而不是另一方完全缺失。)
Loss
Adversarial Loss
对抗损失即原来GAN的损失,生成器G和F各有一个表达如下:
注:G的作用是使得生成的图片越逼真,D的作用是判别出假的照片差异。log(DY(y))是判断真的样本故越大越真,那么就要求D要大,DY(G(x)))判断的是假的照片,那么这个时候结果应该是越小越好,那就要求G要小。故G最小,D最大的情况下是我们的目标函数。
这个对抗性损失的意义在于:促使生成图像分布与目标域的图像分布相逼近Cycle Consistency Loss
满足的是:
x → G(x) → F(G(x)) ≈ x
y → F(y) → G(F(y)) ≈ y.
此损失函数的意义在于:以防止学习的映射G和F相互矛盾Full Objective
我们的模型可以看作是训练两个“自编码器”:我们学习一个自动编码Fo G: X -> X与另外一个自编码Go F:Y -> Y。然而,这些自动编码都有特殊的内部结构:它们通过将图像转换为另一域的中间表示,将图像映射到自身。这样的设置也可以看作是“对抗性自动编码”的特例。它使用一个对抗性损失来训练一个自动编码器的瓶颈层,以匹配人意的目标分布。在我们的例子中,X -> X 自动编码的目标分布是域Y(中间表示)。
Experiments
Network Architecture
采用了适合我们使用的网络架构-Johnson等人的生成网络。该网络包括:两个stride-2卷积,几个残差块和两个分步长卷积。对128X128图像使用6个块,对256X256和更高分辨率的训练图像使用9个块。对于判别网络,我们使用70个PatchGANs,其目的是对70X70的重叠图像块进行是真是假分类。这样的判别器架构比全图判别器具有更少的参数,并且可以以全卷积的方式应用于任意大小的图像。
Training details
1.对于Lgan,我们用最小二乘损失替代负对数似然目标。这种损失在训练和生成高质量结果时更稳定。可参考:生成对抗网络GAN系列(四)--- LSGAN---最小二乘GAN(Least Squares Generative Adversarial Networks
2.减少模型的震荡,我们遵循Shrivastava等人的策略,使用历史生成的图片更新鉴别器,而不是网络最新生成的图片。我们保留了一个图像缓冲区,存储50幅以前生成的图像。
3.对于所有的实验,我设置了lamda = 10,使用Adam,batch size = 1。所有网络都从零开始训练,学习率为0.0002。在前100个epoch保持相同的学习率,并在接下来的100个epoch中线性衰减为0。Results
1.与最近的非成对的图像到图像的迁移方法进行对比;
与极限模型的对比:CoGANPixel、 loss+GAN、Feature loss+GAN、BiGAN/ALI pix2pix 消融研究(Ablation study )---就是通过简化模型,看效果,就不如我们的模型里面,去掉GAN,去掉cycle等等一部分,做实验,看效果如何,如下图:
2.自身进行对比,限制使用不同的损失项;
3.证明了算法的通用性
通过上述对比可以看出,通过实验证明了cyclegan算法的有效性,提高了图像翻译的准确度。下图是应用cyclegan的效果图:
Limitation
cyclegan在涉及纹理或颜色的之类的图像转换效果好一点,但是存在一定的局限性,
1.在涉及几何转换上有失败,例如下图(狗转变成猫或相反):
2.由训练及分布特征导致的,比如训练野马和斑马转换时,并没有考虑到马上可能骑着一个人,个人猜测有可能只提取了轮廓部分。
3.在匹配的数据集上训练和不匹配的数据集上训练仍然会有差距,作者提出要解决这种问题需要融合一些弱语义监督,这样仍然只会带来比全监督系统低得多的标注成本。
Conclusions
总的来说,cyclegan在图像翻译的领域里面取得了不错的成绩,我们可以把cyclegan看做是两个镜像对称的gan构成了一个环形网络,里面共享两个生成器G、F,而且有两个判别器,损失除了原有的GAN损失,还引入了新的循环一致损失,两个损失结合在一起就是我们目标的损失函数。
————————
ending~
参考资料:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks(CycleGAN)
Cycle GAN 论文解析
网友评论