RTT小师弟 · 2023年05月08日

【AI简报20230428】如何在RT-Thread OS环境下使用ncnn进行AI推理

嵌入式 AI

AI 简报 20230427 期
今天简报较短,主要演示一下如何在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
  1. 下载/进入env环境后,找到env根目录下的packages文件夹。
  2. 使用git clone https://github.com/RT-Thread/packages.git命令将最新的packages repo 克隆到本地。注:使用方法还可以参考env根目录下的readme.md文件中包管理器使用的章节,可以利用env环境中支持的包管理命令来更新本地packages文件夹。
  3. 更新完成后,查看新的软件包中./packages/ai/文件夹中是否出现ncnn文件夹,如果存在则表示软件包更新成功。

更新好的软件包如下所示:

image.png

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

image.png

此时会在该目录下生成./dist/xxxx文件夹,该文件夹下就是新生成的树莓派4B项目工程,如下图所示:

image.png

准备好项目工程后,我们将下载好的工具链放置在指定目录,然后修改上面图中rtconfig.py文件中的工具链路径。

image.png

至此,我们已经准备好了一个最基本的项目工程。然后,我们回到env工具中,使用menuconfig命令配置相关packages,这里只引入ncnn工具箱。

image.png

我们以此进入RT-Thread online packagesAI packages,选中ncnn package for RT-Thread,最终选中v1.0.0版本ncnn,保存并退出。

在env环境中输入下列命令,就可以把ncnn的package拉取到当前工程中。

1pkgs --update

拉取好的ncnn工具包可以在项目工程中的./packages文件夹中查看到。

image.png

至此,我们可以尝试编译一下当前项目,不出意外,可以顺利编译。
image.png

image.png

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 << 21) - 1, 0x00200000, NORMAL_MEM},3    {0xFC000000, 0x000100000000 - 1, 0xFC000000, DEVICE_MEM},4};

3.修改文件:./rtconfig.h

1#define RT_MAIN_THREAD_STACK_SIZE 24576023#define FINSH_THREAD_STACK_SIZE 245760

以上参数不同模型可能不同,可能需要根据模型规模去估计。

4.修改main.c文件

我们把./packages/ncnn-v1.0.0文件夹打开,里面examples有我们准备好的测试例程,其中main-yolov3.cpp就是我们用来替换main.c文件的,将其替换mian.c文件,并将mian.c改成mian.cpp文件,然后编译。

image.png

image.png

注意:我们还要确定我们项目工程已经支持了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 -     Thread Operating System 5 / | \     5.0.0 build Apr 18 2023 22:12:57 6 2006 - 2022 Copyright by RT-Thread team 7lwIP-2.1.2 initialized! 8EMMC: assuming clock rate to be 100MHz 9[I/sal.skt] Socket Abstraction Layer initialize success.10[I/utest] utest is initialize success.11[I/utest] total utest testcase num: (0)12[I/DBG] version is B11314[I/SDIO] SD card capacity 31178752 KB.15found part[0], begin: 4194304, size: 256.0MB16found part[1], begin: 272629760, size: 29.492GB17file system initialization done!18Helcpu 1 boot success19cpu 2 boot success20cpu 3 boot success211sh /> 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卡中生成的推理前后图片对比。

image.png

如果想更换测试图片,只需要将新的图片名字修改成bus.jpg就可以,这样偷懒,但是简单。

下面这个是另一个测试结果(去掉了标签)

image.png

当前问题

有部分算子当前在RT-Thread OS上运行时出错,所以如果是想自己搞一个模型跑跑,需要注意这方面问题,good luck。

后续工作

  • 支持RISC-V架构芯片;
  • 解决算子问题;

———————End———————

作者:RTThread物联网操作系统
文章来源:RTThread物联网操作系统

推荐阅读

STM32 USB高速USB端口加持4G联网
关于时间片调度算法issue的分析与解决

欢迎大家点赞留言,更多RT-Thread物联网操作系统动态请关注极术社区RT-Thread物联网操作系统专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
8072
内容数
181
小而美的物联网操作系统,经过14年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过4亿台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息