[機器學習]手把手打造貓狗辨識 Line 機器人(上)

Hoskiss
Hoskiss stand
Published in
5 min readMay 4, 2019

--

想讓你那充滿神奇架構又千錘百鍊的 model,有機會傳給你的親朋好友笑一笑嗎,這邊會寫下我一步一步串出 linebot 的流程,因為也是參考好幾篇的教學分享,不敢說是最好的架構,記錄下來引起更多分享也好

首先就當作天生神力的你已經擁有一個 model 了,我們需要的只是怎麼架一個後台可以提供 model 的服務。不在意費用較高或是想要輕鬆 auto scaling 之類的話,一些現有的像是 amazon sagemaker 可以用,不過身為 xxx … 我們現在就是要來自己架一個。還好已經有 TF Serving 可以幫忙來做這件事,他會把 model 包成一個 docker image,我是先 deploy 在 aws ec2 的環境上

為了要使用 TF Serving,我們必須先定義好 serving_input_receiver_fn 這個 function,主要是做資料需要的前處理,也就是在 train model 前,你有做過的事情。最後應用的時候,使用者的圖片會經過一個 base64 轉碼,變成一個長長的字串,然後經由網路傳給我們的 server,所以在這裡,會先收到轉碼過的字串 (用個 placeholder: raw_image 來裝),轉回成 jpg 或 png,然後調整成 model input layer 吃的大小 (decode_and_resize),例如我用的xception 是吃 (299, 299, 3),以及另外有做的前處理也會接著寫在這裡

最後必須回傳一個 ServingInputReceiver 的物件,這邊注意的是初始參數,他會把我們定義好的 images_tensor,也就是前處理完的圖片,跟 model 的 input layer 做個對應,不確定的話 keras 可以用 model.summary() 來看名稱

model.summary()

接著我們要將 model 轉成 tf.estimator 這個物件,然後才可以接著用到他的 export_savedmodel,其中變數 model_path 就是設定原本 model 路徑,你可以改成自己的 model,接下來他會包成 tf serving 可以用的東西。事實上生成的路徑有些問題,也有人在 stackoverflow 上發問,所以完整的程式碼有一大部分就是把東西搬來搬去,別擔心目前都處理好了,如果有興趣你可以直接到我的 github (連結在最下方) clone 下來

到這邊已經準備好 tf serving 需要的東西,接下來就可以寫 Dockerfile 準備 build image,下面這兩段可以看到我們只是把產生的 saved model 複製一份,然後執行 tensorflow_model_server 指令而已,這樣其實就已經完成一個 model 的 api 服務,可以下 post 拿到結果了

”等等…” 我聽到你問,那為什麼還要一個 flask_serving_app 呢?其實是為了 CORS,我還有另外做了個前端,想用網頁的方式呈現,但是 tf serving 似乎不能輕易地提供 cross-origin HTTP request 的需求,會被 browser 擋下來。所以參考一些別人的做法後,再加上了一層 flask app,把 request 拿到的東西處理一下格式,問隔壁的 tf serving,有需要也可以做 exceptions handling、logging 等。如此一來,我們的後端就可以讓前端用囉~

這裡是 github repo 的連結,實際在執行的時候,我會下 bash ./run.sh 讓他在機器上起 service,不過因為沒有把 model 上傳(有點虛胖),所以直接跑會出錯,可以照上面的路徑敘述調整成自己的 model 就行哩

以下幾篇是參考的許多資料中用到比較多的,對於第一次玩這些的我來說,很感謝這些人願意花時間寫教學,所以即使覺得我自己經驗蠻淺的,也想拋磚引玉一下,其實很多東西這邊只是帶過,像 tensorflow 的 documents 中就有很多可以研究的,也很多關鍵字可以搜尋理解,之後有機會再來熟悉更多工具或框架。如果喜歡這篇的話,麻煩幫我按下拍手給些鼓勵吧,任何回饋或建議也都歡迎喔~謝謝,我們接著繼續向機器學習學習

延伸閱讀

--

--

Hoskiss
Hoskiss stand

生活是不斷成長以追求平衡的巧妙融合