CycleGAN

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上跑了两天左右,给出一些效果

上面是化妆,下面是卸妆

关于CycleGAN的实现,Github上有很多的版本,Tensorflow,Pytorch等等,我这里使用的是Pytorch版本。 Github链接如下:

这是一个pix2pix和CycleGAN的二合一版本,我们这个例子只用了CycleGAN,这个Repo建议代码好好看,最好彻底了解。 然后你们就可以实现你们自己感兴趣的小项目了。