如何在RT-Thread OS环境下使用ncnn进行AI推理

今天简报较短,主要演示一下如何在rt-thread os环境下使用ncnn进行ai推理
关于ncnn
简介
ncnn 是腾讯优图实验室首个开源项目,是一个为手机端极致优化的高性能神经网络前向计算框架。
ncnn 从设计之初深刻考虑手机端的部属和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。
基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 app,将 ai 带到你的指尖。
ncnn 目前已在腾讯多款应用中使用,如 qq,qzone,微信,天天 p 图等。
功能概述
支持卷积神经网络,支持多输入和多分支结构,可计算部分分支
无任何第三方库依赖,不依赖 blas/nnpack 等计算框架
纯 c++ 实现,跨平台,支持 android ios 等
arm neon 汇编级良心优化,计算速度极快
精细的内存管理和数据结构设计,内存占用极低
支持多核并行计算加速,arm big.little cpu 调度优化
整体库体积小于 500k,并可轻松精简到小于 300k
可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe 模型
支持直接内存零拷贝引用加载网络模型
可注册自定义层实现并扩展
恩,很强就是了,不怕被塞卷 qvq
rt-thread-ncnn使用说明
当前rt-thread-ncnn工具包仅支持arm-a核芯片,比如树莓派4b、rk3568等,我们可以在bsp包内找到相关芯片的bsp包。以下演示基于树莓派4b。
1.相关环境
硬件:树莓派4b开发板,带usb转串口调试工具;
系统: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#define heap_end        (kernel_vaddr_start + 500 * 1024 * 1024)2#define page_start      heap_end3#define page_end        ((size_t)page_start + 500 * 1024 * 1024)  
2.修改文件:./driver/board.c
1struct mem_desc platform_mem_desc[] = {2    {0x00200000, (512ul < success22link disconnected23support link mode speed 1000m2425msh />26msh />27msh />mn28mnet_yolov3_test29msh />mnet_yolov3_test30hello rt-thread ncnn3115 = 0.99720 at 48.90 389.97 159.19 x 525.88326 = 0.96088 at 18.52 260.82 783.92 x 512.583315 = 0.95704 at 207.39 407.80 150.12 x 444.35  
其中,最后部分输出了推理的结果。
以下是sd卡中生成的推理前后图片对比。
如果想更换测试图片,只需要将新的图片名字修改成bus.jpg就可以,这样偷懒,但是简单。
下面这个是另一个测试结果(去掉了标签)
当前问题
有部分算子当前在rt-thread os上运行时出错,所以如果是想自己搞一个模型跑跑,需要注意这方面问题,good luck。
后续工作
支持risc-v架构芯片;
解决算子问题;


为企业发展赋能,华为云网站安全解决方案,保护企业网络安全
华为路由器存在后门 沃达丰内部文件揭秘
蔡浩轩:新手炒比特币交易心得及注意事项
云存储管理之Azure Managed Disks分析
华为“天生会画”数字创作大赛完美收官,相聚中国动漫博物馆共话数字化创作价值
如何在RT-Thread OS环境下使用ncnn进行AI推理
5G改变社会将是一个长期渐进式的过程
结合IMOS IP多媒体应用的监控管理平台软件的发展趋势
基于FPGA技术实现SD模式设备接口的设计方案
油浸式变压器高压套管漏油的治理方法
医疗废物在线监测系统实现医废标准化管理
OPPO Reno2确认发布时间,安兔兔跑分成绩达到259109分
TIDA-00617反激式转换器 (5V/5A) 参考设计
uln2003和51连接电路分析
螺杆压缩机轴封位气蚀磨损原因及维修步骤
电动球阀的正确安装方法是怎样的
典型LED驱动电路图分享
Facebook计划推出Oculus Go和Oculus Quest虚拟现实头显的企业版
三星推出Gear Fit2和IconX可穿戴设备
全新小米路由器高清拆解图集