YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署

  • 一、下载源码
  • 二、准备自己的数据集
    • 2.1 标注图像
    • 2.2 数据集结构
  • 三、配置YOLOv5训练
    • 3.1 修改配置文件
    • 3.2 模型选择
  • 四、训练
  • 五、测试
  • 六、部署
    • 6.1 pt转onnx
    • 6.2 onnx转rknn
  • 七、常见错误
    • 7.1 训练过程中的错误
      • 7.1.1 cuda: out of memory
      • 7.1.2 train: No such file or directory train.cache
      • 7.1.3 Expected object of scalar type __int64 but got scalar type float for sequence element 1.
      • 7.1.4 __init__() got an unexpected keyword argument 'generator'
      • 7.1.5 module 'torch.cuda.amp' has no attribute 'autocast'
    • 7.2 部署过程中的错误
      • 7.2.1 检测框越界/检测框不准
      • 7.2.2 检测框非常多、非常小

一、下载源码

https://github.com/ultralytics/yolov5/releases

二、准备自己的数据集

2.1 标注图像

利用LabelImg标注:

https://github.com/HumanSignal/labelImg

2.2 数据集结构

按照如下结构放置标注好的数据:

/path/to/dataset/images/trainimage1.jpgimage2.jpg.../valimage1.jpgimage2.jpg.../labels/trainimage1.txtimage2.txt.../valimage1.txtimage2.txt...

三、配置YOLOv5训练

3.1 修改配置文件

data文件夹中创建一个新的.yaml配置文件,例如my_dataset.yaml

train: /path/to/dataset/images/train
val: /path/to/dataset/images/valnc: 2  # 类别数量
names: ['class1', 'class2']  # 类别名称

3.2 模型选择

models文件夹中选择一个适合你任务的模型配置文件(例如yolov5s.yaml),可以根据需要进行调整,例如修改nc参数以匹配你的类别数量。

四、训练

一切准备就绪后,可以开始训练模型。运行以下命令:

python train.py --img 640 --batch 16 --epochs 50 --data data/my_dataset.yaml --weights yolov5s.pt --device cuda:0

参数解释:

  • --img 640 指定训练时的图像尺寸为640x640。
  • --batch 16 指定每批次处理的图片数量为16。
  • --epochs 50 设置训练的轮数为50。
  • --data data/my_dataset.yaml 使用我们刚才配置的数据集文件。
  • --cfg models/yolov5s.yaml 使用YOLOv5s模型配置。
  • --weights yolov5s.pt 使用预训练权重。
  • --device 使用cuda还是cpu。

训练过程图:
在这里插入图片描述

五、测试

将best.pt和图像拷贝到detect.py同路径下,终端切换到该路径,输入:

python detect.py --weights best.pt --img 640 --source test2.jpg

按照终端显示的保存路径,查看效果。

在这里插入图片描述

六、部署

6.1 pt转onnx

将model/yolo.py的 Detect 类下的

def forward(self, x):z = []  # inference outputfor i in range(self.nl):if getattr(self, 'seg_seperate', False):c, s = self.m_replace[i](x[i])if getattr(self, 'export', False):z.append(c)z.append(s)continuebs, _, ny, nx = c.shapec = c.reshape(bs, self.na, -1, ny, nx)s = s.reshape(bs, self.na, -1, ny, nx)x[i] = torch.cat([c, s], 2).permute(0, 1, 3, 4, 2).contiguous()elif getattr(self, 'detect_seperate', False):z.append(torch.sigmoid(self.m[i](x[i])))continueelse:x[i] = self.m[i](x[i])  # convbs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()if not self.training:  # inferenceif self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)if isinstance(self, Segment):  # (boxes + masks)xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4)xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i]  # xywh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i]  # why = torch.cat((xy, wh, conf.sigmoid(), mask), 4)else:  # Detect (boxes only)xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4)xy = (xy * 2 + self.grid[i]) * self.stride[i]  # xywh = (wh * 2) ** 2 * self.anchor_grid[i]  # why = torch.cat((xy, wh, conf), 4)z.append(y.view(bs, self.na * nx * ny, self.no))if getattr(self, 'export', False):return zreturn x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)

修改为:

def forward(self, x):z = []for i in range(self.nl):x[i] = torch.sigmoid(self.m[i](x[i]))return x

将训练好的best.pt放在工程文件夹下,使用yolov5工程中的export.py将其转换为onnx模型。

python export.py --weights best.pt

生成onnx:

在这里插入图片描述

将生成的onnx文件导入netron(https://netron.app/)中,查看输出是否为3个分支。

在这里插入图片描述

若是3个分支,表示onnx生成成功。

6.2 onnx转rknn

文件结构

/path/bus.jpg/datasets.txt/yolov5_convert.py/best.onnx

datasets的内容:

./bus.jpg

下载转换的程序:
https://github.com/airockchip/rknn-toolkit2/blob/master/rknn-toolkit2/examples/onnx/yolov5/test.py

结合自己的文件路径与类别,修改test.py后运行,便可得到rknn文件。

七、常见错误

7.1 训练过程中的错误

7.1.1 cuda: out of memory

说明内存不足,修改batch的数量,由16改为8或者更小的数。

7.1.2 train: No such file or directory train.cache

方法 1:使用--cache选项强制缓存

python train.py --img 640 --batch 16 --epochs 50 --data data/my_dataset.yaml --weights yolov5s.pt --device cuda:0 --cache

这样,YOLOv5会在数据加载时创建train.cache文件。

方法 2:手动创建缓存

通过运行YOLOv5的dataloaders.py中的create_dataloader函数来创建缓存文件。

python utils/dataloaders.py --data my_dataset.yaml --cache

7.1.3 Expected object of scalar type __int64 but got scalar type float for sequence element 1.

错误位置:

matches = torch.cat((torch.stack(x, 1).long(), iou[x[0], x[1]][:, None]), 1).cpu().numpy()  # [label, detect, iou]

错误原因:索引应该为整型,而不是浮点型,应该利用.long()转成int_64。

修改:

matches = torch.cat((torch.stack(x, 1).long(), iou[x[0], x[1]].long()[:, None]), 1).cpu().numpy()

7.1.4 init() got an unexpected keyword argument ‘generator’

该属性是1.6版本新增加的,所以升级pytorch1.6及以上。

7.1.5 module ‘torch.cuda.amp’ has no attribute ‘autocast’

该属性是1.6版本新增加的,所以升级pytorch1.6及以上。

7.2 部署过程中的错误

7.2.1 检测框越界/检测框不准

在train.py中,noaotoanchor的默认为False,如果设定为True,则会使用默认的anchor设定。
所以,如果经过autoanchor,给出了新的anchor设定,那么在推理和转完rknn后的设定,都需要与之相匹配的anchor,而不是用默认的coco数据集的anchor。

默认的coco数据集anchor:
anchors = [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45],[59, 119], [116, 90], [156, 198], [373, 326]]

利用如下代码,查看自己数据集的anchor:

from models.experimental import attempt_loadmodel = attempt_load('best.pt')  # 加载权重路径
m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1]
print(m.anchor_grid)

在6.2小节的test.py:
yolov5_post_process函数中的anchors参数值,修改为自己数据集的anchors值。

7.2.2 检测框非常多、非常小

由于6.1小节中在修改forward方法时,为了避免置信度大于1,增加了sigmoid函数。所以在6.2小节中test.py的process方法里不应该再有sigmoid函数。不能两个方法都写sigmoid函数,要么forward方法里写sigmoid函数,要么process方法里写sigmoid函数。

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

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

相关文章

STM32 ST7735 128*160

ST7735 接口和 STM32 SPI 引脚连接 ST7735 引脚功能描述STM32 引脚连接(示例,使用 SPI1)SCLSPI 时钟信号 (SCK)PA0(SPI1_SCK)SDASPI 数据信号 (MOSI)PA1 (SPI1_MOSI)RST复位信号 (Reset)PA2(GPIO 手动控制)DC数据/命令选择 (D/C)PA3 (GPIO 手…

使用Redis缓解数据库压力+三种常见问题

目录 一.如何使用 Redis 缓存减缓数据库的压力 : 二.Redis缓存穿透: 布隆过滤器的工作原理: 三.缓存雪崩: 缓存雪崩的处理策略: 四.缓存击穿: 使用 Redis 缓存来减缓数据库的压力是一个常见的优化手段…

移动端VR处理器和传统显卡的不同

骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程,而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下(如移动端 XR 设备)实现高性能和低功耗的平衡。以下是具体的分析: 1. AI 驱动的渲染…

AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案

文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术日新月异的时代,图像生成模型已经成为了创意工作者和开发者手中…

WordPress果果对象存储插件

将网站上的图片等静态资源文件上传至七牛云对象存储,可以减轻服务器文件存储压力,提升静态文件访问速度,从而加速网站访问速度。 支持:阿里云对象存储、华为云对象存储、百度云对象存储、腾讯云对象存储、七牛云对象存储。 下载…

2025美赛倒计时,数学建模五类模型40+常用算法及算法手册汇总

数学建模美赛倒计时,对于第一次参加竞赛且没有相关基础知识的同学来讲,掌握数学建模常用经典的模型算法知识,并熟练使用相关软件进行建模是关键。本文将介绍一些常用的模型算法,以及软件操作教程。 数学建模常用模型包括&#xf…

Maven的下载安装配置

maven的下载安装配置 maven是什么 Maven 是一个用于 Java 平台的 自动化构建工具,由 Apache 组织提供。它不仅可以用作包管理,还支持项目的开发、打包、测试及部署等一系列行为 Maven的核心功能 项目构建生命周期管理:Maven定义了项目构建…

2000-2010年各省第三产业就业人数数据

2000-2010年各省第三产业就业人数数据 1、时间:2000-2010年 2、来源:统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、第三产业就业人员数(万人) 4、范围:31省 5、指标解释:第三产业…

【系统环境丢失恢复】如何恢复和重建 Ubuntu 中的 .bashrc 文件

r如果你遇到这种情况,说明系统环境的.bashrc 文件丢失恢复: 要恢复 ~/.bashrc 文件,可以按照以下几种方式操作: 恢复默认的 ~/.bashrc 文件 如果 ~/.bashrc 文件被删除或修改,你可以恢复到默认的版本。可以参考以下…

Docker网段和服务器ip冲突导致无法访问网络的解决方法

若宿主机所在网络的网段为172.[17-31].xx.xx,则会与Docker本身内部网络间出现冲突,此时需要重新配置Docker默认地址池 一:查看docker的默认网段 route 二:修改docker的默认网段 etc/docker/daemon.json文件增加修改网段信息 {…

2.2.1 语句结构

ST(Structured Text)语言是一种基于IEC 61131-3标准的高级文本编程语言,其语法规则严格且清晰。以下是ST语言中关于分号、注释和代码块的详细语法规则说明: 分号(;) 作用:分号用于表示语句的结…

音频入门(二):音频数据增强

本文介绍了一些常见的音频数据增强方法,并给出了代码实现。 目录 一、简介 二、代码 1. 安装必要的库 2. 代码 3. 各函数的介绍 4. 使用方法 参考: 一、简介 音频数据增强是机器学习和深度学习领域中用于改善模型性能和泛化能力的技术。 使用数据…

网络(一)

目录 1. 网络基础(一); 2. 网络套接字; 3. TCP实现; 1. 网络基础(一) 1.1 网络发展: 从一个个计算器都是独立的, 到计算机连接起来进行数据共享, 后期计算机数量很多通过交换器和路由器进行传输(局域网). 广域网就是世界各个计算器进行数据共享, 也是由一个个局域网组成. 1…

风光并网对电网电能质量影响的matlab/simulink仿真建模

这个课题早在一几年的时候比较热门,之前作电科院配电网的一个项目中也有所涉及,我把其中一部分经典仿真模型思路分享给大家,电能质量影响这部分,我在模型中主要体现的就是不同容量的光伏、风电接入,对并网点的电压影响…

【深度学习入门】深度学习知识点总结

一、卷积 (1)什么是卷积 定义:特征图的局部与卷积核做内积的操作。 作用:① 广泛应用于图像处理领域。卷积操作可以提取图片中的特征,低层的卷积层提取局部特征,如:边缘、线条、角。 ② 高层…

MySQL(4)多表查询

引言:为什么需要多表的查询? A:提高效率,多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询: SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…

PIC单片机HEX文件格式分析

在调试PIC单片机在bootloader程序时,需要将hex文件转换为bin文件,在转换之前先了解一下hex文件中数据是如何定义的。 直接打开一个LED灯闪烁的程序生成的hex文件,芯片型号为PIC18F46K80 可以看到每条数据都是由6部分组成的,下面分…

CANoe Trace窗口

文章目录 一、Trace窗口简介二、Trace窗口打开三、Trace窗口菜单栏介绍1. Detail View2. Statistic View3. Difference view4. Predefined filter5. Analysis filter6. Toggle time mode7. Toggle display mode8. Change font size 四、Trabe窗口配置1. 打开 Trace配置窗口2. 增…

c#配置config文件

1,引用命名空间 Configuration 及配置信息

idea新增java快捷键代码片段

最近在写一些算法题&#xff0c;有很多的List<List这种编写&#xff0c;想着能否自定义一下快捷键 直接在写代码输入&#xff1a;lli&#xff0c;即可看见提示