Flask是一个Python实现web开发的微框架,对于像我对web框架不熟悉的人来说还是比较容易上手的。
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一次性初始化以加快预测的速度等,是后面改进的目的。
以上是本文所有内容,感谢阅读,欢迎留言。