使用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一次性初始化以加快預測的速度等,是後面改進的目的。

 

以上是本文所有內容,感謝閱讀,歡迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章