CycleGAN介绍
优势
具体介绍之前,首先说说CycleGAN的一些优势,CycleGAN实现的是一类图片到另一类图片的转化,也就是图片域的转变, 对于这类问题pix2pix是一种不错的方法,但是pix2pix训练时需要成对的训练样本,也就是比如你要训练图片风景从白天到黑夜的 转变,那么你的训练集就是各种风景图片的白天照片以及其对应的黑夜照片,必须一一对应。那么CycleGAN则不需要, 所以如果用CycleGAN来做这个问题,只需要收集一些白天的风景图片和一些黑夜的风景图片即可,不需要是同一种风景,不需要一一对应。
原理介绍
那么CycleGAN是怎么做到的呢?假设有X,Y两个样本空间,我们的目标就是实现X->Y,那么我们就将X输入到GAN的生成器中,(这里需要你们对GAN有一定了解), 生成器生成虚假的Y,然后输入一个判别器Dy,这个判别器可以判断这个输入是虚假的Y,还是数据集里真实的Y,也就是一个二分类器。因此这个损失就是:
如果你了解GAN,那么你会发现这其实就是GAN的损失函数,但是这样会带来一个问题:
- 从理论上讲,对抗训练可以学习和产生与目标域Y和X相同分布的输出,即映射G和F。 然而,在足够大的样本容量下,网络可以将相同的输入图像集合映射到目标域中图像的任何随机排列,其中任何学习的映射可以归纳出与目标分布匹配的输出分布。 因此,单独的对抗损失Loss不能保证学习函数可以将单个输入Xi映射到期望的输出Yi。
因此,作者又定义了一个cycle consistency loss,也就是说把X生成的Y在通过另一个生成器还原到X域,并且我们希望还原的X和原来的输入X尽可能相似。 也就是G(F(x)) ≈ x,同理 F(G(y)) ≈ y,因此这个循环一致性损失如下:
由此我们得到了X到Y的损失,还有循环一致性损失,同样Y到X的损失也就出来了,因此最后总的损失如下:
为了方便理解,我给出李宏毅的一张ppt Slide:
这张图就很清晰了,需要注意的是相同颜色的G是同一个生成器,因此一共是两个生成器,两个判别器。
一些成果
CycleGAN出来之后,很多有趣的东西被做了出来,比如可以把一张不笑的人脸映射成微笑的人脸, 把男人的脸映射成女人的脸,女人的脸映射成男人的脸,甚至有人实现了可以实现自动脱衣,穿衣。。 日本一个人还做了一个把动漫人物头发变白的项目,效果如下:
我实现的效果
我们现在要实现的是实现妹子自动卸妆的效果,自然对应的,也就可以实现自动化妆。数据集可以直接爬取百度图片, 然后稍微处理一下就可以了,利用PIL模块处理这些还是很方便的,顺便还可以实现数据增强,改进效果。 我这里直接下载了集智AI学院准备好的数据集,然后再CycyleGAN上跑了两天左右,给出一些效果
上面是化妆,下面是卸妆,こわいwww
关于CycleGAN的实现,Github上有很多的版本,Tensorflow,Pytorch等等,我这里使用的是Pytorch版本。 Github链接如下:
这是一个pix2pix和CycleGAN的二合一版本,我们这个例子只用了CycleGAN,这个Repo建议代码好好看,最好彻底了解。 然后你们就可以实现你们自己感兴趣的小项目了。
Notice
老生常谈,GAN的训练一定要用GPU,最好是好一点的GPU,GAN的收敛是各种结构里出了名的难,所以很难训练,那么问题来了, 很多人用在虚拟机上跑pytorch的,舍不得或者不想麻烦搞linux双系统,虚拟机用不了GPU,那么此时我就建议你看一下我之前的 博文,有一篇介绍了如何在Windows上安装Pytorch,当然这样安装的Pytorch一是版本问题,无法更新,二是会出一些Linux下不会出的 奇怪的问题,但是大部分情况下都是可以解决的。
比如在windows上运行上面pytorch版本的CycleGAN时,会出现很多的问题,印象中不下5个问题,我简单回忆一下,给几个建议:
- 首当其冲的就是版本问题,运行CycleGAN时会显示缺少一些类或者方法,这里应该只缺少一个,torch.optim下没有lr_scheduler类,会出错。 其实这些问题都很容易解决,关注Github上Pytorch官方源码,没有什么比源码更有说服力,更直观,既然lr_scheduler是后来版本更新的,那我就在 本地安装目录optim文件夹下自己建一个lr_scheduler.py文件,然后到官方源码,把对应目录的lr_scheduler.py内容拷贝到自己的文件里就ok了。 其实你只要对应源码,把各个文件都和自己本地匹配一遍的话,虽然你的版本可能没有更新,但是其实就是最新版了,内容已经更新了。所以我一直认为版本 不是这个方法的问题。
- 还有人可能注意到我的pytorch只安装了本体,没有torchvision,所以很多包也没有,会出错,这个只要pip install一下就好了,和linux没有区别。
- 还有的问题可以按照TraceBack的描述对应解决。不行就stack overflow一下,里面的回答都很专业的,我没注意需不需要翻墙,因为我的代理 是不关的==
- 如果运行有无法解决的问题,欢迎联系我,我会尽量帮助。