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