65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 CycleGAN 进行移动风格迁移

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (2投票s)

2021年6月15日

CPOL

5分钟阅读

viewsIcon

6620

downloadIcon

83

在本文中,我们将讨论CycleGAN架构。

引言

在本系列文章中,我们将介绍一个基于循环一致对抗网络(CycleGAN)的移动图像到图像翻译系统。我们将构建一个可以执行无配对图像到图像翻译的CycleGAN,并向您展示一些有趣且具有学术深度的示例。我们还将讨论如何将使用TensorFlow和Keras构建的训练好的网络转换为TensorFlow Lite,并在移动设备上作为应用程序使用。

我们假定您熟悉深度学习的概念,以及Jupyter Notebooks和TensorFlow。欢迎您下载项目代码。

本系列的上一篇文章中,我们讨论了条件生成对抗网络(CGAN)的概念。在本文中,我们将更仔细地研究CycleGAN的结构,解释它的工作原理,并展示如何使用TensorFlow和Keras实现它。

CycleGAN模型

CycleGAN模型通过映射来自无配对数据集的输入和输出图像,使深度卷积神经网络(深度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)。编码器使用卷积从输入图像中提取特征,将表示大小减小到输入图像大小的75%。

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

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

生成器具有一个最终的2D卷积层,该层使用tanh激活函数。此层允许生成与原始输入图像大小相同的图像。

CycleGAN判别器

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

CycleGAN损失函数

CycleGAN有两个损失函数:

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

对抗损失:此损失与常规GAN中使用的损失相似。然而,在CycleGAN中,对抗损失应用于两个试图生成各自域图像的生成器。生成器旨在最小化与其判别器的损失,以最终生成真实的图像。对抗损失计算如下:

其中G是“X到Y”域,F是逆向“Y到X”域。Dx和Dy是判别器。

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

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

  • 前向循环一致性损失
  • 后向循环一致性损失

计算这两个损失是为了确保如果一幅图像从一个域(A到B)翻译到另一个域,然后再翻译回来(B到A),将获得相同的结果。

后续步骤

下一篇文章中,我们将展示如何使用Keras框架实现CycleGAN。敬请关注!

© . All rights reserved.