概要
當(dāng)談到微控制器(MCU)和人工智能(AI)的結(jié)合,我們進(jìn)入了一個激動人心的領(lǐng)域。傳統(tǒng)上,AI應(yīng)用程序需要大型計算機(jī)或云服務(wù)器的處理能力,但隨著技術(shù)的發(fā)展,現(xiàn)在可以將AI嵌入到微控制器中。這為嵌入式系統(tǒng)、物聯(lián)網(wǎng)設(shè)備、機(jī)器人和各種其他應(yīng)用開啟了新的可能性。
MCU AI的崛起
MCU AI代表著微控制器上的人工智能。它是將機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型部署到資源有限但功能強(qiáng)大的微控制器中,以實現(xiàn)智能決策和感知。以下是MCU AI的一些關(guān)鍵方面:
- 低功耗:微控制器通常以電池供電,因此低功耗是至關(guān)重要的。AI模型需要經(jīng)過優(yōu)化,以在微控制器上運(yùn)行,同時盡量減小能耗。
- 實時性:微控制器常常用于實時控制系統(tǒng),因此AI模型需要在極短的時間內(nèi)執(zhí)行,以應(yīng)對即時需求。
- 感知和決策:MCU AI可以使設(shè)備具備感知環(huán)境、分析數(shù)據(jù)并作出決策的能力。這對于自主機(jī)器人、智能傳感器和自動控制系統(tǒng)尤為有用。
MCU AI的應(yīng)用
MCU AI可以應(yīng)用于各種領(lǐng)域,下面是一些示例:
- 智能物聯(lián)網(wǎng)設(shè)備:微控制器上的AI可以使物聯(lián)網(wǎng)設(shè)備更加智能,例如智能家居設(shè)備、智能燈具和智能門鎖。它們可以學(xué)習(xí)用戶的偏好,并自動適應(yīng)不同環(huán)境。
- 自主機(jī)器人:微控制器上的AI使自主機(jī)器人能夠避障、規(guī)劃路徑和執(zhí)行任務(wù),例如清掃機(jī)器人和無人機(jī)。
- 醫(yī)療設(shè)備:在醫(yī)療設(shè)備中,MCU AI可以用于監(jiān)測患者的生命體征,提供早期警報和更好的病人護(hù)理。
- 工業(yè)自動化:微控制器上的AI可用于工業(yè)機(jī)器人、自動化生產(chǎn)線和質(zhì)量控制系統(tǒng),提高效率和質(zhì)量。
作者開始深入進(jìn)嵌入式AI這個領(lǐng)域,不過學(xué)習(xí)之前先了解如何用起來,跑起來。本篇文章聊一下如何移植TinyMaix推理框架到RT-THREAD并運(yùn)行起來。
TinyMaix
TinyMaix:是矽速科技(Sipeed)利用兩個周末的業(yè)余時間完成的項目,它是一款專為微控制器設(shè)計的輕量級開源機(jī)器學(xué)習(xí)庫,面向單片機(jī)的超輕量級的神經(jīng)網(wǎng)絡(luò)推理庫,即TinyML推理庫,可以讓你在任意單片機(jī)上運(yùn)行輕量級深度學(xué)習(xí)模型。TinyMaix開源代碼鏈接:https://github.com/sipeed/tinymaix。
TinyMaix關(guān)鍵特性
- 核心代碼少于 400行(tm_layers.c+tm_model.c+arch_cpu.h), 代碼段(.text)少于3KB
- 低內(nèi)存消耗,甚至 Arduino ATmega328 (32KB Flash, 2KB Ram) 都能基于 TinyMaix 跑 mnist(手寫數(shù)字識別)
- 支持 INT8/FP32/FP16 模型,實驗性地支持 FP8 模型,支持 keras h5 或 tflite 模型轉(zhuǎn)換
- 支持多種芯片架構(gòu)的專用指令優(yōu)化: ARM SIMD/NEON/MVEI,RV32P, RV64V
- 友好的用戶接口,只需要 load/run 模型~
- 支持全靜態(tài)的內(nèi)存配置(無需 malloc )
- 即將支持 MaixHub 在線模型訓(xùn)練
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計算部分無特殊依賴(計算代碼均使用標(biāo)準(zhǔn)C實現(xiàn))。SIMD部分,部分計算代碼使用了C語言內(nèi)嵌匯編實現(xiàn),需要CPU支持相應(yīng)的匯編指令,才可以正常編譯、運(yùn)行。
TinyMaix等級選擇
TinyMaix目前支持兩種等級:1. 選擇最少代碼和buf 2. 選擇速度,需要更多代碼和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框架對上層應(yīng)用程序提供的核心API主要位于代碼倉的tinymaix.h文件中,其中:
- 模型API包含四個:模型加載,模型卸載,預(yù)處理,推理。
/*******************************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
- 統(tǒng)計函數(shù):用于輸出模型中間層信息
/*******************************STATFUNCTION************************************/
#ifTM_ENABLE_STAT
tm_err_ttm_stat(tm_mdlbin_t*mdl);//statmodel
#endif
- 工具函數(shù),包含F(xiàn)P32和uint8的互轉(zhuǎn)
/*******************************UTILSFUNCTION************************************/
uint8_tTM_WEAKtm_fp32to8(floatfp32);
floatTM_WEAKtm_fp8to32(uint8_tfp8);
這里的模型,通常是預(yù)訓(xùn)練模型經(jīng)過腳本轉(zhuǎn)換生成的TinyMaix格式的模型;
TinyMaix移植到RT-Thread
- TinyMaix移植到RT-Thread工作量其實不到,主要適配tm_port.h文件即可。
- RT-Thread的配置是通過Kconfig設(shè)置一些參數(shù)的,所以我把硬件類型,選擇等級,量化類型都修改為Kconfig進(jìn)行配置。
#defineTM_ARCHR_TINYMAIX_USING_ARCK_TYPE
#defineTM_OPT_LEVELR_TINYMAIX_USING_OPTION_LEVEL
#defineTM_MDL_TYPER_TINYMAIX_USING_MODULE_TYPE
- TinyMaix需要對接平臺內(nèi)聯(lián),內(nèi)存,打印等接口,所以我們修改對應(yīng)宏定義,將其適配到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調(diào)試依賴于精準(zhǔn)的計時,我們需要適配其對應(yīng)的幾個宏定義,因為RT-Thread系統(tǒng)沒有提供微秒級的接口,只有毫秒級的接口,所以我做了簡單的適配。
#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%.3fmsn",(x),_time);
_start=TM_GET_US();
}
- TinyMaix提供了多個實例,如:cifar10,mnist,vww等,RT-Thread支持命令行輸入,為了實例可以在通過命令函運(yùn)行,我們需要修改一下文件名和接口名字。
- 我們將examples下的cifar10,mnist,vww三個實例下的main.c修改為對應(yīng)實例的名字:cifar10.c,mnist.c,vww.c。
- 將cifar10.c,mnist.c,vww.c中的main函數(shù)修改為對應(yīng)實例名字。
intcifar10(intargc,char**argv)
intmnist(intargc,char**argv)
intvww(intargc,char**argv)
- 將實例接口導(dǎo)出到命令行中。
MSH_CMD_EXPORT(cifar10,TinyMaixcifar10example);
MSH_CMD_EXPORT(mnist,TinyMaixmnistexample);
MSH_CMD_EXPORT(vww,TinyMaixvwwexample);
TinyMaix運(yùn)行效果
實例的運(yùn)行環(huán)境:STM32F401RE,M4內(nèi)核,時鐘頻率:84MHz,RAM:96 KB,F(xiàn)lash:512 KB
- cifar10實例,分類檢測,識別圖片是一只鳥:


- mnist實例,數(shù)字識別,圖片是一個數(shù)字2:

- vww實例,檢測有沒有人,圖片有人:

總結(jié)
- TinyMaix作者已經(jīng)做了一個RT-Thread的軟件包:r-tinymaix??梢栽赗T-Thread中工程中加入軟件包即可以驗證。
- r-tinymaix的開源鏈接:https://github.com/RiceChen0/r-tinymaix
- TinyMaix非常贊,可以讓一個普普通通的單片機(jī)擁有AI能力,讓嵌入式AI成本減低。
-
mcu
+關(guān)注
關(guān)注
146文章
17718瀏覽量
358182 -
AI
+關(guān)注
關(guān)注
87文章
33554瀏覽量
274193 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1348瀏覽量
41367 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5547瀏覽量
122304 -
TinyML
+關(guān)注
關(guān)注
0文章
43瀏覽量
1432
發(fā)布評論請先 登錄
相關(guān)推薦
基于RT-Thread的RoboMaster電控框架設(shè)計
RT-Thread AI kit輕松部署 STM32Cube-AI 至 RT-Thread 精選資料推薦
關(guān)于RT-AK開源輕松實現(xiàn)一鍵部署AI模型至RT-Thread解析

RT-Thread AI kit開源:輕松實現(xiàn)一鍵部署AI模型至 RT-Thread

RT-Thread大會:瑞薩e- AI成功案例及部署

RT-Thread全球技術(shù)大會:RT-Thread上的單元測試框架與運(yùn)行測試用例

RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實現(xiàn)

測評分享 | 如何在先楫HPM6750上運(yùn)行輕量級AI推理框架TinyMaix

評論