0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MCU AI的崛起和應(yīng)用 如何移植TinyMaix推理框架到RT-THREAD

jf_NsPBt3VS ? 來源:風(fēng)火輪技術(shù)團(tuán)隊(duì) ? 2023-11-05 11:07 ? 次閱讀

概要

當(dāng)談到微控制器MCU)和人工智能AI)的結(jié)合,我們進(jìn)入了一個(gè)激動(dòng)人心的領(lǐng)域。傳統(tǒng)上,AI應(yīng)用程序需要大型計(jì)算機(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)大的微控制器中,以實(shí)現(xiàn)智能決策和感知。以下是MCU AI的一些關(guān)鍵方面:

低功耗: 微控制器通常以電池供電,因此低功耗是至關(guān)重要的。AI模型需要經(jīng)過優(yōu)化,以在微控制器上運(yùn)行,同時(shí)盡量減小能耗。

實(shí)時(shí)性: 微控制器常常用于實(shí)時(shí)控制系統(tǒng),因此AI模型需要在極短的時(shí)間內(nèi)執(zhí)行,以應(yīng)對(duì)即時(shí)需求。

感知和決策: MCU AI可以使設(shè)備具備感知環(huán)境、分析數(shù)據(jù)并作出決策的能力。這對(duì)于自主機(jī)器人、智能傳感器和自動(dòng)控制系統(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í)用戶的偏好,并自動(dòng)適應(yīng)不同環(huán)境。

自主機(jī)器人: 微控制器上的AI使自主機(jī)器人能夠避障、規(guī)劃路徑和執(zhí)行任務(wù),例如清掃機(jī)器人和無人機(jī)。

醫(yī)療設(shè)備: 在醫(yī)療設(shè)備中,MCU AI可以用于監(jiān)測(cè)患者的生命體征,提供早期警報(bào)和更好的病人護(hù)理。

工業(yè)自動(dòng)化: 微控制器上的AI可用于工業(yè)機(jī)器人、自動(dòng)化生產(chǎn)線和質(zhì)量控制系統(tǒng),提高效率和質(zhì)量。

風(fēng)火輪科技開始深入進(jìn)嵌入式AI這個(gè)領(lǐng)域,不過學(xué)習(xí)之前先了解如何用起來,跑起來。本篇文章聊一下如何移植TinyMaix推理框架到RT-THREAD并運(yùn)行起來。

TinyMaix

TinyMaix:是矽速科技(Sipeed)利用兩個(gè)周末的業(yè)余時(shí)間完成的項(xiàng)目,它是一款專為微控制器設(shè)計(jì)的輕量級(jí)開源機(jī)器學(xué)習(xí)庫(kù),面向單片機(jī)的超輕量級(jí)的神經(jīng)網(wǎng)絡(luò)推理庫(kù),即TinyML推理庫(kù),可以讓你在任意單片機(jī)上運(yùn)行輕量級(jí)深度學(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ù)字識(shí)別)

支持 INT8/FP32/FP16 模型,實(shí)驗(yàn)性地支持 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可以簡(jiǎn)單理解為一個(gè)矩陣和向量計(jì)算庫(kù),目前已支持如下幾種計(jì)算硬件

#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

對(duì)于ARM-Cortex系列MCU,可以支持純CPU計(jì)算和SIMD計(jì)算。其中CPU計(jì)算部分無特殊依賴(計(jì)算代碼均使用標(biāo)準(zhǔn)C實(shí)現(xiàn))。SIMD部分,部分計(jì)算代碼使用了C語言內(nèi)嵌匯編實(shí)現(xiàn),需要CPU支持相應(yīng)的匯編指令,才可以正常編譯、運(yùn)行。

TinyMaix等級(jí)選擇

TinyMaix目前支持兩種等級(jí):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框架對(duì)上層應(yīng)用程序提供的核心API主要位于代碼倉(cāng)的tinymaix.h文件中,其中:

模型API包含四個(gè):模型加載,模型卸載,預(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)計(jì)函數(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工作量其實(shí)不到,主要適配tm_port.h文件即可。

RT-Thread的配置是通過Kconfig設(shè)置一些參數(shù)的,所以我把硬件類型,選擇等級(jí),量化類型都修改為Kconfig進(jìn)行配置。

#defineTM_ARCHR_TINYMAIX_USING_ARCK_TYPE
#defineTM_OPT_LEVELR_TINYMAIX_USING_OPTION_LEVEL
#defineTM_MDL_TYPER_TINYMAIX_USING_MODULE_TYPE

TinyMaix需要對(duì)接平臺(tái)內(nèi)聯(lián),內(nèi)存,打印等接口,所以我們修改對(duì)應(yīng)宏定義,將其適配到RT-Thread平臺(tái)的接口上。

#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)的計(jì)時(shí),我們需要適配其對(duì)應(yīng)的幾個(gè)宏定義,因?yàn)镽T-Thread系統(tǒng)沒有提供微秒級(jí)的接口,只有毫秒級(jí)的接口,所以我做了簡(jiǎn)單的適配。

#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提供了多個(gè)實(shí)例,如:cifar10,mnist,vww等,RT-Thread支持命令行輸入,為了實(shí)例可以在通過命令函運(yùn)行,我們需要修改一下文件名和接口名字。

我們將examples下的cifar10,mnist,vww三個(gè)實(shí)例下的main.c修改為對(duì)應(yīng)實(shí)例的名字:cifar10.c,mnist.c,vww.c。

將cifar10.c,mnist.c,vww.c中的main函數(shù)修改為對(duì)應(yīng)實(shí)例名字。

intcifar10(intargc,char**argv)

intmnist(intargc,char**argv)

intvww(intargc,char**argv)

將實(shí)例接口導(dǎo)出到命令行中。

MSH_CMD_EXPORT(cifar10,TinyMaixcifar10example);

MSH_CMD_EXPORT(mnist,TinyMaixmnistexample);

MSH_CMD_EXPORT(vww,TinyMaixvwwexample);

TinyMaix運(yùn)行效果

實(shí)例的運(yùn)行環(huán)境:STM32F401RE,M4內(nèi)核,時(shí)鐘頻率:84MHz,RAM:96 KB,F(xiàn)lash:512 KB

cifar10實(shí)例,分類檢測(cè),識(shí)別圖片是一只鳥:

ffeb824a-7aa5-11ee-939d-92fbcf53809c.jpg

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

000ae84c-7aa6-11ee-939d-92fbcf53809c.png

00316472-7aa6-11ee-939d-92fbcf53809c.jpg

vww實(shí)例,檢測(cè)有沒有人,圖片有人:

004eedda-7aa6-11ee-939d-92fbcf53809c.png

總結(jié)

TinyMaix作者已經(jīng)做了一個(gè)RT-Thread的軟件包:r-tinymaix??梢栽赗T-Thread中工程中加入軟件包即可以驗(yàn)證。

TinyMaix非常贊,可以讓一個(gè)普普通通的單片機(jī)擁有AI能力,讓嵌入式AI成本減低

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7336

    瀏覽量

    150107
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16667

    瀏覽量

    347786
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18817

    瀏覽量

    298562
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28877

    瀏覽量

    266228
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1239

    瀏覽量

    39435

原文標(biāo)題:RT-Thread上部署TinyMaix推理框架,使MCU賦予AI能力

文章出處:【微信號(hào):風(fēng)火輪技術(shù)團(tuán)隊(duì),微信公眾號(hào):風(fēng)火輪技術(shù)團(tuán)隊(duì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于RT-Thread的RoboMaster電控框架設(shè)計(jì)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇 RT-Thread 進(jìn)行項(xiàng)目開發(fā)。
    發(fā)表于 09-06 15:21 ?563次閱讀

    移植RT-Thread的原理與方法

    大家好我是驚覺。是的,失蹤人口回來了。最近參加了rt-thread的國(guó)產(chǎn)MCU移植活動(dòng),移植rt-thread到華大的HC32L196。rt
    的頭像 發(fā)表于 09-17 09:41 ?7479次閱讀

    【國(guó)產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano

    【國(guó)產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano
    發(fā)表于 11-18 18:51 ?64次下載
    【國(guó)產(chǎn)<b class='flag-5'>MCU</b><b class='flag-5'>移植</b>】HC32F460基于Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    【國(guó)產(chǎn)MCU系列】在 HK32F030 上移植 RT-Thread Nano

    如需下載相關(guān)開源資料請(qǐng)點(diǎn)擊閱讀原文這是一個(gè)航順 HK32F030 的 RT-Thread Nano 移植示例,記錄了在 Keil 裸機(jī)工程的基礎(chǔ)上進(jìn)行 RT-Thread Nano 移植
    發(fā)表于 11-21 18:51 ?42次下載
    【國(guó)產(chǎn)<b class='flag-5'>MCU</b>系列】在 HK32F030 上<b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片HC32F460PETB

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片HC32F460PETB
    發(fā)表于 11-23 18:06 ?37次下載
    【國(guó)產(chǎn)<b class='flag-5'>MCU</b><b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>到國(guó)產(chǎn)芯片HC32F460PETB

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片F(xiàn)M33LC026

    【國(guó)產(chǎn)MCU移植移植RT-Thread到國(guó)產(chǎn)芯片F(xiàn)M33LC026
    發(fā)表于 11-30 16:51 ?22次下載
    【國(guó)產(chǎn)<b class='flag-5'>MCU</b><b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>到國(guó)產(chǎn)芯片F(xiàn)M33LC026

    RT-Thread移植到GD32F150系列MCU

    RT-Thread移植到GD32F150系列MCU
    發(fā)表于 12-07 19:36 ?7次下載
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>移植</b>到GD32F150系列<b class='flag-5'>MCU</b>

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b>系統(tǒng)<b class='flag-5'>移植</b>到STM32f103

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

    RT-AK 是 RT-Thread 團(tuán)隊(duì)為 RT-Thread 實(shí)時(shí)操作系統(tǒng)所開發(fā)的 AI 套件,能夠一鍵將 AI 模型部署到
    發(fā)表于 01-25 18:18 ?3次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>AI</b> kit開源:輕松實(shí)現(xiàn)一鍵部署<b class='flag-5'>AI</b>模型至 <b class='flag-5'>RT-Thread</b>

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個(gè) stm32f103 的基礎(chǔ)工程作為示例進(jìn)行講解。 RT-Thread Nano 已集成在 Keil MD...
    發(fā)表于 01-26 17:04 ?16次下載
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread文檔_內(nèi)核移植

    RT-Thread文檔_內(nèi)核移植
    發(fā)表于 02-22 18:31 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_內(nèi)核<b class='flag-5'>移植</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與<b class='flag-5'>移植</b>

    RT-Thread文檔_utest 測(cè)試框架

    RT-Thread文檔_utest 測(cè)試框架
    發(fā)表于 02-22 18:43 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_utest 測(cè)試<b class='flag-5'>框架</b>

    如何在RT-Thread OS環(huán)境下使用ncnn進(jìn)行AI推理

    今天簡(jiǎn)報(bào)較短,主要演示一下如何在RT-Thread OS環(huán)境下使用ncnn進(jìn)行AI推理
    的頭像 發(fā)表于 05-04 16:29 ?1117次閱讀
    如何在<b class='flag-5'>RT-Thread</b> OS環(huán)境下使用ncnn進(jìn)行<b class='flag-5'>AI</b><b class='flag-5'>推理</b>

    基于 RT-Thread 的 RoboMaster 電控框架(一)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇 RT-Thread 進(jìn)行項(xiàng)目開發(fā)
    的頭像 發(fā)表于 09-19 19:55 ?641次閱讀