MNN 是一個輕量級的深度學(xué)習(xí)端側(cè)推理引擎,核心解決深度神經(jīng)網(wǎng)絡(luò)模型在端側(cè)推理運行問題,涵蓋深度神經(jīng)網(wǎng)絡(luò)模型的優(yōu)化、轉(zhuǎn)換和推理。目前,MNN已經(jīng)在手淘、手貓、優(yōu)酷、聚劃算、UC、飛豬、千牛等 20 多個 App 中使用,覆蓋直播、短視頻、搜索推薦、商品圖像搜索、互動營銷、權(quán)益發(fā)放、安全風控等場景,每天穩(wěn)定運行上億次。此外,菜鳥自提柜等 IoT 設(shè)備中也有應(yīng)用。在 2018 年雙十一購物節(jié)中,MNN 在天貓晚會笑臉紅包、掃一掃、明星猜拳大戰(zhàn)等場景中使用。
作者:張新棟
關(guān)于更多MNN的介紹和文檔,大家可以看這篇文章或者去MNN的Github主頁。本文主要是想跟大家介紹和討論,如何在嵌入式設(shè)備中,利用MNN來進行CNN任務(wù)的部署。本文主要想跟大家討論的CNN任務(wù)是Mobilenet SSD,是一個輕量級的anchor-based物體檢測器。
嵌入式場景的CNN部署不同于Desktop和server的CNN部署,在嵌入式場景中,沒有強勁的CPU和GPU,硬件資源受限,所以部署的流程和步驟較之于Desktop和server有較大的不同。在我的理解中,我會將嵌入式場景的CNN部署流程分為如下幾部:1. 模型設(shè)計 2. 離線訓(xùn)練 3.網(wǎng)絡(luò)裁剪 4. 在線部署。下面我們將會結(jié)合這個四個步驟,討論如何利用MNN進行Mobilenet SSD的部署。
在進行討論前,我們說明一下,采用的離線訓(xùn)練框架為tensorflow,MobilenetSSD采用的是Google的物體檢測全家桶。
模型設(shè)計
在進行模型設(shè)計的時候,唯一需要注意的要點是避免在核心網(wǎng)絡(luò)層中采用硬件或端上推理框架不支持的Op。比如,tflite android中的NNAPI 1.0中不支持padding、squeeze、reshape等Op。如下圖
NNAPI 1.0 不支持的Op
在使用MNN進行在線部署的時候,同樣也需要考慮這個問題。在進行模型的設(shè)計的時候,需要認真檢查核對,核心的CNN網(wǎng)絡(luò)里有沒有采用MNN框架不支持的Op。如果采用了,需要進行替換或者重新設(shè)計。
離線訓(xùn)練
離線訓(xùn)練的好壞直接影響該CNN模型實際的推斷效果,不過本文的重點不在如何進行訓(xùn)練。后續(xù)我們會再詳細寫一篇文章介紹如何訓(xùn)練,這里我們假定已經(jīng)完成了該任務(wù)。為此,我們提供了訓(xùn)練好的兩個模型,一個是300x300-0.5的人體檢測器,另一個是224x224-0.5的人臉檢測器。我們將在文章末尾附上github的鏈接。
網(wǎng)絡(luò)裁剪
如果有些Op或者layer在進行離線訓(xùn)練時不可缺少,但是端上推理框架不支持該怎么辦呢?比如Mobilenet SSD中的后處理模塊,tensorflow Object detection api的PostProcessing Ops和Caffe SSD中的ObjectDetectionLayer。網(wǎng)絡(luò)裁剪就是在這個時候派上用場的,以tensorflow的Object detection api為例,我們可以僅導(dǎo)出PostProcessing之前的Node,即concat和concat_1,然后后處理可以從device取出結(jié)果后,在cpu端進行postprocessing??蓞⒖既缦聦?dǎo)出腳本,
bazel run --config=opt tensorflow/lite/toco:toco -- /
--input_file=$OUTPUT_DIR/tflite_graph.pb /
--output_file=$OUTPUT_DIR/detect.tflite /
--input_shapes=1,224,224,3 /
--input_arrays=normalized_input_image_tensor /
--output_arrays='concat','concat_1' /
--inference_type=FLOAT /
--change_concat_input_ranges=false
在線部署
我們前面進行了模型設(shè)計(保證核心CNN結(jié)構(gòu)不引入MNN不支持的Op)、離線訓(xùn)練(保證得到一個效果好的CNN網(wǎng)絡(luò))、網(wǎng)絡(luò)裁剪(移除不支持的Op),目前得到的模型(pb或tflite),基本可以確保在MNN中能正常運行。在用MNN進行在線部署的時候,我們還需要完成如下幾個步驟:基于目標平臺的MNN編譯、tflite或tensorflow的MNN模型轉(zhuǎn)化、編寫基于MNN的MSSD業(yè)務(wù)代碼。我們將這幾個步驟都做了詳細的文檔,連同數(shù)據(jù)和代碼都上傳到了我的github賬戶中。大家可參考如下鏈接,工程內(nèi)提供了基于MNN的tflite-mssd和tensorflow-mssd的部署流程和業(yè)務(wù)代碼,覺得有幫助的,希望大家能點個小星星。
討論
歡迎大家留言進行討論,我會第一時間進行回復(fù)。如果您對嵌入式的AI部署也感興趣,可關(guān)注專欄或本人賬號,相互交流學(xué)習(xí)。謝謝大家!
參考
本人Github:MNN-MSSD
審核編輯 黃昊宇
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3534瀏覽量
128999 -
SSD
+關(guān)注
關(guān)注
20文章
2819瀏覽量
117030 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5445瀏覽量
120807
發(fā)布評論請先 登錄
相關(guān)推薦
評論