AI画家第四弹——利用Flask发布风格迁移API

栏目: Python · 发布时间: 5年前

内容简介:上篇文章介绍了python web开发中经常使用到的一个框架flask,如果有遗忘的,可以点此回顾:point_right:本文源码可在微信公众号「01二进制」后台回复「风格迁移API」获得

AI画家第四弹——利用Flask发布风格迁移API

上篇文章介绍了python web开发中经常使用到的一个框架flask,如果有遗忘的,可以点此回顾:point_right: AI画家第三弹——毕业设计大杀器之Flask ,本文的主要任务就是完成上篇文章末尾的要求,利用Flask发布你自己的风格迁移API。

本文源码可在微信公众号「01二进制」后台回复「风格迁移API」获得

需求分析

我们知道软件工程的第一步就是需求分析,放在这里就是要知道我们需要实现的功能是什么样的。我画了一张简陋的图来描述这次的需求:

AI画家第四弹——利用Flask发布风格迁移API

真的是很简陋的一张图啊,其实理解起来很容易,就是用户上传一张图片,Flask获取到这张图片,调用风格迁移的模型,然后生成结果图,在传递回前端即可。

环境准备

既然明白了需求,那么接下来要做的事情自然是环境搭建了,老样子,这里我们仍然使用Pipenv来创建虚拟环境,如何搭建pipenv环境我就不说了,在微信公众号「01二进制」后台回复「风格迁移API」获得源码之后直接在终端输入 pipenv install 即可。

开始

hello world

我们首先在项目根目录创建一个main.py的文件作为整个项目的启动文件,上文我们说过,为了简化大型应用并为扩展提供集中的注册入口,我们并不会将所有的视图函数直接写在main.py,而是采用蓝图的方式分模块开发,因此我们需要在项目根目录新建 app/ 文件夹,在其中的 __init__.py 中编写如下代码:

这样我们就可以通过在main.py中编写如下代码实现一个hello world应用了。

启动main.py即可发现项目启动了,在浏览器输入 localhost:8080 即可看到 hello,world 字样。

蓝图编写

我们肯定是不能满足于小小的hello world的,既然说到了模块化开发,那怎么个模块法?

这里每个人的想法都是不一样的,其实也没有一个统一的标准,这里我就说下我自己的分级方法吧。

AI画家第四弹——利用Flask发布风格迁移API

  • stylize是项目根路径

  • app是项目

  • app/api是项目的api部分,一个项目肯定不只有api,还可能会有web等页面内容

  • app/api/v1表明该api的版本是v1,当然日后也有可能会有v2、v3等等

  • app/api/v1/img表明这里存放的都是和img有关的api

  • app/api/v1/img/stylize.py表明这个文件存放的是风格迁移的视图函数

认识完结构的划分之后,就来编写我们的蓝图吧。

首先我们需要在 app/api/v1/img/__init__.py 中编写如下代码:

这样我们就定义了一个叫做img的蓝图,然后我们在 app/api/v1/__init__.py 中编写如下代码:

这样我们就实现了v1蓝图的编写。

那这样是不是就可以使用蓝图了呢?当然不是,我们还需要在app中配置这个蓝图,把蓝图加载到app中,否则flask是无法识别蓝图的。加载的方法也很简单,我们在 app/__init__.py 文件中添加一个函数:

将这两个蓝图注册到app中,其中 url_prefix 这个参数用来标注路由的。有人可能不清楚,这里举个例子你就懂了。我们启动这个项目之后,在浏览器输入的是 localhost:8080 ,如果加了 url_prefix 这个参数之后,我们访问img下的视图函数时就需要把路径改为 localhost:8080/api/v1/img/ 了。

然后在 create_app() 函数中调用这个方法即可,main.py的代码如下:

接下来我们测试下这个蓝图是否真的注册成功了,我们启动该项目,并打开Postman输入: localhost:8080/api/v1/img ,我们可以看到如下信息:

AI画家第四弹——利用Flask发布风格迁移API

说明我们的蓝图已经注册

编写风格迁移 工具

既然蓝图都已经编写好了,那么视图函数的编写也就非常简单了,因此这里我们先把风格迁移的工具类写好,最后再编写视图函数。

上上篇文章我们介绍了图像风格迁移,记不清的可以看这篇文章:point_right: AI绘画第二弹——图像风格迁移 ,这篇文章介绍了最传统的图像风格迁移,想要生成一张图片的速度非常非常慢,肯定是没办法作为实际使用的,因此这篇文章所采用的生成风格迁移的图片的方法并不是这篇文章,而是基于李飞飞等人的一篇论文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》所实现的快速图像风格迁移。这里只介绍如何拿训练好的模型去运用,有兴趣的自己下载这篇文章去研究。

我们新建一个文件夹: app/utils/stylize ,这个文件夹中包含了风格迁移的工具类,项目结构如下:

AI画家第四弹——利用Flask发布风格迁移API

其中output为最终的生成文件夹、src存放风格迁移的文件(可以不用管)、evaluate.py是之前用于评估模型性能的文件(其实也就是生成图片的文件,不用管+1)、trained model文件夹存放了我们已经训练好的模型、temp存放的是我们从前端上传的图片,create stylize_photo.py包含的是我们对外提供的风格迁移工具类。

因此这整个文件夹我们只需要关注 create_stylize_photo.py 这一个文件就可以了,其他的下载源码之后自己看就可以了。

压缩图片

选择图片风格即所需要使用的模型

执行生成图片的操作

执行完上述步骤后,我们就可以在 utils/stylize/output 中看到已经生成的风格迁移图片了。

利用七牛云存储结果图片

由于服务器带宽限制,我们最后返回给前端的结果肯定不能是我们自己服务器的url(毕竟学生机的带宽只有1M),所以这里我建议使用七牛云存储的功能将生成的结果保存到七牛云上,然后返回一个url即可。

然后我们在 create_stylize_photo.py 中加一句存储的代码即可。

编写风格迁移API

现在我们通过风格迁移工具类已经可以实现输入一张原始图片返回生成图片的URL的功能,现在我们来将目光聚焦到风格迁移API的编写上。

定义路由

接收参数

我们定义一个函数 create_style_changed_img() ,方法采用POST方式,我们需要接受前端发来的两个参数,分别是img和type

生成图片及URL

然后我们将接收到的文件保存到之前新建的temp文件加中,然后调用工具类的方法返回图片的url

定义返回格式

作为一个好的api,我们肯定不只能返回一张图片的url就可以了,我们还需要记录下生成的时间,因此我们在代码执行的开始和结束的时候分别添加一段代码:

然后我们再定义返回格式

然后将结果返回

这里的Res是我定义的一个返回的实体信息类,长得是下面这样

最后我们调用flask的jsonify方法,就可以返回json结果。

测试

到这里我们就已经完成了一个风格迁移API的编写,接下来我们测试下我们的API吧,首先先启动项目,然后打开Postman,将请求方法改为post,添加两个参数img和type,如下:

AI画家第四弹——利用Flask发布风格迁移API

选择图片的时候,图片的质量尽量不要太大,否则可能会出现卡死的情况

最后的返回结果如下:

访问该URL即可看到如下图片(感觉还蛮好看的):

AI画家第四弹——利用Flask发布风格迁移API

至此我们已经实现了利用Flask发布一个风格迁移API了。

总结

本文源码可在微信公众号「01二进制」后台回复「风格迁移API」获得

最后总结下,在这篇文章中介绍了如何利用Flask发布一个风格迁移API,其中我们介绍了应该如何利用蓝图进行模块化开发,并给出了我自己认为的比较好的分层方法,同时利用七牛云存储为我们的服务器减压,最后利用postman请求该API完成测试。下一篇将会介绍如何将该API部署到腾讯云(阿里云)上实现外网访问,有兴趣的小伙伴给个关注,你的支持才是我更新的最大动力!

AI画家第四弹——利用Flask发布风格迁移API

AI画家第四弹——利用Flask发布风格迁移API


以上所述就是小编给大家介绍的《AI画家第四弹——利用Flask发布风格迁移API》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

一本书读懂大数据

一本书读懂大数据

黄颖 / 吉林出版集团有限责任公司 / 2014-12-1

进入大数据时代,让数据开口说话将成为司空见惯的事情,书中将从大数据时代的前因后果讲起,全面分析大数据时代的特征、企业实践的案例、大数据的发展方向、未来的机遇和挑战等内容,展现一个客观立体、自由开放的大数据时代。一起来看看 《一本书读懂大数据》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换