深度學習是近年來電腦科學界火熱的話題,如何將深度學習模型整合到生活應用更是許多開發者想要嘗試的事情,本文透過 Python Flask 搭配 Keras 這個深度學習函式庫(backend 搭配 tensorflow),建立一個簡易版的預測圖片分類的 web api。那就讓我們開始吧。
專案初始化
首先我們先打開終端機,初始化我們的專案:
1 2 3 4 5
$ mkdir python-keras-image-predict-api $ cd mkdir python-keras-image-predict-api $ virtualenv venv $ . venv/bin/activate $ pip install keras tensorflow flask pillow
然後新增一個 main.py 檔案,建立一個簡單 flask api 雛形,一個 POST predict 圖片 api:
1 2 3 4 5 6 7 8 9 10 11 12
from flask import Flask, request, jsonify
@app.route('/predict', methods=['POST']) def predict(): # initialize the data dictionary that will be returned from the # view data = {'success': False} return jsonify(data)
# 當啟動 server 時先去預先 load model 每次 request 都要重新 load 造成效率低下且資源浪費 if __name__ == '__main__': app.run()
# import the necessary packages from keras.applications import ResNet50 from keras.preprocessing.image import img_to_array from keras.applications import imagenet_utils from PIL import Image import numpy as np from flask import Flask, request, jsonify import tensorflow as tf
# initialize our Flask application and the Keras model app = Flask(__name__) model = None
defload_model(): # load pre-trained 好的 Keras model,這邊使用 ResNet50 和 ImageNet 資料集(你也可以使用自己的 model) global model global graph model = ResNet50(weights='imagenet') # 初始化 tensorflow graph graph = tf.get_default_graph()
@app.route('/predict', methods=['POST']) defpredict(): # initialize the data dictionary that will be returned from the # view data = {'success': False} print('request') # ensure an image was properly uploaded to our endpoint if request.method == 'POST': if request.files.get('image'): # 從 flask request 中讀取圖片(byte str) image = request.files['image'].read() # 將圖片轉成 PIL 可以使用的格式 image = Image.open(io.BytesIO(image))
# 將預測結果整理後回傳 json 檔案(分類和可能機率) for (_, label, prob) in results[0]: r = {'label': label, 'probability': float(prob)} data['predictions'].append(r)
data['success'] = True
return jsonify(data)
# 當啟動 server 時先去預先 load model 每次 request 都要重新 load 造成效率低下且資源浪費。記得等到 model 和 server 完整執行後再發 request if __name__ == '__main__': print(('* Loading Keras model and Flask starting server...' 'please wait until server has fully started')) load_model() app.run()
預測
終於來到了預測的階段,我們這邊使用一下可愛的狗狗圖片:
啟動 server 執行 Flask 測試
1
$ python main.py
打開另外一個終端機視窗:
1
curl -X POST -F image=@dog_1.jpg http://127.0.0.1:5000/predict
留言討論