pix2pix:用 cGAN 做图像翻译的通用框架
图像翻译(image-to-image translation)是一类经典问题:给定一张输入图像,生成对应的输出图像,比如把语义分割图变成真实场景照片、给线稿着色、把白天照片转成夜景。这类任务以往往往需要为每个场景单独设计网络结构和损失函数,而 pix2pix 提出用条件 GAN(cGAN)作为通用解决框架——同一套网络结构,换数据集训练就能迁移到不同任务。
为什么不直接用 L1/L2 损失
最直接的监督信号是像素级的 L1 或 L2 距离,让生成图像在每个像素上尽量接近目标。但这里有个根本问题:L1/L2 对每个像素取平均,当模型对某个像素的预测存在不确定性时,最优解是取所有可能值的均值,结果图像就会变得模糊。更准确地说,L1/L2 只能捕捉低频信息——大尺度的颜色分布和整体轮廓可以学好,但细节纹理(高频信息)在平均之后就消失了。
本文的核心观点是:GAN 其实是在学一种损失函数,一种结构化的损失。传统的 L1/L2 是非结构化损失,对图像生成这样的任务,每个像素仅依赖于输入像素,与其他像素无关;而 GAN 的判别器学到的结构化损失能感知像素之间的联系,更适合图像生成任务。
用 patchGAN 建模高频信息
既然低频靠 L1 就能解决,高频信息怎么处理?高频信息本质上是局部的,一小块区域内像素的对比和纹理的重复模式。要判断一张图像是否真实,很大程度上是在看局部纹理是否符合真实图像的统计特性。
本文因此不对整张图像做全局判断,而是把图像切分成 N×N 的 patch,对每个 patch 判断是否真实,最后取所有 patch 判断结果的平均作为整张图的得分,这就是 patchGAN 判别器。
实验表明,patch 尺寸不需要很大就能得到很好的效果,因为局部纹理的真实性本身是局部可判断的。这种做法实际上是把图像建模成了马尔科夫随机场——假设不同 patch 之间的像素相互独立,只有 patch 内部存在相关性。这个假设在纹理建模中很常用,所以 patchGAN 的 loss 相当于是纹理上的 loss。本文将 L1 和 patchGAN 结合使用:L1 负责低频结构,patchGAN 负责高频纹理。
噪声输入与随机性的问题
标准 GAN 中,生成器的随机性来自噪声向量。在 cGAN 中加入高斯噪声,理论上可以让输出覆盖更大的多样性。但本文发现,在条件输入 x 已经足够强的情况下,生成器会直接忽略掉噪声,无法产生实质性的随机性。
后来改用 dropout 来引入随机性,训练和测试阶段都开启,但结论依然相似:多样性非常有限。作者坦承,捕捉条件分布的完整熵是一件很困难的事,也是未来的努力方向。不加噪声的生成器只会拟合到一个 delta function,而不是学到真正的条件分布。
Batch Normalization 的用法
本文的生成器在推断时使用的是测试数据自身的 batch statistics,而非训练时积累的统计量。当 batch size 为 1 时,这等价于 Instance Normalization——每张图像独立归一化。这在图像生成任务中很有用。
实验结果
本文进行了很多实验,验证了框架在多种图像翻译任务上的有效性。