请添加图片描述
已在GitHub开源与本博客同步的YOLOv5_RK3588_object_detect项目,地址:https://github.com/A7bert777/YOLOv5_RK3588_object_detect/tree/main
详细使用教程,可参考README.md或参考本博客第六章 模型部署

文章目录

  • 一、项目回顾
  • 二、模型选择介绍
  • 三、项目文件梳理
  • 四、YOLOv5模型训练 & PT转ONNX
  • 五、ONNX转RKNN
  • 六、模型部署

一、项目回顾

博主之前有写过YOLO11、YOLOv8目标检测&图像分割、YOLOv10目标检测、MoblieNetv2、ResNet50图像分类的模型训练、转换、部署文章,感兴趣的小伙伴可以了解下:

【YOLO11部署至RK3588】模型训练→转换RKNN→开发板部署
【YOLOv10部署RK3588】模型训练→转换rknn→部署流程
【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
【YOLOv8-pose部署至RK3588】模型训练→转换RKNN→开发板部署
【YOLOv8部署至RK3588】模型训练→转换rknn→部署全流程
【YOLOv8seg部署RK3588】模型训练→转换rknn→部署全流程
【MobileNetv2图像分类部署至RK3588】模型训练→转换rknn→部署流程
【ResNet50图像分类部署至RK3588】模型训练→转换RKNN→开发板部署
YOLOv8n部署RK3588开发板全流程(pt→onnx→rknn模型转换、板端后处理检测)

二、模型选择介绍

近期需要做一个针对图像目标检测的模型,并部署到RK3588公版的开发板上,可选择的有YOLOv5、YOLOv8、YOLOv10、YOLO11等,其他算法都已经部署过了,博主其实最早接触到的算法就是YOLOv5,但后续新YOLO算法层出不穷,大家也都转向了YOLOv8、11等算法,也就冷落了YOLOv5,但仍不能否认其价值,因此准备出一篇YOLOv5的全流程部署教程,以此文记录,相互学习,诸君共勉。

三、项目文件梳理

YOLOv5训练、转换、部署所需三个项目文件:
第一个:YOLOv5模型训练以及转换onnx的项目文件(链接在此);
第二个:用于在虚拟机中进行onnx转rknn的虚拟环境配置项目文件(链接在此);
第三个:在开发板上做模型部署的项目文件(链接在此);

这里说下为什么第一个文件要用瑞芯微的仓库而不是ultralytics官方的仓库,瑞芯微的官方回复如下:
在这里插入图片描述

是因为为了优化Focus以及SPPF模块,并将原项目中的激活函数改为ReLU,以更好地适配瑞芯微系列的芯片,如RK3588等。

注:第一个文件使用master版本,第二个和第三个文件均使用2.1.0tag版本
如下所示:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、YOLOv5模型训练 & PT转ONNX

先将第一个文件 git clone 后(我将其重命名为yolov5-rknn),创建并安装conda环境:

pip install -r requirements.txt

等待安装完成

将train.py下的 def parse_opt(known=False): 中的参数进行修改,包括weights、cfg、data、epochs、batch-size等,如下所示:
在这里插入图片描述

yolov5n.pt建议自己去官网先下好,不然训练前做AMP的时候会自动下载,速度较慢

yolov5n.yaml如下所示(可直接复制我的):

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 8  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]],  # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

只需改成自己数据集的类别即可,我的数据集中共有8个类别

mycoco.yaml如下所示(可直接复制我的,但是要把数据集路径和类别数量及类别名称改成自己的):

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# COCO 2017 dataset http://cocodataset.org by Microsoft
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco  ← downloads here (20.1 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /Dataset/Constrution/MOCS/MOCS # dataset root dir
train: /Dataset/Constrution/MOCS/MOCS/images/train # train images (relative to 'path') 118287 images
val: /Dataset/Constrution/MOCS/MOCS/images/val # val images (relative to 'path') 5000 images
#test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# number of classes
nc: 8# Classes
names: ['Worker', 'Bulldozer', 'Excavator', 'Truck', 'Loader', 'Pump truck', 'Concrete transport Mixer', 'Pile driver']

至于batchsize和epoch就因人而异了,我主要是做个演示,所以epoch就设为20,常规设置为300,batchsize为64

执行train.py进行训练:

python train.py

训练完成后,终端结果如下所示:
在这里插入图片描述

然后将训练好的best.pt模型复制到yolov5-rknn路径下,我将其重命名为yolov5_rknn7.0_best.pt,然后执行命令:

python export.py --rknpu --weight yolov5_rknn7.0_best.pt

如下所示:
在这里插入图片描述

可以看到,在当前路径下生成了同名的onnx模型:
在这里插入图片描述

此时需要用netron打开onnx模型,观察模型输出是否正确,应该为如下所示,即有三个输出通道:
在这里插入图片描述

五、ONNX转RKNN

在进行这一步的时候,如果你是在云服务器上运行,请先确保你租的卡能支持RKNN的转换运行。博主是在自己的虚拟机中进行转换
先安装转换环境
这里我们先创建环境:

conda create -n rknn210 python=3.8

创建完成如下所示:
在这里插入图片描述

现在需要用到 第二个文件:rknn-toolkit2-2.1.0文件
进入rknn-toolkit2-2.1.0\rknn-toolkit2-2.1.0\rknn-toolkit2\packages文件夹下,看到如下内容:
在这里插入图片描述

在终端激活环境,在终端输入

pip install -r requirements_cp38-2.1.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

然后再输入

 pip install rknn_toolkit2-2.1.0+708089d1-cp38-cp38-linux_x86_64.whl

然后,我们的转rknn环境就配置完成了。

现在要进行模型转换,其实大家可以参考rknn_model_zoo-2.1.0\examples\yolov5下的README指导进行转换:
在这里插入图片描述
在这里插入图片描述

这里我也详细再说一遍转换流程,修改convert.py,如下所示:
在这里插入图片描述

修改完成后,将我们之前得到的onnx模型复制到model文件夹下:
在这里插入图片描述
打开终端,激活rknn210环境,输入命令:

python convert.py yolov5_rknn7.0_best.onnx rk3588

结果如下:
在这里插入图片描述

在model文件夹下生成了RKNN模型,如下所示:
在这里插入图片描述

复制到win下,用netron打开,输出结构如下所示:
在这里插入图片描述
可以看到,和ONNX一致,同为三个输出

六、模型部署

如果前面流程都已实现,模型的结构也没问题的话,则可以进行最后一步:模型端侧部署。
我已经帮大家做好了所有的环境适配工作,科学上网后访问博主GitHub仓库: YOLOv5_RK3588_object_detect ,进行简单的路径修改就即可编译运行。

统一声明:
1、这个仓库的项目只能做图片的批量检测,不支持视频流检测,没时间做这个,有需要的自己修改代码。
2、从GitHub的README.md中加QQ后直接说问题和小星星截图,对于常见的相同问题,很多都已在CSDN博客中提到了(RKNN转换流程是统一的,可去博主所有的RKNN相关博客下去翻评论),已在评论中详细解释过的问题,不予回复。

重点:请大家举手之劳,帮我的仓库点个小星星
点了小星星的同学可以免费帮你解决转模型与部署过程中遇到的问题。
在这里插入图片描述

我已经把自己的RKNN模型放到了Github项目的model文件夹下、测试图片放到inputimage文件夹下,大家 git clone 后可直接先把build下内容删掉然后重新编译,在用我的RKNN模型和图片直接运行测试。
在这里插入图片描述

在这里插入图片描述

git clone后把项目复制到开发板上,按如下流程操作:
①:cd build,删除所有build文件夹下的内容
②:cd src 修改main.cc,修改main函数中的如下三个内容,将这三个参数改成自己的绝对路径:
在这里插入图片描述

③:cd src 修改postprocess.cc下的txt标签的绝对路径:
在这里插入图片描述

解释一下,这个标签路径中的内容如下所示:
在这里插入图片描述

其实就是你在训练模型时在yaml配置文件中的那几个类别名(如果你先用博主的RKNN模型测试,则无需要改txt中的内容)

④修改include/postprocess.h 中的宏 OBJ_CLASS_NUM
在这里插入图片描述

⑤:把你之前训练好并已转成RKNN格式的模型放到 model 文件夹下,然后把你要检测的所有图片都放到 inputimage 文件夹下,在运行程序后,生成的结果图片在 outputimage 目录下。

⑥:进入build文件夹进行编译

cd build
cmake ..
make

在build下生成可执行文件文件:rknn_yolov5_demo
在build路径下输入

./rknn_yolov5_demo

运行结果如下所示:
在这里插入图片描述

生成的结果图片在 outputimage 目录下,我也将其上传到Github项目中:
在这里插入图片描述

在执行完 ./rknn_yolov5_demo 后在 outputimage 下的输出结果图片示例:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上述即博主此次更新的YOLOv5部署RK3588,包含PT转ONNX转RKNN的全流程步骤,欢迎交流!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Telematics Control Unit(TCU)的系统化梳理

1、Telematics Control Unit (TCU)概述 TCU中文名为远程信息处理控制单元,很多场合都称为Telematics Box,又叫TBox,顾名思义,一般都为一个独立的盒子(如图2、图3所示),负责和云端的远程信息交互…

Appium学习笔记

adb构成client端,在电脑上,负责发送adb命令daemon守护进程,在手机上,负责接收和执行adb命令server端,在电脑上,负责管理client和daemon之间的通信![[Pasted image 20250825201322.png]]包名,对应…

栈指针(Stack Pointer)是什么?

栈指针(Stack Pointer)是什么? 首先,用一个简单易懂的方式解释栈指针(Stack Pointer)。 核心比喻:摞起来的书 想象有一摞书整齐地堆在桌面上: 这摞书就是“栈”(Stack),它是一种后进先出(LIFO) 的数据结构。你只能从最顶部拿走一本书(“弹出”),或者把一本新…

数据结构:红黑树(Red-Black Tree)

目录 从AVL树的“烦恼”说起 如何用“颜色”来定义“大致平衡”?—— 红黑树的五个规则 五个规则如何保证“大致平衡”? 用 C/C 代码定义红黑树的结构 定义颜色和节点结构 定义树的结构和哨兵节点 从AVL树的“烦恼”说起 我们从已经了解的 AVL 树出…

Ubuntu22.04安装VMware Tools

文章目录前言安装open-mv-tools前言 本教程使用的版本是Ubuntu22.04.5,由于虚拟机上面的重新安装VMware Tools是灰的,于是自动下载安装open-mv-tools, 安装open-mv-tools 打开终端,更新一下 sudo apt update这一步可能需要先…

DBeaver连接SQL Server时添加驱动后仍提示找不到驱动的解决方法

DBeaver连接SQL Server时添加驱动后仍提示找不到驱动的解决方法 在使用DBeaver连接SQL Server时,即使您已手动添加驱动文件,系统仍提示“找不到驱动”,这通常是由驱动配置错误、版本不兼容或SQL Server设置问题引起的。以下我将逐步为您提供解…

JVM之【类加载系统】

目录 前言 类加载过程 类加载 执行过程 加载阶段 连接阶段 初始化阶段 类加载器 BootstrapClassLoader ExtClassLoader AppClassLoader 类加载器之间的关系 双亲委派机制 核心思想 好处 源码分析 类加载器之间的父子层级关系 双亲委派的体现 前言 上文中提到…

【 限流技术 | 从四大限流算法到Redisson令牌桶实践 】

引言:为什么需要限流?在现代分布式系统中,服务的稳定性是至关重要的。在遇到突发的请求量激增,恶意的用户访问,亦或是请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均…

深入解析Java NIO多路复用原理与性能优化实践指南

深入解析Java NIO多路复用原理与性能优化实践指南 技术背景与应用场景 在高并发网络编程中,传统的阻塞 I/O 模型往往因每个连接都占用一个线程或一个系统调用而导致线程资源浪费、线程切换开销剧增等问题,难以满足数万甚至数十万并发连接的负载要求。Jav…

目标检测数据集 第006期-基于yolo标注格式的汽车事故检测数据集(含免费分享)

目录 目标检测数据集 第006期-基于yolo标注格式的汽车事故检测数据集(含免费分享) 超实用汽车事故检测数据集分享,助力计算机视觉研究! 1、背景 2、数据详情 数据集基本信息 结构组成 标注格式与示例 类标签说明 数据增强情况 3、应用场景 4、…

应用密码学(书籍学习笔记、基础知识) 一

本博客为读《应用密码学》所得笔记 文章目录一、 加密与解密1.2 秘钥Key1.2.1 引入秘钥K1.2.2 加密秘钥K1,解密秘钥K2二、对称算法 VS 公开密钥算法**① 对称算法** - 传统密码算法 **(Symmetric Algorithm) 🔑****② 非对称算法特点** - 公开秘钥算法 *…

【攻防世界】Web_php_include

1.信息收集题目&#xff1a;Web_php_include &#xff1a;PHP文件包含漏洞2.思路&#xff1a;1.代码审计&#xff1a;<?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) { //在一个字符串中查…

cmake--CPack/deb

deb包的需求 怎么使用cmake把项目的依赖想打包为deb包,把项目的可执行文件和依赖文件打包为deb包,又怎么样配置apt源,让项目在jenkins构建之后,可以通过sudo apt install 下载deb包和安装到任意主机上? 整体流程概览 使用CMake构建项目:确保你的项目可以被CMake正确编译…

七十五、【Linux数据库】部署Redis服务 、 部署LNMP+Redis

Redis 与 LNMP 集成功能概述 Redis 核心功能 内存数据存储:高速读写性能 数据结构丰富:字符串、哈希、列表、集合等 持久化支持:RDB快照和AOF日志 发布订阅:消息队列功能 高可用:主从复制、哨兵模式、集群 LNMP+Redis 集成价值 会话共享:多Web服务器共享Session 数据缓存…

从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南

从YOLOv5到RKNN&#xff1a;零冲突转换YOLOv5模型至RK3588 NPU全指南 在嵌入式AI领域&#xff0c;将训练好的深度学习模型高效部署到边缘设备的NPU&#xff08;神经网络处理器&#xff09;上是提升性能的关键。本文将详细介绍如何在Ubuntu 20.04环境下&#xff0c;将YOLOv5l模型…

DNS的解析过程是怎样的?它基于传输层的什么协议?

问题DNS的解析过程是怎样的&#xff1f;它基于传输层的什么协议&#xff1f;我的回答&#xff1a;DNS解析过程是将域名转换为IP地址的一系列步骤。这个过程涉及多级缓存和查询&#xff1a;首先是浏览器缓存&#xff0c;浏览器会先检查自己的DNS缓存是否有记录。接着是操作系统缓…

模拟互联网大厂Java面试:电商场景下的技术探讨

模拟互联网大厂Java面试&#xff1a;电商场景下的技术探讨 场景概述 在这场模拟面试中&#xff0c;我们设定了一位互联网大厂的面试官与候选人小C之间的对话。面试官严肃专业&#xff0c;而小C则是搞笑的“水货程序员”。通过三轮问答&#xff0c;我们探索了Java技术栈在电商场…

遥感机器学习入门实战教程|Sklearn案例⑤:集成学习方法全览

在机器学习的实际应用中&#xff0c;单一分类器往往存在局限&#xff1a;比如决策树容易过拟合&#xff0c;kNN 对噪声敏感&#xff0c;逻辑回归在高维数据下收敛慢。为了提升整体效果&#xff0c;我们通常会采用 集成学习&#xff08;Ensemble Learning&#xff09;。 这篇文章…

大模型在垂直场景中的创新应用:搜索、推荐、营销与客服的新玩法

1. 引言 背景介绍:简述大模型(如GPT、BERT等)的发展历程及其在AI领域的核心作用,强调其在垂直场景中的潜力。 主题聚焦:说明本文将深入探讨搜索、推荐、营销、客服四大场景,分析大模型带来的创新开发方式。 目的与意义:阐述新玩法如何提升效率、增强用户体验,并推动行业…

华为仓颉语言的class(类)初步

华为仓颉语言的class&#xff08;类&#xff09;初步 class 概念 【官方文档 https://cangjie-lang.cn/docs?url%2F1.0.0%2Fuser_manual%2Fsource_zh_cn%2Fclass_and_interface%2Fclass.html 】 class 是仓颉面向对象体系的核心&#xff0c;用来描述“引用类型”对象。与 s…