【GANs学习笔记】(十九)CycleGAN、StarGAN

完整笔记:http://www.gwylab.com/note-gans.html
———————————————————————

Part2 GANs在风格迁移上的应用

1. CycleGAN

     1.1 CycleGAN解决的问题

       假设我们现在要训练一个风格迁移的神经网络,也就是说输入一张图片,输出一张它的不同风格的图片,比如说输出一张具有泛古抽象质感的图片。

       那么我们考虑应用GANs技术。一个很自然的想法是给它增添一个Discriminator,这个Discriminator用来判别输入的图像是真实的还是G伪造的。

【GANs学习笔记】(十九)CycleGAN、StarGAN_第1张图片

       这个架构看似合理,但是会有一些潜在的危险。在Generator很深时,它的输出和输入差别是可能非常大的,存在一种情况是当输出图像靠近真实分布Y里的某一张图像时,Generator就发现了一个BUG,只要它的输出越逼近这张真实图像,Discriminator给的评分就越高,于是Generator最终可以完全忽略输入长什么样,输出这张偷学到的真实图片,就能产生“高质量”图片。

【GANs学习笔记】(十九)CycleGAN、StarGAN_第2张图片

       为了消除这种潜在危险,CycleGAN诞生了。

     1.2 CycleGAN的原理

       为了防止generator学习到具有欺骗性的造假数据,我们只需要保证generator的输出和原图具有很高的相似性,也就是不丢失原图的特征,于是CycleGAN中加入了一个新的generator,把第一个genreator的输出当作输入丢进去,希望能输出一个和原始输入尽可能相似的图片,如果能够比较好的还原回原始图片,证明第一个generator的输出保留了大量原始图片的特征,输出结果是较为可靠的;而如果不能较好的还原回原始图片,意味着第一个generator可能使用了“造假”的输出结果。

【GANs学习笔记】(十九)CycleGAN、StarGAN_第3张图片

       CycleGAN还可以做成双向的,除了从X domain--(G1)-->Y domain--(G2)-->X domain的训练,同时还会有Y domain--(G2)-->X domain--(G1)-->Y domain 这样的训练,在第二种训练中会新引入一个discriminator,功能同样是保证整次训练的输入和输出尽可能相似。

【GANs学习笔记】(十九)CycleGAN、StarGAN_第4张图片

     1.3 CycleGAN的讨论

       CycleGAN也不是没有问题。CycleGAN: a Master of Steganography (隐写术) [Casey Chu, et al., NIPS workshop, 2017 ]这篇论文就指出,CycleGAN存在一种情况,是它能学会把输入的某些部分藏起来,然后在输出的时候再还原回来。比如下面这张图:

【GANs学习笔记】(十九)CycleGAN、StarGAN_第5张图片

       可以看到,在经过第一个generator的时候,屋顶的黑色斑点不见了,但是在经过第二个generator之后,屋顶的黑色斑点又被还原回来了。这其实意味着,第一个generator并没有遗失掉屋顶有黑色斑点这一讯息,它只是用一种人眼看不出的方式将这一讯息隐藏在输出的图片中(例如黑点数值改得非常小),而第二个generator在训练过程中也学习到了提取这种隐藏讯息的方式。那generator隐藏讯息的目的是什么呢?其实很简单,隐藏掉一些破坏风格相似性的“坏点”会更容易获得discriminator的高分,而从discriminator那拿高分是generator实际上的唯一目的。

       综上,CycleGAN所宣称的CycleConsistency其实是不一定能完全保持的,毕竟generator的学习能力非常强大,即便人为地赋予它诸多限制,它也有可能学到一些trick去产生一些其实并不太符合人们要求的输出结果。



 

2. StarGAN

     2.1 StarGAN解决的问题

       有的时候我们可能希望图片能在ndomain当中互转,那依据CycleGAN的设计思路,理论上我们需要训练generator,如下图所示:

【GANs学习笔记】(十九)CycleGAN、StarGAN_第6张图片

       很明显这需要训练的generator太多了。那为了用更少的generator实现多个风格之间的互转,StarGAN被提出了。

     2.2 StarGAN的原理

       StarGAN在设计的时候就希望只用一个generator去实现所有domain之间的互转。

【GANs学习笔记】(十九)CycleGAN、StarGAN_第7张图片

       对于discriminator,它的输入是一张图片,它需要去鉴别出这张图片是真实图片还是generator产生的图片,同时它还需要分辨出这张输入的图片来自于哪个domain(哪种风格)

【GANs学习笔记】(十九)CycleGAN、StarGAN_第8张图片

       对于generator,它有两个输入,分别是目标domain和输入图片,它的输出是一张符合目标domain风格的图片。

【GANs学习笔记】(十九)CycleGAN、StarGAN_第9张图片

       整个训练架构如下图所示:

【GANs学习笔记】(十九)CycleGAN、StarGAN_第10张图片

       首先目标domain和输入图片会被输入到generator当中,然后generator产生的伪造图片一方面会被传给discriminator(右图),discriminator会判别这张图片的真假以及domain分类是哪,另一方面这个伪造图片会被再次传回给这个generator(中图),不过目标domain改成了原始的来源domain,那模型会希望第二次输出的图片能和最开始的输入图片尽可能相似。其实整套训练流程与CycleGAN是非常相似的,不同之处在于CycleGAN使用了两个generator做风格的来回变换,而在StarGAN中仅使用了一个generator实现这一变换。

     2.3 StarGAN的实现举例

       我们用一个实例来说明StarGAN的具体训练方式。

       首先domain的定义在StarGAN中是用一个vector表示的,譬如:

       那如果一个domain表示为00101 00000 10,就意味着这是一个CelebAlabel,并且这个domain的风格是棕发年轻女性,如果希望要转移到的风格是黑发年轻男性,那么训练过程如下图所示:

【GANs学习笔记】(十九)CycleGAN、StarGAN_第11张图片

       首先原始图片被丢入这个generator中,target domain10011(黑发年轻男性),然后generator就会产生一个黑发年轻男性的图片,接着这张图片又会再次被丢进这个generator中,但是target domain改成了00101(棕发年轻女性),然后generator就会产生一个棕发年轻女性的图片,StarGAN希望这张图片和原始的输入的棕发年轻女性的图片尽可能相似,此处用到的loss就是CycleGAN当中的loss。另外一方面,第一次generator产生的黑发年轻男性图会传给discriminatordiscriminator一方面要判断这张图的真假,另外一方面还要判断出这张图的domain,如果判断结果是10011的话就证明这张图的效果是好的。

       综上就是StarGAN的实现过程,它能实现多种风格之间的互转,并且模型比较小巧且高效。

你可能感兴趣的:(GANs学习笔记)