图片风格快速转换的简单web实现

图片风格快速转换的简单web实现

图片风格转换,是指利用深度学习算法学习某种风格图片的特征,将其应用到另一张图片中,合成新风格的图片,目前技术较为成熟,github上有很多有趣的项目与应用。

本项目核心代码基于fast-neural-style-tensorflow,在此基础上,添加了简单的flask框架,实现了页面上传图片,选择转换风格,生成转换图片并展示的流程。

项目的介绍、配置与部署见Github,地址:fast-neural-style-flask

一、核心代码分解

由于我对图像的深度学习算法和web都是刚入门学习,所以接下来只是简单介绍一下,不涉及核心算法。如果文中有说的不对的地方,还请大家多多指正。

我将这个项目分为三个部分:训练风格模型,实现图片转换,flask框架。

1. 训练风格模型

原项目中,作者提供了重新训练模型的方法,以训练铅笔画风格 pencil 为例。

首先,需要下载 VGG16 model 预训练模型和 COCO dataset 数据集。将模型存放在根目录新建 pretrained 文件夹中,将数据集解压后,用软链接指向train2014。

然后,准备风格图片pencil.jpg,存放在img/pencil.jpg文件夹中。

下一步,准备配置文件pencil.yml,参考conf/wave.yml,修改风格图片和模型名字。

最后,执行命令

python train.py -c conf/pencil.yml

2.快速风格转换

在上一步中,我们生成了铅笔画风格模型,保存在 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框架调用。

3.flask框架

不得不说,前端也是个技术活,整个项目中这部分内容花费的时间是最长的,ajax、JQ稍有不慎就出现各种问题。。。

flask服务端代码文件为predict_flask.py,使用了gevent协程包,整个逻辑为:

页面上传图片和选择风格 --> 判断图片是否合法 --> 生成图片唯一id --> 保存图片 --> 调用模型并合成图片到指定目录 --> 将合成图片目录返回给页面 --> ajax读取合成图片并展示。

前端页面使用了ajax,实现了不刷新页面展示结果。页面有点简陋,但是对于零基础的我来说,真的用了洪荒之力!

二、开发web遇到的问题以及解决方法

1. 训练新的模型较为耗时,需要较高的资源。

在12G显卡的GPU上运行,大约需要4小时多的时间。

2. 风格转换的效果如何?

原项目提供了一些参数可以调试,但是需要考虑训练成本。总体来说,如果图片的线条较为清晰、对比度高的情况下,效果比较好。

3. gevent的安装与部署

windows系统可以安装gevent,但是无法使用。mac os 不能直接使用pip安装,需要从源代码处clone并build。linux系统直接pip安装即可。

4. ajax传递图片

本来想用form序列化的方式传递参数,试了很多网上查找的方法,最后还是用FormData上传成功了。

5. ajax接收返回数据

后台正确执行程序并返回正确结果,ajax却总是跳进error:function()中,是因为返回的数据类型与dataType不一致导致的。

6. ajax展示图片

ajax只能读取static文件夹中的静态文件,所以要讲生成的文件路径设置为static下才行。

三、效果演示与总结

用我自己的图片展示一下铅笔画的效果,感谢同事芳芳的辛苦训练!

四、后续计划

  1. 尝试训练其他风格的模型。
  2. 计划部署在云服务器上,可以开放页面给大家来玩。
  3. 如果有时间,考虑学习html5,开发手机版本的演示页面,更方便大家来玩。

你可能感兴趣的:(深度学习,图像处理,深度学习算法)