深度学习:CycleGAN图像风格迁移转换

目录

基础概念

模型工作流程

循环一致性

几个基本概念

假图像(Fake Image)

重建图像(Reconstructed Image)

身份映射图像(Identity Mapping Image)

CyclyGAN损失函数

对抗损失

身份鉴别损失

CycleGAN的应用

基于MindSpore的CycleGAN

数据集

生成器的基本架构

构建生成器基本块

 定义ResNet的残差块

定义基于ResNet的生成器

定义判别器

定义优化器和损失函数

前向计算

梯度计算和反向传播

模型训练

模型推理


基础概念

CycleGAN是一种GAN的变体,它被设计用来在没有成对训练数据的情况下学习两种不同域之间的图像到图像的转换,不需要同一场景或物体在两个不同域中的对应图像。

CycleGAN由Jun-Yan Zhu等人在2017年提出。

CycleGAN的模型架构主要由两组生成器和判别器组成,每组负责一个方向上的图像转换。

具体来说,假设我们有两个不同的图像领域X(比如马的照片)和Y(比如斑马的照片),那么CycleGAN将包含以下组件:

  1. 生成器G:负责将图像从领域X转换到领域Y。
  2. 生成器F:负责将图像从领域Y转换回领域X。
  3. 判别器DY:用于区分领域Y中的真实图像与通过生成器G从领域X转换来的假图像。
  4. 判别器DX:用于区分领域X中的真实图像与通过生成器F从领域Y转换来的假图像。

模型工作流程

  • 当一张来自领域X的图片x被输入到生成器G时,它会产生一张看起来像是属于领域Y的图片G(x)。
  • 判别器DY会尝试判断G(x)是否是真实的领域Y图片。
  • 同样地,当一张来自领域Y的图片y被输入到生成器F时,它会产生一张看起来像是属于领域X的图片F(y)。
  • 判别器DX会尝试判断F(y)是否是真实的领域X图片。

循环一致性

为了确保生成器G和F不仅能够成功地进行单向转换,而且还能保持原始图像的信息不丢失,CycleGAN引入了循环一致性的概念。

前向循环一致性

对于源域中的图像x,首先通过生成器G生成转换图像G(x),随后通过生成器F将G(x)转换回源域F(G(x))。循环一致性损失计算F(G(x))与原始图像x之间的差异。

反向循环一致性

对于目标域中的图像y,首先通过生成器F生成一个转换后图像F(y),然后通过生成器G将F(y)转换回目标域G(F(y))。计算G(F(y))与原始图像y之间的差异。

对抗性损失

生成器G和F需要生成足够真实的图片七篇对应的判别器DY和DX。

几个基本概念

假图像(Fake Image)

假图像是通过生成器网络将一个域的图像转换成另一个域的图像。例如,在人脸年龄变化的任务中,如果有一个年轻人的脸部图片(属于年轻域),生成器可以生成一张看起来更老的脸部图片(属于年老域)。这个新生成的老年脸部图片就是假图像。

在接下来的代码中,fake_a 是从域 B 的真实图像 img_b 通过生成器 net_rg_b 生成的假图像,而 fake_b 是从域 A 的真实图像 img_a 通过生成器 net_rg_a 生成的假图像。

重建图像(Reconstructed Image)

重建图像是指将假图像再次通过相应的生成器网络转换回原始域的过程。这样做是为了确保图像在跨域转换后仍然能够恢复其原始特征。

例如,如果 fake_b 是从 img_a 生成的,那么再用 net_rg_b 将 fake_b 转换回域 A 得到的图像 rec_a 应该尽可能地接近 img_a

这种循环一致性损失有助于保持图像内容的一致性,即使在跨域转换过程中也不会丢失重要信息。

在接下来的代码中,rec_a 是由 fake_b 通过 net_rg_b 重新转换得到的图像,而 rec_b 是由 fake_a 通过 net_rg_a 重新转换得到的图像。

身份映射图像(Identity Mapping Image)

身份映射图像是指将一个域的真实图像直接输入到对应域的生成器网络中,期望输出与输入相同或非常相似的图像。这用于训练生成器学习如何在不改变图像的情况下保持图像不变。

这种损失被称为身份损失,它鼓励生成器在不需要进行跨域转换时保持图像不变。

在接下来的代码中,identity_a 是将域 A 的真实图像 img_a 直接通过 net_rg_b 得到的输出,而 identity_b 是将域 B 的真实图像 img_b 直接通过 net_rg_a 得到的输出。

CyclyGAN损失函数

CycleGAN 的损失函数设计得比较复杂,旨在解决无监督图像到图像的转换问题。它的损失函数由主要两部分组成:对抗损失(Adversarial Loss)和循环一致性损失(Cycle Consistency Loss)。同时可以包括身份鉴别损失(Identity Mapping Loss)

对抗损失

对抗损失来源于生成对抗网络(GANs)的基本概念。它包括生成器(G)和判别器(D)两个部分。

生成器 G 尝试生成看起来像目标域 Y 的图像,而判别器 D 则试图区分真实的目标域 Y 图像与生成的假图像。

对于 CycleGAN 来说,有两个生成器 G:X→Y 和 F:Y→X,以及两个对应的判别器 DY和 DX。

对抗损失可以表示为:

同样地,对于另一个方向也有一个类似的损失: 

循环一致性损

循环一致性损失是为了保证从一个域转换到另一个域后,再转回原域时,图像应该尽可能接近原始输入。

这个损失鼓励 G(F(y))≈y 和 F(G(x))≈x。

循环一致性损失表示为:

身份鉴别损失

除了上述两种损失外,CycleGAN有时还会引入一种额外的损失来增强模型的表现,即身份映射损失。

这种损失鼓励生成器保留那些已经属于目标域的图像不变。如果将一个目标域的图像输入到对应的生成器中,输出应该和输入相同。

 身份鉴别损失表示为:

综合这些损失,CycleGAN的整体损失函数通常是这样构成的: 

L(G, F, D_X, D_Y) = L_{GAN}(G, D_Y, X, Y) + L_{GAN}(F, D_X, Y, X) + \lambda (L_{cyc}(G, F) + L_{cyc}(F, G)) + \lambda_{id} (L_{identity}(G, F, X, Y))

其中 λ 和 λid是超参数,用于平衡不同损失项的重要性。 

CycleGAN的应用

风格迁移:讲真实照片变为莫奈风格的艺术作品

物体转换:将马变成斑马、将苹果变成橘子

基于MindSpore的CycleGAN

数据集

# 数据集
'''
本案例使用的数据集里面的图片来源于ImageNet,该数据集共有17个数据包,本文只使用了其中的苹果橘子部分。
图像被统一缩放为256×256像素大小,
其中用于训练的苹果图片996张、橘子图片1020张,用于测试的苹果图片266张、橘子图片248张。

对数据进行了随机裁剪、水平随机翻转和归一化的预处理,
为了将重点聚焦到模型,此处将数据预处理后的结果转换为 MindRecord 格式的数据,
以省略大部分数据预处理的代码。
'''
from download import download

url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/models/application/CycleGAN_apple2orange.zip"

download(url, ".", kind="zip", replace=True)

# 数据集
'''
本案例使用的数据集里面的图片来源于ImageNet,该数据集共有17个数据包,本文只使用了其中的苹果橘子部分。
图像被统一缩放为256×256像素大
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值