趣文网 > 作文大全

可能是近期最好玩的深度学习模型:CycleGAN的原理与实验详解

2020-11-23 13:40:01
相关推荐

雷锋网 AI科技评论按:本文作者何之源,原文载于知乎专栏AI Insight,雷锋网获其授权发布。

CycleGAN是在今年三月底放在arxiv(地址:https://arxiv.org/abs/1703.10593)的一篇文章,文章名为Learning to Discover Cross-Domain Relations with Generative Adversarial Networks,同一时期还有两篇非常类似的DualGAN(地址:https://arxiv.org/abs/1704.02510)和DiscoGAN(地址:https://arxiv.org/abs/1703.05192),简单来说,它们的功能就是:自动将某一类图片转换成另外一类图片。

作者在论文中也举了一些例子,比如将普通的马和斑马进行互相转换,将苹果和橘子进行互相转换:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/2d01528ee42c49b2d283031d713ba147.jpg" data-rawwidth="1953" data-rawheight="1415" class="origin_image zh-lightbox-thumb" width="1953" data-original="https://pic2.zhimg.com/v2-fb0d72ed12b81aad165ddc5aa8897479_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/2d01528ee42c49b2d283031d713ba147.jpg"/>

把照片转换成油画风格:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/bbc4e236e087e661bb8ce483dc3cf7e8.jpg" data-rawwidth="1655" data-rawheight="980" class="origin_image zh-lightbox-thumb" width="1655" data-original="https://pic3.zhimg.com/v2-4d78b4c2906f526aa7b9a53db19fd01e_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/bbc4e236e087e661bb8ce483dc3cf7e8.jpg"/>将油画中的场景还原成现实中的照片:

将油画中的场景还原成现实中的照片:

由于CycleGAN这个框架具有较强的通用性,因此一经发表就吸引了大量注意,很快,脑洞大开的网友想出了各种各样神奇的应用。

比如将猫变成狗:

让图片中的人露出笑容:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/c214affdc09e8ea8b5e8f8822d1ad99e.jpg" data-rawwidth="1280" data-rawheight="670" class="origin_image zh-lightbox-thumb" width="1280" data-original="https://pic3.zhimg.com/v2-10d935280918fb198b19aacaa5b98896_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/c214affdc09e8ea8b5e8f8822d1ad99e.jpg"/>

国外网友Jack Clark还搜集了巴比伦、耶路撒冷以及伦敦的古代地图,利用CycleGAN将它们还原成了真实卫星图像:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/fd77f9fdbf467194b4e6b5e13c8a48df.png" data-rawwidth="835" data-rawheight="559" class="origin_image zh-lightbox-thumb" width="835" data-original="https://pic1.zhimg.com/v2-c458d4979bf89b1ef0078958d046ee3c_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/fd77f9fdbf467194b4e6b5e13c8a48df.png"/>

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/6a00094d25cae7976cc8642dcbe6aeca.png" data-rawwidth="841" data-rawheight="420" class="origin_image zh-lightbox-thumb" width="841" data-original="https://pic4.zhimg.com/v2-1ec0e2acd756d3f689269aec6ad596c3_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/6a00094d25cae7976cc8642dcbe6aeca.png"/>

还有人使用CycleGAN将人脸转换成娃娃:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/725180e4988053b95e700747cb86883d.png" data-rawwidth="704" data-rawheight="525" class="origin_image zh-lightbox-thumb" width="704" data-original="https://pic2.zhimg.com/v2-f4e2a3c290ff32e8f6f577157288cbc9_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/725180e4988053b95e700747cb86883d.png"/>

将男人变成女人:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/4b5aaac44b4ecfc4cc5780146dc5590a.png" data-rawwidth="641" data-rawheight="648" class="origin_image zh-lightbox-thumb" width="641" data-original="https://pic4.zhimg.com/v2-5c32c81bac522a4de1022d39afe9783b_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/4b5aaac44b4ecfc4cc5780146dc5590a.png"/>

把你自己变成一个“肌肉文身猛男”也是可以的:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/6d43a79cbac5df039e3c10fe6b8b259b.jpg" data-rawwidth="529" data-rawheight="514" class="origin_image zh-lightbox-thumb" width="529" data-original="https://pic3.zhimg.com/v2-a44dd6937d766f23408ed7a930a46cea_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/6d43a79cbac5df039e3c10fe6b8b259b.jpg"/>

如果说这些应用多少可以理解,那么下面的应用就有点“匪夷所思”了:你可以想象将人和拉面做转换吗?日本网友加藤卓哉(Takuya Kato)就训练了这样一个模型,它可以从拉面中生成人像,此外将人脸变成拉面的图片。鉴于生成的结果比较鬼畜,如果有兴趣的可以点击这个链接(地址:https://junyanz.github.io/CycleGAN/images/faces_and_ramens.jpg)观看生成结果。

此外,知乎上的 @達聞西 还用CycleGAN训练了可以脱掉女优衣服的模型(可以参考提高驾驶技术:用GAN去除(爱情)动作片中的马赛克和衣服),其脑洞之大,实在是让人惊叹了一番。

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/4d629dccef1a54ccd7941a0b5c4baa2e.jpg" data-rawwidth="768" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="768" data-original="https://pic2.zhimg.com/v2-da6e908fbff06e8e14c60d86d776d225_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/4d629dccef1a54ccd7941a0b5c4baa2e.jpg"/>

今天这篇文章主要分成三个部分:

CycleGAN的原理解析

CycleGAN与原始的GAN、DCGAN、pix2pix模型的对比

如何在TensorFlow中用CycleGAN训练模型

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)。

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/0f75114663971b03f937286d9e5c9435.png" data-rawwidth="693" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="693" data-original="https://pic3.zhimg.com/v2-d3e41b467e76891d763f7d9a15aa260a_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/0f75114663971b03f937286d9e5c9435.png"/>

比如,我们希望训练一个将白天的照片转换为夜晚的模型。如果使用pix2pix模型,那么我们必须在搜集大量地点在白天和夜晚的两张对应图片,而使用CycleGAN只需同时搜集白天的图片和夜晚的图片,不必满足对应关系。因此CycleGAN的用途要比pix2pix更广泛,利用CycleGAN就可以做出更多有趣的应用。

在TensorFlow中实验CycleGAN

最后来讲一讲如何在TensorFlow中实验CycleGAN,打开全球最大的同性交友网站Github,我们可以发现CycleGAN在TensorFlow中已经有很多轮子了,我使用的代码是:vanhuyz/CycleGAN-TensorFlow(地址:https://github.com/vanhuyz/CycleGAN-TensorFlow)。

利用这个代码,我训练了一个从男性和女性图片互换的模型,比如将男人转换成女人(左侧为原图,右侧为模型自动生成的图片):

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/512c9c3892133866751834ae4cc1c01a.png" data-rawwidth="652" data-rawheight="643" class="origin_image zh-lightbox-thumb" width="652" data-original="https://pic3.zhimg.com/v2-dace98659b3f39eedd7b574d51fd4426_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/512c9c3892133866751834ae4cc1c01a.png"/>

还可以将女性转换成男性:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/ee62d097bcc8003abee1d774d1a18130.png" data-rawwidth="636" data-rawheight="645" class="origin_image zh-lightbox-thumb" width="636" data-original="https://pic3.zhimg.com/v2-0828b25a2ea4c82d4ce7b5f47adebb6a_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/ee62d097bcc8003abee1d774d1a18130.png"/>

为了训练这么一个模型,我们需要分别准备好男性的图片和女性的图片。在实践中,我使用了CelebA数据集,分别取出其中男性和女性的图片并统一缩放到256x256的大小,然后存入两个文件夹中:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/ffbaef3cb0fcfce7fc852ba3bc04fcc2.jpg" data-rawwidth="407" data-rawheight="199" class="content_image" width="407" _src="https://static.leiphone.com/uploads/new/article/pic/201709/ffbaef3cb0fcfce7fc852ba3bc04fcc2.jpg"/>

如果你对这个实验有兴趣,可以直接在地址https://pan.baidu.com/s/1i5qY3yt下载到我使用的数据集。当然,也可以使用自己的数据,只需要将它们存为jpg格式并统一缩放到256x256的大小就可以了。接下来的步骤为:

1. 下载项目代码

git clone https://github.com/vanhuyz/CycleGAN-TensorFlow.git

2. 将图片转换成tfrecords格式

这个项目中提供了一个build_data脚本,用于将图片转换成tfrecords形式。假设我们的图片存放在~/datasets/man2woman/a_resized/和 ~/datasets/man2woman/b_resized目录下,对应的命令就是:

python build_data.py --X_input_dir ~/datasets/man2woman/a_resized/ --Y_input_dir ~/datasets/man2woman/b_resized/ --X_output_file ~/datasets/man2woman/man.tfrecords --Y_output_file ~/datasets/man2woman/woman.tfrecords

3. 训练

训练的命令为:

python train.py --X ~/datasets/man2woman/man.tfrecords --Y ~/datasets/man2woman/woman.tfrecords --image_size 256

训练的过程比较漫长,此时可以打开TensorBoard来观察训练情况(运行这个命令时需要将“20170715-1622”改成机器中对应的文件夹,下同):

tensorboard --logdir checkpoints/20170715-1622

4. 导出模型并执行单张图片

导出模型的方法为:

python export_graph.py --checkpoint_dir checkpoints/20170715-1622 --XtoY_model man2woman.pb --YtoX_model woman2man.pb --image_size 256

对单张图片进行转换(将data/test.jpg替换为对应的输入图片地址):

python inference.py --model pretrained/man2woman.pb --input data/test.jpg --output data/output.jpg --image_size 256

总结

因为CycleGAN只需要两类图片就可以训练出一个模型,所以它的应用十分广泛,个人感觉是近期最好玩的一个深度学习模型。这篇文章介绍了CycleGAN的一些有趣的应用、Cycle的原理以及和其他模型的对比,最后加了一个TensorFlow中的CycleGAN小实验,希望大家喜欢~

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

秋天 作文 班级美食节作文400字 关于老师的作文800 英语初中作文 小标题作文1000字 写谢谢你的作文 海外留学英语作文 那一天我哭了作文 舌尖上的美味作文600字 英语二小作文预测 我为家乡添一抹绿作文 六年级下册作文大全400字 生态公园作文 我的一片天地作文 庆中秋作文300字 读后感四百字作文 厨房交响乐作文 人口老龄化作文 有你真好作文600 秋天的梦作文 日成一事作文600 小草的力量作文 我家的故事作文250字 学武术的作文 描写濠河的作文 努力的作文 端午节二年级作文 一篇600字的作文 爱在家里作文 关于坐井观天的作文