pix2pix实战_算法笔记答案

pix2pix实战_算法笔记答案论文:Image-to-ImageTranslationwithConditionalAdversarialNetworks论文链接:https://arxiv.org/abs/1611.07004代码链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix这篇论文发表在CVPR2017,简称pix2pix,是将GAN应用...

论文: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 16256256,N设置为8,判别器的输出大小是 1 ∗ 1 ∗ 32 ∗ 32 1*1*32*32 113232,其中 32 ∗ 32 32*32 3232大小的输出中的每个值都表示输入中对应 8 ∗ 8 8*8 88区域是真实的概率。

实验结果:
Table1是关于不同损失函数的组成效果对比, 这里采用的是基于分割标签得到图像的任务。评价时候采用语义分割算法FCN对生成器得到的合成图像做语义分割得到分割图,假如合成图像足够真实,那么分割结果也会更接近真实图像的分割结果,分割结果的评价主要采用语义分割中常用的基于像素点的准确率和IOU等。
在这里插入图片描述
Table2是关于不同生成器的效果,主要是encoder-decoder和U-Net的对比。
在这里插入图片描述
Table3是关于判别器PatchGAN采用不同大小N的实验结果,其中 1 ∗ 1 1*1 11表示以像素点为单位判断真假,显然这样的判断缺少足够的信息,因此效果不好; 286 ∗ 286 286*286 286286表示常规的以图像为单位判断真假,这是比较常规的做法,从实验来看效果也一般。中间2行是介于前两者之间的PatchGAN的效果,可以看到基于区域来判断真假效果较好。
在这里插入图片描述
最后放一下pix2pix的生成图像,可以基于图像边缘得到图像、基于语义分割的标签得到图像、背景去除、图像修复等。更多结果可以参考原论文,效果还是很不错的。
在这里插入图片描述在这里插入图片描述

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/209298
0
   

发表评论