今天簡報較短,主要演示一下如何在RT-Thread OS環境下使用ncnn進行AI推理
關于NCNN
簡介
ncnn 是騰訊優圖實驗室首個開源項目,是一個為手機端極致優化的高性能神經網絡前向計算框架。
ncnn 從設計之初深刻考慮手機端的部屬和使用。無第三方依賴,跨平臺,手機端 cpu 的速度快于目前所有已知的開源框架。
基于 ncnn,開發者能夠將深度學習算法輕松移植到手機端高效執行,開發出人工智能 APP,將 AI 帶到你的指尖。
ncnn 目前已在騰訊多款應用中使用,如 QQ,Qzone,微信,天天 P 圖等。
功能概述
支持卷積神經網絡,支持多輸入和多分支結構,可計算部分分支
無任何第三方庫依賴,不依賴 BLAS/NNPACK 等計算框架
精細的內存管理和數據結構設計,內存占用極低
支持多核并行計算加速,ARM big.LITTLE cpu 調度優化
整體庫體積小于 500K,并可輕松精簡到小于 300K
可擴展的模型設計,支持 8bit 量化和半精度浮點存儲,可導入 caffe 模型
支持直接內存零拷貝引用加載網絡模型
可注冊自定義層實現并擴展
恩,很強就是了,不怕被塞卷 QvQ
RT-Thread-NCNN使用說明
當前RT-Thread-NCNN工具包僅支持Arm-A核芯片,比如樹莓派4B、rk3568等,我們可以在BSP包內找到相關芯片的BSP包。以下演示基于樹莓派4B。
1.相關環境
系統:RT-Thread OS v5.0.0版本;
開發環境:Windows 10;
開發IDE:Vscode;
交叉編譯工具鏈:gcc-arm-10.3-2021.07-mingw-w64-i686-aarch64-none-elf;
工具鏈下載地址:https://developer.arm.com/downloads/-/gnu-a
2.更新package工具包
相關參考:https://github.com/RT-Thread/packages
下載/進入env環境后,找到env根目錄下的packages文件夾。
使用git clone https://github.com/RT-Thread/packages.git命令將最新的packages repo 克隆到本地。注:使用方法還可以參考env根目錄下的readme.md文件中包管理器使用的章節,可以利用env環境中支持的包管理命令來更新本地packages文件夾。
更新完成后,查看新的軟件包中./packages/ai/文件夾中是否出現ncnn文件夾,如果存在則表示軟件包更新成功。
更新好的軟件包如下所示:
3.準備樹莓派4B項目工程
RT-Thread下載地址:https://github.com/RT-Thread/rt-thread
進入準備好的RT-Thread開發包,進入./rt-thread/bsp/raspberry-pi/raspi4-64/文件夾。在該目錄下啟動env,輸入如下命令創建新的項目工程。
1scons--dist--project-name=xxxx
此時會在該目錄下生成./dist/xxxx文件夾,該文件夾下就是新生成的樹莓派4B項目工程,如下圖所示:
準備好項目工程后,我們將下載好的工具鏈放置在指定目錄,然后修改上面圖中rtconfig.py文件中的工具鏈路徑。
至此,我們已經準備好了一個最基本的項目工程。然后,我們回到env工具中,使用menuconfig命令配置相關packages,這里只引入ncnn工具箱。
我們以此進入RT-Thread online packages、AI packages,選中ncnn package for RT-Thread,最終選中v1.0.0版本ncnn,保存并退出。
在env環境中輸入下列命令,就可以把ncnn的package拉取到當前工程中。
1pkgs--update
拉取好的ncnn工具包可以在項目工程中的./packages文件夾中查看到。
至此,我們可以嘗試編譯一下當前項目,不出意外,可以順利編譯。
4.編譯yolov3示例
在編寫代碼之前,我們需要準備AI模型,可以參考NCNN官方的AI模型庫。
參考鏈接:https://github.com/nihui/ncnn-assets/tree/master
我們以mobilev2-yolov3為例,準備一下資料到sd卡
mobilenetv2-yolov3.bin
mobilenetv2-yolov3.param
bus.jpg
其中前兩個為ncnn指定的模型權重和結構,最后一個是測試圖片。都準備好了,我們現在修改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
以上參數不同模型可能不同,可能需要根據模型規模去估計。
4.修改main.c文件
我們把./packages/ncnn-v1.0.0文件夾打開,里面examples有我們準備好的測試例程,其中main-yolov3.cpp就是我們用來替換main.c文件的,將其替換mian.c文件,并將mian.c改成mian.cpp文件,然后編譯。
注意:我們還要確定我們項目工程已經支持了C++特性和開啟了文件系統,如果沒有的話還需要通過menuconfig來修改,這一部分不再贅述。
此外,關于如何在樹莓派4B開發板中啟動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測試結果
串口輸出結果:
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
其中,最后部分輸出了推理的結果。
以下是sd卡中生成的推理前后圖片對比。
如果想更換測試圖片,只需要將新的圖片名字修改成bus.jpg就可以,這樣偷懶,但是簡單。
下面這個是另一個測試結果(去掉了標簽)
當前問題
有部分算子當前在RT-Thread OS上運行時出錯,所以如果是想自己搞一個模型跑跑,需要注意這方面問題,good luck。
后續工作
支持RISC-V架構芯片;
解決算子問題;
審核編輯:湯梓紅
-
移植
+關注
關注
1文章
375瀏覽量
28013 -
AI
+關注
關注
87文章
28877瀏覽量
266239 -
命令
+關注
關注
5文章
658瀏覽量
21929 -
RT-Thread
+關注
關注
31文章
1239瀏覽量
39437 -
深度學習
+關注
關注
73文章
5422瀏覽量
120593
原文標題:【AI簡報20230428】如何在RT-Thread OS環境下使用ncnn進行AI推理
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論