當微信小程序趕上TensorFlow:Server端實現

又是一年一度的十一黃金旅遊周,你是在景區看人從衆叕,仍是在高速公路上觀看大媽打太極呢?旅遊黃金週我通常是儘可能不出門,這個十一也不例外。十月一日跑了一個半馬迎接國慶,十月二號選擇去了一個偏門的景點:張之洞與武漢博物館。今天則宅在家,吃吃喝喝之餘,琢磨起識別狗狗的微信小程序。python

自打想到開發一款識別狗狗的app,個人第一直覺是應該開發一款微信小程序。相對於手機原生app,微信小程序具備開發和部署簡單,特別是無需安裝,即用即走,特別適合這種功能單一,偶爾用一用的app。git

實現方案,首先想到的是TensorFlow.js,手機端實現深度學習,無需服務器端,可是TensorFlow.js並不支持微信小程序,無奈只得選擇小程序 + server的模式。而我並不擅長web + server的開發,因此在《這個中秋,我開發了一個識別狗狗的app》中談到,我先使用TensorFlow Lite實現了一個Android App。這個Android App 更多的是一個實驗性的項目,這個國慶節,空餘時間比較多,決定整一整微信小程序。github

由於採用端加server的模式,圖片識別在server端完成,因此主要功能實如今server端。咱們就先來談一談Server端的實現。web

TensorFlow Serving

Server端的實現方案有好多種,C++/Java/Python均可以,我一度甚至考慮採用Node.js實現。上週瀏覽Google開發者大會資料時發現,TensorFlow已經提供了服務器部署方案: TensorFlow Serving。算法

TensorFlow Serving是一種靈活的高性能服務系統,適用於機器學習模型,專爲生產環境而設計。 TensorFlow Serving能夠輕鬆部署新算法和實驗,同時保持相同的服務器架構和API。 TensorFlow Serving提供與TensorFlow模型的一攬子集成方案,也能夠輕鬆擴展以服務於其餘類型的模型。編程

詳細資料請訪問: tensorflow.google.cn/serving/json

TensorFlow Serving正在不斷完善中,直接參考示例並不能實現須要的功能,在多方查找資料以後,終於把整個流程走通。小程序

SavedModel

TensorFlow提供兩種模型格式:微信小程序

  • checkpoints,這是一種依賴於建立模型的代碼的格式。
  • SavedModel,這是一種獨立於建立模型的代碼的格式。

SaveModel是一種與語言無關,可恢復的密封式序列化格式。TensorFlow提供了多種與SavedModel交互的機制,如tf.saved_model API、Estimator API和CLI。TensorFlow Serving須要使用SavedModel格式的模型文件。api

retrain並保存爲SavedModel

在《這個中秋,我開發了一個識別狗狗的app》一文中提到,咱們不須要從頭訓練識別狗狗的深度學習模型,而是採用遷移學習,在現有模型的基礎上再訓練。考慮到模型是部署到服務器端,因此我選擇了識別能力更強的Inception V3模型。

帶標籤的狗狗數據集採用stanford dog datasets,請自行下載並解壓,而後執行以下命令進行訓練:

python retrain.py --image_dir=./Images --saved_model_dir=models/inception_v3
複製代碼

訓練的模型保存於models/inception_v3/1,其中1是版本號,能夠經過retrain.py腳本的命令行參數進行指定。

安裝tensorflow model server

在Ubuntu下這個很是容易,只須要使用下面的命令便可:

sudo apt install tensorflow-model-server
複製代碼

爲了開發方便,須要安裝TensorFlow Serving Python API:

pip install tensorflow-serving-api
複製代碼

啓動tensorflow model server

按照文檔,啓動tensorflow model server很是簡單,這裏加上rest_api_port參數是啓動server,並提供RESTful API,這種API接口方便微信小程序與之進行通訊。

tensorflow_model_server --rest_api_port=8501 --model_base_path=$PWD/models/inception_v3
複製代碼

可是經過這種方法啓動tensorflow model server,整了半天也沒有和client進行上通信,正在束手無策的時候,看到github上的一個項目:github.com/tobegit3hub…

簡單說,Simple TensorFlow Serving是一個TensorFlow Serving的封裝,是機器學習模型的通用且易於使用的服務。

其野心也很大,號稱支持以下功能:

  • 支持分佈式TensorFlow模型
  • 支持常規RESTful / HTTP API
  • 支持GPU加速推理
  • 支持curl和其餘命令行工具
  • 支持客戶端使用任何編程語言
  • 支持自動生成客戶端代碼,無需編碼
  • 支持圖像模型中使用原始圖片文件進行推斷
  • 支持詳細請求的統計指標
  • 支持同時爲多個模型提供服務
  • 支持動態的在線和離線模型版本
  • 支持爲TensorFlow模型加載新的自定義操做
  • 經過可配置的基自己份驗證支持安全身份驗證
  • 支持TensorFlow / MXNet / PyTorch / Caffe2 / CNTK / ONNX / H2o / Scikit-learn / XGBoost / PMML 等多種模型

我最看中的就是它的自動生成客戶端代碼功能,在沒有這個以前,我查找了不少資料,都沒有搞定客戶端與服務端之間的通訊。另外它還提供了一個web界面,能夠查看模型的結構以及signature(簽名),這個signature也是折騰了我很久都沒有搞定的。

瀏覽器訪問: http://127.0.0.1:8500,web界面以下:

Simple TensorFlow Serving的安裝很是簡單:

pip install simple_tensorflow_serving
複製代碼

接下來啓動server:

simple_tensorflow_serving --model_base_path="./models/inception_v3" &
複製代碼

客戶端

微信小程序的開發尚未開始學,先用python寫一個客戶端先測試一下,咱們可使用自動生成客戶端代碼功能:

curl http://localhost:8500/v1/models/default/gen_client?language=python > test_client.py
複製代碼

自動生成的代碼以下:

#!/usr/bin/env python

import requests

def main():
  endpoint = "http://ilego.club:8500"
  json_data = {"model_name": "default", "data": {"image": [[[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]]]}}
  result = requests.post(endpoint, json=json_data)
  print(result.text)

if __name__ == "__main__":
  main()
複製代碼

能夠看出,客戶端向server端post一段JSON數據,並獲取結果。在這段代碼的基礎上進行修改,加入圖片讀取,圖片縮放並轉換爲JSON格式數據,即完成測試客戶端代碼,代碼請參考: github.com/mogoweb/aie…

能夠嘗試測試一張狗狗圖片:

python test_client.py --image=./Images/n02116738-African_hunting_dog/n02116738_1105.jpg
複製代碼

結果以下:

n02116738 african hunting dog 0.780203342438
n02115913 dhole 0.0102733308449
n02092002 scottish deerhound 0.00600153999403
複製代碼

前面是類別標籤,後面是屬於某個類別的機率,上面結果中Top 1機率0.78。

總結

這個服務器端遠尚未達到完善,還存在一下問題:

  1. 客戶端與服務器端的圖片採用JSON格式傳遞,圖像數據由二進制轉爲JSON字符串,空間效率低,後面考慮對圖像數據進行base64編碼。
  2. 預測的效率比較第,從發出請求到收到迴應,有幾十秒的時間,尚未查找瓶頸在何處。
  3. 併發支持,由於如今只是一個簡單的測試,若是考慮到產品階段,多個手機的微信小程序同時進行識別,這仍是會有不少工做須要作的。

好了,關於服務端的開發部署就先到這裏,下一篇文章我將談談微信小程序的開發和與server端的通訊,敬請關注!

本文完整代碼請參考:github.com/mogoweb/aie…

image
相關文章
相關標籤/搜索