本文轉(zhuǎn)載于極術(shù)社區(qū)
極術(shù)專欄:Arm技術(shù)博客
作者:鄭亞斌丨Arm中國(guó)生態(tài)技術(shù)市場(chǎng)經(jīng)理
一、概述
隨著邊緣計(jì)算和深度學(xué)習(xí)領(lǐng)域的不斷發(fā)展,越來(lái)越多的端側(cè) AI 設(shè)備開(kāi)始出現(xiàn)在我們的視野中。本次提出的這一方案著眼于邊緣計(jì)算與深度學(xué)習(xí)場(chǎng)景,提出了一款應(yīng)用于無(wú)人值守倉(cāng)儲(chǔ)、居民社區(qū)或危險(xiǎn)禁入?yún)^(qū)域的智能監(jiān)控方案,具有成本低、功耗低等優(yōu)勢(shì)。此處以人體檢測(cè)為例,對(duì)于長(zhǎng)時(shí)間徘徊于某區(qū)域的行人進(jìn)行智能識(shí)別,并且將異常現(xiàn)象及時(shí)上報(bào)云端,從而實(shí)現(xiàn)邊緣 AI,TencentOS Tiny 以及騰訊云完美結(jié)合的智能安防案例。
二、系統(tǒng)創(chuàng)新點(diǎn)
1. 本系統(tǒng)采用了 TencentOS Tiny 這一物聯(lián)網(wǎng)實(shí)時(shí)操作系統(tǒng)來(lái)實(shí)現(xiàn)片上資源的智能化管理。一方面,它可以靈活高效的管理系統(tǒng)的片上資源,為系統(tǒng)并發(fā)執(zhí)行多個(gè)任務(wù)提供了基礎(chǔ) ;另一方面,搭載 TencentOS Tiny 的端側(cè)系統(tǒng)可以方便的與騰訊云對(duì)接,依托于騰訊云的豐富資源為端云結(jié)合帶來(lái)了更多的可能性。
2. 本系統(tǒng)搭載了Tensorflow Lite Micro 超低功耗 AI 推理框架以及 Arm CMSIS-NN 加速庫(kù)。Tensorflow Lite Micro 是 Tensorflow 針對(duì)微控制器應(yīng)用場(chǎng)景所設(shè)計(jì)的 AI 推理框架。它占用的資源少,運(yùn)行時(shí)內(nèi)存最低只需要 16KB。并且它依托于Tensorflow 平臺(tái)強(qiáng)大的技術(shù)生態(tài),使得更多開(kāi)發(fā)者可以方便的集成、使用 AI 算法。Tensorflow Lite Micro 通過(guò)使能 Arm 開(kāi)源加速庫(kù) CMSIS-NN ,為端側(cè)帶來(lái)人工智能的新活力。
CMSIS-NN:
https://www.keil.com/pack/doc/CMSIS/NN/html/index.html
3. 目前 Tensorflow Lite Micro 及 CMSIS-NN 組件已經(jīng)合并到 TencentOS Tiny GitHub 倉(cāng)庫(kù),其中提供了 Tensorflow Lite Micro 源碼以及針對(duì) Arm Cortex-M 系列的 MDK lib 庫(kù)文件,可以方便開(kāi)發(fā)者集成到 MCU 開(kāi)發(fā)環(huán)境中。
Tensorflow Lite Micro 及 CMSIS-NN:
https://github.com/Tencent/TencentOS-tiny/tree/master/components/ai/tflite_micro
4. 本系統(tǒng)將邊緣 AI 和 TencentOS Tiny 結(jié)合,面向區(qū)域安防管理,提出了一種新的端云系統(tǒng)架構(gòu)。通過(guò)對(duì)系統(tǒng)的驗(yàn)證并配合詳細(xì)的用戶移植文檔,讓整個(gè)系統(tǒng)具備在多領(lǐng)域多場(chǎng)景的可遷移性與易用性。
系統(tǒng)拓?fù)浣Y(jié)構(gòu)圖:
單個(gè) TencentOS Tiny 內(nèi)部結(jié)構(gòu)圖:
系統(tǒng) Demo 展示:
設(shè)備檢測(cè)的正確率與模型設(shè)計(jì)和模型訓(xùn)練息息相關(guān)。經(jīng)過(guò)測(cè)試,采用 Tensorflow Lite Micro 官方 github 中的 Person Detection 模型開(kāi)發(fā)的行人檢測(cè)例程,其檢測(cè)正確率達(dá)到 84%。端側(cè)檢測(cè)到行人后,MCU 將有關(guān)行人的數(shù)據(jù)上傳到云端,云端根據(jù)收到的信息來(lái)喚醒其他高性能設(shè)備,進(jìn)一步獲取更加詳實(shí)的真實(shí)數(shù)據(jù)。
相比與傳統(tǒng)的社區(qū)管理員通過(guò)大量連接高清攝像頭的屏幕來(lái)完成社區(qū)安全管理的方法相比,這種基于 TencentOS Tiny 和 CMSIS-NN 的端云協(xié)同智能安防系統(tǒng)僅會(huì)在端側(cè)檢測(cè)到行人后才會(huì)觸發(fā)相應(yīng)事件。這不僅減輕了管理員的工作負(fù)擔(dān),更重要的是端側(cè)實(shí)現(xiàn)的智能化應(yīng)用將極大的節(jié)省系統(tǒng)帶寬,提升系統(tǒng)響應(yīng)的同時(shí)也降低了成本,是一種綜合能力較強(qiáng)的解決方案。
三、系統(tǒng)移植概述
我們已將相關(guān)代碼和文檔開(kāi)源至官方主倉(cāng)庫(kù),開(kāi)發(fā)者可以按照指南進(jìn)行移植和應(yīng)用。
1. 準(zhǔn)備目標(biāo)硬件(開(kāi)發(fā)板 / 傳感器 / 模組)
開(kāi)發(fā)板 :NUCLEO-L496ZG,MCU 為 STM32L496ZG
Camera :獲取 RGB 圖像,本例程使用 OV2640 攝像頭
通信模組 :負(fù)責(zé) MCU 與云端之間的通信,本例程選用的樂(lè)鑫 ESP8266
2.準(zhǔn)備系統(tǒng)軟件
參考 TencentOS Tiny 基于 Keil 的移植教程進(jìn)行移植。
為了方便初始化 MCU 外設(shè),后續(xù)要繼續(xù)使用 STM32CubeMX 軟件,請(qǐng)確保正確安裝。在系統(tǒng)移植完成后,工程可以進(jìn)行線程任務(wù)切換,通過(guò)串口打印“hello world”,表明基礎(chǔ) Keil 工程代碼準(zhǔn)備完畢。
準(zhǔn)備 Tensorflow Lite Micro 組件。
基于 Keil 的移植教程:
https://github.com/Tencent/TencentOS-tiny/blob/master/doc/10.Porting_Manual_for_KEIL.md
本次我們使用 Tensorflow Lite Micro 推理框架來(lái)實(shí)現(xiàn)行人檢測(cè)任務(wù),用戶可以直接采用主倉(cāng)庫(kù)中 TencentOS-tinycomponentsai flite_micro 路徑下對(duì)應(yīng)的lib 庫(kù)文件來(lái)集成到系統(tǒng)中,然后調(diào)用相關(guān)的 API 即可將 AI 組件部署在 MCU 平臺(tái)上。
制作 lib 庫(kù)文件以及能使 CMSIS NN 加速。
請(qǐng)參考 Tensorflow Lite Micro 組件使用說(shuō)明。
使用說(shuō)明:
https://github.com/Tencent/TencentOS-tiny/blob/master/components/ai/tflite_micro/TFlite_Micro_Component_User_Guide.md
3. 系統(tǒng)移植流程
在獲得基礎(chǔ)工程后,我們首先移植驅(qū)動(dòng)代碼
添加與本例程相關(guān)的 Necluo STM32L496RG 的攝像頭驅(qū)動(dòng)代碼 ( 此處采用官方倉(cāng)庫(kù)中的驅(qū)動(dòng)代碼)
Necluo STM32L496RG 的攝像頭驅(qū)動(dòng)代碼:
https://github.com/Tencent/TencentOS-tiny/tree/master/board/NUCLEO_STM32L496ZG/BSP/Hardware/Src
重寫 mcu_init 函數(shù)中的 DCMI 幀中斷回調(diào)函數(shù)。值得注意的是,當(dāng)使用 CubeMX 重新配置外設(shè)并生成代碼時(shí),代碼需要寫在 CubeMx 生成的注釋語(yǔ)句內(nèi),這樣添加的代碼才不會(huì)被覆蓋。如下所示,代碼添加在 /* USER CODE BEGIN 4 / 和 / USER CODE END 4 */ 注釋語(yǔ)句之間 :
添加 LCD 程序顯示攝像頭圖像 :
將 Tensorflow Lite Micro 的模型和數(shù)據(jù)接入代碼添加到工程中,同時(shí)添加
TencentOS-tinycomponentsai flite_microKEIL etarget.c
TencentOS-tinycomponentsai flite_microARM_CortexM4_lib tensorflow_lite_micro.lib
模型和數(shù)據(jù)接入代碼:
https://github.com/Tencent/TencentOS-tiny/tree/master/examples/tflitemicro_person_detection
最后關(guān)閉 Keil 的 Microlib 庫(kù),include 相關(guān)的文件
注 :最下方的路徑為
調(diào)整優(yōu)化等級(jí)和指定 tflite_micro 的 debug 信息輸出串口 :
其中宏 NUCLEO_STM32L496ZG 指定 Nucleo STM32L496 的 hlpuart1 為系統(tǒng)printf 函數(shù)的輸出串口,具體定義在 Nucleo STM32L496 BSP 文件夾中的mcu_init.c 中 。
至此 Tensorflow Lite Micro 已經(jīng)成功的移植到 MCU 平臺(tái)中,可以開(kāi)始設(shè)計(jì)與行人檢測(cè)有關(guān)的應(yīng)用層代碼。
設(shè)計(jì)圖像預(yù)處理函數(shù)。在本例程中,模型的輸入為灰度圖,為完成攝像頭獲取的 RGB 圖像到灰度圖轉(zhuǎn)換,需要解析出 RGB565 像素格式中 R、G、B 通道的數(shù)據(jù),再根據(jù)公式計(jì)算出單個(gè)像素點(diǎn)的灰度,具體代碼如下 :
編寫行人檢測(cè)線程任務(wù)函數(shù) :
應(yīng)用程序主體若在 10 幀中檢測(cè)到超過(guò)半數(shù)的人像,就判定為異常并上報(bào)云端。根據(jù)實(shí)際的測(cè)試結(jié)果,執(zhí)行一幀圖像推理耗時(shí)約 633ms。
在 MCU 端處理完行人檢測(cè)后,MCU 與云端建立數(shù)據(jù)連接并傳輸數(shù)據(jù)。部分代碼如下 :
4. 騰訊物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái) - 騰訊連連小程序開(kāi)發(fā)
為了方便用戶實(shí)時(shí)查看端側(cè)上傳的信息(是否有異常報(bào)警、人流量計(jì)數(shù)等)以及控制設(shè)備端發(fā)出報(bào)警提示,我們利用騰訊云 IoT Explorer 開(kāi)發(fā)平臺(tái),開(kāi)發(fā)騰訊連連小程序。
開(kāi)發(fā)過(guò)程如下,登錄騰訊云開(kāi)發(fā)平臺(tái) :
步驟一 :新建產(chǎn)品
步驟二 :跟據(jù)場(chǎng)景和應(yīng)用定義數(shù)據(jù)模板
設(shè)備端上傳只讀數(shù)據(jù) :
1.行人檢測(cè) :設(shè)備端檢測(cè)到行人時(shí),標(biāo)志位置為 1
2.異常停留報(bào)警 :當(dāng)設(shè)備端持續(xù)檢測(cè)到行人時(shí),觸發(fā)異常停留報(bào)警,標(biāo)志位置為 1
3.行人計(jì)數(shù) :當(dāng)設(shè)備端的行人檢測(cè)結(jié)果從無(wú)人變化為有人時(shí),人流量計(jì)數(shù)值 +1
設(shè)備端接收控制指令 :
報(bào)警提示 :當(dāng)用戶看到有異常停留時(shí),可以控制設(shè)備端發(fā)出報(bào)警提示,也可以關(guān)閉報(bào)警提示
步驟三 :編輯小程序的面板
由于目前騰訊連連提供的模板較少,暫時(shí)使用按鈕顯示設(shè)備狀態(tài)信息。
步驟四 :設(shè)備調(diào)試
將產(chǎn)品 ID、密鑰、設(shè)備號(hào)等信息填入設(shè)備端程序
移植基于 TencentOS Tiny 的 AT 組件和 ESP8266 適配的 SAL 框架
設(shè)備端編寫上行和下行數(shù)據(jù)處理程序
四、結(jié)語(yǔ)
我們提出了一種基于邊緣 AI+TencentOS Tiny 的新架構(gòu),雖然在用戶前端還有很多改進(jìn)的空間,但通過(guò)對(duì)整體方案的驗(yàn)證并且配合詳細(xì)的用戶移植文檔,使我們的工作具備了可遷移性和擴(kuò)展性,同時(shí)也實(shí)現(xiàn)了 TencentOS Tiny 對(duì)于人工智能領(lǐng)域的支持。未來(lái)我們會(huì)繼續(xù)完善 Tensorflow Lite Micro 組件并不斷更新應(yīng)用,致力于豐富整個(gè)TencentOS Tiny 以及 Arm 生態(tài)。隨著越來(lái)越多的廠商采用 Arm Cortex-M55 和Ethos-U NPU IP 方案,相信未來(lái)端側(cè) AI 的應(yīng)用會(huì)更加廣闊。
TencentOS Tiny AI 組件 :
https://github.com/Tencent/TencentOS-tiny/tree/master/components/ai/tflite_micro
Arm Cortex-M4 :
https://www.arm.com/products/silicon-ip-cpu/cortex-m/cortex-m4
Arm Cortex-M55 :
https://www.arm.com/products/silicon-ip-cpu/cortex-m/cortex-m55
Arm Ethos-U55 :
https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u55
Arm Ethos-U65 :
https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65
TensorFlow Lite for Microcontrollers :https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro
五、致謝
感謝 TencentOS Tiny 以及 TensorFlow 開(kāi)源社區(qū)團(tuán)隊(duì)的大力支持,感謝個(gè)人開(kāi)發(fā)者鄧可笈,楊慶生和劉恒言的貢獻(xiàn)。
https://aijishu.com/a/1060000000188831