当前位置: 首页 > news >正文

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

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

最后

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

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

 

相关文章:

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

本文主要讲述了Yolov5如何训练自定义的数据集&#xff0c;以及使用GPU训练&#xff0c;涵盖报错解决&#xff0c;案例是检测图片中是否有救生圈。 最后的效果图大致如下&#xff1a; 效果图1效果图2 前言 系列文章 1、详细讲述Yolov5从下载、配置及如何使用GPU运行 2、…...

设计模式之单列模式

单列模式是一种经典的设计模式&#xff0c;在校招中最乐意考的设计模式之一~ 设计模式就是软件开发中的棋谱&#xff0c;大佬们针对一些常见的场景&#xff0c;总结出来的代码的编写套路&#xff0c;按照套路来写&#xff0c;不说你写的多好&#xff0c;至少不会太差~ 在校招中…...

linux内核模块编译方法详解

文章目录 前言一、静态加载法1.1 编写驱动程序1.2 将新功能配置在内核中1.3为新功能代码改写Makefile1.4 make menuconfig界面里将新功能对应的那项选择为<*> 二、动态加载法2.1 新功能源码与Linux内核源码在同一目录结构下2.2 新功能源码与Linux内核源码不在同一目录结构…...

简介shell的关联数组与普通数组

本文首先介绍shell的关联数组&#xff0c;然后介绍shell的普通数组&#xff0c;最后总结它们的共同语法。 shell的关联数组 定义一个关联数组&#xff0c;并打印它的key-value对 #!/bin/sh# 声明一个关联数组 declare -A HASH_MAP# 给关联数组赋值 HASH_MAP["Tom"…...

玩转Mysql系列 - 第17篇:存储过程自定义函数详解

这是Mysql系列第17篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 代码中被[]包含的表示可选&#xff0c;|符号分开的表示可选其一。 需求背景介绍 线上程序有时候出现问题导致数据错误的时候&#xff0c;如果比较紧急&#xff0c;我们可以写一个存储来…...

自动驾驶:轨迹预测综述

自动驾驶&#xff1a;轨迹预测综述 轨迹预测的定义轨迹预测的分类基于物理的方法&#xff08;Physics-based&#xff09;基于机器学习的方法&#xff08;Classic Machine Learning-based&#xff09;基于深度学习的方法&#xff08;Deep Learning-based&#xff09;基于强化学习…...

【uniapp/uview】u-datetime-picker 选择器的过滤器用法

引入&#xff1a;要求日期选择的下拉框在分钟显示时&#xff0c;只显示 0 和 30 分钟&#xff1b; <u-datetime-picker :show"dateShow" :filter"timeFilter" confirm"selDateConfirm" cancel"dateCancel" v-model"value1&qu…...

如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

yocto stm32mp1集成ros

yocto stm32mp1集成ros yocto集成ros下载meta-rosyocto集成rosrootfs验证 yocto集成ros 本章节介绍yocto如何集成ros系统用来作机器人开发。 下载meta-ros 第一步首先需要下载meta-ros layer&#xff0c;meta-ros的链接如下&#xff1a;https://github.com/ros/meta-ros/tre…...

Linux 中的 chroot 命令及示例

Linux/Unix系统中的chroot命令用于更改根目录。Linux/Unix 类系统中的每个进程/命令都有一个称为root 目录的当前工作目录。它更改当前正在运行的进程及其子进程的根目录。 在此类修改的环境中运行的进程/命令无法访问根目录之外的文件。这种修改后的环境称为“ chroot监狱”或…...

oracle的redo与postgreSQL的WAL以及MySQL的binlog区别

Oracle的redo日志、PostgreSQL的WAL(Write-Ahead Log)以及MySQL的binlog(二进制日志)都是数据库的事务日志,但它们在实现和功能上有一些区别。 1. 实现方式: - Oracle的redo日志是通过在事务提交前将事务操作记录到磁盘上的重做日志文件中来实现的。 - PostgreSQL…...

进入低功耗和唤醒

休眠模式 进入休眠模式 如果使用 WFI 指令进入睡眠模式&#xff0c;则嵌套向量中断控制器 (NVIC) 确认的任意外设中断都会 将器件从睡眠模式唤醒。 如果使用 WFE 指令进入睡眠模式&#xff0c;MCU 将在有事件发生时立即退出睡眠模式。唤醒事件可 通过以下方式产生&#xff…...

【多线程】volatile 关键字

volatile 关键字 1. 保证内存可见性2. 禁止指令重排序3. 不保证原子性 1. 保证内存可见性 内存可见性问题: 一个线程针对一个变量进行读取操作&#xff0c;另一个线程针对这个变量进行修改操作&#xff0c; 此时读到的值&#xff0c;不一定是修改后的值&#xff0c;即这个读线…...

【Windows注册表内容详解】

Windows注册表内容详解 第一章节 注册表基础 一、什么是注册表 注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”&#xff0c;也可以说是一个非常巨大的树状分层结构的数据库系统。 注册表记录了用户安装在计算机上的软件和每个程…...

大数据Hadoop入门之集群的搭建

hadoop的三种运行模式 本地模式:测试本地的hadoop是否能够运行&#xff0c;用来运行官方的代码。伪分布模式:原先有人拿来测试&#xff0c;目前测试都不用这个模式了。完全分布模式&#xff1a;多台服务器组成分布式环境&#xff0c;生产环境使用 分布式主机文件同步命令 sc…...

华为云云耀云服务器L实例评测|基于云服务器的minio部署手册

华为云云耀云服务器L实例评测|基于云服务器的minio部署手册 【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本 创建人 修改人 创建时间 备注 1.0 jz jz 2023.9.2 minio华为云耀服务器 一. 部署规划与架…...

龙智携手Atlassian和JFrog举办线下研讨会,探讨如何提升企业级开发效率与质量

2023年9月8日&#xff0c;龙智将携手Atlassian和JFrog于上海举办线下研讨会&#xff0c;以“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”为主题&#xff0c;邀请龙智高级咨询顾问、Atlassian认证专家叶燕秀&#xff0c;紫龙游戏上海研发中心高级项目管理主管叶凯…...

2023数学建模国赛A题定日镜场的优化设计- 全新思路及代码

背景资料关键信息和要点如下&#xff1a; 定日镜&#xff1a;塔式太阳能光热发电站的基本组件&#xff0c;由纵向转轴和水平转轴组成&#xff0c;用于反射太阳光。 定日镜场&#xff1a;由大量的定日镜组成的阵列。 集热器&#xff1a;位于吸收塔顶端&#xff0c;用于收集太…...

CSS笔记(黑马程序员pink老师前端)圆角边框

圆角边框 border-radius:length; 效果显示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…...

水表电表集中远程抄表系统分析

电表水表远程抄表系统石家庄光大远通电气有限公司主要经营自动抄表,远程抄表,集中抄表,新供应信息&#xff0c;是石家庄光大远通电气有限公司自动远程抄表系统集信号采集、网络通信于一体的高性能抄表装置&#xff0c;该系统以485通讯方式读取水表电表的数据,以MBUS通讯方式读取…...

Android 通知

1. 原生Android通知的几种显示方式&#xff1a; 状态栏的图标&#xff1a;发出通知后&#xff0c;通知会先以图标的形式显示在状态栏中。 抽屉式通知栏&#xff1a;用户可以在状态栏向下滑动以打开抽屉式通知栏&#xff0c;并在其中查看更多详情及对通知执行操作。在应用或用户…...

【Unittest】Requests实现小程序项目接口测试

文章目录 一、搭建接口测试框架二、初始化日志三、定义全局变量四、封装接口五、编写测试用例六、生成测试报告 一、搭建接口测试框架 目录结构如下。 二、初始化日志 在utils.py文件中编写如下如下代码&#xff0c;初始化日志。 # 导入app.py全局变量文件 import app import l…...

Mac 搭建本地服务器

文章目录 一、启动服务器二、添加文件到本地服务三、手机/其他电脑 访问本机服务器 MacOS 自带Apatch 服务器。所以我这里选择Apatch服务器搭建 一、启动服务器 在safari中输入 http://127.0.0.1/ &#xff0c;如果页面出现 it works&#xff0c;则代表访问成功。启动服务器 …...

区块链基础之编写合约二

一、了解solidity中的关键字。 二、了解solidity中的类型。 三、编写合约 1.这里列出一些solidity中的关键字&#xff0c;有哪些。 pragma 作用&#xff1a;是告知编译器如何处理源代码的通用指令&#xff08;例如&#xff0c; pragma once &#xff09;。public 作用&#…...

【前端基础】js 如何判断一个值是数组

在JavaScript中&#xff0c;可使用不同的方法来判断一个值是否是一个数组。以下是一些常用的方法&#xff1a; 使用 Array.isArray() 方法&#xff1a; if (Array.isArray(value)) {// 值是一个数组 } else {// 值不是一个数组 }Array.isArray() 方法是最简单和推荐的方法&…...

Linux之NFS服务器

目录 Linux之NFS服务器 简介 NFS背景介绍 生产应用场景 NFS工作原理 NFS工作流程图 流程 NFS的安装 安装nfs服务 安装rpc服务 启动rpcbind服务同时设置开机自启动 启动nfs服务同时设置开机自启动 NFS的配置文件 主配置文件分析 示例 案例 --- 建立NFS服务器&#…...

ES delete_by_query条件删除的几种方式

es 查询删除的几种方式 1.根据id删除 #根据id删除 POST /indexname/_delete_by_query {"query": { "match": {"id": "100000"}} } 2.根据多个id删除 #根据多个id删除 POST /indexname/_delete_by_query {"query": {"…...

1.springboot 集成elasticsearch组件

1.前置条件已经安装和搭建好了elasticsearch中间件 一&#xff1a;项目中引入elasticsearch相关依赖 我安装的elasticsearch版本是7.10.2 对应依赖的版本保持一致 此处省略springboot 搭建及必要的依赖项 <dependency><groupId>org.elasticsearch.client</group…...

【学习笔记】元学习如何解决计算机视觉少样本学习的问题?

目录 1 计算机视觉少样本学习 2 元学习 3 寻找最优初始参数值方法&#xff1a;MAML 3.1 算法步骤 3.2 代码&#xff1a;使用MAML 和 FO-MAML、任务增强完成Few-shot Classification 4 距离度量方法&#xff1a;Siamese Network,ProtoNet,RN 4.1 孪生网络&#xff08;Sia…...

【C语言】17-函数-3

1. 链接属性 当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数将链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个实体,还是表示不同的实体?标识符的链接属性决定如何处理…...