yolov5篇---yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程
yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程
- 一、任务介绍
- 二、实验过程
- 2.1 使用正确版本的yolov5进行训练(平台:x86机器ubuntu22.04系统)
- 2.2 best.pt转换为best.onnx(平台:x86机器ubuntu22.04系统)
- 2.3 best.onnx转换为best.rknn(平台:x86机器ubuntu22.04系统)
- 2.3.1 环境准备和工具包安装
- 2.3.2 onnx转换为rknn
- 2.4 RK3588部署rknn实现NPU加速(平台:aarch板子Linux系统)
- 3. 3588平台部署
一、任务介绍
瑞芯微RK3588是一款搭载了NPU的国产开发板。NPU(neural-network processing units)可以说是为了嵌入式神经网络和边缘计算量身定制的,但若想调用RK3588的NPU单元进行推理加速,则需要首先将模型转换为**.rknn格式**的模型,否则无法使用。
这次我们的任务是将yolov5训练得到的pt模型,一步步转换为rknn模型,并将rknn模型部署在搭载RK3588的StationPC M3主机上,使用NPU推理。(官网NPU教程:NPU使用 — Firefly Wiki)查阅资料和官网后发现转换和使用过程分以下几步,首先总结给大家,后文细说:
-
1.使用正确版本(v5.0)的yolov5进行训练得到pt模型;
-
2.将pt模型使用yolov5工程中的export.py转换为onnx模型;
-
3.将onnx模型使用rknn-toolkit2中onnx文件夹的test.py转换为rknn模型;
-
4.在板子上使用rknpu2工具调用rknn模型,实现NPU推理加速。
接下来进行详细介绍。
二、实验过程
2.1 使用正确版本的yolov5进行训练(平台:x86机器ubuntu22.04系统)
人菜就要跟着官方教程做,请看官方教程:
rknn-toolkit/examples/pytorch/yolov5 at master · rockchip-linux/rknn-toolkit · GitHub
需要指出的是,虽然我们后面要使用的是rknn-toolkit2工具进行模型转换,但教程却在rknn-toolkit工程中,github二者的父目录如图:
进入rknn-toolkit工程,浏览至/example/pytorch/yolov5,在README中赫然写着:
这就是我们本次要使用的“正确版本的yolov5” ,怕麻烦的读者请一定按照这个id去yolov5官网找到工程并克隆下来。进入yolov5官网GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
git clone 获取指定分支的指定commit版本
git clone https://github.com/ultralytics/yolov5
cd yolov5
git reset --hard c5360f6e7009eb4d05f14d1cc9dae0963e949213
非常棒,至此我们已经找到了正确版本的yolov5!接下来就是把代码克隆到本地或者云服务器,开始训练自己的pt模型;此处实际上是yolov5 5.0版本的工程,其中未包含预训练模型yolov5s.pt,需要我们自行下载,在releasesl链接中找到V5.0下载yolov5s.pt,链接如下:
https://github.com/ultralytics/yolov5/releases
关于yolov5的运行环境配置、参数修改和训练命令,网上教程很多,满足package的要求,可以开始训练收敛即可,不作为本文重点。最终在经过若干轮训练后,我们得到了自己的last.pt模型,本部分告一段落。
2.2 best.pt转换为best.onnx(平台:x86机器ubuntu22.04系统)
(1)
此处依然参考rknn-toolkit工程中的教程进行转换,切记以下步骤!!!
注意:在训练时不要修改yolo.py的这段代码,训练完成后使用export.py进行模型导出转换时一定要进行修改,不然会导致后面的rknn模型转换失败!
(2) 修改export.py
找到 torch.onnx.export 所在行
修改后将last.pt移动至export.py同一文件夹下,在命令行调用以下命令:
python export.py --weights last.pt --img 640 --batch 1 --include onnx
我们便可以得到成功转换的模型last.onnx。
2.3 best.onnx转换为best.rknn(平台:x86机器ubuntu22.04系统)
2.3.1 环境准备和工具包安装
有了以上的last.onnx模型作为基础,现在可以正式开始rknn模型的转换了。此处的转换工具rknn-toolkit2只能在Linux系统上运行,这里我使用的是本机Ubuntu22.04。在上文提到的链接中下载rknn-toolkit2,下载后的文件夹如图:
首先安装rknn-toolkit2的环境, 其环境要求在./doc/requirements_cp38-1.4.0.txt中,这里我使用的是anaconda创建的python3.8虚拟环境,创建环境并命名为rknn_3588,使用pip安装requirements_cp38-1.4.0.txt中的包
pip install -r requirements_cp38-1.4.0.txt
环境满足需求后便可以安装rknn-toolkit2工具包了,浏览至**./packages**中,输入以下命令:
pip install rknn_toolkit2-1.4.0_22dcfef4-cp38-cp38-linux_x86_64.whl
提示安装完成后我们可以检查是否安装成功,在终端中运行python,输入:
from rknn.api import RKNN
若不报错说明我们的工具包已经安装成功,之后便可进行rknn模型的转换了~
2.3.2 onnx转换为rknn
在rknn-toolkit2工程文件夹中浏览至 ./examples/onnx/yolov5,将我们在2.2中转换得到的last.onnx复制到该文件夹下,修改该文件夹下的test.py中的内容为自己模型的名字,要修改的地方如下:
在这个test.py的main函数中(在第230行附近)可以了解到这个python文件的作用:
【 配置——加载onnx模型—导出rknn模型——rknn模型推理——后处理——输出结果】
最终弹窗得到post process result,若结果正确,说明我们的rknn模型转换成功了!这里的test.py构建了一个虚拟的NPU运行环境,模拟在RK3588上真实运行的情况。结果正确说明离最终完成任务只差部署在板子上这一步了。
这时在当前文件夹**./example/onnx/yolov5中可以看到生成的last.rknn**模型。至此,我们离胜利就不远了。
2.4 RK3588部署rknn实现NPU加速(平台:aarch板子Linux系统)
终于RK3588板子登场的时候了,但如果它还是原生的安卓系统,请按官网教程给它安装一个Linux系统吧。我这里使用TF卡烧录安装了Ubuntu系统。
依然找到官网,下载其中的rknpu2工具,链接如下:https://github.com/rockchip-linux/rknpu2
3. 3588平台部署
在3588的主目录上获取官方demo
git clone https://github.com/rockchip-linux/rknpu2.git
进入yolov5目录
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo
修改include文件中的头文件postprocess.h
#define OBJ_CLASS_NUM 3 #这里的数字修改为数据集的类的个数
修改model目录下的coco_80_labels_list.txt文件, 改为自己的类并保存
xxx
xxx
xxx
将转换后的rknn文件放在model/RK3588目录下
编译,运行shell
bash ./build-linux_RK3588.sh
成功后生成install目录
cd install/rknn_yolov5_demo_linux
在model目录下放入需要推理的图片
运行
./rknn_yolov5_demo ./model/RK3588/last.rknn ./model/0625_Bin_005.jpg
注:后面的图片用的全路径,因为当前的相对路径识别不到(主要是看图片所在的位置)
在rknn_yolov5_demo_linux获取到结果
参考:
https://blog.csdn.net/m0_57315535/article/details/128250096
https://blog.csdn.net/m0_51714298/article/details/125916417
相关文章
- string类
stringstring类1.为什么要学习string类1.1 C语言中的字符串1.2两个面试题2.标准库中的string类2.1 string类2.2 string类的常用接口说明1. string类对象的常见构造2.string类对象的容量操作3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数6. v…...
2023/3/26 19:11:21 - 点与线段的关系
点与线段的关系 对于向量a(x1,y1)和b(x2,y2) 点乘的数学意义:a * b x1x2 y1y2 点乘的几何意义:a * b |a||b|cosQ 这个可以看成是投影关系表达式:cosQ a * b / ( |a||b|) 令r cosQ; 求p点和线段AB的位置关系,可以…...
2023/3/26 19:11:06 - Android 通过Room操作SQLite数据库
谷歌推荐使用Room操作数据库,Room在 SQLite 上提供了一个抽象层,在充分利用 SQLite强大功能的同时,能够流畅地访问数据库。 Room的三个主要组件: 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。…...
2023/3/26 19:11:01 - 易基因|表观发育:ChIP-seq揭示精子H3K4me3可传递到胚胎并与代谢功能障碍遗传有关
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2022年2月17日,《Mol Metab》杂志在线发表了题为“Sperm histone H3 lysine 4 tri-methylation serves as a metabolic sensor of paternal obesity and is associated with …...
2023/3/26 19:10:49 - buuctf-misc-[GKCTF 2021]你知道apng吗1
先下载附件,快要过年了,十二月份还没发过文章,紧急写一篇。 下载文件后缀名为apng 搜索一下APNG(基于PNG的位图动画格式)_百度百科 利用火狐浏览器可以打开 类似gif图片的格式,用专门工具进行拆解…...
2023/3/26 19:10:42 - Linux多线程编程
文章目录1、线程基本知识2、线程控制3、线程同步与互斥<1>线程互斥<2>线程同步条件变量生产者消费者模型POSIX信号量读者写者问题<3>线程池<4>单例模式1、线程基本知识 线程概念 线程是在进程内部运行的一个执行分支(执行流),属于进程的一部…...
2023/3/26 19:10:01 - Day869.索引(下) -MySQL实战
索引(下) Hi,我是阿昌,今天学习记录的是关于索引(下)的内容。 先来看一下这个问题: 下面这个表 T 中,如果执行 select * from T where k between 3 and 5,需要执行几次…...
2023/3/26 19:09:42 - 记录--微信调用jssdk--Invalid Signature, updateAppMessageShareData: denied等问题
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近在做安卓内嵌入H5活动页拉新活动,遇到的棘手问题记录下, 一是为了日后遇到同样问题好回顾,二是希望能帮到有同样问题的兄弟。 废话不多说,先从最棘手…...
2023/3/26 19:09:37 - 14种可用于时间序列预测的损失函数
在处理时间序列预测问任务时,损失函数的选择非常重要,因为它会驱动算法的学习过程。以往的工作提出了不同的损失函数,以解决数据存在偏差、需要长期预测、存在多重共线性特征等问题。本文工作总结了常用的的 14 个损失函数并对它们的优缺点进…...
2023/3/26 19:09:28 - QSS编辑器QssEditor之二:加载有变量的QSS
一.Qt样式表(StyleSheet) 1.关于样式表 Qt样式表可以让你自定义任何一个Qt控件的样式包括颜色、边框、背景等等(你想的到样式都可以),Qt样式表的概念、术语和语法与HTML的CSS样式表类似。样式表是文本规范。 QApplication::setStyleSheet()在整个应用程序上设置,一般在…...
2023/3/26 19:09:20 - 人工智能轨道交通行业周刊-第19期(2022.10.17-10.23)
本期关键词:首都智慧地铁、AI四小龙、文本生成视频、低光照目标检测、天窗、电务人员 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V…...
2023/3/26 19:08:50 - 基于JAVA课程在线反馈系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA课程在线反馈系统计算机毕业设计源码系统mysql数据库lw文档部署 基于JAVA课程在线反馈系统计算机毕业设计源码系统mysql数据库lw文档部署本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前…...
2023/3/26 19:08:45 - 整理之前的书籍
天气不太好的,今天在家里整理书籍,然后看了看以前的一些记录,当然还有关于投资的东西,以前也记录了很多笔记,写了很多心得感悟。...
2023/3/26 19:08:37 - 一对一,屏对屏,菊风远程同屏解决方案,助力多行业实现数字化协同
业务沟通效率太低了怎么办? 业务办理流程太复杂,客户总不会操作怎么办? 系统怎么又显示错误了,我到底哪步做错了? ....... 菊风远程同屏服务以音视频沟通和实时同屏互动为核心功能,可融合线上线下高频服…...
2023/3/26 19:08:27 - MMDeploy 使用指南
MMDeploy 使用指南 参考: MMlab 官方文档 MMDeploy 部署实战 一. 环境配置 1. 创建mmdeploy的conda环境 conda create --name mmdeploy python3.8 -y conda activate mmdeploy # pytorch安装 conda install pytorch{pytorch_version} torchvision{torchvision_…...
2023/3/26 19:08:15 - 后台管理界面源代码简单的
dreamweaver制作的网页后台管理源代码展开3全部dreamweaver制作的网页后台管理源代码方法:1、首先打开Dreamweaver软件,新建站点和html文件,并保存。2、然后打开想要借鉴的网站首页,比如“香奈儿中国官网”,然后右击网页选择”查看源“,查看网站主页的源代码。3、然后切换…...
2023/3/26 19:08:13 - android 获取alertdialog的view,android – 如何在AlertDialog中显示CalendarView?
我正在尝试在警报对话框中显示CalendarView,但所有显示的都是月/年和星期几.这些是布局文件的内容:android:id"id/myLayout"android:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertic…...
2023/3/26 19:08:09 - Spring--IOC基于XML管理bean
IOC容器 IOC思想 IOC:Inversion of Control 即反转控制 获取资源的传统方式 自己做饭:买菜、洗菜、择菜、改刀、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程中的全部细节且熟练掌握。 在应用程序中的组件…...
2023/3/26 19:07:48 - SpringBoot(一): SpringBoot的创建和使用
Spring的创建和使用1. 什么是Spring?2. SpringBoot的优点3. SpringBoot项目的创建3.1 使用IDEA创建3.2 使用网页创建4. 项目目录介绍和运行4.1 目录介绍4.2 项目运行4.3 输出hello world4.4 约定大于配置1. 什么是Spring? Spring的诞生是为了简化Java程…...
2023/3/26 19:07:20 - 适用于 Windows 的 5 大 PDF 编辑器
“如何在 Windows 7/8/10/11 上编辑 PDF 文件?” “适用于 Windows 7/8/10/11的最佳 PDF 编辑器是什么?” 升级到 Windows 7/8/10/11 后,你会发现很多应用程序在新的 Windows 系统上无法运行,包括 PDF 编辑器。然而,一…...
2023/3/26 19:07:07
最新文章
- yolov5篇---yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程
yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程一、任务介绍二、实验过程2.1 使用正确版本的yolov5进行训练(平台:x86机器ubuntu22.04系统)2.2 best.pt转换为best.onnx(平台:x86机器ubuntu22.04系统)2.3 best…...
2023/3/26 19:11:23 - Hallucination in NLP(自然语言处理中的幻觉现象)
幻觉在心理学层次指一个清醒的个体在没有对应外界刺激下产生的相应感觉,简单来说是让人感觉是真实发生的虚假体验。“a percept, experienced by a waking individual, in the absence of an appropriate stimulus from the extracorporeal world”——Blom[1]那么在…...
2023/3/26 19:11:23 - 文心一言是中文版的ChatGPT?多角度分析猜测文心一言到底是什么?
文心一言是中文版的ChatGPT?多角度分析/猜测文心一言到底是什么! ChatGPT爆火网络,一时间风靡不断。 AI替代人类工作的传言四起 宣布ChatGPT类似产品的公司股价大涨,这到底是什么? 国产的类似产品到底到了什么程度…...
2023/3/26 19:11:21 - string类
stringstring类1.为什么要学习string类1.1 C语言中的字符串1.2两个面试题2.标准库中的string类2.1 string类2.2 string类的常用接口说明1. string类对象的常见构造2.string类对象的容量操作3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数6. v…...
2023/3/26 19:11:21 - Android 14 首个开发者预览版到来
作者 / Dave Burke, VP of Engineering让 Android 在数十亿用户的手中良好运行,是我们、Android 设备制造商,以及开发者社区的一致追求。今天,我们为大家带来 Android 14 的第一个开发者预览版。大家针对预览版提出的反馈具有重要意义&#x…...
2023/3/26 19:11:18 - 点与线段的关系
点与线段的关系 对于向量a(x1,y1)和b(x2,y2) 点乘的数学意义:a * b x1x2 y1y2 点乘的几何意义:a * b |a||b|cosQ 这个可以看成是投影关系表达式:cosQ a * b / ( |a||b|) 令r cosQ; 求p点和线段AB的位置关系,可以…...
2023/3/26 19:11:06 - Android 通过Room操作SQLite数据库
谷歌推荐使用Room操作数据库,Room在 SQLite 上提供了一个抽象层,在充分利用 SQLite强大功能的同时,能够流畅地访问数据库。 Room的三个主要组件: 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。…...
2023/3/26 19:11:01 - 读取配置文件,注入属性为NULL
1. SpringBoot读取配置属性常见的三种方式: info:address: url/adress1. 1 Value注解读取方式 Component public class InfoConfig1 {Value("${info.address}")private String address;public String getAddress() {return address;}public void setAddress(String…...
2023/3/26 19:10:51 - 易基因|表观发育:ChIP-seq揭示精子H3K4me3可传递到胚胎并与代谢功能障碍遗传有关
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2022年2月17日,《Mol Metab》杂志在线发表了题为“Sperm histone H3 lysine 4 tri-methylation serves as a metabolic sensor of paternal obesity and is associated with …...
2023/3/26 19:10:49 - buuctf-misc-[GKCTF 2021]你知道apng吗1
先下载附件,快要过年了,十二月份还没发过文章,紧急写一篇。 下载文件后缀名为apng 搜索一下APNG(基于PNG的位图动画格式)_百度百科 利用火狐浏览器可以打开 类似gif图片的格式,用专门工具进行拆解…...
2023/3/26 19:10:42 - 【RT-Thtread 编译入门及渐进 3-- GCC 编译过程介绍】
文章目录1.1 gcc 编译介绍1.1.1 gcc-arm-none-eabi toolchain 介绍及安装1.1.2 编译过程1.1.3 编译之参数1.1.4 elf 与 .map .bin之间的关系1.1 gcc 编译介绍 1.1.1 gcc-arm-none-eabi toolchain 介绍及安装 gcc-arm-none-eabi 是一个开源的ARM开发工具链,适用于A…...
2023/3/26 19:10:17 - Linux多线程编程
文章目录1、线程基本知识2、线程控制3、线程同步与互斥<1>线程互斥<2>线程同步条件变量生产者消费者模型POSIX信号量读者写者问题<3>线程池<4>单例模式1、线程基本知识 线程概念 线程是在进程内部运行的一个执行分支(执行流),属于进程的一部…...
2023/3/26 19:10:01 - MySQL常见面试题(2023年最新)
目录1.char和varchar的区别2.数据库的三大范式3.索引是什么4.索引的优点和缺点5.索引怎么设计(优化)6.索引的类型7.索引的数据类型8.索引为什么使用树结构9.二叉查找树、B树、B树10.为什么使用B树不用B树11.最左匹配原则12.MylSAM和InnoDB的区别13.什么是事务14.事务的四大特性…...
2023/3/26 19:09:56 - Day869.索引(下) -MySQL实战
索引(下) Hi,我是阿昌,今天学习记录的是关于索引(下)的内容。 先来看一下这个问题: 下面这个表 T 中,如果执行 select * from T where k between 3 and 5,需要执行几次…...
2023/3/26 19:09:42 - 记录--微信调用jssdk--Invalid Signature, updateAppMessageShareData: denied等问题
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近在做安卓内嵌入H5活动页拉新活动,遇到的棘手问题记录下, 一是为了日后遇到同样问题好回顾,二是希望能帮到有同样问题的兄弟。 废话不多说,先从最棘手…...
2023/3/26 19:09:37 - 在软件开发中如何将看板方法与 Scrum 集合使用?
什么是看板和 Scrum 的混合模式?适合在哪些场景使用?有哪些成功的案例可参考?本文将围绕以上问题展开。敏捷实践是一个团队过程,选择适合团队的敏捷框架时并没有什么技巧,无论您是使用看板方法、Scrum 还是两者的组合&…...
2023/3/26 19:09:36 - 14种可用于时间序列预测的损失函数
在处理时间序列预测问任务时,损失函数的选择非常重要,因为它会驱动算法的学习过程。以往的工作提出了不同的损失函数,以解决数据存在偏差、需要长期预测、存在多重共线性特征等问题。本文工作总结了常用的的 14 个损失函数并对它们的优缺点进…...
2023/3/26 19:09:28 - QSS编辑器QssEditor之二:加载有变量的QSS
一.Qt样式表(StyleSheet) 1.关于样式表 Qt样式表可以让你自定义任何一个Qt控件的样式包括颜色、边框、背景等等(你想的到样式都可以),Qt样式表的概念、术语和语法与HTML的CSS样式表类似。样式表是文本规范。 QApplication::setStyleSheet()在整个应用程序上设置,一般在…...
2023/3/26 19:09:20 - C# 利用FluentFTP实现FTP上传下载功能
FTP作为日常工作学习中,非常重要的一个文件传输存储空间,想必大家都非常的熟悉了,那么如何快速的实现文件的上传下载功能呢,本文以一个简单的小例子,简述如何通过FluentFTP实现文件的上传和下载功能。仅供学习分享使用…...
2023/3/26 19:09:10 - 如何在JavaScript中对文件进行处理
在JavaScript中可以通过文件API实现许多常见的文件处理任务,请看下面的一些例子: 1、读取文件内容:使用 FileReader API 可以将文件读取为 ArrayBuffer、Blob、DataURL 等格式,并进行后续处理。 JavaScript 可以使用文件 API 中…...
2023/3/26 19:08:52