CycleGAN: 图像翻译的循环一致对抗网络

在本文中,将构建一个能够执行未配对图像到图像翻译的CycleGAN,并展示一些既有趣又具有学术深度的例子。此外,还将讨论如何将使用TensorFlowKeras构建的这种训练网络转换为TensorFlow Lite,并在移动设备上作为应用程序使用。假设熟悉深度学习的概念,以及Jupyter Notebooks和TensorFlow。欢迎下载项目代码。

在本系列的中,讨论了条件生成对抗网络(CGAN)的概念。在本文中,将更详细地了解CycleGAN的结构,解释其工作原理,并展示如何使用TensorFlowKeras实现它。

CycleGAN模型

CycleGAN模型使训练深度卷积神经网络(deep CNN)进行图像到图像的翻译成为可能,通过映射来自未配对数据集的输入和输出图像。网络学习如何使用图像训练集将输入图像映射到输出图像。

典型的CycleGAN架构包括两个生成器和两个鉴别器,它们同步工作,使用相同的模型将图像从源域映射到目标域,反之亦然。下面的图表显示了一个简单的CycleGAN架构。

将使用马到斑马的翻译作为示例来解释CycleGAN的工作机制和训练。如在上图中所见,网络有两个生成器(GAB和GBA)和两个鉴别器(DA和DB)。GAB为第一个域(域A)生成图像。换句话说,它将域A的图像转换为域B的图像——从马到斑马。第二个生成器,GBA,为第二个域(域B)生成图像。换句话说,它将域B的图像转换为域A的图像——从斑马到马。

每个生成器都有一个相应的鉴别器,用于检测生成的图像是真实的还是伪造的。DA检测由GAB生成的图像,而DB检测由GBA生成的图像。

因此,有两个映射函数——G和F:

G: A→B F: B→A

A代表来自域A的图像,B代表来自域B的期望输出图像。

CycleGAN生成器

CycleGAN生成器是一个自编码器,它接收一个输入图像,从中提取特征,并生成另一个图像。生成器网络由三个主要阶段组成:

  • 编码器(卷积块)
  • 变换器(残差块)
  • 解码器(转置卷积块)

编码器阶段包括三个2D卷积层,后面跟着一个实例归一化层和一个激活函数(ReLU)。编码器使用卷积从输入图像中提取特征,将表示大小减少到输入图像大小的25%。

编码器的输出通过变换器阶段,该阶段主要由6到9个残差块组成。每个块是一组2D卷积层,每两层后面跟着一个具有动量的实例归一化层。

变换器的输出将通过解码器阶段,该阶段由两个上采样块组成。每个上采样块是一个转置卷积层,后面跟着一个ReLU激活函数。这两个反卷积块将来自变换器的处理图像的表示大小增加到其原始值。

生成器以一个最终的2D卷积层为特色,该层使用tanh激活函数。这一层允许生成与原始输入图像大小相等的图像。

CycleGAN鉴别器

CycleGAN鉴别器是一个典型的CNN,包括多个卷积层。这个网络接收一个输入图像,并将其分类为真实或伪造。CycleGAN鉴别器与常规GAN中使用的鉴别器不同。后者将输入从256x256的图像映射到一个单一的标量输出,代表“真实”或“伪造”。CycleGAN鉴别器将从256x256的图像映射到一个NxN的输出数组X。在该数组中,每个Xij表示图像中ij块是真实还是伪造。下面的图表显示了CycleGAN鉴别器的典型架构。

CycleGAN损失函数

CycleGAN有两个损失函数:

  • 对抗损失
  • 循环一致性损失

对抗损失:这种损失与常规GAN中使用的那种类似。然而,在CycleGAN中,对抗损失应用于两个生成器,它们试图生成它们相应域的图像。一个生成器的目标是最小化与其鉴别器的损失,以便最终生成真实图像。对抗损失的计算如下:

Adversarial Loss = log(D_x) + log(1 - D_y(G_y(X))) + log(1 - D_x(G_x(X)))

其中G是“X到Y”域,F是逆“Y到X”域。D_x和D_y是鉴别器。

循环一致性损失:要理解这种损失,首先应该理解CycleGAN中实践的循环一致性方法。这种方法最初在CycleGAN文章中提出,它代表了逆映射F: Y→X。循环一致性旨在使映射图像的逆映射产生与原始图像相同的结果。换句话说,如果想将图像从马转换为斑马,然后将其从斑马转换回马,应该得到初始图像。

CycleGAN使用两个循环一致性损失来规范映射:

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485