cycle/Pix2Pix 模型

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

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

比如将猫变成狗:

让图片中的人露出笑容:

将男人变成女人:

如果说这些应用多少可以理解,那么下面的应用就有点“匪夷所思”了:你可以想象将人和拉面做转换吗?

日本网友加藤卓哉(Takuya Kato)就训练了这样一个模型,它可以从拉面中生成人像,此外将人脸变成拉面的图片。鉴于生成的结果比较鬼畜,如果有兴趣的可以搜索观看生成结果。

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

还有自动美颜,卸妆...

CycleGAN与pix2pix模型的对比

pix2pix也可以做图像变换,它和CycleGAN的区别在于,pix2pix模型必须要求成对数据(paired data),而CycleGAN利用非成对数据也能进行训练(unpaired data)。

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

在TensorFlow/Pytorch中实验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

具体步骤:

1.拷贝项目

 
  1. git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

  2. cd pytorch-CycleGAN-and-pix2pix

这个没啥好说的,不会github命令请转身学习几分钟。

2.玩转CycleGAN

CycleGAN train/test

懒人系列就直接安装源码中给出的数据集,一步步来就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

代码想要跑起来,必须搭建好环境,参照项目源码自行配置,记得安装

 
  1. pip install visdom

  2. 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

3.玩转pix2pix

pix2pix train/test

数据集准备

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 BA and B should each have their own subfolders trainvaltest, 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 (valtest, 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 ..

  1. #!./scripts/test_pix2pix.sh

  2. 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

3.https://blog.csdn.net/Gavinmiaoc/article/details/80585531

猜你喜欢

转载自blog.csdn.net/weixin_41923961/article/details/81430329