今天簡報較短,主要演示一下如何在RT-Thread OS環(huán)境下使用ncnn進(jìn)行AI推理
關(guān)于NCNN
簡介
ncnn 是騰訊優(yōu)圖實驗室首個開源項目,是一個為手機(jī)端極致優(yōu)化的高性能神經(jīng)網(wǎng)絡(luò)前向計算框架。
ncnn 從設(shè)計之初深刻考慮手機(jī)端的部屬和使用。無第三方依賴,跨平臺,手機(jī)端 cpu 的速度快于目前所有已知的開源框架。
基于 ncnn,開發(fā)者能夠?qū)?a target="_blank">深度學(xué)習(xí)算法輕松移植到手機(jī)端高效執(zhí)行,開發(fā)出人工智能 APP,將 AI 帶到你的指尖。
ncnn 目前已在騰訊多款應(yīng)用中使用,如 QQ,Qzone,微信,天天 P 圖等。
功能概述
支持卷積神經(jīng)網(wǎng)絡(luò),支持多輸入和多分支結(jié)構(gòu),可計算部分分支
無任何第三方庫依賴,不依賴 BLAS/NNPACK 等計算框架
純 C++ 實現(xiàn),跨平臺,支持 android ios 等
精細(xì)的內(nèi)存管理和數(shù)據(jù)結(jié)構(gòu)設(shè)計,內(nèi)存占用極低
支持多核并行計算加速,ARM big.LITTLE cpu 調(diào)度優(yōu)化
整體庫體積小于 500K,并可輕松精簡到小于 300K
可擴(kuò)展的模型設(shè)計,支持 8bit 量化和半精度浮點存儲,可導(dǎo)入 caffe 模型
支持直接內(nèi)存零拷貝引用加載網(wǎng)絡(luò)模型
可注冊自定義層實現(xiàn)并擴(kuò)展
恩,很強(qiáng)就是了,不怕被塞卷 QvQ
RT-Thread-NCNN使用說明
當(dāng)前RT-Thread-NCNN工具包僅支持Arm-A核芯片,比如樹莓派4B、rk3568等,我們可以在BSP包內(nèi)找到相關(guān)芯片的BSP包。以下演示基于樹莓派4B。
1.相關(guān)環(huán)境
硬件:樹莓派4B開發(fā)板,帶USB轉(zhuǎn)串口調(diào)試工具;
系統(tǒng):RT-Thread OS v5.0.0版本;
開發(fā)環(huán)境:Windows 10;
開發(fā)IDE:Vscode;
交叉編譯工具鏈:gcc-arm-10.3-2021.07-mingw-w64-i686-aarch64-none-elf;
工具鏈下載地址:https://developer.arm.com/downloads/-/gnu-a
2.更新package工具包
相關(guān)參考:https://github.com/RT-Thread/packages
下載/進(jìn)入env環(huán)境后,找到env根目錄下的packages文件夾。
使用git clone https://github.com/RT-Thread/packages.git命令將最新的packages repo 克隆到本地。注:使用方法還可以參考env根目錄下的readme.md文件中包管理器使用的章節(jié),可以利用env環(huán)境中支持的包管理命令來更新本地packages文件夾。
更新完成后,查看新的軟件包中./packages/ai/文件夾中是否出現(xiàn)ncnn文件夾,如果存在則表示軟件包更新成功。
更新好的軟件包如下所示:
3.準(zhǔn)備樹莓派4B項目工程
RT-Thread下載地址:https://github.com/RT-Thread/rt-thread
進(jìn)入準(zhǔn)備好的RT-Thread開發(fā)包,進(jìn)入./rt-thread/bsp/raspberry-pi/raspi4-64/文件夾。在該目錄下啟動env,輸入如下命令創(chuàng)建新的項目工程。
1scons--dist--project-name=xxxx
此時會在該目錄下生成./dist/xxxx文件夾,該文件夾下就是新生成的樹莓派4B項目工程,如下圖所示:
準(zhǔn)備好項目工程后,我們將下載好的工具鏈放置在指定目錄,然后修改上面圖中rtconfig.py文件中的工具鏈路徑。
至此,我們已經(jīng)準(zhǔn)備好了一個最基本的項目工程。然后,我們回到env工具中,使用menuconfig命令配置相關(guān)packages,這里只引入ncnn工具箱。
我們以此進(jìn)入RT-Thread online packages、AI packages,選中ncnn package for RT-Thread,最終選中v1.0.0版本ncnn,保存并退出。
在env環(huán)境中輸入下列命令,就可以把ncnn的package拉取到當(dāng)前工程中。
1pkgs--update
拉取好的ncnn工具包可以在項目工程中的./packages文件夾中查看到。
至此,我們可以嘗試編譯一下當(dāng)前項目,不出意外,可以順利編譯。
4.編譯yolov3示例
在編寫代碼之前,我們需要準(zhǔn)備AI模型,可以參考NCNN官方的AI模型庫。
參考鏈接:https://github.com/nihui/ncnn-assets/tree/master
我們以mobilev2-yolov3為例,準(zhǔn)備一下資料到sd卡
mobilenetv2-yolov3.bin
mobilenetv2-yolov3.param
bus.jpg
其中前兩個為ncnn指定的模型權(quán)重和結(jié)構(gòu),最后一個是測試圖片。都準(zhǔn)備好了,我們現(xiàn)在修改RT-Thread項目工程
1.修改文件:./drivers/board.h
1#defineHEAP_END(KERNEL_VADDR_START+500*1024*1024) 2#definePAGE_STARTHEAP_END 3#definePAGE_END((size_t)PAGE_START+500*1024*1024)
2.修改文件:./driver/board.c
1structmem_descplatform_mem_desc[]={ 2{0x00200000,(512ul<21)?-?1,?0x00200000,?NORMAL_MEM}, 3????{0xFC000000,?0x000100000000?-?1,?0xFC000000,?DEVICE_MEM}, 4};
3.修改文件:./rtconfig.h
1#defineRT_MAIN_THREAD_STACK_SIZE245760 2 3#defineFINSH_THREAD_STACK_SIZE245760
以上參數(shù)不同模型可能不同,可能需要根據(jù)模型規(guī)模去估計。
4.修改main.c文件
我們把./packages/ncnn-v1.0.0文件夾打開,里面examples有我們準(zhǔn)備好的測試?yán)?,其中main-yolov3.cpp就是我們用來替換main.c文件的,將其替換mian.c文件,并將mian.c改成mian.cpp文件,然后編譯。
注意:我們還要確定我們項目工程已經(jīng)支持了C++特性和開啟了文件系統(tǒng),如果沒有的話還需要通過menuconfig來修改,這一部分不再贅述。
此外,關(guān)于如何在樹莓派4B開發(fā)板中啟動RT-Thread OS,可以參考以下文檔:
啟動RT-Thead OS in Pi 4B:https://github.com/RT-Thread/rt-thread/tree/master/bsp/raspberry-pi/raspi4-64
5.yolov3測試結(jié)果
串口輸出結(jié)果:
1heap:0x0056b530-0x1f400000 2 3|/ 4-RT-ThreadOperatingSystem 5/|5.0.0buildApr1820232257 62006-2022CopyrightbyRT-Threadteam 7lwIP-2.1.2initialized! 8EMMC:assumingclockratetobe100MHz 9[I/sal.skt]SocketAbstractionLayerinitializesuccess. 10[I/utest]utestisinitializesuccess. 11[I/utest]totalutesttestcasenum:(0) 12[I/DBG]versionisB1 13 14[I/SDIO]SDcardcapacity31178752KB. 15foundpart[0],begin:4194304,size:256.0MB 16foundpart[1],begin:272629760,size:29.492GB 17filesysteminitializationdone! 18Helcpu1bootsuccess 19cpu2bootsuccess 20cpu3bootsuccess 211sh/>success 22linkdisconnected 23SupportlinkmodeSpeed1000M 24 25msh/> 26msh/> 27msh/>mn 28mnet_yolov3_test 29msh/>mnet_yolov3_test 30HelloRT-ThreadNCNN 3115=0.99720at48.90389.97159.19x525.88 326=0.96088at18.52260.82783.92x512.58 3315=0.95704at207.39407.80150.12x444.35
其中,最后部分輸出了推理的結(jié)果。
以下是sd卡中生成的推理前后圖片對比。
如果想更換測試圖片,只需要將新的圖片名字修改成bus.jpg就可以,這樣偷懶,但是簡單。
下面這個是另一個測試結(jié)果(去掉了標(biāo)簽)
當(dāng)前問題
有部分算子當(dāng)前在RT-Thread OS上運(yùn)行時出錯,所以如果是想自己搞一個模型跑跑,需要注意這方面問題,good luck。
后續(xù)工作
支持RISC-V架構(gòu)芯片;
解決算子問題;
審核編輯:湯梓紅
-
移植
+關(guān)注
關(guān)注
1文章
379瀏覽量
28124 -
AI
+關(guān)注
關(guān)注
87文章
30728瀏覽量
268882 -
命令
+關(guān)注
關(guān)注
5文章
683瀏覽量
22011 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40081 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121111
原文標(biāo)題:【AI簡報20230428】如何在RT-Thread OS環(huán)境下使用ncnn進(jìn)行AI推理
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論