【yolov5系列】将模型部署到瑞芯微RK3566上面

【yolov5系列】yolov5 v6.0 环境配置、图片视频测试、模型可视化、v6.0的更新内容
【yolov5系列】yolov5的原理与核心代码解析
【yolov5系列】yolov5-onnxruntime在Ubuntu和RK芯片上运行
【yolov5系列】将模型部署到瑞芯微RK3566上面

本篇博客记录将yolov5s移植到瑞芯微3566上的整体流程。当然在其它芯片上的操作类似,差别会在具体的API的调用上。

1 芯片相关

gitlab连接如下

RKNN Toolkit:包含python的安装包、安装说明文档、python将onnx转成rknn示例工程。​

Rockchip NPU提供驱动、C++推理示例

这里记录基于3566上的v1.4.0的版本的环境安装流程和部署工作。故没有下载master分支,而是下载 rknn-toolkit2-v1.4.0分支rknpu2-v1.4.0分支,然后解压。
另外补充说下,官方文档里面介绍api是比较详细的,如果按照下面流程依然无法正确跑通,就多看看文档了。

2024.5.20】针对不同系列的芯片,rk开发者使用了多套工具链。常用的为rknpu1、rknpu2,用于端侧内容的开发和编译,对应python模型转换环境分别为:rknn-toolkit、rknn-toolkit2。其中每个工具链又存在自己更新的版本,rknpu1目前常用的为1.7,rknpu2目前常用的为1.4。
另外,rknpu2-1.6的板端跑了yolov8比rknpu2-1.4速度快很多,但测试出1.6的端侧不能同时运行两个模型进行推理,会导致推理结果异常。故目前使用的仍未1.4版本。

2 DEMO工程的运行


2.1 配置环境与demo模型转换

进入【rknn-toolkit2-v1.4.0】工程根目录,文件夹下的树状结构如下。tree的安装命令为【sudo apt-get -y install tree】
在这里插入图片描述

  1. 创建虚拟环境
    1.4的版本支持python3.6、python3.8。这里选择python3.6
    conda create -n RK3566 python=3.6
    conda activate RK3566
  2. 安装依赖库
    安装必要的依赖包。下面的命令添加了清华镜像,加快安装速度,否则跟蜗牛一样。
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r ./doc/requirements_cp36-1.4.0.txt
  3. 安装rk的包
    pip install ./packages/rknn_toolkit2-1.4.0_22dcfef4-cp36-cp36m-linux_x86_64.whl
  4. 检查是否安装成功
    在这里插入图片描述
  5. 运行官方的yolov5demo
    cd examples/onnx/yolov5
    python test.py
    其中,yolov5s.rknn为转换后的模型,test.png为结果的可视化图片
    在这里插入图片描述
    python的工作到此结束。
    我们需要注意下,对于RK1126相似系列的代码中模型转换时,模型build时,有个预编译参数,仿真时和端侧运行时的设置是不一致且不通用的。

2.2 demo工程编译与板端运行

进入【rknpu2-v1.4.0】工程根目录,文件夹下的树状结构如下
在这里插入图片描述

  1. 下载交叉编译器
    交叉编译器可通过两种方式安装:
    • a) 终端命令安装
      查看可安装版本:apt-cache search aarch64
      安装指定版本为:apt-get install gcc-10-aarch64-linux-gnc
      报错"E: Unmet dependencies"时:apt --fix-broken install
    • b) 官方软件包下载
      我这里在【官方软件包下载路径】下载版本【gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu】,下载文件夹里面是已经编译好的二进制可执行程序。下载后解压,bin目录下存放这所需的交叉编译器,可直接使用
  2. 编译官方 yolov5 demo
    demo路径为【./examples/rknn_yolov5_demo】。需要先修改工程中的交叉编译器路径
    cd ./examples/rknn_yolov5_demo
    打开文件【build-linux_RK356X.sh】并修改【GCC_COMPILER】路径,
    在这里插入图片描述
  3. 板端运行demo
    将编译好的install目录推到板端的【/userdata/】路径下。然后运行
    adb shell
    cd /userdata/install/rknn_yolov5_demo_Linux
    ./rknn_yolov5_demo ./model/RK356X/yolov5s-640-640.rknn ./model/bus.jpg
    在这里插入图片描述
    在这里插入图片描述
  4. 板端的运行时间
    神经网络在大多数平台推理时,前1-3次的推理运行时间普遍会增长一点,这是计算平台有一个"热身"的动作,用于计算单元的资源分配等操作。真实的推理时间,我们需观察一段时间的平均值较为准确。
    这里的推理平均时间是:对于输入图片640*640*3,推理时间需要57ms,后处理时间需要1ms;但如果加入到完整的项目工程中,芯片的使用时发热、其他模块的资源占用,这个时间将会增长
    在这里插入图片描述
    在这里插入图片描述

3 相关代码解析


3.1 onnx转rknn的核心代码

在【doc/Rockchip_User_Guide_RKNN_Toolkit2_CN-1.4.0.pdf】中,详细介绍了API接口的使用规则。这里只记录需要注意的点。

  1. 均值方差的设置
    模型在训练时,图片会经过归一化处理,一般都是减均值除方差。在yolov5目标检测的训练时候,均值方差分别为[0,0,0]、[255,255,255]。代码设置如下截图。
    如果个人实际训练中,修改了均值方差,对应位置修改即可。在这里插入图片描述

  2. 加载ONNX模型并设置输出节点
    源码中的设置如图
    在这里插入图片描述
    但我们自己训练的yolov5的onnx模型使用【Netron】打开,如下图。
    在这里插入图片描述
    当想要3层的输出时,需要指定输出节点才行。

    • 可以看到模型提供的3个输出层的节点名称分别为[339,392,445],对应的输出shape分别为 (1x3x20x20x22)、(1x3x40x40x22)、(1x3x80x80x22)。
    • 这三层输出的reshape前的节点分别为[326,379,432],对用的shape分别为(1x66x20x20)、(1x66x40x40)、(1x66x80x80)。
    • 我们可以看到仿真器的后处理,以及C++部署的后处理都是针对(1x66x20x20)、(1x66x40x40)、(1x66x80x80)。所以这里需要设置节点为[326,379,432]。当我们优化改造过模型,这三个节点具体的名称会发生变化,所以一定要可视化onnx模型确认节点名称
      在这里插入图片描述
  3. 是否量化的设置
    在rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)中,前者是设置是否进行量,后者是量化时使用的数据集的图片路径。量化的图片的shape和网络输入如果不一致,这里会自动resize,所以为了保证精度,我们的量化数据集的shape尽量与输入一致。
    在【Rockchip_Trouble_Shooting_RKNN_Toolkit_V1.7.3_CN.pdf】中有简单介绍。
    在这里插入图片描述

  4. 导出rknn模型
    导出的模型,用于板端的推理
    在这里插入图片描述

  5. rknn仿真器推理结果
    在这里插入图片描述

  6. 结果后处理
    在这里插入图片描述


3.2 rknn板端推理核心代码

这部分代码不需要我们修改多的内容,就是自己实际使用时,想要将其添加到其他工程中,就需要将其重构成一个类,实现出对外可调用的3个成员函数:init_modeldetectdestroy_model,具体修改这里不做记录。这里说明如下几点:

  1. 通过rknn_query获取加载后的rk模型的相关信息
    代码实现和终端打印如下:
    在这里插入图片描述
    在这里插入图片描述
    上图分别获取的内容:rk的版本信息、模型的输入输出数量的信息、输入节点相关的信息、输出节点相关的信息
    1)自己曾遇到过sdk version 和driver version的版本不兼容导致模型无法加载正确。所以模型在有些主板上可加载成功 有些不能,可留心板端的的库的版本等信息是否正确。
    2)对于输入输出节点信息的打印,我们能看到的元素有:

    • index:模型的第几个输入或输出
    • name:节点的名称
    • n_dims:节点的维度数量
    • dims:节点的具体的维度数值
    • n_elems:节点中有多少个数值
    • size:节点的内存大小,单位为Byte。当为int8时,一个数大小为1Byte,此时n_elems=size。
    • fmt:该节点维度维度为NCHW、或 NHWC
    • type:该节点的数据类型
    • qnt_type:量化的方式
    • zp:量化时候的参数
    • scale:量化时候的参数
  2. 通过rknn_input实现输入数据的设置
    在这里插入图片描述
    注意这里设置的信息要与前面网络模型获取的输入节点信息相匹配。这里的buf的设置时,一定保证图片的大小和网络的输入是相同的尺寸。
    在源码中是先有个判断,如果两者不一致会进行resize处理,这里使用的是rga库进行resize的。较早的rk提供板端的推理工程图片读取处理使用的都是rga,该库的速度会很快。但在一般图像相关工程中都会使用到opencv,所以rk修改为使用opencv的库读取图片,但opencv的resize较为耗时,这里还是选择rga的resize进行操作

在这里插入图片描述
当我们网络为多输入时候,设置如下即可:

在这里插入图片描述


量化方式

在这里插入图片描述

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
【资源说明】 YOLOv8部署瑞芯微RK3588板端c++源码(含使用说明).zipYOLOv8部署瑞芯微RK3588板端c++源码(含使用说明).zip ## 编译和运行 1)编译 ``` cd examples/rknn_yolov8_demo_open bash build-linux_RK3588.sh ``` 2)运行 ``` cd install/rknn_yolov8_demo_Linux ./rknn_yolov8_demo ``` 注意:修改模型、测试图像、保存图像的路径,修改文件为src下的main.cc ``` 测试效果 冒号“:”前的数子是coco的80类对应的类别,后面的浮点数是目标得分。(类别:得分) ![images](test_result.jpg) (注:图片来源coco128) 说明:推理测试预处理没有考虑等比率缩放,激活函数 SiLU 用 Relu 进行了替换。由于使用的是coco128的128张图片数据进行训练的,且迭代的次数不多,效果并不是很好,仅供测试流程用。换其他图片测试检测不到属于正常现象,最好选择coco128中的图像进行测试。 把板端模型推理和后处理时耗也附上,供参考,使用的芯片rk3588。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值