由于毕设和image-to-image translation有关,所以最近拜读了CycleGAN和pix2pix论文,这两篇可以说是图像转译领域的经典论文了,下面是两个链接:
Image-to-Image Translation with Conditional Adversarial Networks
,Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
一、Pix2pix精读
有趣的是,pix2pix和cycleGAN都是直接把效果图放在论文最前面,给人一目了然的感觉。
(一)简介
pix2pix这篇论文主要的工作是图像的配对生成,比如给出给出一个简笔画,能够生成对应的真实图像。
作者在一开始就提出,在图像翻译领域,卷积神经网络已经成为了一个workhorse(牛马),但是需要针对不同的任务,设置不同的损失函数,而且这个损失函数要合适。比如我想在图像生成任务中用像素级别的欧几里得距离来做损失函数,那么模型会更倾向于产生模糊的边界。因为哪怕两个图像一样,就因为整体位置偏了一点,欧几里得距离也会变得非常大,因此模型会生成更加模糊的边界。这显然是不合适的。
因此,作者提出,用一个更高级的视角来看待,比如“使输出图像和真实图像无法分辨出来”这样的目标,会更加好一些。而者正是GAN正在做的事,且GAN的损失函数是在去适应数据,因此能够适用于不同的任务,而且不用为每个任务设计单独的损失函数。
(二)方法
方法上,作者主要借鉴了cGAN,也就是条件生成对抗网络,而条件生成对抗网络和传统GAN地区别在于,生成器产生图像时的输入是一个随机变量和一张真实图像;判别器的输入不只是单张图像,而是将真实图像和生成图像一起进行判别,如下图。
(三)损失函数
对应的,损失函数也会改变:
上面公式的第一部分,是借鉴了条件生成对抗网络的损失函数,如下图,D是判别器,G是生成器,x是输入的图像,y是对应的真实图像,z是随机变量。对于判别器来讲,是希望
D
(
x
,
y
)
D(x,y)
D(x,y)尽量大,也就是识别出真实图像的概率大,而
D
(
x
,
G
(
x
,
z
)
)
D(x,G(x,z))
D(x,G(x,z))尽量小,也就是认为生成图像时真实的概率尽量小,也就是
1
−
D
(
x
,
G
(
x
,
z
)
)
1-D(x,G(x,z))
1−D(x,G(x,z))尽量大;对于生成器来讲,第一项是常量,只要让第二项尽量小就可以。
而第二部分,是针对生成器的,因为我们希望生成器不仅能够骗过判别器,也就是尽量真实,还要跟输入图像的内容保持一致。因此加了一项L1损失函数,因为相比L2能够产生更少的模糊。
对于生成器和判别器的网络结构:
生成器采用的是UNet网络结构,考虑到生成的图像和原图像一样有高分辨率,因此采用了传统的encode-decoder结构,但是对于图像翻译任务来讲,原图像的很多语义信息很容易在中间的bottleneck中丢失,因此unet的skip-connection可以帮助补充丢失的语义信息:
对于判别器,采用的是PatchGAN,也就是将几个像素块看成一个patch,patch与patch之间是相互独立的,patch内部又是相关的,也就是马尔科夫随机场。这可能会丢失低频信息(低语义特征),但不用担心,L1损失函数弥补了这个缺点。
二、CycleGAN论文精读
(一)简介
cycleGAN与pix2pix最大的不同在于,pix2pix的训练需要配对的数据,比如一个简笔画对应一个真实图像,但这往往很难实现,但如果我们做两个域之间的转换,这就变得相对简单了。这就是CycleGAN做的工作。不仅是
x
→
y
x→y
x→y而是
X
→
Y
X→Y
X→Y
但是,这个时候会有新问题出现,如何保证在转换时,原图像的语义信息被保留下来了?因为这种映射关系很多,但能够保留x的信息的映射很少,而且很容易导致模式崩溃,也就是无论输入是什么样的,输出的图像都是一样的。因此,如果我们能够使y再映射回x,这样就能保证语义信息在y中不会被丢失掉。如下图所示:
(二)损失函数
损失函数设计:
前两部分是对抗损失,即对于映射
X
→
Y
X→Y
X→Y和判别器
D
Y
D_Y
DY有第一项,同理对于映射
Y
→
X
Y→X
Y→X和判别器
D
X
D_X
DX有第二项
第三项是循环一致损失函数,定义如下,是为了保证在图像翻译时保留原图像的语义特信息。
后面的消融实验也证明了循环一致损失的重要性。
作者也在论文里提到了,这就像是在训练两个特殊的自编码器,即
X
→
Y
→
X
X→Y→X
X→Y→X与
Y
→
X
→
Y
Y→X→Y
Y→X→Y
(三)应用
CycleGAN其实有很多有意思的应用,作者也提供了网站CycleGAN Project Page,里面不仅有代码,还有很多有趣的应用,比如季节转换,街景转GTA等等,不过也有一些失败的案例,比如下图的马边变斑马,由于训练数据里没有人骑着马,因此很容易将人也变成了黑白条纹。