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