图片风格转换,是指利用深度学习算法学习某种风格图片的特征,将其应用到另一张图片中,合成新风格的图片,目前技术较为成熟,github上有很多有趣的项目与应用。
本项目核心代码基于fast-neural-style-tensorflow,在此基础上,添加了简单的flask框架,实现了页面上传图片,选择转换风格,生成转换图片并展示的流程。
项目的介绍、配置与部署见Github,地址:fast-neural-style-flask
由于我对图像的深度学习算法和web都是刚入门学习,所以接下来只是简单介绍一下,不涉及核心算法。如果文中有说的不对的地方,还请大家多多指正。
我将这个项目分为三个部分:训练风格模型,实现图片转换,flask框架。
原项目中,作者提供了重新训练模型的方法,以训练铅笔画风格 pencil 为例。
首先,需要下载 VGG16 model 预训练模型和 COCO dataset 数据集。将模型存放在根目录新建 pretrained 文件夹中,将数据集解压后,用软链接指向train2014。
然后,准备风格图片pencil.jpg,存放在img/pencil.jpg文件夹中。
下一步,准备配置文件pencil.yml,参考conf/wave.yml,修改风格图片和模型名字。
最后,执行命令
python train.py -c conf/pencil.yml
在上一步中,我们生成了铅笔画风格模型,保存在 models/pencil.ckpt-done 中。
执行命令
python eval.py --model_file models/pencil.ckpt-done --image_file img/test.jpg
即可生成test.jpg的铅笔画风格图片。
online_eval.py代码文件是将eval.py稍微做了一点修改,便于web框架调用。
不得不说,前端也是个技术活,整个项目中这部分内容花费的时间是最长的,ajax、JQ稍有不慎就出现各种问题。。。
flask服务端代码文件为predict_flask.py,使用了gevent协程包,整个逻辑为:
页面上传图片和选择风格 --> 判断图片是否合法 --> 生成图片唯一id --> 保存图片 --> 调用模型并合成图片到指定目录 --> 将合成图片目录返回给页面 --> ajax读取合成图片并展示。
前端页面使用了ajax,实现了不刷新页面展示结果。页面有点简陋,但是对于零基础的我来说,真的用了洪荒之力!
在12G显卡的GPU上运行,大约需要4小时多的时间。
原项目提供了一些参数可以调试,但是需要考虑训练成本。总体来说,如果图片的线条较为清晰、对比度高的情况下,效果比较好。
windows系统可以安装gevent,但是无法使用。mac os 不能直接使用pip安装,需要从源代码处clone并build。linux系统直接pip安装即可。
本来想用form序列化的方式传递参数,试了很多网上查找的方法,最后还是用FormData上传成功了。
后台正确执行程序并返回正确结果,ajax却总是跳进error:function()中,是因为返回的数据类型与dataType不一致导致的。
ajax只能读取static文件夹中的静态文件,所以要讲生成的文件路径设置为static下才行。
用我自己的图片展示一下铅笔画的效果,感谢同事芳芳的辛苦训练!