CycleGAN是在去年三月底放在arxiv的一篇文章,文章名为Learning to Discover Cross-Domain Relations with Generative Adversarial Networks,同一时期还有两篇非常类似的 DualGAN 和 DiscoGAN ,简单来说,它们的功能就是:自动将某一类图片转换成另外一类图片。
由于CycleGAN这个框架具有较强的通用性,因此一经发表就吸引了大量注意,很快,脑洞大开的网友想出了各种各样神奇的应用。
比如将猫变成狗:
让图片中的人露出笑容:
将男人变成女人:
如果说这些应用多少可以理解,那么下面的应用就有点“匪夷所思”了:你可以想象将人和拉面做转换吗?
日本网友加藤卓哉(Takuya Kato)就训练了这样一个模型,它可以从拉面中生成人像,此外将人脸变成拉面的图片。鉴于生成的结果比较鬼畜,如果有兴趣的可以搜索观看生成结果。
此外,知乎上的 @達聞西 还用CycleGAN训练了可以脱掉女优衣服的模型(可以参考提高驾驶技术:用GAN去除(爱情)动作片中的马赛克和衣服),其脑洞之大,实在是让人惊叹了一番。
pix2pix也可以做图像变换,它和CycleGAN的区别在于,pix2pix模型必须要求成对数据(paired data),而CycleGAN利用非成对数据也能进行训练(unpaired data)。
比如,我们希望训练一个将白天的照片转换为夜晚的模型。如果使用pix2pix模型,那么我们必须在搜集大量地点在白天和夜晚的两张对应图片,而使用CycleGAN只需同时搜集白天的图片和夜晚的图片,不必满足对应关系。因此CycleGAN的用途要比pix2pix更广泛,利用CycleGAN就可以做出更多有趣的应用。
1.Tensorflow中开源代码主要可以参考这个
vanhuyz/CycleGAN-TensorFlow(地址:https://github.com/vanhuyz/CycleGAN-TensorFlow)。
具体操作也比较简单,今天主要给大家玩玩Pytorch版CycleGAN 与 pix2pix二合一版的。
2.提高驾驶技术
一行代码都不用改,只需要按照前面的步骤把数据准备好,然后按照pix2pix官方的使用方法训练就可以了:
https://github.com/phillipi/pix2pix
pyTorch版pix2pix(Cycle-GAN二合一版):
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
具体步骤:
git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
cd pytorch-CycleGAN-and-pix2pix
这个没啥好说的,不会github命令请转身学习几分钟。
懒人系列就直接安装源码中给出的数据集,一步步来就ok.
这里主要介绍如何在自己的数据集上去训练。
数据集准备
To train a model on your own datasets, you need to create a data folder with two subdirectories trainA
and trainB
that contain images from domain A and B. You can test your model on your training set by setting --phase train
in test.py
. You can also create subdirectories testA
and testB
if you have test data.
简单说就是,训练自己的CycleGAN,需要在datasets目录下新建两个文件夹 trainA 和trainB,同时为了后面的测试,可以再建testA,testB,完整目录展示如下:
注意mosaic是我存放两个数据集的根目录。看名字就知道我这个数据集就是用来玩马赛克的。
数据集有千百种获取方式,,写个爬虫脚本,收集一下需要的图片,然后做些处理,随机crop,翻转等数据增强操作。记得一定要准备两类,比如高清图,对应的马赛克图,美颜图,对应的需要卸妆后的图。如果你跟我一样比较懒,那么也好办,从来源数据集下载总可以了吧。这里我下载的celeba数据集,然后截取了两万张,,,后来发现训练太慢来,再次截取,最后采集来三千张来玩,由于我要做的是原图与马赛克图之间的translation,所以,随机采集3000张后的图作为trainB,然后打马赛克的图作为trainA.最后图像转换的方向就是A==>B
话说回来,如何打mosaic?前几天刚好研究到这里,已经放出了代码,请自行移步这里
训练
python3 train.py --dataroot ./datasets/mosaic --name mosaic_cyclegan --model cycle_gan --pool_size 50 --no_dropout --gpu_ids 0,1
说明下:
CycleGAN训练是个非常漫长的过程,如果没有GPU,小哥哥你还是看看就好。我是直接放到服务器上玩的了,配置如下:
如上训练命令,我使用的是GPU DEVICE 0和1
代码想要跑起来,必须搭建好环境,参照项目源码自行配置,记得安装
pip install visdom
pip install dominate
用来可视化训练过程的
To view training results and loss plots, run python3 -m visdom.server
and click the URL http://localhost:8097. To see more intermediate results, check out ./checkpoints/maps_cyclegan/web/index.html
可视化过程:
python3 -m visdom.server
记得现把这个执行下,不然直接跑训练命令会报错。
训练过程是这样的
看不出来?再贴一张:
测试命令在:
/scripts/test_cyclegan.sh
python test.py --dataroot ./datasets/mosaic --name mosaic_cyclegan --model cycle_gan --phase test --no_dropout
数据集准备
We provide a python script to generate pix2pix training data in the form of pairs of images {A,B}, where A and B are two different depictions of the same underlying scene. For example, these might be pairs {label map, photo} or {bw image, color image}. Then we can learn to translate A to B or B to A:
Create folder /path/to/data
with subfolders A
and B
. A
and B
should each have their own subfolders train
, val
, test
, etc. In /path/to/data/A/train
, put training images in style A. In /path/to/data/B/train
, put the corresponding images in style B. Repeat same for other data splits (val
, test
, etc).
Corresponding images in a pair {A,B} must be the same size and have the same filename, e.g., /path/to/data/A/train/1.jpg
is considered to correspond to /path/to/data/B/train/1.jpg
.
这个比较复杂一点,主要是要求图像必须成对
我们同样在./datasets/mosaic文件夹下新建两个文件夹,A 和 B,然后在它们各自目录下再建三个folder,test,train,val
最后将训练数据放到各自的train下,测试的在test下,验证在val下。
整个文件结构长这样子:
细心的盆友可能发现mosaic根目录下也有三个folder,test,train,val,对的,这个是用代码自动生成的:
python3 datasets/combine_A_and_B.py --fold_A ./mosaic/A --fold_B ./mosaic/B --fold_AB ./mosaic
到此,我们的数据集算是搞定了。
训练
还不就是一句话的事
python3 train.py --dataroot ./datasets/mosaic --name mosaic_pix2pix --model pix2pix --which_model_netG unet_256 --which_direction AtoB --lambda_B 100 --dataset_mode aligned --no_lsgan --norm batch --pool_size 0
注意参数选取
可视化
一样的,通过
run python3 -m visdom.server
and click the URL http://localhost:8097.
测试
so easy ..
#!./scripts/test_pix2pix.sh
python test.py --dataroot ./datasets/facades --name facades_pix2pix --model pix2pix --which_model_netG unet_256 --which_direction BtoA --dataset_mode aligned --norm batch
数据集改成自己测试的数据集路径就好。
参考文献:
1.https://cloud.tencent.com/developer/article/1064970
2.https://cloud.tencent.com/developer/article/1077415