图像到图像的转换涉及到生成给定图像的新的合成版本,并进行特定的修改,例如将夏季风景转换为冬季风景。
训练图像到图像转换模型通常需要大量的配对示例数据集。这些数据集可能难以准备且成本高昂,在某些情况下甚至不可能,例如已故艺术家的画作照片。
CycleGAN 是一种无需配对示例即可自动训练图像到图像转换模型的技术。模型使用来自源域和目标域的图像集合以无监督方式进行训练,这些图像无需以任何方式关联。
这种简单的技术功能强大,在各种应用领域都取得了令人印象深刻的视觉效果,最值得注意的是将马的照片转换为斑马,反之亦然。
在这篇文章中,您将了解用于非配对图像到图像转换的 CycleGAN 技术。
阅读本文后,你将了解:
- 图像到图像的转换涉及图像的受控修改,需要大量难以准备或有时不存在的配对图像数据集。
- CycleGAN 是一种通过 GAN 架构使用来自两个不同领域的非配对图像集合来训练无监督图像转换模型的技术。
- CycleGAN 已在各种应用中得到演示,包括季节转换、物体变形、风格迁移以及从画作生成照片。
通过我的新书《使用 Python 的生成对抗网络》**启动您的项目**,其中包括**分步教程**和所有示例的 **Python 源代码**文件。
让我们开始吧。

CycleGAN 简介
图片来自 Trish Hartmann,保留部分权利。
概述
本教程分为五个部分;它们是:
- 图像到图像转换的问题
- 使用 CycleGAN 进行非配对图像到图像转换
- 什么是 CycleGAN 模型架构?
- CycleGAN 的应用
- CycleGAN 的实现技巧
图像到图像转换的问题
图像到图像转换是一种图像合成任务,需要生成一个经过受控修改的新图像。
图像到图像转换是一类视觉和图形问题,目标是使用对齐图像对的训练集来学习输入图像和输出图像之间的映射。
——《使用循环一致性对抗网络进行非配对图像到图像转换》,2017年。
图像到图像转换的例子包括:
- 将夏季风景转换为冬季风景(反之亦然)。
- 将画作转换为照片(反之亦然)。
- 将马转换为斑马(反之亦然)。
传统上,训练图像到图像转换模型需要一个包含配对示例的数据集。也就是说,需要一个包含大量输入图像 X(例如夏季风景)和具有所需修改的相同图像(可以作为预期输出图像 Y,例如冬季风景)的大型数据集。
对配对训练数据集的要求是一个限制。这些数据集的准备具有挑战性且成本高昂,例如在不同条件下拍摄的不同场景的照片。
在许多情况下,数据集根本不存在,例如著名画作及其各自的照片。
然而,获取配对训练数据可能困难且昂贵。[…] 对于艺术风格化等图形任务,获取输入-输出对可能更加困难,因为所需输出高度复杂,通常需要艺术创作。对于许多任务,如物体变形(例如,斑马 <-> 马),所需输出甚至没有明确定义。
——《使用循环一致性对抗网络进行非配对图像到图像转换》,2017年。
因此,人们渴望无需配对示例即可训练图像到图像转换系统的技术。具体来说,可以使用任何两个不相关图像的集合,并从每个集合中提取一般特征,并将其用于图像转换过程。
例如,能够获取大量夏季风景照片和大量冬季风景照片(场景和位置不相关)作为第一个位置,并能够将特定照片从一个组转换到另一个组。
这就是非配对图像到图像转换的问题。
想从零开始开发GAN吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
使用 CycleGAN 进行非配对图像到图像转换
CycleGAN 是一种用于非配对图像到图像转换的成功方法。
CycleGAN 是一种使用生成对抗网络(GAN)模型架构训练图像到图像转换模型的方法。
[…] 我们提出了一种方法,该方法可以学习 [捕捉] 一个图像集合的特殊特征,并找出如何将这些特征转换到另一个图像集合,所有这些都在没有任何配对训练示例的情况下完成。
——《使用循环一致性对抗网络进行非配对图像到图像转换》,2017年。
GAN 架构是一种用于图像合成模型训练的方法,它由两个模型组成:生成器模型和判别器模型。生成器以潜在空间中的点作为输入,生成来自该领域的新颖且合理的图像;判别器以图像作为输入,并预测它是真实的(来自数据集)还是伪造的(生成的)。两个模型都在一场博弈中进行训练,以便更新生成器以更好地欺骗判别器,并更新判别器以更好地检测生成的图像。
CycleGAN 是 GAN 架构的扩展,它涉及同时训练两个生成器模型和两个判别器模型。
一个生成器将第一个领域中的图像作为输入,并输出第二个领域中的图像;另一个生成器将第二个领域中的图像作为输入,并生成第一个领域中的图像。然后使用判别器模型来确定生成的图像的可信度,并相应地更新生成器模型。
仅靠这种扩展可能足以在每个域中生成可信的图像,但不足以生成输入图像的转换。
……仅靠对抗性损失不能保证学习到的函数能够将单个输入 xi 映射到期望的输出 yi
——《使用循环一致性对抗网络进行非配对图像到图像转换》,2017年。
CycleGAN 使用了架构的额外扩展,称为循环一致性。其思想是,第一个生成器输出的图像可以用作第二个生成器的输入,而第二个生成器的输出应该与原始图像匹配。反之亦然:第二个生成器的输出可以作为输入馈给第一个生成器,结果应该与第二个生成器的输入匹配。
循环一致性是机器翻译中的一个概念,即一个从英语翻译成法语的短语,再从法语翻译回英语,应该与原始短语相同。反向过程也应该如此。
……我们利用了翻译应该“循环一致”的特性,即如果我们翻译,例如,一个英语句子到法语,然后将其从法语翻译回英语,我们应该回到原始句子
——《使用循环一致性对抗网络进行非配对图像到图像转换》,2017年。
CycleGAN 通过添加额外的损失来鼓励循环一致性,以衡量第二个生成器的生成输出与原始图像之间的差异,反之亦然。这起到了生成器模型的正则化作用,引导新领域中的图像生成过程朝着图像转换的方向发展。
什么是 CycleGAN 模型架构?
乍一看,CycleGAN 的架构似乎很复杂。
让我们花点时间仔细研究一下所有涉及的模型及其输入和输出。
考虑一个我们对将夏季图像转换为冬季,以及将冬季图像转换为夏季感兴趣的问题。
我们有两个照片集,它们是非配对的,这意味着它们是不同地点、不同时间拍摄的照片;我们没有冬季和夏季完全相同的场景。
- **集合 1**:夏季风景照片。
- **集合 2**:冬季风景照片。
我们将开发一个包含两个 GAN 的架构,每个 GAN 都有一个判别器模型和一个生成器模型,这意味着架构中总共有四个模型。
第一个 GAN 将根据夏季照片生成冬季照片,第二个 GAN 将根据冬季照片生成夏季照片。
- **GAN 1**:将夏季照片(集合 1)转换为冬季照片(集合 2)。
- **GAN 2**:将冬季照片(集合 2)转换为夏季照片(集合 1)。
每个 GAN 都有一个条件生成器模型,它将根据输入图像合成图像。每个 GAN 都有一个判别器模型,用于预测生成的图像来自目标图像集合的可能性。GAN 的判别器和生成器模型在正常的对抗性损失下进行训练,就像标准的 GAN 模型一样。
我们可以将 GAN 1 的生成器和判别器模型总结如下:
- 生成器模型 1
- **输入**:接收夏季照片(集合 1)。
- **输出**:生成冬季照片(集合 2)。
- 判别器模型 1:
- **输入**:接收来自集合 2 的冬季照片和生成器模型 1 的输出。
- **输出**:图像来自集合 2 的可能性。
同样,我们可以将 GAN 2 的生成器和判别器模型总结如下:
- 生成器模型 2:
- **输入**:接收冬季照片(集合 2)。
- **输出**:生成夏季照片(集合 1)。
- 判别器模型 2:
- **输入**:接收来自集合 1 的夏季照片和生成器模型 2 的输出。
- **输出**:图像来自集合 1 的可能性。
到目前为止,这些模型足以在目标域中生成可信的图像,但它们不是输入图像的转换。
每个 GAN 也使用循环一致性损失进行更新。这旨在鼓励目标域中合成的图像是输入图像的转换。
循环一致性损失将输入到 CycleGAN 的照片与生成的照片进行比较,并计算两者之间的差异,例如使用 L1 范数或像素值的总绝对差。
有两种计算循环一致性损失并用于在每次训练迭代中更新生成器模型的方法。
第一个 GAN (GAN 1) 将接收一张夏季风景图像,生成一张冬季风景图像,该图像作为输入提供给第二个 GAN (GAN 2),后者又将生成一张夏季风景图像。循环一致性损失计算输入到 GAN 1 的图像与 GAN 2 输出的图像之间的差异,并相应地更新生成器模型以减少图像中的差异。
这是循环一致性损失的正向循环。相同的过程以反向方式进行,用于从生成器 2 到生成器 1 的反向循环一致性损失,并比较原始冬季照片与生成的冬季照片。
- 正向循环一致性损失:
- 夏季输入照片(集合 1)到 GAN 1
- GAN 1 输出的冬季照片
- GAN 1 输出的冬季照片输入到 GAN 2
- GAN 2 输出的夏季照片
- 比较夏季照片(集合 1)与 GAN 2 输出的夏季照片
- 反向循环一致性损失:
- 冬季输入照片(集合 2)到 GAN 2
- GAN 2 输出的夏季照片
- GAN 2 输出的夏季照片输入到 GAN 1
- GAN 1 输出的冬季照片
- 比较冬季照片(集合 2)与 GAN 1 输出的冬季照片
CycleGAN 的应用
CycleGAN 方法提出了许多令人印象深刻的应用。
在本节中,我们将回顾其中五个应用,以了解该技术的能力。
风格迁移
风格迁移是指从一个领域(通常是绘画)学习艺术风格,并将其应用于另一个领域(例如照片)。
CycleGAN 通过将 莫奈、梵高、塞尚 和 浮世绘 的艺术风格应用于风景照片来展示。

著名画家风格迁移到风景照片的例子。
摘自:使用循环一致对抗网络的非配对图像到图像转换。
物体变形
物体变形是指将一种类别的物体(例如狗)转换为另一种类别的物体(例如猫)。
CycleGAN 展示了将马的照片转换为斑马,以及反之:将斑马的照片转换为马。考虑到马和斑马在大小和结构上相似,只是颜色不同,这种变形是合理的。

马到斑马和斑马到马的物体变形示例。
摘自:使用循环一致对抗网络的非配对图像到图像转换。
CycleGAN 还展示了将苹果的照片转换为橙子,以及反之:将橙子的照片转换为苹果。
同样,这种变形是有意义的,因为橙子和苹果具有相同的结构和大小。

苹果到橙子和橙子到苹果的物体变形示例。
摘自:使用循环一致对抗网络的非配对图像到图像转换。
季节转换
季节转换是指将一个季节(例如夏季)拍摄的照片转换为另一个季节(例如冬季)。
CycleGAN 展示了将冬季风景照片转换为夏季风景照片,以及将夏季风景照片转换为冬季风景照片。

冬季到夏季和夏季到冬季的季节转换示例
摘自:使用循环一致对抗网络的非配对图像到图像转换。
从绘画生成照片
从绘画生成照片,顾名思义,是根据绘画(通常是著名艺术家或著名场景的绘画)合成逼真图像。
CycleGAN 展示了将莫奈的许多画作转换为可信的照片。

莫奈画作转换为逼真场景的示例。
摘自:使用循环一致对抗网络的非配对图像到图像转换。
照片增强
照片增强是指以某种方式改善原始图像的转换。
CycleGAN 展示了通过改善花卉特写照片的景深(例如,提供微距效果)来进行照片增强。

通过改善花卉照片景深进行照片增强的示例。
摘自:使用循环一致对抗网络的非配对图像到图像转换。
CycleGAN 的实现技巧
CycleGAN 论文提供了许多关于如何在实践中实现该技术的技术细节。
生成器网络的实现基于 Justin Johnson 在 2016 年题为“用于实时风格迁移和超分辨率的感知损失”的论文中描述的方法。
生成器模型从使用深度卷积 GAN 的生成器最佳实践开始,该 GAN 使用多个残差块(例如来自 ResNet)实现。
判别器模型使用 PatchGAN,如 Phillip Isola 等人在 2016 年题为“基于条件对抗网络的图像到图像转换”的论文中所述。
这个判别器试图将图像中的每个 NxN 块分类为真实或虚假。我们对图像进行卷积判别,并平均所有响应以提供 D 的最终输出。
——《使用条件对抗网络进行图像到图像翻译》,2016年。
判别器模型中使用 PatchGAN 将输入图像的 70×70 重叠块分类为属于该领域或已生成。然后将判别器输出作为每个块预测的平均值。
对抗性损失使用最小二乘损失函数实现,如 Xudong Mao 等人的 2016 年论文“最小二乘生成对抗网络”中所述。
[…] 我们提出了最小二乘生成对抗网络 (LSGANs),它采用最小二乘损失函数作为判别器。这个想法简单而强大:最小二乘损失函数能够将伪造样本推向决策边界,因为最小二乘损失函数惩罚那些在决策边界正确一侧很远的样本。
—— 最小二乘生成对抗网络,2016。
此外,根据 Ashish Shrivastava 2016 年题为“通过对抗性训练从模拟和无监督图像中学习”的论文所述,使用 50 个生成图像的缓冲区来更新判别器模型,而不是新鲜生成的图像。
[…] 我们引入了一种方法,通过使用精炼图像的历史(而不仅仅是当前小批量中的图像)来更新判别器,从而提高对抗性训练的稳定性。
— 通过对抗性训练从模拟和无监督图像中学习,2016。
模型使用 Adam 版本的随机梯度下降和较小的学习率训练 100 个 epoch,然后使用学习率衰减再训练 100 个 epoch。模型在每张图像之后更新,例如批量大小为 1。
论文附录中提供了有关该技术所演示的每个数据集的额外模型特定详细信息。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 使用循环一致对抗网络的未配对图像到图像转换, 2017.
- 用于实时风格迁移和超分辨率的感知损失, 2016.
- 使用条件对抗网络进行图像到图像翻译, 2016.
- 最小二乘生成对抗网络, 2016.
- 通过对抗性训练从模拟和无监督图像中学习, 2016.
文章
总结
在这篇文章中,您了解了用于非配对图像到图像转换的 CycleGAN 技术。
具体来说,你学到了:
- 图像到图像的转换涉及图像的受控修改,需要大量难以准备或有时不存在的配对图像数据集。
- CycleGAN 是一种通过 GAN 架构使用来自两个不同领域的非配对图像集合来训练无监督图像转换模型的技术。
- CycleGAN 已在各种应用中得到演示,包括季节转换、物体变形、风格迁移以及从画作生成照片。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
您在写一本关于强化学习的书吗?
谢谢提问。我希望将来能涵盖这个主题。
你好,想知道你现在有没有。
我在这里有一些关于这个话题的想法
https://machinelearning.org.cn/faq/single-faq/do-you-have-tutorials-on-deep-reinforcement-learning
你好,Jason
是不是有打字错误?
一个生成器将来自第一个域的图像作为输入并输出第二个域的图像,而另一个生成器将来自第二个域的图像作为输入并生成来自第一个域的图像
也许是
一个生成器将来自第一个域的图像作为输入并输出第二个域的图像,而另一个生成器将来自第二个域的图像作为输入并生成用于第一个域的图像
祝好
谢谢,但是哪里有错别字?我没看到?
您写道:
第二个域作为输入并生成来自第一个域的图像
我想是
第二个域作为输入并生成用于第一个域的图像
“from the first domain” 中的“from”替换为“for”
我说的对吗?
是的,谢谢!
已修复。
这是否可能用于使用波形图片或原始数据的音频合成器?有人在合成器论坛上提到这可能是一个更新。我查了 CycleGAN,得到了这个非常有用的解释。感谢您的帮助!
抱歉,我不太了解 GAN 在音频方面的应用。我希望将来能深入研究。
CycleGAN 是否可以实现多类别图像(例如人与动物)的图像到图像转换?例如,它能否将夜晚的人与动物的单独图像转换为白天的人与动物的图像?
也许吧。我还没见过这种情况,但我的直觉告诉我,这种架构可能可以扩展到 n 对。
我正在使用 Github 上的 pytorch-CycleGAN-and-pix2pix 实现。本质上,我有两个数据集,每个数据集都包含人物和另一个类别。我想知道是否可以在两个数据集域之间进行图像到图像的转换,同时也能可靠地生成每个类别。
如果不同域的类之间存在一对一关系,那么也许可以为每个类拟合一个模型?
你好,杰森,写得真棒。CycleGAN 是否需要来自不同域的图像集数量相等?如果我有两个数据集,它们的图像数量不成比例,怎么办?
谢谢!
不是数量相等,而是不同领域中图像数量大致相同。更具体地说,是领域覆盖范围相同。
如果不是,无论如何都要尝试一下,看看会发生什么。
Cycle GAN 是将人类图像从一个区域转换为另一个区域(例如印度人转换为中国人)的最佳方法吗?
对于任何机器学习问题,都没有“最佳”方法。
CycleGAN 是一个不错的开始。
一篇好文章,但它非常需要一些澄清图表来解释概念。
感谢您的建议。
你好,杰森。一如既往的精彩文章。我在一篇文章中读到 CycleGAN 生成低分辨率图像,而 NVIDIA 开发了一种名为 ProGAN 的技术,可以生成高分辨率图像。所以,我想知道 ProGAN 是否可以用于图像到图像的转换。或者说,是否只有某些 GAN 被设计用于图像到图像的转换任务。
你指的是渐进式增长 GAN 吗?
https://machinelearning.org.cn/introduction-to-progressive-growing-generative-adversarial-networks/
是的,它是否可以用于图像到图像的转换,以及它是否需要配对、非配对数据或两者兼而有之。
标准实现只用于图像生成。
可能存在用于图像转换的扩展,我暂时不清楚。
嗨!很棒的教程!
你能推荐一个适合初学者的、包含 GANs 代码实现的大学作业教程吗?网上有很多,但我想从一些直接的开始,最好是 Keras。
感谢您的出色工作,它对我帮助很大!
是的,就在这里
https://machinelearning.org.cn/how-to-develop-a-generative-adversarial-network-for-a-1-dimensional-function-from-scratch-in-keras/
我有一个关于数据集的问题。如果数据是非配对的,那么两个不同集合中的数据数量需要相同吗?
并不是真的。
我正在 Google Cloud 上运行模型(8 核 CPU,64GB 内存,无 GPU)。它花费的时间太多了(每分钟最多迭代三次),所以需要很多天才能完成。我该怎么办?
这可能有帮助
https://machinelearning.org.cn/faq/single-faq/how-do-i-speed-up-the-training-of-my-model
太棒的解释
谢谢!
嗨,Jason,
感谢您的清晰解释。我知道原始论文是为一对一转换而构建的,但我想知道是否有可能通过操纵生成器的 z 向量输入(使用预训练分类器)来控制输出。例如,如果我将一个源(苹果)训练到多个目标(橙子和梨的图像作为一个数据集中的一个目标),并训练一个分类器来区分每个目标(橙子和梨),是否有可能控制我们想要的目标输出。我只是想知道这种模型的结构是否允许这样做?
我见过对普通 GANs 进行的可控生成,但找不到有人将其用于 CycleGANs。
我从没尝试过,但你描述的听起来是对的。
谢谢回复!
我提出这个问题是因为文章中提到,对于GAN架构,“生成器从一个潜在空间中获取一个点作为输入,并从该域生成新的合理图像”,而对于CycleGAN架构,“一个生成器从第一个域获取图像作为输入,并输出第二个域的图像”,所以我试图理解CycleGAN架构中是否存在潜在空间。
您有没有看到任何解释这方面的资源?
是的,CycleGAN是一种更高级的GAN,例如条件GAN。
请看这个例子
https://machinelearning.org.cn/cyclegan-tutorial-with-keras/
你好,
感谢这篇精彩的文章。我在哪里可以找到它的实现?
请参阅 https://machinelearning.org.cn/cyclegan-tutorial-with-keras/
假设我想把夜间图像转换成白天图像,那么我就不需要成对的白天和夜间图像了。我可以使用任何白天数据集和任何夜间数据集吗?
你好David……你可能会对以下资源感兴趣
https://www.researchgate.net/publication/338437759_GAN-Based_Day-to-Night_Image_Style_Transfer_for_Nighttime_Vehicle_Detection
https://github.com/chrispmaag/cycle_gan