图像到图像的翻译是将给定源图像转换为目标图像的可控转换。
一个例子可能是将黑白照片转换为彩色照片。
图像到图像的翻译是一个具有挑战性的问题,通常需要为给定的翻译任务或数据集开发专门的模型和损失函数。
Pix2Pix GAN 是图像到图像翻译的一种通用方法。它基于条件生成对抗网络,其中目标图像是基于给定输入图像生成的。在这种情况下,Pix2Pix GAN 更改了损失函数,使得生成的图像既在目标域的内容上是合理的,又是输入图像的一种合理翻译。
在本篇文章中,您将了解用于图像到图像翻译的 Pix2Pix 条件生成对抗网络。
阅读本文后,你将了解:
- 图像到图像的翻译通常需要专门的模型和手动设计的损失函数。
- Pix2Pix GAN 为图像到图像的翻译提供了一个通用模型和损失函数。
- Pix2Pix GAN 已在多种图像生成任务中得到演示,包括将照片从白天转换为夜晚,以及将产品草图转换为照片。
开始您的项目,阅读我的新书 《Python 生成对抗网络》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。
概述
本教程分为五个部分;它们是:
- 图像到图像翻译的问题
- 用于图像到图像翻译的 Pix2Pix GAN
- Pix2Pix 架构细节
- Pix2Pix GAN 的应用
- Pix2Pix 架构选择的见解
图像到图像翻译的问题
图像到图像的翻译是指以特定或受控的方式改变给定图像的问题。
例如,包括将白天风景照片转换为夜景照片,或将分割图像转换为照片。
类比自动语言翻译,我们将自动图像到图像翻译定义为,在有足够的训练数据的情况下,将场景的一种可能表示转换为另一种表示的任务。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
这是一个具有挑战性的问题,通常需要为所执行的翻译任务类型开发专门的模型和手动设计的损失函数。
经典方法使用逐像素分类或回归模型,这些模型的问题在于,每个预测的像素都独立于之前预测的像素,并且可能会忽略图像的整体结构。
图像到图像的翻译问题通常被表述为逐像素分类或回归。这些表述将输出空间视为“无结构”,因为给定输入图像,每个输出像素都被认为与其他像素条件独立。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
理想情况下,需要一种通用的技术,这意味着同一个通用模型和损失函数可以用于多个不同的图像到图像翻译任务。
想从零开始开发GAN吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
用于图像到图像翻译的 Pix2Pix GAN
Pix2Pix 是一种生成对抗网络 (GAN) 模型,专为通用图像到图像翻译而设计。
该方法由 Phillip Isola 等人在其 2016 年论文“Conditional Adversarial Networks 的图像到图像翻译”中提出,并于 2017 年在 CVPR 上发表。
GAN 架构是一种用于训练生成器模型的方法,通常用于生成图像。判别器模型被训练来将图像分类为真实(来自数据集)或虚假(生成的),而生成器被训练来欺骗判别器模型。
条件 GAN(cGAN)是 GAN 架构的一个扩展,它提供了对生成图像的控制,例如允许生成给定类别的图像。Pix2Pix GAN 是 cGAN 的一种实现,其中图像的生成是以给定图像为条件的。
正如 GAN 学习数据的生成模型一样,条件 GAN (cGAN) 学习条件生成模型。这使得 cGAN 适用于图像到图像的翻译任务,在这些任务中,我们以输入图像为条件并生成相应的输出图像。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
生成器模型接收给定图像作为输入,并生成该图像的翻译版本。判别器模型接收输入图像以及真实或生成的配对图像,并必须确定配对图像是真实的还是虚假的。最后,生成器模型被训练以欺骗判别器模型并最小化生成图像与预期目标图像之间的损失。
因此,Pix2Pix GAN 必须在由输入图像(翻译前)和输出或目标图像(翻译后)组成的图像数据集上进行训练。
这种通用架构允许 Pix2Pix 模型针对一系列图像到图像翻译任务进行训练。
Pix2Pix 架构细节
Pix2Pix GAN 架构涉及生成器模型、判别器模型和模型优化程序的仔细规范。
生成器和判别器模型都使用标准的卷积-批归一化-ReLU 层块,这对于深度卷积神经网络来说很常见。具体的层配置在论文的附录中提供。
生成器和判别器都使用卷积-BatchNorm-ReLu 形式的模块。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
让我们更仔细地看看这两种模型架构以及用于优化模型权重的损失函数。
U-Net 生成器模型
生成器模型以图像作为输入,与传统的 GAN 模型不同,它不以潜在空间中的一个点作为输入。
相反,随机性的来源是 dropout 层的使用,这些层在训练期间和进行预测时都会使用。
相反,对于我们的最终模型,我们仅以 dropout 的形式提供噪声,将其应用于我们生成器的多个层,在训练和测试时都如此。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
- 输入:来自源域的图像
- 输出:目标域的图像
使用 U-Net 模型架构作为生成器,而不是常见的编码器-解码器模型。
编码器-解码器生成器架构涉及以图像作为输入,并在几层上进行下采样,直到一个瓶颈层,然后表示在几层上再次上采样,最后输出所需尺寸的最终图像。
U-Net 模型架构非常相似,它涉及下采样到瓶颈层,然后再次上采样到输出图像,但会在编码器和解码器中相同大小的层之间建立链接或跳跃连接,从而绕过瓶颈。
对于许多图像翻译问题,输入和输出之间存在大量的低级信息共享,直接将这些信息通过网络传递将是理想的。[…] 为了让生成器能够绕过瓶颈来处理这类信息,我们添加了跳跃连接,遵循“U-Net”的大致形状。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
例如,编码器的第一层与解码器的最后一层具有相同大小的特征图,并与解码器合并。这会与编码器中的每一层和解码器中对应的层重复,形成一个 U 形模型。

编码器-解码器生成器和 U-Net 生成器模型的示意图。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
PatchGAN 判别器模型
判别器模型接收来自源域的图像和来自目标域的图像,并预测目标域中的图像是源图像的真实版本还是生成版本的可能性。
- 输入:来自源域的图像,以及来自目标域的图像。
- 输出:目标域的图像是源图像真实翻译的概率。
判别器模型的输入突出了在训练模型时拥有由配对的源图像和目标图像组成的图像数据集的必要性。
与使用深度卷积神经网络对图像进行分类的传统 GAN 模型不同,Pix2Pix 模型使用 PatchGAN。这是一个深度卷积神经网络,旨在对输入图像的块进行分类,而不是对整个图像进行分类。
……我们设计了一个判别器架构——我们称之为 PatchGAN——它只惩罚图像块级别的结构。这个判别器尝试对图像中的每个 NxN 块是真实还是虚假进行分类。我们将这个判别器卷积地运行在图像上,平均所有响应以提供 D 的最终输出。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
PatchGAN 判别器模型被实现为深度卷积神经网络,但层数配置使得网络的每个输出的有效感受野映射到输入图像中的特定大小。网络的输出是单个实/假预测特征图,可以将其平均以获得单个分数。
在各种图像到图像翻译任务中,70×70 的块大小被发现是有效的。
复合对抗损失和 L1 损失
判别器模型以独立的方式进行训练,与传统的 GAN 模型相同,最小化识别真实和虚假图像的负对数似然,尽管是基于源图像的条件。
判别器的训练速度相对于生成器过快,因此将判别器损失减半以减慢训练过程。
- 判别器损失 = 0.5 * 判别器损失
生成器模型使用对抗损失(用于判别器模型)以及生成图像的翻译与预期目标图像之间的 L1 或平均绝对像素差来训练。
对抗损失和 L1 损失被组合成一个复合损失函数,用于更新生成器模型。L2 损失也进行了评估,发现会导致图像模糊。
判别器的任务保持不变,但生成器的任务不仅是欺骗判别器,还要在 L2 意义上接近地面真实输出。我们也探索了此选项,使用 L1 距离而非 L2,因为 L1 鼓励更少的模糊。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
对抗损失影响生成器模型是否能输出在目标域中合理的图像,而 L1 损失正则化生成器模型以输出输入图像的合理翻译的图像。因此,L1 损失与对抗损失的组合由新超参数 lambda 控制,lambda 设置为 10,例如,在训练期间,L1 损失的重要性是生成器对抗损失的 10 倍。
- 生成器损失 = 对抗损失 + Lambda * L1 损失
Pix2Pix GAN 的应用
Pix2Pix GAN 在一系列有趣的图像到图像翻译任务中得到了演示。
例如,论文列出了九个应用;它们是
- 语义标签 <-> 照片,在 Cityscapes 数据集上训练。
- 建筑标签 -> 照片,在 Facades 上训练。
- 地图 <-> 航拍照片,在从 Google Maps 抓取的数据上训练。
- 黑白 -> 彩色照片。
- 边缘 -> 照片。
- 草图 -> 照片。
- 白天 -> 夜晚照片。
- 热成像 -> 彩色照片。
- 带有缺失像素的照片 -> 修复的照片,在 Paris StreetView 上训练。
在本节中,我们将回顾一些从论文中提取的示例。
语义标签到照片
下面的示例演示了语义标记图像到城市街道场景照片的翻译。

Pix2Pix GAN 将语义图像翻译为城市景观照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
另一个例子演示了建筑立面的语义标记图像到照片的翻译。

Pix2Pix GAN 将语义图像翻译为建筑立面照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
白天到夜晚的照片
下面的示例演示了白天照片到夜晚照片的翻译。

Pix2Pix GAN 将白天照片翻译为夜晚照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
产品草图到照片
下面的示例演示了包袋产品草图到照片的翻译。

Pix2Pix GAN 将包袋产品草图翻译为照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
还有类似的例子,例如将鞋子草图翻译为照片。

Pix2Pix GAN 将鞋子产品草图翻译为照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
照片修复
下面的示例演示了巴黎街景照片的修复。

Pix2Pix GAN 修复巴黎街景照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
热成像到彩色照片
下面的示例演示了热成像到街景彩色照片的翻译。

Pix2Pix GAN 将热成像翻译为彩色照片。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
Pix2Pix 架构选择的见解
作者们探索并分析了不同模型配置和损失函数对图像质量的影响,支持了架构选择。
这些实验的结果阐明了为什么 Pix2Pix 方法在广泛的图像翻译任务中如此有效。
损失函数分析
进行了实验比较用于训练生成器模型的不同损失函数。
这些包括仅使用 L1 损失,仅使用条件对抗损失,仅使用无条件对抗损失,以及 L1 与每个对抗损失的组合。
结果很有趣,表明单独使用 L1 和条件对抗损失可以生成合理的图像,尽管 L1 图像模糊,而 cGAN 图像引入了伪影。两者的结合产生了最清晰的结果。
仅 L1 会产生合理但模糊的结果。单独的 cGAN [...] 会产生更清晰的结果,但在某些应用中会引入视觉伪影。将两者相加(lambda = 100)可以减少这些伪影。
— 《Conditional Adversarial Networks 的图像到图像翻译》,2016 年。

使用 L1、条件对抗 (cGAN) 和复合损失函数生成的图像。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
生成器模型分析
将 U-Net 生成器模型架构与更常见的编码器-解码器生成器模型架构进行了比较。
这两种方法都与仅 L1 损失和 L1 + 条件对抗损失进行了比较,结果表明编码器-解码器在这两种情况下都能生成图像,但在使用 U-Net 架构时图像更清晰。
在我们的实验中,编码器-解码器无法学会生成逼真的图像。U-Net 的优势似乎不特定于条件 GAN:当 U-Net 和编码器-解码器都使用 L1 损失进行训练时,U-Net 再次取得了更好的结果。
——《使用条件对抗网络进行图像到图像翻译》,2016年。

在不同损失下使用编码器-解码器和 U-Net 生成器模型生成的图像。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
判别器模型分析
进行了实验,比较了具有不同有效感受野大小的 PatchGAN 判别器。
测试了从 1×1 感受野或 PixelGAN,到完整的 286×286 或 ImageGAN,以及较小的 16×16 和 70×70 PatchGANs 的模型版本。
感受野越大,网络越深。这意味着 1×1 PixelGAN 是最浅的模型,而 286×286 ImageGAN 是最深的模型。
结果表明,非常小的感受野可以生成有效的图像,尽管完整尺寸的 ImageGAN 提供了更清晰的结果,但更难训练。使用较小的 70×70 感受野在性能(模型深度)和图像质量方面提供了良好的折衷。
70×70 PatchGAN [...] 取得了略微更好的分数。扩展到完整的 286×286 ImageGAN,似乎并没有提高视觉质量 [...] 这可能是因为 ImageGAN 具有比 70 x 70 PatchGAN 多得多的参数和更深的深度,并且可能更难训练。
——《使用条件对抗网络进行图像到图像翻译》,2016年。

使用具有不同感受野大小的 PatchGANs 生成的图像。
摘自:《Conditional Adversarial Networks 的图像到图像翻译》。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- 使用条件对抗网络进行图像到图像翻译, 2016.
- 使用条件对抗网络进行图像到图像翻译,主页.
- 使用条件对抗网络进行图像到图像翻译,GitHub.
- pytorch-CycleGAN-and-pix2pix,GitHub.
- 交互式图像到图像演示, 2017.
- Pix2Pix 数据集
总结
在本篇文章中,您了解了用于图像到图像翻译的 Pix2Pix 条件生成对抗网络。
具体来说,你学到了:
- 图像到图像的翻译通常需要专门的模型和手动设计的损失函数。
- Pix2Pix GAN 为图像到图像的翻译提供了一个通用模型和损失函数。
- Pix2Pix GAN 已在多种图像生成任务中得到演示,包括将照片从白天转换为夜晚,以及将产品草图转换为照片。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你似乎忘了数据?或者我的意思是至少在你无法获得大量测试数据的情况下。快速搜索一下,这里有一篇关于如何生成测试数据的指南 http://www.mlguides.com/guides/data-analysis/generate-test-data-machine-learning-python-using-scikit-learn/
我相信这在未来是可行的。这样一来,任何无法获得大型数据集的人都可以进行机器学习项目。我认为对 AI 感兴趣的人越多越好。
那个教程有助于生成 GAN 数据吗?
我持怀疑态度,因为 sklearn 不支持 GAN。
我在这里展示了如何开发测试数据
https://machinelearning.org.cn/generate-test-datasets-python-scikit-learn/
非常感谢,解释得很棒
你好,但我需要低分辨率到高分辨率图像的代码,考虑到我的图像尺寸是 32*32,在 GAN 网络中。我想要高质量的,就像 500*500,没有像素失真。请问你能给我发一个链接吗?谢谢!
这被称为超分辨率。我希望将来能介绍它。
你能告诉我如何进行 pix2pix 的超参数调整吗?我们是针对 L1 损失进行优化吗?
是的,测试不同的模型、训练方案、数据预处理,甚至是不同的损失函数等等。发挥创意!
我正在将 cgan 用于医学图像分割。我使用了 dice_loss 而不是 l1_loss 作为生成器输出损失。
total_gan_loss = gan_loss_due_to_discriminator + 100* l1_loss( input , target_mask )
我总是得到黑色的图像(即没有输出掩码)。我观察到判别器损失收敛到零。你能告诉我任何可能的原因吗?谢谢。
不太确定,也许是你的损失函数。你必须自己尝试/调试你的代码。
如何使用 Keras 实现 L1 损失?
我读了你在另一篇文章中关于 Pix2pix 实现的教程,那里只有 dloss1、dloss2 和 gloss。没有 L1loss。
你能帮我理解一下吗?
谢谢你。
L2 损失:'mse'
L1 损失:'mae'
感谢这篇文章。问题:您是否尝试过逐像素反向传播损失(输出中每个像素的绝对误差)与所有像素的平均绝对误差 MAE 相比?
Jay
这本质上不就是 L1 损失吗?
什么?!我很困惑。我无法创作逼真的艺术品,如果我能的话,我就不需要这个网站了。但它仍然很好!
你好,我正在将 pix2pix 架构用于“带有缺失像素的照片 -> 修复的照片,在 Paris StreetView 上训练”的任务。
我想知道,在输入图像中,使用从噪声分布采样的缺失像素是否比具有所有白色像素更好?对我来说,这似乎更合理,因为它更接近经典 GAN 的行为。
谢谢
你好 Paolo……你的理解是正确的!请继续你的建议,并让我们知道你的发现。