原文代码:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
精简CycleGAN代码:https://github.com/aitorzip/PyTorch-CycleGAN (已实测可用)
(代码还没有运行过,现在的状态还是不会去跑代码。。。)
论文讲解参考:https://www.bilibili.com/video/BV1Ya411a78P?spm_id_from=333.999.0.0
ready
风格迁移:
Pix2Pix 原文链接:https://arxiv.org/abs/1611.07004),不过Pix2Pix要求训练数据必须是成对的
Disco GAN, Dual GAN ,Cycle GAN是同一时期提出的,想法一致,只不过是不同团队提出的,他们是在两种风格间进行转换
Star GAN是可以在多种风格间进行转换。
不仅可以做图片风格转换,也可以做文字风格转换,首先都要收集资料(图片或句子)
总结
配对的图片做起来比较困难。
①训练配对的图片复杂又昂贵。
②数据集少而小
本篇CycalGAN不要求提供pairs,如题目所说:Unpaired。因为成对的图像数据集其实并不多。这里的x和y不要求有什么较好的关联性,可以是毫不相干的两幅图像。
图(a)这个模型包含两个映射函数(生成器)G:X->Y和F:Y->X。还有两个判别器Dx,Dy。Dx鼓励G去转化的输出和域Y不可区分。Dy鼓励F去转化的输出和域Y不可区分。
图(b)是前向循环一致性损失。x → G(x) → F(G(x)) ≈ x
图(c)是向后循环一致性损失。y → F(y) → G(F(y)) ≈ y
Generator G
G是一个生成器,给定先验分布 我们希望得到生成分布 ,这里很难通过极大似然估计得到结果
Discriminator D
D是一个函数,来衡量 与 之间的差距,这是用来取代极大似然估计。
公式
对抗损失:
对于映射函数G: X→Y及其鉴别器DY,我们表示为:
Dy(y)是表示真图的,越大越好,Dy(G(x))表示假图的,越小越好。
这个损失函数里面x和y分别是2个不同领域的image,G(x) 试图输入x领域的图片生成y领域的图片, Dy试图区分真实的y领域的图片。
y~Pdata(y)是指y服从先验分布。
在G试图生成图像G (x),类似于图像域Y,Dy旨在区分转化样本G (x)和真实样本Y。G旨在最小化这一目标对敌人,D试图最大化,也就是说minGmaxDy LGAN (G, DY, x, Y)。我们对映射函数F: Y X和它的鉴别器Dx也引入了类似的对抗性损失,即minF maxDx LGAN(F, DX, Y, X)。
循环一致性损失:
①防止模式崩溃(也就是防止多幅度对应一幅图,不管什么图片得到的始终是那一个),本文是双射(一对一且满射)。也就是防止“思密达”现象。(思密达现象是看到一个视频up主编的,挺有趣)
②可以满足pix2pix实现的场景
③前向循环一致性损失。x → G(x) → F(G(x)) ≈ x,向后循环一致性损失。y → F(y) → G(F(y)) ≈ y
是希望获得有用的特征。
总的损失:
λ控制两个目标的相对重要性。我们的目标是:
即生成器要最小化,判别器结果要最大化(分数越高越好)
实现
使用两种技术来使得训练更加稳定。首先,对于公式-1的LGANLGAN,使用最小二乘损失替换负的log似然损失。利用该损失训练过程更稳定,且得到了更好的结果:
第二,为了减少模型的波动,在更新识别器 DXDX和 DYDY时,使用前段时间已生成的图片,而不是进几次迭代生成的图片。
具体实验:
网络架构;
采用了适合我们使用的网络架构-Johnson等人的生成网络。该网络包括:两个stride-2卷积,几个残差块和两个分步长卷积。对128X128图像使用6个块,对256X256和更高分辨率的训练图像使用9个块。对于判别网络,我们使用70个PatchGANs,其目的是对70X70的重叠图像块进行是真是假分类。这样的判别器架构比全图判别器具有更少的参数,并且可以以全卷积的方式应用于任意大小的图像。
训练细节:
1.对于Lgan,我们用最小二乘损失替代负对数似然目标。这种损失在训练和生成高质量结果时更稳定。
2.减少模型的震荡,我们遵循Shrivastava等人的策略,使用历史生成的图片更新鉴别器,而不是网络最新生成的图片。我们保留了一个图像缓冲区,存储50幅以前生成的图像。
3.对于所有的实验,我设置了lamda = 10,使用Adam优化器,batch size = 1。所有网络都从零开始训练,学习率为0.0002。在前100个epoch保持相同的学习率,并在接下来的100个epoch中线性衰减为0。
结果
与最近的非成对的图像到图像的迁移方法进行对比;
自身进行对比,限制使用不同的损失项;
展示生成的结果。
训练过程:
先下载数据集。我是直接在
https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/
上下载的。
也可以脚本下载(这个方式还没弄清怎么搞)
先训练的是马的数据集
bash ./scripts/download_cyclegan_model.sh horse2zebra
调好了之后在终端按照代码readme上面的步骤做。
python train.py --dataroot ./datasets/horse2zebra --name maps_cyclegan --model cycle_gan
参考:
[1]https://blog.csdn.net/cassiepython/article/details/80942899
[2]https://zhuanlan.zhihu.com/p/270357839