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

news2024/11/28 17:39:14

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

1 芯片相关

  • 芯片参数:https://www.rock-chips.com/a/cn/product/RK35xilie/2021/0113/1273.html
  • CPU:四核,1.8GHZ.
  • NPU:1TOPs@Int8,每秒一万亿次运算。
    在这里插入图片描述

gitlab连接如下

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

  • RK1808/RK1806/RV1109/RV1126/RK3399Pro 使用: https://github.com/rockchip-linux/rknn-toolkit
  • RK3566/RK3568/RK3588/RV1103/RV1106使用:https://github.com/rockchip-linux/rknn-toolkit2

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

  • RK1808/RK1806/RV1109/RV1126,参考:https://github.com/rockchip-linux/rknpu
  • RK3566/RK3568/RK3588/RV1103/RV1106,参考:https://github.com/rockchip-linux/rknpu2
  • RK3399Pro用户态的库及驱动,参考:https://github.com/airockchip/RK3399Pro_npu

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

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
    在这里插入图片描述
    在这里插入图片描述

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进行操作

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS查缺补漏之《选择器的复杂用法》

最近在复盘CSS基础知识,发现很多CSS选择器里面还是大有学问,需要详细总结一番,以备差缺补漏~ 作为CSS基础的一大类别,选择器又分为多种类别,本篇内容默认读者已了解并掌握基础选择器【通配符选择器】、【元素选择器】…

企业采用融合CDN战略之前的相关注意事项

很多企业可能都会犹豫是否要从单CDN模式到转向为多CDN模式,一方面因为这可能看起来很复杂,这不仅涉及到需要建立更多的CDN提供商,而且还有其他较多的操作和配置要做,尤其是在当前单CDN供应商似乎一切正常的情况下。但从另一方面来…

【每日算法】【203. 移除链表元素】

☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&…

《C++高级编程》读书笔记(八、九:类和对象)

1、参考引用 C高级编程(第4版,C17标准)马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门,笔记链接如下 21天学通C读书笔记(文章链接汇总) 1. 编写类 编写类时,需要指定行为或方法 (应用于类的…

8.3 TCP/IP协议与五层体系结构

目录 TCP/IP及五层体系结构 OSI与TCP/IP TCP/IP 的体系结构 沙漏计时器形状的 TCP/IP 协议族 具有五层协议的体系结构 五层协议的体系结构 各层的主要功能 互联网中客户-服务器工作方式 同时为多个客户进程提供服务 TCP/IP及五层体系结构 OSI与TCP/IP TCP/IP 的体系结构 现…

Atcoder Beginner Contest 306

A - Echo AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() {int n;cin>>n;string s;cin>>s;for(int i0;i<n;i){cout<<s[i]<<s[i];}return 0; } B - Base 2 lo…

服务调用OpenFeign

OpenFeign OpenFeign 介绍OpenFeign 的使用OpenFeign 参数传递OpenFeign 超时控制OpenFeign 日志设置OpenFeign 的工作流程 OpenFeign 介绍 Feign 是 SpringCloud组件中一个轻量级RESTful的HTTP服务客户端&#xff0c;Feign集成了Ribbon、RestTemplate 实现了负载均衡的执行Ht…

拉普拉斯方程解决有介质导体球壳问题

一个内径和外径分别为和的导体球壳&#xff0c;带电荷&#xff0c;同心地包围着一个的导体球&#xff0c;使这个导体球接地&#xff0c;求空间各点的电势和这个导体球的感应电荷 我们不难发现&#xff0c;球对称性非常强&#xff0c;电势只和半径有关系 所以我们可以假设电势为…

Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.6 完整的猜大小纸牌游戏

总项目目标&#xff1a;用面向过程思想设计一个简单的纸牌游戏程序&#xff0c;称为"Higher or Lower"&#xff08;高还是低&#xff09;。游戏中&#xff0c;玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性&#xff0c;玩家可以得到或失去相应的积…

学了些性能知识,实际工作如何开展性能测试?

目录 前言&#xff1a; 确定需求 了解业务 搭建测试环境 脚本执行及监控 收集测试结果 持续学习 前言&#xff1a; 学到了性能测试的知识&#xff0c;接下来如何在实际工作中开展性能测试呢&#xff1f; 确定需求 刚接触性能测试的同学往往不知道性能测试是有需求的。…

C++右值引用问题

1、右值引用与函数重载 class Int {int value; public:Int(int x 0) :value(x) { cout << "create " << this << endl; }~Int() { cout << "destroy " << this << endl; }Int(const Int& it) :value(it.value){…

系统原型设计,轻松搞定后台管理系统

伴随互联网的发展&#xff0c;越来越多的团队和企业开始使用自动化管理系统。近年来&#xff0c;各行各业的B端后台管理系统更是应运而生&#xff0c;并且快速发展迭代更新&#xff0c;直接推动了CMS、OA、 CRM、ERP、POS等系统原型的开发。 相比一般的web页面以及其他的互联网…

真实案例之视频下载性能测试分析报告

一、背景介绍 XXXX是一个以视频教学为主的教学平台&#xff0c;因此对服务器所支持的视频下载量、下载速度等都有相应的要求。其中视频采用HTTP协议&#xff0c;为下载后对视频进行一个播放和学习。为了得出测试服务器网络是否满足XXXX的要求&#xff0c;从而对该服务器做相应…

基于工业智能网关的电力能耗监测管理系统

据国家能源局最新数据显示&#xff0c;1至5月&#xff0c;全国全社会用电量35325亿千瓦时&#xff0c;同比增长5.2%&#xff0c;其中&#xff0c;5月份全国全社会用电量7222亿千瓦时&#xff0c;同比增长7.4%。 6月以来&#xff0c;随着我国经济形势的整体向好和气温的逐步升高…

流场粒子追踪精度数值实验

在计算流线&#xff0c;拉格朗日拟序结构等流场后处理时&#xff0c;我们常常需要计算无质量的粒子在流场中迁移时的轨迹&#xff0c;无质量意味着粒子的速度为流场当地的速度。此时&#xff0c;求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

020:vue刷新跳转当前页面

第020个 查看专栏目录: VUE — element UI VUE刷新当前页面在很多场合都会使用到&#xff0c;比如在搜索页搜索内容并展示在搜索页&#xff1f;在当前页删除&#xff0c;添加内容的等&#xff0c;查看更新后的结果等。 方法一 用vue-router 重新路由的时候到当前页面的时候是…

vue移动端瀑布流布局

需求: 瀑布流, 图片大小统一不变, 描述长度根据内容确定, 不超过三行. 分两列,那边矮,下个元素就放那边 如图所示: 1. 给item设置top,和left 由于我的项目做了 amfe-flexible适配所以使用rem 完整 template <template><div class"HomePage"><van-l…

【好书精读】网络是怎样连接的 之 全世界 DNS 服务器的大接力

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 域名的层次结构 寻找相应的 DNS 服务器并获取 IP 地址 通过缓存加快 DNS 服务器的响应 DNS 服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应 客户端的查询消息&#xf…

信息量、熵、联合熵、条件熵、相对熵、交叉熵、JS散度、Wasserstein距离

信息量 I ( x i ) l o g 1 P ( x i ) − l o g P ( x i ) I(x_i)log \frac {1}{P(x_i)}-logP(x_i) I(xi​)logP(xi​)1​−logP(xi​) 信息量&#xff08;self-information&#xff09;&#xff0c;又译为信息本体&#xff0c;由克劳德 香农&#xff08;Claude Shannon&…

使用投票回归器VotingRegressor对糖尿病数据集进行回归预测

目录 1. 作者介绍2. 投票回归器VotingRegressor简介2.1 VotingRegressor介绍2.2 VotingRegressor算法遵循以下关键原则&#xff1a; 3. 使用投票回归器VotingRegressor对糖尿病数据集进行回归预测实验过程3.1 代码流程介绍3.2 完整代码3.3 实验结果 1. 作者介绍 余成伟&#x…