CycleGAN的原理
我们之前已经说过,CycleGAN的原理可以概述为:将一类图片转换成另一类图片。也就是说,现在有两个样本空间,X和Y,我们希望把X空间中的样本转换成Y空间中的样本。
因此,实际的目标就是学习从X到Y的映射。我们设这个映射为F。它就对应着GAN中的生成器,F可以将X中的图片x转换为Y中的图片F(x)。对于生成的图片,我们还需要GAN中的判别器来判别它是否为真实图片,由此构成对抗生成网络。设这个判别器为 。这样的话,根据这里的生成器和判别器,我们就可以构造一个GAN损失,表达式为:
这个损失实际上和原始的GAN损失是一模一样的,如果这一步不是很理解的可以参考我之前的一篇专栏:GAN学习指南:从原理入门到制作生成Demo。
但单纯的使用这一个损失是无法进行训练的。原因在于,映射F完全可以将所有x都映射为Y空间中的同一张图片,使损失无效化。对此,作者又提出了所谓的“循环一致性损失”(cycle consistency loss)。
我们再假设一个映射G,它可以将Y空间中的图片y转换为X中的图片G(y)。CycleGAN同时学习F和G两个映射,并要求 ,以及
。也就是说,将X的图片转换到Y空间后,应该还可以转换回来。这样就杜绝模型把所有X的图片都转换为Y空间中的同一张图片了。根据
和
,循环一致性损失就定义为:
同时,我们为G也引入一个判别器 ,由此可以同样定义一个GAN的损失
,最终的损失就由三部分组成:
CycleGAN与DCGAN的对比
为了进一步搞清楚CycleGAN的原理,我们可以拿它和其他几个GAN模型,如DCGAN、pix2pix模型进行对比。
先来看下DCGAN,它的整体框架和最原始的那篇GAN是一模一样的,在这个框架下,输入是一个噪声z,输出是一张图片(如下图),因此,我们实际只能随机生成图片,没有办法控制输出图片的样子,更不用说像CycleGAN一样做图片变换了。
CycleGAN与pix2pix模型的对比
pix2pix也可以做图像变换,它和CycleGAN的区别在于,pix2pix模型必须要求成对数据(paired data),而CycleGAN利用非成对数据也能进行训练(unpaired data)。
比如,我们希望训练一个将白天的照片转换为夜晚的模型。如果使用pix2pix模型,那么我们必须在搜集大量地点在白天和夜晚的两张对应图片,而使用CycleGAN只需同时搜集白天的图片和夜晚的图片,不必满足对应关系。因此CycleGAN的用途要比pix2pix更广泛,利用CycleGAN就可以做出更多有趣的应用。
转自:https://zhuanlan.zhihu.com/p/28342644
笔者也在本篇博客中简单介绍一下CycleGAN的原理(截图来自论文):
CycleGAN是一个环形的结构,主要由两个生成器及两个判别器组成,如上图所示。X表示X域的图像,Y表示Y域的图像。X域的图像通过生成器G生成Y域的图像,再通过生成器F重构回X域输入的原图像;Y域的图像通过生成器F生成X域图像,再通过生成器G重构回Y域输入的原图像。判别器Dx和Dy起到判别作用,确保图像的风格迁移。
CycleGAN的训练的损失函数如下所示(截图来自论文):
可以看到,CycleGAN的loss函数分成两大部分,一共四块。其中两块GAN loss,两块L1 loss。整个CycleGAN框架采用end-to-end方式训练。
总而言之,CycleGAN想要达到的目的是,完成两个域之间的风格转换,在风格转换的同时,又要确保图中物体的几何形状和空间关系不发生变化。
---------------------
作者:jiongnima
来源:CSDN
原文:https://blog.csdn.net/jiongnima/article/details/80113976
版权声明:本文为博主原创文章,转载请附上博文链接!
应用:具有广泛性,可以实现较多的匪夷所思的转换,如将普通的马和斑马进行互相转换,将苹果和橘子进行互相转换:把照片转换成油画风格:将油画中的场景还原成现实中的照片:于CycleGAN这个框架具有较强的通用性,因此一经发表就吸引了大量注意,很快,脑洞大开的网友想出了各种各样神奇的应用。
比如将猫变成狗:让图片中的人露出笑容:
国外网友Jack Clark还搜集了巴比伦、耶路撒冷以及伦敦的古代地图,利用CycleGAN将它们还原成了真实卫星图像:
还有人使用CycleGAN将人脸转换成娃娃:将男人变成女人:
如果说这些应用多少可以理解,那么下面的应用就有点“匪夷所思”了:你可以想象将人和拉面做转换吗?日本网友加藤卓哉(Takuya Kato)就训练了这样一个模型,它可以从拉面中生成人像,此外将人脸变成拉面的图片。鉴于生成的结果比较鬼畜,如果有兴趣的可以点击这个链接观看生成结果。此外,知乎上的@達聞西
还用CycleGAN训练了可以脱掉女优衣服的模型(可以参考提高驾驶技术:用GAN去除(爱情)动作片中的马赛克和衣服),其脑洞之大,实在是让人惊叹了一番。
翻译Paper
4.Implementation
网络架构我们采用Johnson等人的生成网络架构G。(参考) [23]已经显示出神经风格转移和超分辨率的令人印象深刻的结果。 该网络包含两个stride-2 convolutions,,几个residual blocks[18],以及两个fractionally-stride convolutions with stride 1/2。 我们使用6个blocks 128×128图像和9个blocks,用于256×256和更高分辨率的训练图像。 与Johnson等人相似。 [23],我们使用实例规范化[53]。 对于D鉴别器网络,我们使用70×70 PatchGAN [22,30,29],其目的在于分类70×70重叠图像块是真实的还是假的。 这种贴片级鉴别器结构具有比全图像鉴别器更少的参数,并且可以以完全循环的方式处理任意大小的图像[22]。
train details我们应用近期工作中的两种技术来稳定我们的模型训练程序。首先,对于LGAN(等式1),我们用最小二乘损失替换负对数可变目标[35]。这种损失在训练期间更稳定,并产生更高质量的结果。特别是,对于GAN损失LGAN(tt,D,X,Y),我们训练tt以最小化Ex p(x)[(D(tt(x)) - 1)2]并训练D以最小化Ey ~pdata(y)[(D(y)-1)] + Ex p(x)[D(tt(x))2]。
其次,为了减少模型振荡[15],我们遵循Shrivastava等人的策略[46](参考)并使用生成图像的历史而不是最新生成器生成的图像更新鉴别器。我们保留一个图像缓冲区,用于存储50个先前创建的图像。
对于所有实验,我们在Equation3中设置lamda = 10。
我们使用批量大小为1的Adam求解器[26]。所有网络都是从头开始训练的,学习率为0.0002。我们在前100个时期保持相同的学习率,并在接下来的100个时期内将速率线性衰减为零。有关数据集,体系结构和培训过程的更多详细信息,请参阅附录(第7节)。
7.Appendix
7.1Training details
我们从头开始训练我们的网络,学习率为0.0002。 在实践中,我们将目标objective除以2,同时优化D,这相对于tt的速率减慢了D学习的速率。 我们在前100个时期保持相同的学习率,并在接下来的100个时期内将速率线性衰减为零。 权重从高斯分布N(0,0.02)初始化。
Cityscapes标签↔Photo
2975训练图像来自Cityscapes训练集[4],图像大小为128×128。我们使用Cityscapes val set进行测试。
maps→aerial photograph
1096个训练图像从谷歌地图[22]中删除,图像尺寸为256×256。图像来自纽约市内外。
然后将数据分成训练并测试采样区域的中值纬度(添加缓冲区以确保测试集中没有出现训练像素)。
Architectural facades labels↔photo
建筑立面标签照片来自CMP门面数据库的40张训练图像[40]。
边缘→鞋子
来自UT Zappos50K数据集的大约50,000个训练图像[60]。该模型经过5个时期的训练。
Horse↔Zebra和Apple↔Orange
我们使用关键字“野马斑马”,“苹果”和“脐橙”从Image Net下载图像。图像缩放为256×256像素。每个班级的训练集大小:939(马),1177(斑马),996(苹果)和1020(橙色)。
Summer↔WinterYosemite
使用带有标签yosemite和日期拍摄字段的Flickr API下载图像。修剪了黑白照片。图像缩放为256×256像素。train size
each class:1273(夏季)和854(冬季)。
Photo↔Art
风格转移艺术图像从Wikiart.org下载。一些素描或过于淫秽的艺术品都是手工修剪过的。 pho-
使用标签landscape和landscapephotography的组合从Flickr下载了tos。修剪了黑白照片。图像缩放为256×256像素。每班的训练集大小为1074(莫奈),584(塞尚),401(梵高),1433
(浮世绘)和6853(照片)。莫奈数据集被特别修剪为仅包括风景画,而梵高数据集仅包括他后来的作品,这些作品代表了他最知名的艺术风格。
莫奈的画作→照片
为了在保存记忆的同时实现高分辨率,我们使用原始图像的随机方形作物进行训练。为了产生结果,我们
将具有正确宽高比的宽度为512像素的图像作为输入传送到生成器网络。同一性映射损失的权重为0.5λ,其中λ是循环一致性损失的权重。我们设置λ= 10。
花卉照片增强
智能手机拍摄的花卉图像是通过搜索Apple iPhone 5,5s或6拍摄的照片和Flickr下载的。具有浅DoF的DSLR图像也通过搜索标签flower,dof从Flickr下载。图像按宽度缩放到360像素。使用了身份映射失重0.5λ。智能手机和DSLR数据集的训练集大小分别为1813和3326。我们设置λ= 10。
7.2。网络架构
我们提供PyTorch和Torch实现。
G架构我们采用Johnson等人的架构。 [23]。我们使用6个残差块用于128×128个训练图像,9个残余块用于256×256或更高分辨率的训练图像。下面,我们遵循Johnson et al。的Github存储库中使用的命名约定。
令c7s1-k表示具有k个滤波器和步幅1的7×7卷积 - 实例范数 - ReLU层.dk表示具有k个滤波器的3×3卷积 - 实例范数 - ReLU层和
步幅2.反射填充用于减少伪影。 Rk表示包含两个3×3对比层的残余块,在两层上具有相同数量的滤波器。 uk表示具有k个滤波器和步幅1的3×3分数跨步 - 卷积 - 实例范数 - ReLU层。
具有6个residual blocks 的网络包含:
c7s1-64,d128,d256,R256,R256,R256,R256,R256,R256,u128,u64,c7s1-3
具有9个残余块的网络包括:
c7s1-64,d128,d256,R256,R256,R256,R256,R256,R256,R256,R256,R256,u128 u64,c7s1-3
D架构对于鉴别器网络,我们使用70×70 PatchGAN [22]。 设Ck表示一个带有k个滤波器和步幅2的4×4卷积 - 实例范数 - 泄漏ReLU层。在最后一层之后,我们应用一个convolution产生一维输出。 我们不将InstanceNorm用于第一个C64层。 我们使用斜率为0.2的泄漏ReLU。 鉴别器架构是:
C64-C128,C256-C512