识狗君微信小程序的部署
日歷嘩啦啦的往前翻,很快就要翻過2018,迎來2019年。今天預(yù)報(bào)了好久的大雪終于降臨到了武漢,外面白雪皚皚,家中溫暖如春,這個(gè)時(shí)候感覺最愜意。古人有詩云:綠蟻新醅酒,紅泥小火爐。晚來天欲雪,能飲一杯無?,而現(xiàn)代人則在朋友圈中歡呼著下雪,各有各的慶祝方式,并無高下之分。
在后臺有收到朋友詢問識狗君微信小程序的部署,我開始覺得之前的幾篇文章已經(jīng)講的很清楚,問的朋友多了,返回去再看,發(fā)覺幾篇文章是站在開發(fā)的角度寫的,比較散,決定在2018年最后的一篇文章整理一下關(guān)于識狗君微信小程序的部署,算是對2018年機(jī)器學(xué)習(xí)項(xiàng)目的一個(gè)總結(jié)。
如果你還不了解識狗君微信小程序這個(gè)項(xiàng)目,請參考以下幾篇文章:
當(dāng)微信小程序遇上TensorFlow:Server端實(shí)現(xiàn)
當(dāng)微信小程序遇上TensorFlow:Server端實(shí)現(xiàn)補(bǔ)充
當(dāng)微信小程序遇上TensorFlow:小程序?qū)崿F(xiàn)
當(dāng)微信小程序遇上TensorFlow:接收base64編碼圖像數(shù)據(jù)
當(dāng)微信小程序遇上TensorFlow:終章
項(xiàng)目主頁: https://github.com/mogoweb/AIDog
說是微信小程序的部署,但本文并不打算講解如何申請、開發(fā)和審核微信小程序,而是說明服務(wù)端的部署。如果想了解微信小程序的開發(fā),請參考騰訊官方文檔。
以下步驟中涉及到的模型、數(shù)據(jù)集,我上傳到了百度網(wǎng)盤,可以根據(jù)需要下載:
鏈接: https://pan.baidu.com/s/1kaoiV_uMFS_7IK-HMO1G8A 提取碼: ct9e訓(xùn)練模型
這個(gè)步驟是可選步驟,你可以使用訓(xùn)練好的模型:inception_v3.tar.gz,這個(gè)版本是我在Google官方inception V3模型的基礎(chǔ)上,使用stanford dog datasets數(shù)據(jù)集訓(xùn)練而得的模型,請注意和原版的區(qū)別。
如果想自行訓(xùn)練模型,請接著往下看。
帶標(biāo)簽的狗狗數(shù)據(jù)集采用stanford dog datasets,請自行下載并解壓,然后執(zhí)行如下命令進(jìn)行訓(xùn)練:
python retrain.py --image_dir=./Images --saved_model_dir=models/inception_v3 --model_version 2訓(xùn)練的模型保存于models/inception_v3/2,其中2是版本號,可以通過retrain.py腳本的命令行參數(shù)進(jìn)行指定。
注意: 這個(gè)訓(xùn)練過程會(huì)從網(wǎng)絡(luò)下載Inception V3原版模型,需要翻墻才行。無法翻墻的朋友也可以采用如下的方法,將tfhub_modules.tgz的內(nèi)容解壓到/tmp目錄下,內(nèi)容大體如下:
alex@alex-550-279cn:~/work/ai/workspace/AIDog/serving$ ls -la /tmp/tfhub_modules/ total 88 drwxr-xr-x 3 alex alex 4096 12月 30 19:27 . drwxrwxrwt 15 root root 73728 12月 30 19:31 .. drwxr-xr-x 4 alex alex 4096 10月 9 10:04 11d9faf945d073033780fd924b2b09ff42155763 -rw-rw-r-- 1 alex alex 161 10月 9 10:04 11d9faf945d073033780fd924b2b09ff42155763.descriptor.txt alex@alex-550-279cn:~/work/ai/workspace/AIDog/serving$這個(gè)訓(xùn)練過程有點(diǎn)長,在我的PC上帶GTX 960的顯卡訓(xùn)練,大約需要兩個(gè)小時(shí)。
讓模型接收base64編碼圖像
通過上一個(gè)步驟訓(xùn)練出的模型接收的是(299, 299, 3)的二進(jìn)制圖像數(shù)據(jù),這種二進(jìn)制數(shù)據(jù)不方便通過HTTP傳遞,HTTP傳輸二進(jìn)制數(shù)據(jù)常用的方案是對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼。
如何看出模型接收什么類型數(shù)據(jù)?我們可以通過save_model_cli.py腳本查看模型的簽名,這個(gè)腳本由tensorflow提供,如果你下載了tensorflow源碼,在其 tensorflow/python/tools/ 目錄下,可以使用如下命令查看我們訓(xùn)練出來的模型:
python ~/work/ai/tensorflow/tensorflow/tensorflow/python/tools/saved_model_cli.py show --dir ~/work/ai/workspace/AIDog/serving/models/inception_v3/2 --allMetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:signature_def['serving_default']:The given SavedModel SignatureDef contains the following input(s):inputs['image'] tensor_info:dtype: DT_FLOATshape: (-1, 299, 299, 3)name: Placeholder:0The given SavedModel SignatureDef contains the following output(s):outputs['prediction'] tensor_info:dtype: DT_FLOATshape: (-1, 120)name: final_result:0Method name is: tensorflow/serving/predict從中我們可以看出模型的輸入?yún)?shù)名為image,其shape為(-1, 299, 299, 3),這里-1代表可以批量輸入,通常我們只輸入一張圖像,所以這個(gè)維度通常是1。輸出參數(shù)名為prediction,其shape為(-1, 120),-1和輸入是對應(yīng)的,120代表120組狗類別的概率。
為了讓模型接收base64編碼圖片,我們在模型的輸入前面增加一層,進(jìn)行base64及解碼處理:
python rebuild_model.py --model_dir models/inception_v3/3 --origin_model_dir models/inception_v3/2/其中:
- model_dir 參數(shù)為接收base64輸入模型輸出的目錄
- origin_model_dir 參數(shù)為上一個(gè)步驟訓(xùn)練出來的模型
這個(gè)時(shí)候我們再來看看第三個(gè)版本模型的簽名:
python ~/work/ai/tensorflow/tensorflow/tensorflow/python/tools/saved_model_cli.py show --dir ~/work/ai/workspace/AIDog/serving/models/inception_v3/3 --allMetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:signature_def['serving_default']:The given SavedModel SignatureDef contains the following input(s):inputs['image'] tensor_info:dtype: DT_STRINGshape: unknown_rankname: base64_string:0The given SavedModel SignatureDef contains the following output(s):outputs['prediction'] tensor_info:dtype: DT_FLOATshape: (-1, 120)name: import_1/final_result:0Method name is: tensorflow/serving/predict可以看到,模型的輸入為字符串?dāng)?shù)據(jù),即base64編碼字符串。
申請證書
因?yàn)?strong>微信小程序要求HTTP請求走更加安全的HTTPS協(xié)議,所以必須提供一個(gè)SSL證書。
我們可以上阿里云申請一個(gè)免費(fèi)的證書,雖然有效期只有一年,但商業(yè)用的證書比較貴,根據(jù)需要選擇吧。需要注意的是,阿里云上申請證書很隱蔽,我也是嘗試了好幾個(gè)組合,那個(gè)免費(fèi)證書的選項(xiàng)才出現(xiàn)。因?yàn)槲业闹鳈C(jī)就是托管在阿里云上,域名也是使用阿里云的DNS服務(wù),所以申請完后,很快就審核通過,然后就可以下載證書。證書下載時(shí)我選擇證書for Nginx,下載下來就是兩個(gè)文件:一個(gè)pem文件,一個(gè)key文件。
安裝Simple TensorFlow Serving
這個(gè)Simple TensorFlow Serving是一個(gè)Google官方TensorFlow Serving的封裝,是機(jī)器學(xué)習(xí)模型的通用且易于使用的服務(wù)。項(xiàng)目主頁:https://github.com/tobegit3hub/simple_tensorflow_serving
Simple TensorFlow Serving的安裝非常簡單:
pip install simple_tensorflow_serving啟動(dòng)服務(wù)
接下來啟動(dòng)server:
simple_tensorflow_serving --enable_ssl=True --model_base_path="./tensorflow/serving/models/inception_v3" --secret_pem="./certs/215052392380319.pem" --secret_key="./certs/215052392380319.key" --log_level="debug" --debug=True其中:
- enable_ssl參數(shù)表示是否啟用https
- model_base_path指定模型的基礎(chǔ)路徑,需要注意的是,這個(gè)基礎(chǔ)路徑不帶版本號數(shù)字,我們可以有多個(gè)版本的模型,所以這個(gè)目錄下可能有1, 2, 3之類的子目錄,分別對應(yīng)不同版本的模型,微信小程序或客戶端可以選擇使用哪個(gè)版本
- secret_pem 和 secret_key 為證書申請過程中獲得的兩個(gè)證書文件
- 后面兩個(gè)參數(shù)用于調(diào)試,可以不用
要驗(yàn)證服務(wù)器是否部署成功,可以使用簡單的客戶端程序測試一下:
python test_client.py --image=./Images/n02116738-African_hunting_dog/n02116738_1105.jpg結(jié)果如下:
n02116738 african hunting dog 0.780203342438 n02115913 dhole 0.0102733308449 n02092002 scottish deerhound 0.00600153999403前面是類別標(biāo)簽,后面是屬于某個(gè)類別的概率,上面結(jié)果中Top 1概率0.78。
微信小程序的代碼可以參見github項(xiàng)目,這里就不多說明了。
Q & A
答: 是由于tensorflow源碼和python環(huán)境中安裝的tensorflow包版本不一致,可以使用python環(huán)境中安裝的tensorflow包中的那個(gè)saved_model_cli.py腳本。
小結(jié)
到這里,關(guān)于識狗君微信小程序的部署就講完了,如果這個(gè)步驟中有疑問的地方,請與我聯(lián)系。
馬上就要到2019年了,在這里祝各位朋友在2019年工作順利,心想事成!
總結(jié)
以上是生活随笔為你收集整理的识狗君微信小程序的部署的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别再说你不懂malloc()和callo
- 下一篇: 建立自信心的有效方法