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一次性初始化以加快預測的速度等,是後面改進的目的。
以上是本文所有內容,感謝閱讀,歡迎留言。