YOLO-V5 系列算法和代码解析(八)—— 模型移植
文章目录
- 工程目标
- 芯片参数
- 查阅官方文档
- 基本流程
- Python 版工具链安装
- RKNPU2的编译以及使用方法
- 移植自己训练的模型
工程目标
将自己训练的目标检测模型【YOLO-V5s】移植到瑞芯微【3566】芯片平台,使用NPU推理,最终得到正确的结果。整个过程涉及模型量化、转换,C++部署。
芯片参数
芯片参数介绍:https://www.rock-chips.com/a/cn/product/RK35xilie/2021/0113/1273.html
CPU:四核,1.8GHZ.
NPU:1TOPs@Int8,每秒一万亿次运算。
查阅官方文档
通常每一款芯片都有其对应的使用文档和工具链,以此作为开发的参考。通过官方文档,可以确认开发环境(Ubuntu, python版本等),工具链版本,不同深度学习框架的Demo,以及一些特别的注意事项等。
- python 版本工具链
rknn-toolkit2:https://github.com/rockchip-linux/rknn-toolkit2.
- C 版本工具链
rknpu2:https://github.com/rockchip-linux/rknpu2,用于编译在RK板子上推理的工具链。
基本流程
部署流程:
- 安装 Python 版本的工具链(RKNN-ToolKit2),可以在PC端将(.onnx,.pt,.ckpt)导出为(.rknn)模型。该步骤可以验证自己训练的模型是否可以成功导出,卷积算子是否支持,预测效果是否可用,量化效果等功能。
- PC 端配置 C 版本工具链(RKNPU2),编译自己的 C++ 推理工程,编译得到的可执行文件可以在RK芯片运行。
- 将得到RKNN模型和可执行文件,以及RK一些必要的依赖库(.so)放入芯片上,可以直接运行。
Python 版工具链安装
下图是Python版本工具链目录结构,在【DOC】目录中提供了英文版和中文版的使用文档。
初次使用该工具链的时候,仔细阅读如下文档:
- “Rockchip_Quick_Start_RKNN_SDK_V1.4.0_CN.pdf”,该文档主要介绍了安装教程,运行demo以及一些基本的硬件参数,内容相对较少,(配置环境,运行demo建议阅读此文档)。
- “Rockchip_User_Guide_RKNN_Toolkit2_CN-1.4.0.pdf”,详细介绍了API接口得使用规则,以及其它相关内容,(具体API的使用,可以参考此文档)。
本教程使用【pip】的方式安装,docker也是官方建议的安装方式,看自己对哪种方式更为熟悉。结合文档的流程,具体操作过程如下:
- 创建虚拟环境
conda create -n rknn2 python==3.6
conda activate rknn2- 安装依赖库
- 进入工程的根目录
- 安装必要相应版本的依赖包
pip install -r doc/requirements_cp36-1.4.0.txt (下图是官方给的问题解决办法)
值得注意:在配置软件包的过程中,遇到“匹配不到XX版本”的问题,按照上述方式,并不能解决。
解决办法:首先安装Numpy(pip install numpy==1.19.5),然后执行上述命令,pip install -r doc/requirements_cp36-1.x.x.txt. 可能还有其它的错误,要根据错误提示,具体问题,具体分析。- 安装RKNN软件包
python pip install packages/rknn_toolkit2-1.4.0_22dcfef4-cp36-cp36m-linux_x86_64.whl
- 检查RKNN-Toolkit2是否安装成功
如下图所示,没有出错,则表示安装成功
- 测试官方 YOLO-V5 Demo
- 运行目录下的【test.py】
python test.py
如下图所示,运行平台是PC(linux)模拟器,转换得到【yolov5s.rknn】模型。
RKNPU2的编译以及使用方法
主要介绍板子上为Linux系统64位的编译以及使用,具体流程如下:
- 下载编译工具链(Arm版)
由于板子上是Linux系统,所以下载gcc编译器,下图是【官方推荐】的gcc版本以及下载链接,
遇到问题:上述GCC的下载链接不存在,也没有找到gcc-9.3版本的下载链接。后来又找到gcc-9.3(没有测试是否可用),https://gitlab.com/firefly-linux/prebuilts/gcc/linux-x86/aarch64/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu.
解决办法:下载其它版本的交叉编译器,【gcc-6.3】,下载链接如下,
http://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/(参考博客为:https://blog.csdn.net/song_lee/article/details/105487177)。- 下载部署源码
下载地址:https://github.com/rockchip-linux/rknpu2.- 编译官方 YOLOV5 Demo
Git官方上的方法如下:https://github.com/rockchip-linux/rknpu2/tree/master/examples/rknn_yolov5_demo
仿照上述方式,针对自己下载的版本,终端命令如下:
export TOOL_CHAIN=/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/
./build-linux_RK356X.sh
按照上述方法,仍并无法编译成功,报错如下图所示,找不到如下可执行文件 “aarch64-linux-gnu-gcc”
为此,修改【build-linux_RK356X.sh】脚本,将编译器所在目录写完整,具体修改如下图所示:
至此,可以成功编译YOLO-V5的例子,会在当前路径下生成【install】目录,目录中包含了扫地机上运行所需要的库,模型(可以通过rknn-toolkit2转换得到),测试图片,可执行程序,目录展开如下:
板子上运行(使用adb)
下图是Git上给的方式,将adb线插到扫地机,进行扫地机和PC端进行数据传输
Xshell 连接板子,运行程序即可。
移植自己训练的模型
移植自己训练的YOLOV5s,由于应用任务场景的不同,输出与官方YOLOV5的输出略有差异。与官方的Demo相比,需要修改一些输出的尺寸。具体流程如下:
- 导出RKNN模型
注意修改网络的输出大小:官方的模型yolov5s 输出的形状如下
output[0].shape=(1, 255, 80, 80), 自训练的模型输出为(1, 3, 80, 80,21)
output[0].shape=(1, 255, 40, 40), 自训练的模型输出为(1, 3, 40, 40,21)
output[0].shape=(1, 255, 20, 20), 自训练的模型输出为(1, 3, 20, 20,21)
为了适配官方提供的后处理,可以导出中间层的模型。用软件【Netron】打开自训练的模型,获得指定输出层的编号,如下图所示,得到输出为 (1, 63, 40, 40),
根据上述的网络节点的编号,代码需要修改的位置如下图所示,这样导出的模型可以完全与官方的后处理代码兼容。
- 编译RK板子的运行程序
参考上面的流程,修改相应的输出,直接编译即可。- 板子上运行
参考上面的流程,运行即可。
相关文章:

YOLO-V5 系列算法和代码解析(八)—— 模型移植
文章目录工程目标芯片参数查阅官方文档基本流程Python 版工具链安装RKNPU2的编译以及使用方法移植自己训练的模型工程目标 将自己训练的目标检测模型【YOLO-V5s】移植到瑞芯微【3566】芯片平台,使用NPU推理,最终得到正确的结果。整个过程涉及模型量化、…...
js实现复制拷贝的兼容方法
1. 定义复制拷贝的方法 在某个工具类方法中定义该方法,兼容不同浏览器处理 /*** description 拷贝的类方法*/ class CopyClass {// constructor() {}setRange(input) {return new Promise((resolve, reject) > {try {// 创建range对象const range document.c…...

学习 Python 之 Pygame 开发魂斗罗(八)
学习 Python 之 Pygame 开发魂斗罗(八)继续编写魂斗罗1. 创建敌人类2. 增加敌人移动和显示函数3. 敌人开火4. 修改主函数5. 产生敌人6. 使敌人移动继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(七)中࿰…...

Lesson11---分类问题
11.1 逻辑回归 11.1.1 广义线性回归 课程回顾 线性回归:将自变量和因变量之间的关系,用线性模型来表示;根据已知的样本数据,对未来的、或者未知的数据进行估计 11.1.2 逻辑回归 11.1.2.1 分类问题 分类问题:垃圾…...
Python基础学习12——异常
在Python中,会使用“异常”这个十分特殊的对象来管理程序执行期间发生的错误,即报错。本文将介绍一下python基础的处理异常的方法以及一些基本的异常类型。 异常处理方法 try-except代码块 当我们编写程序时,我们可以编写一个try-except代…...
[日常练习]练习17:链表头插法、尾插法练习
[日常练习]练习17:链表头插法、尾插法练习练习17描述输入输出输入示例1输出示例1输入示例2输出示例2代码演示:总结练习17 【日常练习】 链表头插法、尾插法练习 描述 输入3 4 5 6 7 9999一串整数,9999代表结束,通过头插法新建链…...

第十四届蓝桥杯模拟赛(第三期)试题与题解 C++
目录 一、填空题 (一)最小的十六进制(答案:2730) (二)Excel的列(答案:BYT) (三)相等日期(答案:70910) (四)多少种取法(答案:189)…...
关于 “宏“
起源 宏 Macro"这个词源于希腊语 “makros”,意为“大的,长的” 延伸使用 随后用于计算机领域是,在汇编语言时用于描述一大堆的汇编指令。 只要用宏指令,就是直接用的一大堆的汇编指令(有点函数的味道…...

1.2 CSS标签选择器,类选择器
CSS选择器: 根据不同的需求选出不同的标签,进行美化装饰 1. 标签选择器 标签选择器(元素选择器):用 HTML标签名作为选择器,按标签名称进行分类,为页面某一类标签指定统一的CSS样式 作用: 可以把某一类标签全部选中&…...

【Linux】进程等待 | 详解 wait/waitpid 的 status 参数
🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅 🔥 💭 写在前面:在上一章中我们讲解了进程创建与进程终止,本章我们开始讲解进程等待。进程等待这部分知识相较于前面还是较为复杂的࿰…...
OpenAI眼中的无线调优策略
问:无线调优策略该怎么优化无线调优是指对无线网络的各种参数进行优化,以提高网络性能和用户体验。以下是几个无线调优策略:频谱分配:通过优化频谱的分配,可以提高网络的容量和覆盖范围。在频谱分配时,需要…...

DataX入门
目录 1. DataX介绍 2. DataX支持的常用数据源类型 3. 设计理念 4. DataX框架设计 4.1. Reader 4.2. Writer 4.3. Framework 5. DataX的运行流程 6. DataX与Sqoop对比 7. 部署 8. 配置详解 9. 案例 同步MySql到HDFS 9.1. 整体结构 9.2. mySqlReader 9.2.1. …...

第二章SpringBoot基础学习
文章目录SpringBoot依赖管理特性依赖管理开发导入starter场景启动器SpringBoot自动配置特性自动配好Tomcat自动配好SpringMVC默认的包结构各种配置拥有默认值按需加载所有自动配置项SpringBoot注解底层注解ConfigurationImport导入组件Conditional条件装配ImportResource导入Sp…...

B - Build Roads (最小生成树 + 打表)
https://vjudge.net/problem/Gym-103118B/origin 在猫的国度里,有n个城市。猫国国王想要修n -1条路来连接所有的城市。第i市有一家ai经验价值的建筑公司。要在第i市和第j市之间修建公路,两个城市的建筑公司需要相互合作。但是,在修路的过程中…...
k8s管理工具
k8s管理工具 文章目录k8s管理工具Kuboard(💕17.3k)KubeOperator(💕4.6k)Rainbond(💕3.8k)KubeSphere(💕12k)Kuboard(&…...

Cannot start compiler The output path is not specified for module mystatic(已解决)
1.背景:今天在idea上写了一些代码,右键run竟然跑不起来了,而且右下角的Event Log还报错。报错内容如下图:2.报错原因:项目代码和编译器的输出路径不在一块,导致idea无法找到模块的output path(输…...

python入门应该怎么学习
国外Python的使用率非常高,但在国内Python是近几年才火起来,Python正处于高速上升期市场对于Python开发人才的需求量急剧增加,学习Python的前景比较好。 Python应用领域广泛,意味着选择Python的同学在学成之后可选择的就业领域有…...

不懂命令, 如何将代码托管到Gitee上
1.注册码云注册地址 : https://gitee.com2. 新建仓库第一步 : 创建仓库第二步 : 给仓库起名字创建好仓库后, 我们就有了一个网络上的仓库 : 3. 将网络上的仓库克隆到本地在克隆仓库之前, 我们需要先在电脑上安装以下两个工具 >>这两个软件一定要按顺序安装, 先安装第一个…...

Mysql常见面试题总结
1、什么是存储引擎 存储引擎指定了表的类型,即如何存储和索引数据,是否支持事务,同时存储引擎也决定了表在计算机中的存储方式。 2、查看数据库支持哪些存储引擎使用什么命令? -- 查看数据库支持的存储引擎 show engines; 或者 …...

python第一周作业
作业1:1、PPT上五个控制台界面2、要求定义两个数,并且交换它们的值(请使用多种方式,越多越好)作业1作业2:判断一个数,是否是2的指数2的指数0000 0010 0000 00010000 0100 0000 00110000 1000 00…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...