目录
介绍
CycleGAN模型
CycleGAN生成器
CycleGAN鉴别器
CycleGAN损失函数
下一步
在本系列文章中,我们将展示一个基于循环一致对抗网络(CycleGAN)的移动图像到图像转换系统。我们将构建一个CycleGAN,它可以执行不成对的图像到图像的转换,并向您展示一些有趣但具有学术深度的例子。我们还将讨论如何将这种使用TensorFlow和Keras构建的训练有素的网络转换为TensorFlow Lite并用作移动设备上的应用程序。
我们假设您熟悉深度学习的概念,以及Jupyter Notebooks和TensorFlow。欢迎您下载项目代码。
在本系列的前一篇文章中,我们讨论了条件生成对抗网络(CGAN)的概念。在本文中,我们将仔细研究CycleGAN结构,解释它的工作原理,并展示如何使用TensorFlow和Keras实现它。
CycleGAN模型能够训练深度卷积神经网络(深度CNN),通过映射来自未配对数据集的输入和输出图像来执行图像到图像的转换。网络学习如何使用一组训练图像将输入图像映射到输出图像。
典型的CycleGAN架构包括两个生成器和两个鉴别器,它们使用相同的模型同步工作以将图像从源域映射到目标域,反之亦然。下图显示了一个简单的CycleGAN架构。
我们将以马到斑马的转换为例来解释CycleGAN的工作机制和训练。
正如您在上图中看到的,该网络有两个生成器(GAB和GBA)和两个鉴别器(DA和DB)。GAB为第一个域(域A)生成图像。换句话说,它将图像从域A转换到域B——从马到斑马。第二个生成器 GBA为第二个域(域B)生成图像。换句话说,它将图像从域B转换为域A——从斑马到马。
每个生成器都有一个相应的鉴别器,用于检测生成的图像是真还是假。DA检测由GAB生成的图像,而DB检测由GBA生成的图像。
所以我们有两个映射函数——G和F:
A表示来自域A的图像,B表示来自域B的所需输出图像。
CycleGAN生成器是一个自动编码器,它获取输入图像,从中提取特征,然后生成另一个图像。生成器网络由三个主要阶段组成:
编码器阶段包括三个2D卷积层,后面是一个实例归一化层和一个激活函数(ReLU)。编码器使用卷积从输入图像中提取特征,将表示减少了输入图像大小的25%。
编码器输出通过主要由6到9个残差块组成的变压器级。每个块是一组2D卷积层,每两层后跟一个具有动量的实例归一化层。
转换器输出将通过解码器级,解码器级由两个上采样块组成。每个上采样块都是一个转置卷积层,后跟一个ReLU激活函数。这两个反卷积块将来自转换器的已处理图像的表示大小增加到其原始值。
生成器具有使用tanh激活函数的最终2D卷积层。该层允许生成大小等于原始输入图像大小的图像。
CycleGAN鉴别器是典型的CNN,包括多个卷积层。该网络采用输入图像并将其分类为真或假。CycleGAN鉴别器与常规GAN中使用的鉴别器不同。后者将输入从256 x 256图像映射到单个标量输出,表示“真”或“假”。CycleGAN鉴别器从256 x 256图像映射到N x N输出数组X。在该数组中,每个X ij表示图像中的补丁ij是真的还是假的。下图显示了CycleGAN鉴别器的典型架构。
CycleGAN有两个损失函数:
Adversarial Loss:这种损失类似于常规GAN中使用的损失。然而,在CycleGAN中,对抗性损失应用于试图生成其相应域的图像的两个生成器。生成器旨在最小化其鉴别器的损失,以最终生成真实图像。对抗性损失计算如下:
其中G是“X到Y”域,F是“Y到X”的逆域。D x和D y是鉴别器。
Cycle-Consistency Loss:要理解这种损失,我们首先应该了解CycleGAN中实践的循环一致性方法。这种方法最早是在CycleGAN文章中提出的,它表示逆映射,F:Y→X。循环一致性旨在使映射图像的逆映射产生与原始图像相同的结果。换句话说,如果我们想把一个图像从马转换成斑马,然后再从斑马转换回马,我们应该得到初始图像。
CycleGAN使用两个循环一致性损失来正则化映射:
计算这两个是为了确保如果图像从一个域转换到另一个域(A到B)然后返回(B到A),将获得相同的结果。
在接下来的文章中,我们将向您展示如何实现使用Keras框架CycleGAN。
https://www.codeproject.com/Articles/5304920/Using-CycleGAN-for-Mobile-Style-Transfer