pix2pix算法笔记
Posted AI之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pix2pix算法笔记相关的知识,希望对你有一定的参考价值。
论文:Image-to-Image Translation with Conditional Adversarial Networks
论文链接:https://arxiv.org/abs/1611.07004
代码链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
这篇论文发表在CVPR2017,简称pix2pix,是将GAN应用于有监督的图像到图像翻译的经典论文,有监督表示训练数据是成对的。图像到图像翻译(image-to-image translation)是GAN很重要的一个应用方向,什么叫图像到图像翻译呢?其实就是基于一张输入图像得到想要的输出图像的过程,可以看做是图像和图像之间的一种映射(mapping),我们常见的图像修复、超分辨率其实都是图像到图像翻译的例子。这篇论文列举了一些图像到图像翻译的例子如图Figure1所示,包括从标签到图像的生成、图像边缘到图像的生成等过程。
pix2pix基于GAN实现图像翻译,更准确地讲是基于cGAN(conditional GAN,也叫条件GAN),因为cGAN可以通过添加条件信息来指导图像生成,因此在图像翻译中就可以将输入图像作为条件,学习从输入图像到输出图像之间的映射,从而得到指定的输出图像。而其他基于GAN来做图像翻译的,因为GAN算法的生成器是基于一个随机噪声生成图像,难以控制输出,因此基本上都是通过其他约束条件来指导图像生成,而不是利用cGAN,这是pix2pix和其他基于GAN做图像翻译的差异。
pix2pix算法的示意图如图Figure2所示,在图中以基于图像边缘生成图像为例介绍pix2pix的工作流程。首先输入图像用y表示,输入图像的边缘图像用x表示,pix2pix在训练时需要成对的图像(x和y)。x作为生成器G的输入(随机噪声z在图中并未画出,去掉z不会对生成效果有太大影响,但假如将x和z合并在一起作为G的输入,可以得到更多样的输出)得到生成图像G(x),然后将G(x)和x基于通道维度合并在一起,最后作为判别器D的输入得到预测概率值,该预测概率值表示输入是否是一对真实图像,概率值越接近1表示判别器D越肯定输入是一对真实图像。另外真实图像y和x也基于通道维度合并在一起,作为判别器D的输入得到概率预测值。因此判别器D的训练目标就是在输入不是一对真实图像(x和G(x))时输出小的概率值(比如最小是0),在输入是一对真实图像(x和y)时输出大的概率值(比如最大是1)。生成器G的训练目标就是使得生成的G(x)和x作为判别器D的输入时,判别器D输出的概率值尽可能大,这样就相当于成功欺骗了判别器D。
pix2pix的优化目标包含2个部分,如公式4所示。一部分是cGAN的优化目标;另一部分是L1距离,用来约束生成图像和真实图像之间的差异,这部分借鉴了其他基于GAN做图像翻译的思想,只不过这里用L1而不是L2,目的是减少生成图像的模糊。
cGAN的优化目标如公式1所示,z表示随机噪声,判别器D的优化目标是使得公式1的值越大越好,而生成器G的优化目标是使得公式1的log(1-D(x,G(x,z))越小越好,这也就是公式4中min和max的含义。这里需要注意的是正如GAN论文提到的,公式1有时候训练容易出现饱和现象,也就是判别器D很强大,但是生成器G很弱小,导致G基本上训练不起来,因此可以将生成器G的优化目标从最小化log(1-D(x,G(x,z))修改为最大化log(D(x,G(x,z))),pix2pix算法采用修改后的优化目标。
L1距离如公式3所示,用来约束生成图像G(x, z)和真实图像y之间的差异。
接下来是关于生成器和判别器的网络结构设计。
生成器采用U-Net,这是在图像分割领域应用非常广泛的网络结构,能够充分融合特征;而原本GAN中常用的生成器结构是encoder-decoder类型,二者的对比如Figure3所示。
判别器采用PatchGAN,PatchGAN对输入图像的每个区域(patch)都输出一个预测概率值,相当于从判断输入是真还是假演变成判断输入的N*N大小区域是真还是假。举个例子,假设判别器的输入是
1
∗
6
∗
256
∗
256
1*6*256*256
1∗6∗256∗256,N设置为8,判别器的输出大小是
1
∗
1
∗
32
∗
32
1*1*32*32
1∗1∗32∗32,其中
32
∗
32
32*32
32∗32大小的输出中的每个值都表示输入中对应
8
∗
8
8*8
8∗8区域是真实的概率。
实验结果:
Table1是关于不同损失函数的组成效果对比, 这里采用的是基于分割标签得到图像的任务。评价时候采用语义分割算法FCN对生成器得到的合成图像做语义分割得到分割图,假如合成图像足够真实,那么分割结果也会更接近真实图像的分割结果,分割结果的评价主要采用语义分割中常用的基于像素点的准确率和IOU等。
Table2是关于不同生成器的效果,主要是encoder-decoder和U-Net的对比。
Table3是关于判别器PatchGAN采用不同大小N的实验结果,其中
1
∗
1
1*1
1∗1表示以像素点为单位判断真假,显然这样的判断缺少足够的信息,因此效果不好;
286
∗
286
286*286
286∗286表示常规的以图像为单位判断真假,这是比较常规的做法,从实验来看效果也一般。中间2行是介于前两者之间的PatchGAN的效果,可以看到基于区域来判断真假效果较好。
最后放一下pix2pix的生成图像,可以基于图像边缘得到图像、基于语义分割的标签得到图像、背景去除、图像修复等。更多结果可以参考原论文,效果还是很不错的。
以上是关于pix2pix算法笔记的主要内容,如果未能解决你的问题,请参考以下文章