训练自己的yolo模型,并部署到rk3588上

news2025/7/19 14:26:16

文章目录

      • 1. 训练自己的模型
      • 2. pt转onnx
      • 3. onnx转rknn
      • 4. 后续……

1. 训练自己的模型

如何训练自己的yolo模型,网络上已经有足够多的教程,这里只简单的描述一下。如果已经有了自己的.pt模型,那么可以直接跳转到第二节。

此处是以检测模型的训练为示例进行说明,其他的比如分割、姿态的模型搜索一下教程即可,一通百通。

(如何安装cuda,以及安装pytorch,这里不再进行说明,请参考网络上的教程)

假设现在你已经使用conda创建了一个deep的环境,并在其中已经安装了pytorch,然后现在在某一目录下,进行下述的操作。

首先拉取ultralytics的代码:

git clone https://github.com/ultralytics/ultralytics.git

然后进入到目录中,进行操作:

cd ultralytics
pip install -e .  # 这里是自动安装ultrlytics的依赖

如果上述pip安装过于缓慢,可以考虑换源,这里以Linux为例,其他的需要搜索解决一下。

vim ~/.config/pip/pip.conf

然后将其中的内容更换为:

[global]
index-url = https://repo.huaweicloud.com/repository/pypi/simple/

[install]
trusted-host = repo.huaweicloud.com/repository/pypi

这样ultralytics就准备完成了。

然后在一个目录下专门存放你的数据集,比如在~/datasets下,并且你的数据集文件夹假设为mydatasets,然后有对应的imageslabels子目录,有如下的目录结构:

└── mydatasets
    ├── images
    │   ├── test
    │   ├── train
    │   └── val
    └── labels
        ├── test
        ├── train
        └── val

然后我们在刚才git下载的目录下进行操作:

进入到ultralytics/ultralytics/cfg/datasets下,创建一个新的data_my.yaml文件:

path: /home/xxx/datasets/mydatasets  # 刚刚放数据集的目录
train: images/train  # 训练图片地址,是对于path的相对地址
val: images/val  # 验证图片地址,是对于path的相对地址
test: images/test # 测试图片地址,是对于path的相对地址(这个可选,如果只是训练,这个路径可以为空)

nc: 2 # 这个是类别的数量,根据自己的数据集进行处理!
names:
  0: person
  1: bicycle

上面的names这一项,写法也有其他的形式,比如:

names: ['person', 'bicycle']

使用哪种方式,看你的喜好。

然后我们从git上下载预训练模型(多数时候建议使用预训练模型),访问git地址,然后在下面看到这些进行下载:

在这里插入图片描述

直接点击Model下方的蓝色字体即可下载。假设下载了s模型,然后将其放到目录中,那么可以得到如下的目录结构:

├── CITATION.cff
├── CONTRIBUTING.md
├── docker
├── docs
├── examples
├── LICENSE
├── mkdocs.yml
├── pyproject.toml
├── README.md
├── README.zh-CN.md
├── tests
├── ultralytics
└── yolo11s.pt     # 这就是刚刚下载的预训练模型

在上述的预训练模型的同级目录下新建一个文件train_my.py,然后有如下的内容:

# 加载预训练模型
from ultralytics import YOLO

# 加载预训练模型
model = YOLO("yolo11s.pt")  # 使用YOLOv8 Nano版本作为起点

# 训练模型
results = model.train(data="data_my.yaml",  # 使用自定义数据集进行训练
                      epochs=500,  # 训练500个周期
                      imgsz=640,  # 调整图像大小
                      batch=16,  # 减少批次大小
                      )  

然后在py文件的目录下打开终端,切换环境,就可以开始训练了。

conda activate deep
python ./train_my.py

然后就可以在runs/detect下面找到对应的训练结果,得到权重的文件夹,然后有best.pt文件了。

2. pt转onnx

得到了我们想要的best.pt文件,我们就需要将其转换为best.onnx文件,但是需要使用rk的官方代码来进行转换,否则将导致模型的裁剪不正确的问题。

在合适的目录下,打开终端,拉取rk的转换代码:

git clone https://github.com/airockchip/ultralytics_yolo11.git

注意看到这个比之前的仓库名字多了_yolo11字样。

进入到ultralytics_yolo11目录之后,我们新建一个models的文件夹(这里只是为了方便,没有要求),然后将我们的best.pt拷贝进来。大致的结构如下:

├── LICENSE
├── mkdocs.yml
├── models
│   └── best.pt # 这里就是我们的模型
├── pyproject.toml
├── README.md

将我们自己数据集的yaml文件(对应第一节的data_my.yaml)拷贝到目录: /home/xxx/rknn/ultralytics_yolo11/ultralytics/cfg/datasets

这里就是示意的一个目录,具体参考自己的目录。

然后我们修改/home/xxx/rknn/ultralytics_yolo11/ultralytics/cfg/default.yaml文件:

在这里插入图片描述

将这里的两个路径对应修改。

然后回到ultralytics_yolo11的目录下,打开终端,运行如下的命令:

conda activate deep
export PYTHONPATH=./
python ./ultralytics/engine/exporter.py

然后就可以在models目录下得到best.onnx文件了。

如果运行报错没有onnx模块,使用命令安装:

pip install onnx

另外,可以验证一下onnx模型是否转换正确,可以打开netron,然后导入这个onnx模型,然后点击images,需要出现类似这样的output才是正确的!

在这里插入图片描述

3. onnx转rknn

得到上述的best.onnx文件之后,我们需要进行转换为合适的rknn模型。

准备一个rknn的环境:

这里需要参考rknn官方文档,具体看其中的2.1.2.3 创建RKNN-Toolkit2 Conda环境2.1.2.4 安装 RKNN-Toolkit2即可,这里直接给出创建方式:

conda create -n rknn python=3.8
conda activate rknn
pip install rknn-toolkit2

在合适的目录下拉取代码:

git clone https://github.com/airockchip/rknn_model_zoo.git

然后我们将刚才的best.onnx文件的绝对路径记住,我们进入到rknn_model_zoo目录下,然后修改rknn_model_zoo/examples/yolo11/python/yolo11.py文件的内容:

在这里插入图片描述

然后在这个yolo11.py目录下直接打开终端进行处理:

conda activate rknn
python convert.py /home/xxx/rknn/ultralytics_yolo11/models/best.onnx rk3588 i8 /home/xxx/rknn/ultralytics_yolo11/models/best.rknn

这样就能在刚刚的models文件夹下看到best.rknn文件了,这个就可以在rk3588上进行使用了。

4. 后续……

后续会考虑将rknn官方的运行模型的代码进行优化整理,提高识别的帧率、优化前后处理的代码等等……

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

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

相关文章

以少学习:通过无标签数据从大型语言模型进行知识蒸馏

Learning with Less: Knowledge Distillation from Large Language Models via Unlabeled Data 发表:NNACL-Findings 2025 机构:密歇根州立大学 Abstract 在实际的自然语言处理(NLP)应用中,大型语言模型&#xff08…

Qt qml Network error问题

最近在学习Qt&#xff0c;需要调用地图&#xff0c;所以用到了QML&#xff0c;但是却遇到了这样的问题 d://qt_project//run//main.qml: Network error 现在我展示一下我的main文件的代码&#xff1a; #include <QApplication> #include <QQuickView> #include &l…

Spring Boot微服务架构(六):伪装的微服务有哪些问题?

伪装的微服务有哪些问题&#xff1f; 伪装的微服务架构&#xff08;即表面上模仿微服务设计&#xff0c;但未真正遵循其核心原则的系统&#xff09;通常具备以下特征点&#xff0c;这些特征可能导致系统复杂度增加、维护困难或性能下降&#xff1a; ​​1. 服务间强耦合​​ …

恶意npm与VS Code包窃取数据及加密货币资产

60个npm包窃取系统敏感信息 安全研究人员在npm软件包注册表中发现60个恶意组件&#xff0c;这些组件能够收集主机名、IP地址、DNS服务器和用户目录信息&#xff0c;并将其发送至Discord平台控制的终端节点。据Socket安全研究员Kirill Boychenko上周发布的报告显示&#xff0c;…

什么是3D全景视角?3D全景有什么魅力?

什么是3D全景视角&#xff1f;3D全景视角的全面解析。 3D全景视角&#xff0c;又称为3D全景技术或3D实景技术&#xff0c;是新兴的富媒体技术&#xff0c;基于静态图像和虚拟现实&#xff08;VR&#xff09;技术&#xff0c;通过全方位、无死角地捕捉和展示环境&#xff0c;为…

【Mini-F5265-OB开发板试用测评】按键控制测试

本文介绍了如何使用按键控制 MCU 引脚的输出电平。 原理 由原理图可知 板载用户按键 K1 和 K2 分别与主控的 PB0 和 PB1 相连。 代码 #define _MAIN_C_#include "platform.h" #include "gpio_key_input.h" #include "main.h"int main(void) …

每日Prompt:古花卷

提示词 主体对象 一本展开的古画卷 古画卷内呈现的内容 一片微型春秋鲁国&#xff0c;有古代马车&#xff0c;孔子乘坐周游列国&#xff0c;颜回、子路、子贡、曾参紧随其后 古画卷的外观状态 表面已经开裂和风化&#xff0c;呈现出年代感和历史感 与文字描述的首句一致&…

夏季用电高峰如何防患于未“燃”?电力测温技术守护城市生命线

随着夏季来临用电负荷激增&#xff0c;电力系统面临严峻的高温考验&#xff0c;电力测温技术的重要性愈发凸显&#xff0c;电力安全是城市生命线工程的核心环节&#xff0c;电力测温已从"可选功能"升级为"必要的基础安全设施"。通过实时感知、智能分析和快…

【创造型模式】抽象工厂方法模式

文章目录 抽象工厂方法模式产品族与产品等级结构抽象工厂方法模式的角色和职责抽象工厂方法模式的实现抽象工厂方法模式的优缺点适用场景 抽象工厂方法模式 工厂方法模式引入了“工厂等级结构”&#xff0c;解决了简单工厂方法过分依赖单一工厂的问题。但是工厂方法模式存在的一…

一台手机怎样实现多IP上网?方法有多种

在数字时代&#xff0c;多IP上网已成为许多手机用户的刚需。本文将详细介绍如何通过不同技术手段实现手机多IP上网&#xff0c;帮助读者根据实际需求选择适合的解决方案。 一、为什么一台手机要实现多IP上网 手机实现多IP上网的典型场景包括&#xff1a; ①防止同一IP操作多个…

Linux 527 重定向 2>1 rsync定时同步(未完)

rsync定时同步 配环境 关闭防火墙、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 设置主机名 systemctl set-hostname code systemctl set-hostname backup 配静态ip rsync 需要稳定的路由表和端…

3DVR拍摄指南:从理论到实践

3DVR拍摄指南&#xff1a;从理论到实践 3D虚拟现实&#xff08;Virtual Reality,简称VR&#xff09;作为近年来迅速崛起的高新技术&#xff0c;通过电脑模拟产生一个三维空间的虚拟世界&#xff0c;为使用者提供视觉、听觉乃至触觉的全方位感官模拟&#xff0c;使用户仿佛身临…

leetcode hot100刷题日记——21.不同路径

和20题一样的思路link 题解&#xff1a; class Solution { public:int dfs(int i,int j,vector<vector<int>>&memo){//超过了边界&#xff0c;return 0if(i<0||j<0){return 0;}//从&#xff08;0&#xff0c;0&#xff09;到&#xff08;0&#xff0c;0…

通过JS模板引擎实现动态模块组件(Vite+JS+Handlebars)

1. 引言 在上一篇文章《实现一个前端动态模块组件(Vite原生JS)》中&#xff0c;笔者通过原生的JavaScript实现了一个动态的模块组件。但是这个实现并不完善&#xff0c;最大的问题就是功能逻辑并没有完全分开。比如模块的HTML&#xff1a; <div class"category-secti…

fvm install 下载超时 过慢 fvm常用命令、flutter常用命令

Git 配置问题 确保 Git 使用的是 HTTPS&#xff0c;而不是 SSH。如果你有 .gitconfig&#xff0c;确保没有配置奇怪的代理&#xff1a; git config --global --get http.proxy git config --global --get https.proxy如果有代理设置且不需要&#xff0c;取消代理&#xff1a;…

Python正则表达式:30秒精通文本处理

一、概述 1. 含义 正则表达式是一种记录文本规则的代码工具&#xff0c;用于描述字符串的结构和模式。它广泛应用于字符串的匹配、查找、替换、提取等操作。 2. 特点 语法复杂&#xff1a;符号多、规则灵活&#xff0c;可读性较差。功能强大&#xff1a;可以精确控制字符串…

Introduction to SQL

目录 SQL特点 ​编辑 Select-From-Where Statements Meaning of Single-Relation Query Operational Semantics * In SELECT clauses Complex Conditions in WHERE Clause PATTERNS NULL Values Three-Valued Logic Multirelation Queries Aggregations NULL’s Ig…

计算机视觉---YOLOv3

YOLOv3讲解 一、YOLOv3 核心架构与创新 YOLOv3&#xff08;2018年发布&#xff09;在YOLOv2基础上进行了全面升级&#xff0c;通过多尺度预测、更强大的骨干网络和优化的分类损失函数&#xff0c;显著提升了检测精度&#xff0c;尤其是小目标检测能力&#xff0c;同时保持了实…

#RabbitMQ# 消息队列进阶

目录 消息可靠性 一 生产者的可靠性 1 生产者的重连 2 生产者的确认 (1 Confirm* (2 Return 二 MQ的可靠性 1 数据持久化 2 Lazy Queue* 三 消费者的可靠性 1 消费者确认机制 2 消费失败处理 3 业务幂等性 四 延迟消息 消息可靠性 在消息队列中&#xff0c;可靠性…

【深度学习】损失“三位一体”——从 Fisher 的最大似然到 Shannon 的交叉熵再到 KL 散度,并走进 PET·P-Tuning微调·知识蒸馏的实战

一页速览&#xff1a; 1912 Fisher 用最大似然把「让数据出现概率最高」变成参数学习&#xff1b; 1948 Shannon 把交叉熵解释成「最短平均编码长度」&#xff1b; 1951 Kullback-Leibler 用相对熵量化「多余信息」。 三条历史线落到今天深度学习同一个损失——交叉熵。 也…