概要
當談到微控制器(MCU)和人工智能(AI)的結合,我們進入了一個激動人心的領域。傳統上,AI應用程序需要大型計算機或云服務器的處理能力,但隨著技術的發展,現在可以將AI嵌入到微控制器中。這為嵌入式系統、物聯網設備、機器人和各種其他應用開啟了新的可能性。
MCU AI的崛起
MCU AI代表著微控制器上的人工智能。它是將機器學習和深度學習模型部署到資源有限但功能強大的微控制器中,以實現智能決策和感知。以下是MCU AI的一些關鍵方面:
低功耗: 微控制器通常以電池供電,因此低功耗是至關重要的。AI模型需要經過優化,以在微控制器上運行,同時盡量減小能耗。
實時性: 微控制器常常用于實時控制系統,因此AI模型需要在極短的時間內執行,以應對即時需求。
感知和決策: MCU AI可以使設備具備感知環境、分析數據并作出決策的能力。這對于自主機器人、智能傳感器和自動控制系統尤為有用。
MCU AI的應用
MCU AI可以應用于各種領域,下面是一些示例:
智能物聯網設備: 微控制器上的AI可以使物聯網設備更加智能,例如智能家居設備、智能燈具和智能門鎖。它們可以學習用戶的偏好,并自動適應不同環境。
自主機器人: 微控制器上的AI使自主機器人能夠避障、規劃路徑和執行任務,例如清掃機器人和無人機。
醫療設備: 在醫療設備中,MCU AI可以用于監測患者的生命體征,提供早期警報和更好的病人護理。
工業自動化: 微控制器上的AI可用于工業機器人、自動化生產線和質量控制系統,提高效率和質量。
風火輪科技開始深入進嵌入式AI這個領域,不過學習之前先了解如何用起來,跑起來。本篇文章聊一下如何移植TinyMaix推理框架到RT-THREAD并運行起來。
TinyMaix
TinyMaix:是矽速科技(Sipeed)利用兩個周末的業余時間完成的項目,它是一款專為微控制器設計的輕量級開源機器學習庫,面向單片機的超輕量級的神經網絡推理庫,即TinyML推理庫,可以讓你在任意單片機上運行輕量級深度學習模型。TinyMaix開源代碼鏈接:https://github.com/sipeed/tinymaix。
TinyMaix關鍵特性
核心代碼少于 400行(tm_layers.c+tm_model.c+arch_cpu.h), 代碼段(.text)少于3KB
低內存消耗,甚至 Arduino ATmega328 (32KB Flash, 2KB Ram) 都能基于 TinyMaix 跑 mnist(手寫數字識別)
支持 INT8/FP32/FP16 模型,實驗性地支持 FP8 模型,支持 keras h5 或 tflite 模型轉換
支持多種芯片架構的專用指令優化: ARM SIMD/NEON/MVEI,RV32P, RV64V
支持全靜態的內存配置(無需 malloc )
即將支持 MaixHub 在線模型訓練
TinyMaix底層依賴
TinyMaix可以簡單理解為一個矩陣和向量計算庫,目前已支持如下幾種計算硬件:
#defineTM_ARCH_CPU(0)//default,purecpucompute #defineTM_ARCH_ARM_SIMD(1)//ARMCortexM4/M7,etc. #defineTM_ARCH_ARM_NEON(2)//ARMCortexA7,etc. #defineTM_ARCH_ARM_MVEI(3)//ARMv8.1:M55,etc. #defineTM_ARCH_RV32P(4)//T-headE907,etc. #defineTM_ARCH_RV64V(5)//T-headC906,C910,etc. #defineTM_ARCH_CSKYV2(6)//cskyv2withdspcore #defineTM_ARCH_X86_SSE2(7)//x86sse2
對于ARM-Cortex系列MCU,可以支持純CPU計算和SIMD計算。其中CPU計算部分無特殊依賴(計算代碼均使用標準C實現)。SIMD部分,部分計算代碼使用了C語言內嵌匯編實現,需要CPU支持相應的匯編指令,才可以正常編譯、運行。
TinyMaix等級選擇
TinyMaix目前支持兩種等級:1. 選擇最少代碼和buf2. 選擇速度,需要更多代碼和buf
#defineTM_OPT0(0)//default,leastcodeandbuf #defineTM_OPT1(1)//optforspeed,needmorecodeandbuf #defineTM_OPT2(2)//TODO
TinyMaix量化
TinyMaix支持不同位寬的量化:
#defineTM_MDL_INT80 #defineTM_MDL_INT161 #defineTM_MDL_FP322 #defineTM_MDL_FP163 #defineTM_MDL_FP8_1434//experimental #defineTM_MDL_FP8_1525//experimental
TinyMaix核心API
TinyMaix框架對上層應用程序提供的核心API主要位于代碼倉的tinymaix.h文件中,其中:
模型API包含四個:模型加載,模型卸載,預處理,推理。
/*******************************MODELFUNCTION************************************/ tm_err_ttm_load(tm_mdl_t*mdl,constuint8_t*bin,uint8_t*buf,tm_cb_tcb,tm_mat_t*in);//loadmodel voidtm_unload(tm_mdl_t*mdl);//removemodel tm_err_ttm_preprocess(tm_mdl_t*mdl,tm_pp_tpp_type,tm_mat_t*in,tm_mat_t*out);//preprocessinputdata tm_err_ttm_run(tm_mdl_t*mdl,tm_mat_t*in,tm_mat_t*out);//runmodel
統計函數:用于輸出模型中間層信息
/*******************************STATFUNCTION************************************/ #ifTM_ENABLE_STAT tm_err_ttm_stat(tm_mdlbin_t*mdl);//statmodel #endif
工具函數,包含FP32和uint8的互轉
/*******************************UTILSFUNCTION************************************/ uint8_tTM_WEAKtm_fp32to8(floatfp32); floatTM_WEAKtm_fp8to32(uint8_tfp8);
這里的模型,通常是預訓練模型經過腳本轉換生成的TinyMaix格式的模型;
TinyMaix移植到RT-Thread
TinyMaix移植到RT-Thread工作量其實不到,主要適配tm_port.h文件即可。
RT-Thread的配置是通過Kconfig設置一些參數的,所以我把硬件類型,選擇等級,量化類型都修改為Kconfig進行配置。
#defineTM_ARCHR_TINYMAIX_USING_ARCK_TYPE #defineTM_OPT_LEVELR_TINYMAIX_USING_OPTION_LEVEL #defineTM_MDL_TYPER_TINYMAIX_USING_MODULE_TYPE
TinyMaix需要對接平臺內聯,內存,打印等接口,所以我們修改對應宏定義,將其適配到RT-Thread平臺的接口上。
#defineTM_INLINErt_inline #defineTM_WEAKrt_weak #definetm_malloc(x)rt_malloc(x) #definetm_free(x)rt_free(x) #defineTM_PRINTF(...)rt_kprintf(__VA_ARGS__)
TinyMaix調試依賴于精準的計時,我們需要適配其對應的幾個宏定義,因為RT-Thread系統沒有提供微秒級的接口,只有毫秒級的接口,所以我做了簡單的適配。
#defineTM_GET_US()rt_tick_get_millisecond()/1000; #defineTM_DBGT_INIT()uint32_t_start,_finish; float_time; _start=TM_GET_US(); #defineTM_DBGT_START()_start=TM_GET_US(); #defineTM_DBGT(x){ _finish=TM_GET_US(); _time=(float)(_finish-_start)/1.0; TM_PRINTF("===%suse%.3fms ",(x),_time); _start=TM_GET_US(); }
TinyMaix提供了多個實例,如:cifar10,mnist,vww等,RT-Thread支持命令行輸入,為了實例可以在通過命令函運行,我們需要修改一下文件名和接口名字。
我們將examples下的cifar10,mnist,vww三個實例下的main.c修改為對應實例的名字:cifar10.c,mnist.c,vww.c。
將cifar10.c,mnist.c,vww.c中的main函數修改為對應實例名字。
intcifar10(intargc,char**argv) intmnist(intargc,char**argv) intvww(intargc,char**argv)
將實例接口導出到命令行中。
MSH_CMD_EXPORT(cifar10,TinyMaixcifar10example); MSH_CMD_EXPORT(mnist,TinyMaixmnistexample); MSH_CMD_EXPORT(vww,TinyMaixvwwexample);
TinyMaix運行效果
實例的運行環境:STM32F401RE,M4內核,時鐘頻率:84MHz,RAM:96 KB,Flash:512 KB
cifar10實例,分類檢測,識別圖片是一只鳥:
mnist實例,數字識別,圖片是一個數字2:
vww實例,檢測有沒有人,圖片有人:
總結
TinyMaix作者已經做了一個RT-Thread的軟件包:r-tinymaix。可以在RT-Thread中工程中加入軟件包即可以驗證。
TinyMaix非常贊,可以讓一個普普通通的單片機擁有AI能力,讓嵌入式AI成本減低
審核編輯:湯梓紅
-
微控制器
+關注
關注
48文章
7496瀏覽量
151082 -
mcu
+關注
關注
146文章
17018瀏覽量
350366 -
嵌入式
+關注
關注
5071文章
19026瀏覽量
303486 -
AI
+關注
關注
87文章
30238瀏覽量
268467 -
RT-Thread
+關注
關注
31文章
1274瀏覽量
39938
原文標題:RT-Thread上部署TinyMaix推理框架,使MCU賦予AI能力
文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論