人脸生成DCGAN深度卷积对抗生成网络学习笔记

本学习笔记是根据之前转载的几篇文章摸索实践而来,实际在我的实践过程中,可能有些版本已经更新,导致有一定的差异,这里根据回忆记录一些踩过的坑。

1.项目源码,github:https://github.com/carpedm20/DCGAN-tensorflow
这里要感谢carpedm20大神的无私奉献。

2.将该项目下载解压缩,然后使用之前已经配置好的python环境,该项目据说是兼容2和3,我用的python3.6。
Tensorflow 0.12.1,我用的1.3
SciPy,安装方法:可以使用pip安装:python -m pip install –user numpy scipy matplotlib ipython jupyter pandas sympy nose
或者访问官方网站查看其它安装方式:https://www.scipy.org/install.html
pillow,安装方法:可以使用pip安装:pip install Pillow
或者访问官方网站查看其它安装方式:https://pillow.readthedocs.io/en/latest/installation.html
(可选) moviepy (用于可视化),安装方法:可以用pip安装:pip install moviepy
或者访问github源码查看其它安装方式:https://github.com/Zulko/moviepy
(可选) Align&Cropped Images.zip : 大型人脸数据集,http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
可以手动下载,也可以通过下面的命令自动下载。

3.数据集准备:python download.py mnist celebA
这句会自动下载mnist手写数字和celebA人脸两个数据集,国内网络环境可能下载会非常慢,也可能会根本下不下来。不过这两个数据集都可以手动下载到,其中人脸数据在官方网站还有百度盘的链接提供。
放在项目根目录的data目录下即可。
实际,我执行这句命令出现了很多问题,我估计还是网络的问题,如果有好的网络环境的话估计不会踩坑。

4.训练模型:
python main.py –dataset mnist –input_height=28 –output_height=28 –train
我实践过程中发现mnist对我来说完全跑不起来,索性放弃,毕竟手写数字,目测都知道什么结果了。

python main.py –dataset celebA –input_height=108 –train –crop
人脸数据,20万+张人脸图片,数据量不小,没有gpu我感觉需要非常长的时间,我也放弃了,尤其下载数据从百度盘没会员的话就不用浪费自己的时间,也不用浪费百度的高成本服务器和带宽资源了。

实际我自己找了几百张动漫图片来做测试。
python main.py –dataset dongmantu –input_height=96 –output_height=64 –train
然后就遇到了main.py里的问题,
flags_dict = {k:FLAGS[k].value for k in FLAGS}
这行报错,说FLAGS中的__Value是一个不可迭代的对象,google搭梯子也打不开了,果然强大呀,百度到处找不到结果,都是驴唇不对马嘴,没办法简单看了下上下文,发现貌似 也没什么用,应该是把FLAGS参数保存到json文件中,那么我代码改成这样:

#flags_dict = {k:FLAGS[k].value for k in FLAGS}
    #json.dump(flags_dict, f, indent=4, sort_keys=True, ensure_ascii=False)
    json.dump(flags.FLAGS.__flags, f, indent=4, sort_keys=True, ensure_ascii=False)

这个问题解决了,不知道后面会不会出什么问题。
然后继续往下走,又报一个图片分辨率错误,说是极有可能是因为没有设置输入尺寸和输出尺寸或没有指定裁剪crop而导致的,实际我的参数中指定了输入尺寸96,输出尺寸64,并且我的图片处理过的全部统一裁剪到96的宽和高,看代码,检查参数,各种测试,没发现问题,加上–crop试试,哦了,不报这个错了。当然,也许将输入尺寸和输出尺寸设置为一样可能就不会出现这个问题。
继续往下走,报错:记不清错误信息了,大致意思就是没有加载imresize,百度到是scipy和pillow冲突的原因,有网友将pillow升级到6.1,scipy1.3就没问题了,但实际我这里还是不行,我用另一个网友的办法,将scipy降级到1.2,问题解决。命令是:
pip install scipy==1.2.1

查看安装模块和版本的命令:
pip list

至此跑起来就没问题了。

我实际使用如下命令进行训练:

python3 main.py --dataset dongmantu --train --input_height=96 --crop --sample_freq=10 --ckpt_freq=10 --visualize --out_name="20190823.110319 - data - dongmantu - x96.z100.
uniform_signed.y64.b64" --epoch=250 --max_to_keep=10

意思是训练项目根目录下的data目录下的dongmantu文件夹下的所有图片,输入图尺寸宽高都是96像素,要裁剪,每10步保存一张当前训练效果生成的图片,每10步保存一个checkpoint,要可视化,输出目录为项目根目录下默认的out目录下的20190823.110319 – data – dongmantu – x96.z100.
uniform_signed.y64.b64这个目录,迭代次数250轮,其中每一轮会执行图片数量除以batch size步,如果图片640张,batch size默认64,则每一轮会执行10步。
手动指定输出名称,可以接着之前训练的步骤继续迭代下去,如果不指定,那么每次运行该命令都会新建一个文件夹并从头开始训练,–max_to_keep=10意思是最大保留最近的10个checkpoint,这样当运行完之后或者crash之后,可以挑选一个指定的checkpoint继续训练或者进行测试。

在刚开始训练的时候,输出的图片都是噪音,慢慢的有了人脸的轮廓,再慢慢的轮廓变的清晰起来,然后有了五官,五官的位置很乱,随着训练的进行,五官越来越端正了,甚至可以画出刘海、胡须、眼镜、墨镜等,训练了很久之后,模型基本收敛到位,输出的图片已经可以符合我们的需求了,这个时候就可以手动终止训练过程了,如果继续下去,有可能会效果反而越来越差。当然,我跑了几十个小时什么也不做,已经看到了效果,这里我们就先终止了。
果然搞人工智能不光是需要大量人工,还需要大量算力呀,几万块钱的n卡值得拥有。。。

5.测试模型

python3 main.py --dataset dongmantu --input_height=96 --out_name="20190823.110319 - data - dongmantu - x96.z100.uniform_signed.y64.b64" --crop --visualize

执行之后,会加载最新一版的模型,然后输出100张测试图片(100为z_dim的默认值,可以手动设定为其它数值),每张图片8*8一共64小张,这是默认可视化option=1的情况,我们来看下0、2、3、4的几种情况如何,这个值可以在main.py的最下面修改。

option=0,输出1张大图,图片8*8一共64小张

option=2,输出gif,如果没有成功,则生成png

option=3,输出小图gif,64*64像素,一共100张

option=4,输出小图gif,64*64像素,一共100张,然后合成一张大gif图

目前只到这,后续看情况再更新。