本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
摘要: Pix2Pix是一种基于cGAN的图像到图像转译的架构,其中生成器输入是一张我们需
要转换的图,输出是一张转译目标图;判别器输入一对图片配对 ( paired data),即转换图和
生成图的配对或者是转换图和原图的配对,输出这一配对是原图的概率。pix2pix算法能够实
现标签图到街景图,黑白图到彩色图,标签图到建筑图等任务的映射,是一个比较通用的图片
转译算法。
点个star:github.com/Bailey-24/p…
1. 前置知识
1.1 图片转译 Image translation
图片转译是基于一张输入图像得到想要的输出图像的过程,可以看做是图像和图像之间的
一种映射,例如轮廓图转彩色图,实现图像状态之间的转换,所以图片转译是一个图像生成任
务。
1.2 生成对抗模型GAN
对于图像生成任务,容易想到当时很流行的生成对抗模型 Generator Adversarial
Networks (GAN). GAN包含生成器 G和判别器 D,具体流程如图1所示,G的作用是生成图
片,其输入是一个随机编码 z , 输出一个生成的图片;D 是用来判断的,其输入是生成器 G输
出的图片,输出这张图是真的概率,真的则输出1,假的输出0。
在训练过程中,两个网络的能力越来越强,即 G生成的图片越来越像真的图片,D也越来越会判断图片的真假。到了测试阶段,只使用 G作为图片生成器。
下面是GAN的目标函数,也就是我们要在最大化 D的判断能力的前提下,G生成的图片要
骗过 D, 即最小化D对G的判断能力。
2. 算法原理
由于GAN算法的生长器是基础一个随机噪声生成图像,难以控制输出,所以需要一些约
束条件来指导图像生成,添加条件信息后的GAN称为Conditional GAN (cGAN). Pix2pix是
基于 cGAN实现图片转译,以用户输入的图片作为条件。
Pix2pix算法流程如图2所示,在图中以基于图像边缘生成图像为例。
训练pix2pix数据需要一组配对的条件图像 x 和原始图像 y。
1) x 作为生成器 G的输入,得到生成图像G(x),然后将x 和 G(x)作为判别器的输入,得到
预测概率值,这个值表示输入是否是一对真实图像,概率值越接近1表示判别器越肯定输入的
是一对真实图像。
2) 将原始图像y和条件图像x作为判别器D的输入,得到预测概率值。
2.1 目标函数
根据上面的的原理介绍,可以写出cGAN的目标函数,如下。
生成器 G 的作用就是迷惑 D,同时为了产生与ground truth很像的图像,缩小生成图像
和真实图像之间的差异,需要加上 L1 损失。
所以最终的目标函数可以表示为如下形式。
2.2 生成器 UNet
生成器采用UNet,因为作者认为输入和输出图像的外表面 (surface appearance) 应该不
同,而潜在的结构 (underlying structure) 应该相似,也就是输入和输出应该共享一些底层
信息,因此使用UNet这种跳层连接 (skip connection) 的方法,这里的跳层连接是第 i 层与第
n − i层相连,如下所示。
2.3 判别器 PatchGAN
因为目标函数中有 L1损失,这样能够较好地恢复图像的低频部分(图像中的色块),但
是不能很好地恢复图像的高频部分(图像中的边缘),所以为了更好地对图像的局部做判断,
作者用PatchGAN作为判别器,也就是把图像等分成patch大小,分别判断每个patch的真
假,最后再取平均,这个平均值作为整张图片的真假概率,而不是像GAN那样对整一张图片
判断真假。
3. 算法实现
3.1 实验环境
主机:ubuntu 18.04
实现框架:jittor 和 pytorch
硬件 (服务器):
显卡:Nvidia TITAN V,12G
CPU:Intel E5-2699 v4 @ 2.20GHz x88
内存:220G
3.2 实现流程和核心代码
以下都是用jittor框架写的代码。
点个star:github.com/Bailey-24/p…
先训练判别器,后生成器前面;而且如果判别器太强大导致生成器学不到什么东西,可以
使判断器每两个epochs更新一次参数,或者调小判断器的学习率。
以下为训练核心代码。
4. 实验结果
实验目的:实现pix2pix算法并对比jittor和pytorch下的速度和效果,两种框架下的模
型架构和超参数相同。
- 在这种生成任务上,jittor跑的速度比pytorch快。在 facades 数据集上,训练集有
400张,jittor跑一个epoch平均需要24秒左右,pytorch则需要48秒左右,jittor比pytorch
足足快了两倍。
- 但是用pytorch和jittor都是跑400 epochs情况下, pytorch的表现更加好一点,因为
jittor没学到一些外形建筑物,比如下图的柱子,而且jittor生成的图比pytorch模糊。用相同
的图片对pytorch和jittor测试,左边是原图,中间是生成图,右边是conditional image.
- 为了验证结果是否受训练时间影响,我在jittor运行800个epochs花费的时间跟在
pytorch运行 400个epochs时间差不多,以下是结果。结果跟运行400个epochs效果差不
多,比pytorch的效果要差。
后续工作:因为现实生活中很少这种配对的数据集,为了解决这个问题,后续工作提出了
Cycle-GAN,它只需要输入数据的一个集合和输出数据的一个集合,就可以做到样式迁移;
pix2pix算法生成的图还是有点模糊,所以有人提出pix2pixHD算法来提高生成图片的质量。
5. 参考文献
1. pix2pix算法笔记
2. 一文读懂GAN, pix2pix, CycleGAN和pix2pixHD
3. pix2pix算法原理与实现
4. 官方代码
5. jittor_GAN模型库
6. pytorch_GAN模型库