yolov5篇---yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程

news2024/11/25 1:45:37

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

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

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

相关文章

2023年西安Java培训机构十强榜单出炉,快来看看哪家榜上有名~

关于“西安Java培训机构哪家好?”“如何选择适合自己的Java培训机构?”这类问题常常出现网络上,其实关于这类问题没有统一的答案,一千个人有一千个哈姆雷特,每个人关注的重点不一样,需求更是不同&#xff0…

投入3.6亿美元!加拿大启动国家量子战略

(图片来源:网络)量子科学和技术处于研究和创新的前沿,具有巨大的商业化潜力和突破性进展,包括更有效的药物设计、更好的气候预测、改进的导航系统和清洁技术的创新。加拿大政府支持这一新兴行业的持续发展,…

用队列实现栈+用栈实现队列+循环队列(oj题)

1.题目: 力扣https://leetcode.cn/problems/implement-stack-using-queues/ 思路: 核心思路: 1、入数据,往不为空的队列入、保持另一个队列为空 2、出数据的时候,依次出队头的数据,转移另一个队列保存。只剩最后一个事,Pop掉 typ…

【数据结构之排序系列】校招热门考点:快速排序

目录前言一、hoare版本1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试二、挖坑法1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试三、前后指针法1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试四、快排的时间复杂度五、快排的优化1. 三数取中2. 小区间优化六、快排的…

[Vulnhub] DC-9

前言: 打了这么长时间,终于,DC系列1-9 靶机已经干完了。通过这九个靶机的历练,都是单靶机 感觉远远不足,但也不是没有收获,学到了一些工具和提权的简单利用,大概知道了什么是反弹shell&#xf…

UE实现人物角色沿样条线移动效果

文章目录 1.实现目标2.实现过程2.1 实现思路2.2 具体过程3.参考资料1.实现目标 实现人物角色Character按样条线Spline自动移动效果,GIF动图如下。 2.实现过程 2.1 实现思路 (1)获取某一时刻样条线上点的位置,直接使用GetLocationAtTime函数即可。 (2)实时更新Characte…

Python Windows Apache部署Django项目运行环境(含Mysql)以及解决过程中遇到的问题

上一篇请移步Python Windows Apache部署Django项目运行环境_水w的博客-CSDN博客 本文是在上一篇的基础上, 进行后续工作。 目录 一、配置数据库(MySQL) 1、Mysql配置 2、安装MySQL管理工具SQLyog 【解决过程中遇到的问题】 解决报错&am…

java泛型2

真正搞定泛型!!!------- >类型形参 所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参(或叫泛型)将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类…

【看表情包学Linux】进程的概念 | 进程控制块 PCB | 父进程与子进程 | 进程 ID | task_struct

🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅 🔥 💭 写在前面:本章我们将带着大家深入理解 "进程" 的概念,"进程" 这个概念其实使我们一直在接触的东西,只不…

一文深入搞懂 mmap 涉及的所有内容

内存映射,简而言之就是将内核空间的一段内存区域映射到用户空间。映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间与用户空间两者之间需要大量数…

一文讲清同步异步,消息队列,宏任务 微任务...

单线程多线程 什么是线程进程? 进程:是cpu分配资源的最小单位;(是能拥有资源和独立运行的最小单位) 线程: 是cpu调度的最小单位;(线程是建立在进程的基础上的一次程序运行单位,一…

Kafka第一章:环境搭建

系列文章目录 Kafka第一章:环境搭建 文章目录系列文章目录前言一、环境安装1.前置环境2.软件下载3.上传集群并解压4.编写配置文件5.分发配置文件6.修改参数7.环境变量8.启动服务9.编写启动脚本二、主题命令行操作1.查看topic2.创建 first topic3.查看主题的详情4.修…

录制屏幕为什么没有声音?教您录制声画同步的视频

有时我们只顾着录制电脑的画面,而忽视了录制视频的声音,导致录制的视频文件只有画面没有声音。那您知道录制的视频为什么没有声音吗?怎样才能录制声画同步的录屏文件呢?想要录制带声画同步的视频,首先您得拥有一款支持…

[kubernetes]-k8s通过psp限制nvidia-plugin插件的使用

导语: k8s通过psp限制nvidia-plugin插件的使用。刚开始接触psp 记录一下 后续投入生产测试了再完善。 通过apiserver开启psp 静态pod会自动更新 # PSP(Pod Security Policy) 在默认情况下并不会开启。通过将PodSecurityPolicy关键词添加到 --enbale-admission-plu…

【Cocos新手入门】使用 cocos creator 创建多个场景,并通过代码和事件绑定进行切换场景的方法

本篇文章主要讲解使用 cocos creator 创建多个场景,并通过代码和事件绑定进行切换 作者:任聪聪 日期:2023年1月31日 cocos 引擎版本 2.4.3 场景的创建 步骤一、右击资源管理器下的assets目录,点击新建,献出案件一个sc…

NX二开ufun函数UF_MODL_create_section_surface(样条曲线构建截面特征)

本节主要介绍通过样条曲线及截面OPEN API结构体构建截面特征,函数名 UF_MODL_create_section_surface,效果图如下: 1、函数结构 int UF_MODL_create_section_surface ( UF_MODL_secsrf_data_p_t section_surface_data&#xff0c…

vue2 数据响应式Object.defineProperty

我们通常可以对进行输入框进行数据的监听,只需要用到了input 事件或 change事件,就可以实时监听到数据的改变,但是如果只是一个单独的数据呢?怎么去做监听,watch吗??哈哈。 所以 vue响应式就用…

基于微信小程序的懒人美食帮小程序

文末联系获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.…

graalvm把springboot 3.0应用编译为原生应用

文章目录1、GraalVM Native Support依赖2、编译为原生应用2.1、编译为docker镜像2.2、编译为原生应用文件之前的文章《Graalvm 安装和静态编译(https://blog.csdn.net/penngo/article/details/128006244)》介绍了graalvm的安装和环境配置,普通…

【Rust】6. 结构体与方法

6.1 结构体的定义和实例化 6.1.1 结构体定义、创建实例 6.1.2 创建实例:字段初始化简写语法 6.1.3 创建实例:结构体更新语法(注意:数据的移动特性!) .. 语法:指定了剩余未显式设置值的字段应有…