又是一年一度的十一黃金旅遊周,你是在景區看人從衆叕,仍是在高速公路上觀看大媽打太極呢?旅遊黃金週我通常是儘可能不出門,這個十一也不例外。十月一日跑了一個半馬迎接國慶,十月二號選擇去了一個偏門的景點:張之洞與武漢博物館。今天則宅在家,吃吃喝喝之餘,琢磨起識別狗狗的微信小程序。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
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正在不斷完善中,直接參考示例並不能實現須要的功能,在多方查找資料以後,終於把整個流程走通。小程序
TensorFlow提供兩種模型格式:微信小程序
SaveModel是一種與語言無關,可恢復的密封式序列化格式。TensorFlow提供了多種與SavedModel交互的機制,如tf.saved_model API、Estimator API和CLI。TensorFlow Serving須要使用SavedModel格式的模型文件。api
在《這個中秋,我開發了一個識別狗狗的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腳本的命令行參數進行指定。
在Ubuntu下這個很是容易,只須要使用下面的命令便可:
sudo apt install tensorflow-model-server
複製代碼
爲了開發方便,須要安裝TensorFlow Serving Python API:
pip install tensorflow-serving-api
複製代碼
按照文檔,啓動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的封裝,是機器學習模型的通用且易於使用的服務。
其野心也很大,號稱支持以下功能:
我最看中的就是它的自動生成客戶端代碼功能,在沒有這個以前,我查找了不少資料,都沒有搞定客戶端與服務端之間的通訊。另外它還提供了一個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。
這個服務器端遠尚未達到完善,還存在一下問題:
好了,關於服務端的開發部署就先到這裏,下一篇文章我將談談微信小程序的開發和與server端的通訊,敬請關注!
本文完整代碼請參考:github.com/mogoweb/aie…