Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决

本文主要讲述了Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决,案例是检测图片中是否有救生圈。 最后的效果图大致如下:

效果图1效果图2

life_buoy.jpg

0.jpg

前言

系列文章

1、详细讲述Yolov5从下载、配置及如何使用GPU运行

2、Labelimg标注自己的数据集,及如何划分训练集和验证集,应用于Yolov5

上一篇文章中,已经介绍了该如何标注自己的数据集,以及该如何给他们分类,接下来的话,就是根据我们已经标注好的数据集来进行训练啦。

将我们之前划分好的数据集放入项目中

image.png

补充:通过文件夹将数据集复制放进去的,pycharm可以索引的更快,不然会卡很久。

一、修改配置文件

我们需要指定数据集的位置,首先就是要修改 coco128.yaml 配置文件

1.1、修改 coco128.yaml 配置文件

我们复制data 文件夹下 coco128.yaml 配置文件,并重命名为 blog_demo.yaml

image.png

1.2、修改 yolov5s.yaml 配置文件

我们复制 models 文件夹下 yolov5s.yaml 配置文件,并重命名为 yolov5s_blog.yaml

image.png

参数的细节可能需要各位朋友自己去了解啦,我这里只是将类别数目修改成和data/blog_demo.yaml文件对应。

二、了解 train.py 参数

此处暂时不做深究,我们当前的任务是跑通整个代码。

主要是了解截图里面部分参数,这主要是因为训练的时候,不同的机器硬件参数不同,能做的事情也不同,所以相应需要调整,尽可能的把性能发挥到极致。

image.png

  1. weigths: 指的是训练好的网络模型,用来初始化网络权重
  2. cfg:为configuration的缩写,指的是网络结构,一般对应models文件夹下的xxx.yaml文件
  3. data:训练数据路径,一般为data文件夹下的xxx.yaml文件
  4. hyp: 训练网络的一些超参数设置,(一般用不到)
  5. epochs:设置训练的轮数(自己电脑上一般建议先小一点,测试一下,看跑一轮要多久)
  6. batch-size:每次输出给神经网络的图片数,(需要根据自己电脑性能进行调整)
  7. img-size:用于分别设置训练集和测试集的大小。两个数字前者为训练集大小,后者为测试集大小
  8. rect: 是否采用矩形训练
  9. resume: 指定之前训练的网络模型,并继续训练这个模型
  10. nosave: 只保留最后一次的网络模型
  11. notest:只在最后一次进行测试
  12. noautoanchor:是否采用锚点
  13. evolve:是否寻找最优参数
  14. bucket:这个参数是 yolov5 作者将一些东西放在谷歌云盘,可以进行下载
  15. cache-images:是否对图片进行缓存,可以加快训练
  16. image-weights:测试过程中,图像的那些测试地方不太好,对这些不太好的地方加权重
  17. device:训练网络的设备cpu还是gpu
  18. multi-scale:训练过程中对图片进行尺度变换
  19. single-cls:训练数据集是单类别还是多类别
  20. adam:是否采用adam
  21. sync-bn:生效后进行多 GPU 进行分布式训练
  22. local_rank:DistributedDataParallel 单机多卡训练,一般不改动
  23. workers: 多线程训练
  24. project:训练结果保存路径
  25. name: 训练结果保存文件名
  26. exist-ok: 覆盖掉上一次的结果,不新建训练结果文件
  27. quad:在dataloader时采用什么样的方式读取我们的数据
  28. linear-lr:用于对学习速率进行调整,默认为 false,含义是通过余弦函数来降低学习率,生效后按照线性的方式去调整学习率
  29. save_period:用于记录训练日志信息,int 型,默认为 -1
  30. label-smoothing: 对标签进行平滑处理,防止过拟合
  31. freeze:冻结哪些层,不去更新训练这几层的参数
  32. save-period:训练多少次保存一次网络模型

注意:参数含default的为默认值,可以直接在文件进行修改,那么运行时直接python train.py也可;直接在命令行指定也可以。

含action的一般为'store_true',使用该参数则需要在命令行指定。

三、训练数据集

可以使用命令行,也可以修改train.py代码,我为了方便测试,就直接使用命令行啦

 

bash

复制代码

python train.py --weights weights/yolov5s.pt --cfg models/yolov5s_blog.yaml --data data/blog_demo.yaml --epochs 100 --batch-size 16 --multi-scale --device 0

接下来就是我的报错踩坑过程啦。

3.1、报错1:AttributeError: module 'numpy' has no attribute 'int'.

错误如下图,这个很好解决,主要是由于 numpy 的版本引起的。我们换个版本即可。

image.png

yolo官方 requirements.txt 指定的 numpy 版本≥1.18.5,当你执行pip install -r requirements.txt命令时,他默认安装为1.24,但是再numpy版本更新时numpy.int在NumPy 1.20中已弃用,在NumPy 1.24中已删除。下面给2个解决方案:

1、重新安装numpy

pip uninstall numpy pip install numpy==1.22 -i <https://pypi.tuna.tsinghua.edu.cn/simple

image.png

2、修改当前项目模块中的 numpy 的源码

找到报错地方,将numpy.int更改为numpy.int_

我采取的方式是重新安装 numpy ,咋简单咋来。

接着重新尝试,还有坑….

3.2、报错2:OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "E:\environment\anaconda\envs\yolov5_6.1_demo_py3.8\lib\site-packages\torch\lib\nvfuser_codegen.dll" or one of its dependencies.

image.png

解决方案:

1、最简单的,关闭吃内存的软件,或者把pycharm重启试试看,不能行继续往下看。

2、调整虚拟内存啦

打开系统高级设置

image.png

image.png

还有可能你调整了这个虚拟内存大小,仍然会报这个错误,那就接着看第三个解决方案。

3、在命令行中设置 -workers=0 ,这个是设置多线程的参数,在个人机器上,这个参数到底设置多少,一般和 --batch-size 8 相挂钩,如果batch-size设置的小,workers可以试着调大一点,2,4等等,一步一步的测试,一步一步的调整,看看有没有到训练瓶颈。也可以调大 batch-size 到16、32,当然具体的参数大小还是需要自己测试。

如果在命令行种设置 --workers=0 仍然运行失败,修改 [datasets.py](<http://datasets.py>) 文件的第119行,直接改成

num_workers=0一般来说,改了这里,大概率是没问题啦。

image.png

再推荐一篇文章,pytorch中DataLoader的num_workers参数详解与设置大小建议

要是还不行的话,我的建议是直接 加钱,换电脑,哈哈哈哈


踩到这里,要是还有的话,建议评论一下,贴一下错误,复述一下步骤,我看看你还有踩到了啥。

因为版本的坑,自我感觉踩的挺深的,去掉版本问题,才只有两个报错信息。

 

bash

复制代码

### 3.3、raise RuntimeError('DataLoader worker (pid(s) {}) exited unexpectedly'.format(pids\_str)) from e raise RuntimeError('DataLoader worker (pid(s) {}) exited unexpectedly'.format(pids_str)) from e RuntimeError: DataLoader worker (pid(s) 64752) exited unexpectedly

这个也是我在我其中一个虚拟环境种爆出来的问题,我真的麻啦。

解决方法还是一样的,修改 datasets.py 的文件种的第119行,将num_workers直接设置为0。

3.4、开始使用自己的数据集训练

改完上面的错误,我们的训练终于开始啦。

 

bash

复制代码

python train.py --weights weights/yolov5s.pt --cfg models/yolov5s_blog.yaml --data data/blog_demo.yaml --epochs 100 --batch-size 8 --multi-scale --device 0

后面的参数啥的,完全可以根据自己电脑的性能来进行设置,就比如这个--batch-size 8 ,你要是显存大,完全可以改成 16、32、64等等。

image.png

训练完成后,会出现run/train文件夹下出现一个expn的文件夹,看最新的那个就是最近一次训练的结果。

image.png

weights 文件夹下就是通过训练出来的权重文件,best.pt 是最好的,last.pt 是最后一次。

我们可以拿去测一下,看看效果(我这种十几张数据的,十轮训练,坦白说后面都不一定检测的出来)

3.5、测试训练出来的权重效果

best.pt 文件复制到weights 文件夹下,然后我在网上再随便找了一张不是我们数据集的救生圈图片放到了根目录下,执行下面命令进行测试

 

bash

复制代码

python detect.py --weights weights/best.pt --source life_buoy.jpg

写到这个地方的时候,有点糟糕,数据量太小,然后训练轮数,太少,导致这十轮训练出来的数据,直接就没效果,然后我重新了标注了100来张照片,重新训练了100轮,重新训练了一个 best.pt 文件。(没有数据量真没法玩,比较难受) 效果大致为以下这样:

image.png

后面的内容主要是补充了一下可能会遇到的错误,以及笔者个人的一些自言自语。

如果给了你帮助的话,记得给作者点个赞,评论一下,分享一下属于你的成功的喜悦,让写这篇文章的我,也与你一起快乐一下吧。

3.6、另外可能会遇到的报错

报错1:AttributeError: 'FreeTypeFont' object has no attribute 'getsize’

pip uninstall pillow

pip install Pillow==9.5 -i <https://pypi.tuna.tsinghua.edu.cn/simple>

pip show Pillow 查看依赖包版本

报错2:OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

我之前确实遇到了,后面专门写这个项目的时候,又没让我遇上了,应该还是版本问题,但是也先贴出来吧。

image.png

在pycharm里调试程序时可以直接通过在程序前添加这两个语句解决

 

bash

复制代码

import os os.environ['KMP_DUPLICATE_LIB_OK']='TRUE

四、补充:关于yolov5训练时参数workers和batch-size的理解

后面我自己在又一次训练时,又开始好奇 num_workers 和 batch-size 这两者的关系啦,细细的拜读了几位博主的博客,后在下面的这篇文章中找到了一些比较好的理解,大家可以阅读一下。

本小章节内容主要来自于: 关于yolov5训练时参数workers和batch-size的理理解 -作者:flamebox

如何让训练达到我们电脑的瓶颈,只能是一步一步的测试,然后去调整相关的参数。

最后

这个系列主要是想给自己一个记录,写在文档里也是写,发布博客也是写,前面几篇比较容易,后面会慢慢加深的。慢慢来吧。

越是容易写的文章,写起来越是麻烦。对版本问题真的很无赖,只能选择低版本的或者去踩坑。

 

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

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

相关文章

数据结构大作业 成绩分析c语言程序设计

界面加载 界面展示 成绩输入 求平均成绩 升序排列 降序排列 名字排序 按名字搜索 按ID搜索 每门课成绩分析 成绩单展示 -

Mac 手动安装 sshpass

1. 下载安装包 https://sourceforge.net/projects/sshpass/ 解压并进入到安装包目录 tar -zxvf sshpass-xx.xx.tar.gz cd sshpass-xx.xx2. 检验环境&#xff0c;编译源码安装 ./configuremake&&make install3. 检测安装是否成功 ▶ sshpass Usage: sshpass [-f|-…

2023/9/8 -- C++/QT

作业 1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 02stack.h: #ifndef __02STACK_H__ #define __…

网络协议从入门到底层原理学习(三)—— 路由

网络协议从入门到底层原理学习&#xff08;三&#xff09;—— 路由 1、简介 路由&#xff08;routing&#xff09;是指分组从源到目的地时&#xff0c;决定端到端路径的网络范围的进程 在不同网段之间转发数据&#xff0c;需要有路由器的支持 默认情况下&#xff0c;路由器…

linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步 数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态&#xff08;挂起&#xff09; 非阻塞 - 不会改变线程的状态&#xff0c;通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 …

[VSCode] 替换掉/去掉空行

VSCode中使用快捷键CtrlH&#xff0c;出现替换功能&#xff0c;在上面的“查找”框中输入正则表达式&#xff1a; ^\s*(?\r?$)\n然后选择右侧的“使用正则表达式”&#xff1b;“替换”框内为空&#xff0c;点击右侧的“全部替换”&#xff0c;即可去除所有空行。 参考 [VS…

MySQL 连接出现 Authentication plugin ‘caching_sha2_password‘ cannot be loaded

在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin caching_sha2_password cannot be loaded 出错 出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法&#xff1a;把my…

Linux内核分析与应用2-内存寻址

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 2.1 内存寻址 数据连续存储和选择读取思想,是目前我们使用的几乎所有机器运行背后的灵魂 计算机体系结构中的核心问题之一,就是如…

AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 外围简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度保护点为…

力扣(LeetCode)算法_C++——稀疏矩阵的乘法

给定两个 稀疏矩阵 &#xff1a;大小为 m x k 的稀疏矩阵 mat1 和大小为 k x n 的稀疏矩阵 mat2 &#xff0c;返回 mat1 x mat2 的结果。你可以假设乘法总是可能的。 示例 1&#xff1a; 输入&#xff1a;mat1 [[1,0,0],[-1,0,3]], mat2 [[7,0,0],[0,0,0],[0,0,1]] 输出&am…

mysql 增量备份与恢复使用详解

目录 一、前言 二、数据备份策略 2.1 全备 2.2 增量备份 2.3 差异备份 三、mysql 增量备份概述 3.1 增量备份实现原理 3.1.1 基于日志的增量备份 3.1.2 基于时间戳的增量备份 3.2 增量备份常用实现方式 3.2.1 基于mysqldump增量备份 3.2.2 基于第三方备份工具进行增…

Vue中表单手机号验证与手机号归属地查询

下面是一篇关于Vue中如何进行表单手机号验证与手机号归属地查询的Markdown格式的文章&#xff0c;包含代码示例。 Vue中表单手机号验证与手机号归属地查询 手机号验证和归属地查询是许多Web应用程序中常见的功能之一。在Vue.js中&#xff0c;我们可以轻松地实现这两个功能。本…

如何使用Web Storage对页面中数据进行监听?

当使用Web Storage存储的数据发生变化时&#xff0c;会触发Window对象的storage事件&#xff0c;我们可以监听该事件并指定事件处理函数&#xff0c;当其他页面中的localStorage或 sessionStorage中保存的数据发生改变时&#xff0c;就会执行事件处理函数。 监听storage事件的…

SpotBugs(是FindBugs的继任者)安装、使用

SpotBugs介绍 SpotBugs和FindBugs的关系 SpotBugs是FindBugs的继任者&#xff0c;从SpotBugs停止的地方继续。 备注&#xff1a;FindBugs项目已经停止了&#xff0c;从2015年发布3.0.1版本以后再没有新的版本。 SpotBugs通过静态分析寻找java代码中的bug&#xff0c;通过发现…

JavaScript 运行时比较: Node.js、 Deno 和 Bun

文章目录 为什么选择正确的 JavaScript 运行时很重要介绍 JavaScript 运行时Node.jsDenoBun 比较 JavaScript 运行时性能社区稳定性安全附加功能 小结 JavaScript 运行时可帮助您构建高级的、服务器驱动的 JavaScript 项目&#xff0c;这些项目不依赖于用户的浏览器来运行。 有…

Linux 安装配置使用 FTP 服务

学习场景&#xff1a;使用摄像机做区域报警&#xff0c;预警后将预警图片传输到 FTP 服务上&#xff0c;所以搭一个环境测试一下&#xff0c;这里我使用的是树莓派 4B&#xff0c;官方 32 位系统&#xff0c;其他 Linux 系统应该通用 下面说两个 FTP 应用 一、vsftpd vsftpd 是…

基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题(附完整源码下载)

背包问题算法设计 问题要求在一个物品集合中选择合适的物品放入背包&#xff0c;在放入背包中的物品总重量不超过背包容量的前提下&#xff0c;希望放入背包的物品总价值最大。根据是否允许部分物品放入背包的要求&#xff0c;背包问题可以分为【分数背包问题】和【0-1背包问题…

形态图像处理

形态图像处理 预备知识 反射、平移结构元 腐蚀和膨胀 腐蚀 将 B 平移&#xff0c;当其原点位于 z 时&#xff0c;其包含在 A 中&#xff0c;则 z 为一个有效的位置&#xff0c;所有有效的z构成了腐蚀之后的结果腐蚀缩小或细化了二值图像中的物体可以将腐蚀看作形态学滤波操…

Solidity 小白教程:12. 事件

Solidity 小白教程&#xff1a;12. 事件 这一讲&#xff0c;我们用转账 ERC20 代币为例来介绍solidity中的事件&#xff08;event&#xff09;。 事件 Solidity中的事件&#xff08;event&#xff09;是EVM上日志的抽象&#xff0c;它具有两个特点&#xff1a; 响应&#x…

探索云计算和大数据分析的崛起:API行业的机遇与挑战【电商大数据与电商API接入】

I. 引言 随着云计算和大数据分析技术的快速发展&#xff0c;企业和个人对数据分析和处理的需求不断增加。在这个信息爆炸的时代&#xff0c;数据已成为企业决策和战略规划的重要基础。云计算提供了强大的计算和存储能力&#xff0c;使得大规模数据的处理和分析变得更加容易和高…