有没有想过将一张普通的狗狗图片加上一张星空的油画,变出一副星空狗狗,今天给大家分享一篇iCAN大赛参赛学生的博客内容,带领大家走入生成式对抗网络的世界,甚至将男人与女人进行转化也是轻而易举。
CSDN博客主:CExploer(iCAN大赛参赛选手,东北大学秦皇岛分校 陈若愚)
博客时间:2018年08月20日 00:47:19
博客链接:https://blog.csdn.net/Exploer_TRY/article/details/81841826?from=groupmessage
博客内容:
这次,我将带大家一起参与到Cyclegan生成式对抗网络的实战之中,那么,什么是生成式对抗网络呢?
生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。(文字来自百度百科)
CycleGAN是发表于ICCV17的一篇GAN工作,可以让两个domain的图片互相转化。传统的GAN是单向生成,而CycleGAN是互相生成,网络是个环形,所以命名为Cycle。并且CycleGAN一个非常实用的地方就是输入的两张图片可以是任意的两张图片,也就是unpaired。
这里,我主要是带大家进行代码的实战操作,如果大家想要深入了解的cyclegan的实现原理的话请大家自己去看论文,我首先以简单的方式让大家理解一下。
论文地址:https://arxiv.org/abs/1703.10593
本博客将持续更新,并会在此列出新更新的内容或是修改的bug。
比如,我的训练集有两类,每一类代表着一种风格,那么经过训练得到的模型就能让两种风格相互转化。比如,我有一个训练集,一类是斑马,另一类是野马,在经过对抗网络之后,我就可以随意输入一张野马的图片使其变成斑马,我也可以随意输入一张斑马的图片让他变成野马。那么这就是cyclegan基本可以做的功能。
更多的转换实例如下图:
你可以发挥想象这样做:
只要你有一部分普通的图片,和这种星空的油画图片,经过处理后即可将狗狗星空化。
这里,我带大家做一个实战的项目,实现男人和女人的转换。
请大家把数据集下载好:https://pan.baidu.com/s/1WEowSXnl5EvQuChhyUKmkg
此外,还有cyclegan项目代码:
https://github.com/CExplorer/Cyclegan
原码地址:
https://github.com/junyanz/CycleGAN
我们把项目先下载下来,然后我们在train.py的文件下创建几个文件夹(其实名字可以自己起,这里我为了方便起见带大家创建,以便讲解):
--data #用于放置测试的图片,或者是你在训练之后需要转换的图片
--datasets #用于放置训练需要的图片
--pretrained #用于存放训练好的模型,就是.pb文件
--checkpoints #训练时保存的数据
准备工作完毕,那么我们开始动手做吧。
1.环境配置
环境配置我这里建议使用gpu版本,cpu我尝试过也是可以训练的,不过可能有些慢。
我们在官网上下载完anaconda后,即可安装tensorflow。这里我简单带大家过一下,如果大家没有安装过tensorflow或者anaconda的可以去网上查一下,如果安装过的环境配置可以跳过了。
CPU版本tensorflow需要在cmd中输入如下命令:
pip install tensorflow
GPU版本tensorflow需要cuda,cudnn,根据不同电脑来,cuda有8.0,9.0和9.2。因此我不做具体的讲解,大家关于配置可以去网络上查一查,或者安装中有问题我也可以尽量帮助。
安装tensorflow的gpu版本在cmd中输入如下命令:
pip install tensorflow-gpu
那么就简单介绍到这里吧,接下来我们开始实战吧。
2.预处理数据集
这里我把目录通过图片方式给大家看一下,文件夹samples大家不需要创建,__pycache__文件夹是python编译产生的文件夹:
这里我们之前下载的训练集叫man2woman,解压后得到a_resized和b_resized两个文件夹,a_resized文件夹里是男人的图片,b_resized文件夹里是女人的图片。我将这两个文件夹放在datasets这个文件夹里。
首先,训练是不能直接拿图片去训练,我们需要转换一下格式,build_data.py,就是建立数据的文本,tensorflow训练数据需要接收.tfrecords格式的文件,这里不同于别的模型,我们需要两个tfrecords格式的文件。男性的图片我们转换格式后命名为man.tfrecords,女性的图片转换格式后我们命名为women.tfrecords。
如何转换,我们定位到build_data.py这个文件夹这里,打开cmd,输入如下命令:
python build_data.py
--X_input_dir datasets/a_resized
--Y_input_dir datasets/b_resized
--X_output_file datasets/man.tfrecords
--Y_output_file datasets/woman.tfrecords
X_input_dir和Y_input_dir是图片的路径,两个tfrecord文件的路径,X_output_file和Y_output_file是输出tfrecord文件路径。
转换完后我们在datasets文件夹下多得到了tfrecord文件,那么就开始训练吧。
3.训练
训练需要使用train.py这个文件,我们需要定义几个参数,除了两个tfrecord文件输入路径以外,还需要图片的大小,--image_size,我们这里训练集图片的边长均为256,因此我们可以这样命令来训练:
python train.py
--X datasets/man.tfrecords
--Y datasets/woman.tfrecords
--image_size 256
这里,我想再补充一下,大家打开train.py文件,看到代码如下:
上面一个划线部分是训练多少步在cmd中打印出训练的信息,大家可以根据自己需要修改,不过我认为应该不怎么需要,我想提醒的是下一个,下一个是训练多少步保存一次,这里如果步数间隔太小很可能造成文件膨胀,也就是保存了太多的数据导致过于占磁盘空间,我之前是50步保存一次,结果发现占了200G空间,因此建议大家可以多等一会,1000步保存一次,并且如果你手动关闭训练电脑也是会保存你此时的模型的。就是把下面的if step % 100 == 0的100更改,相信大家都是懂程序结构,也就是知道怎么更改多少步保存一次。
修改后保存在训练一下,训练时间需要长一些,不然可能测试效果不太好。如果你想终止训练,在命令行按Ctrl+c键中止训练。大家不需要担心中断后得重新训练,我在后面会为大家讲怎么接着以前训练。成功开始训练标志如下:
训练的过程中,我们除了可以在命令行查看loss等数据,也可以打开tensorboard,我们打开checkpoints文件夹,里面会看到一些有一串数字的文件夹,那些文件夹是保存训练时数据的,命名是根据保存数据时间来命名的,比如会有20180819-2346这个命名的文件夹,说明是在2018年8月19日23时46分保存的文件。我们根据此时保存在哪个文件夹确定,大家可以看最新产生的文件夹来确认。比如此时产生的文件夹是20180819-2346,我可以这样来观察:
tensorboard
--logdir checkpoints/20180819-23464.转换为模型
我们用于将训练数据转换为模型的文件是export_graph.py,我们可以这样使用:
在上面我们说了在checkpoint文件夹下的时间命名的文件夹,训练保存的数据就在那里,我们应该是选择时间最近的文件夹,比如我时间最近的文件夹叫20180819-2346,我们可以这样来导出模型:
python export_graph.py
--checkpoint_dir checkpoints/20180819-2346
--XtoY_model man_to_woman.pb
--YtoX_model woman_to_man.pb
--image_size 256
checkpoint_dir是数据的路径,XtoYmodel是从X风格变为Y风格的模型,YtoXmodel是从Y风格变为X风格的模型,image_size是图片大小。pb文件会自动保存到pretrained的文件夹里。
5.测试
接下来,我们的模型已经训练好了,比如你想恶作剧,你就可以把你同学的照片拿来,让其“变性”。
emm,博主去网上找了一张男同学的照片来测试变成女生的效果:
结果不理想,首先,转换时支持的是正方形图片,所以我没有处理好;其次,鉴于我的模型训练步数不足,可能训练一个好点的模型普通电脑需要训练10天样子,我只训练了一会儿,但是大家可以测试模型效果。
接下来告诉大家怎么测试:
对单张图片进行转换,我把需要转换的图片放在data文件夹下,因为我们有2个.pb文件,一个是从X风格到Y风格,另一个是Y风格到X风格。我们这里选的图片是X风格,所以我们用的是man_to_women.pb这个模型来转换,转换使用的文件是inference.py。测试命令如下:
python inference.py
--model pretrained/man_to_woman.pb
--input data/input.jpg
--output data/output.jpg
--image_size 256
model是使用什么转换的模型,input是需要测试的图片的路径,output是输出位置,image_size是输入图片边长大小。
然后大家就能在你想要的输出路径下看到输出的图片了。
6.如果中断怎么接着训练
我们找到时间最近的checkpoint中的文件夹名字,比如最近的是20180819-2346,我们可以使用如下命令接着训练:
python train.py
--load_model 20180819-23467.应用的一些小建议
1.我曾经用学校的工作站训练过一个给女生卸妆和化妆的模型,因为数据集来源方便,那个由于训练时间较长所以效果比较好,这里我提供一下训练集,感兴趣自己尝试一下:https://pan.baidu.com/s/1GxHC-WlA6fd-DH_IUuuSIA
2.我们可以把一些画家的作品,比如梵高的油画,和我们一些正常的照片,作为两种风格输入,这样我们就可以将一些我们的图片转化为有优化风格的,比如我这篇博客上有个小狗星空化就是这样,甚至可以尝试一下和毕加索的风格尝试转化。
3.物品之类的转化,比如我可以用大量苹果的图片,还有橙子的图片,作为两种风格,就可以把一个苹果变成橙子,或是把橙子变成苹果。
4.可以有实时性,就像我们手机美颜时有不同的效果一样,感兴趣大家可以做一下,如果我有时间我也可以在后就这篇博客上补上一个实时风格转化的实战。
如果大家有其他使用想法也可以在下方留言,我也会不断地做补充。
编辑:赵继发
领取专属 10元无门槛券
私享最新 技术干货