使用Flask搭建图像识别服务器

Flask

Flask是一个Python实现web开发的微框架,对于像我对web框架不熟悉的人来说还是比较容易上手的。

Flask安装

sudo pip install Flask

一个简单服务器应用

为了稍微了解一下flask是如何使用的,先做一个简单的服务器例子。

第一个文件hello.py。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
  return 'hello world!'

@app.route("/python")
def hello_python():
  return 'hello python!'

if __name__ == '__main__':
  app.run(host='0.0.0.0')

app.run(host='0.0.0.0')表示现在设定的ip为0.0.0.0,并且设定为0.0.0.0是非常方便的,如果你是在一台远程电脑上设置服务器,并且那台远程电脑的ip是172.1.1.1,那么在本地的电脑上可以设定ip为172.1.1.1来向服务器发起请求。

@app.route('/')表示发送request的地址是http://0.0.0.0:5000/,@app.route("/python")表示发送requests的地址为http://0.0.0.0:5000/python。

当这个文件写好用运行,显示如下反馈,表示现在我们搭建的服务在等待请求。

ubuntu@ubuntu:/local/share/DeepLearning/flask$ python hello.py
 * Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

第二个文件是request.py

import requests

url = 'http://0.0.0.0:5000/'
r = requests.get(url)
print(r.status_code)
print(r.text)

url = 'http://0.0.0.0:5000/python'
r = requests.get(url)
print(r.status_code)
print(r.text)

运行出来的结果是

200
hello world!
200
hello python!

调用成功,很简单。

向服务器发送图片

服务器代码

#coding:utf-8
from flask import request, Flask
import os
app = Flask(__name__)

@app.route("/", methods=['POST'])
def get_frame():
  upload_file = request.files['file']
  old_file_name = upload_file.filename
  file_path = os.path.join('/local/share/DeepLearning', 'new' + old_file_name)

  if upload_file:
      upload_file.save(file_path)
      print "success"
      return 'success'
  else:
      return 'failed'


if __name__ == "__main__":
    app.run("0.0.0.0", port=5000)

客户端代码

import requests

url = "http://0.0.0.0:5000"

filepath='./t2.jpg'
split_path = filepath.split('/')
filename = split_path[-1]
print(filename)

file = open(filepath, 'rb')
files = {'file':(filename, file, 'image/jpg')}

r = requests.post(url,files = files)
result = r.text
print result

这种情况长传图片是最快的,比用opencv先打开后传递象素级的数字要快很多。

 

部署分类算法

关于分类算法的训练部分可以参考之前的一篇博文:用tensorflow中slim下的分类网络训练自己的数据集,本文只会关注提供接口供远程调用进行分类预测。

现在我们已经知道了如何向服务器发送图片,那只需要在接收到图片后进行预测。所以在predict.py中增加一个predict接口供server收到图片后调用。完整的predict.py的代码参考predict.py

def server_predict(predict_file):
  FLAGS.predict_file = predict_file
  FLAGS.model_name = 'inception_v4'
  FLAGS.checkpoint_path = './data/ckpt_inception4'
  FLAGS.dataset_dir = './data/usecoin'
  FLAGS.predict_image_size = 224
  return main('')

准备好接口后,在server中调用即可。server代码可以参考server.py,发起申请参考request.py

import predict

def get_frame():
......
    result = predict.server_predict(file_path)

当然这只是比较demo的实现方式,如何处理并发式操作,如果让tensorflow一次性初始化以加快预测的速度等,是后面改进的目的。

 

以上是本文所有内容,感谢阅读,欢迎留言。

你可能感兴趣的:(实战操作)