yolov5训练自己的目标检测模型

news2025/1/11 21:09:20

yolov5训练自己的目标检测模型

1.克隆项目并配置环境

1.1克隆项目

进入GitHub下载yolov5源码 点此进入

选择分支v5.0,并下载源码

在这里插入图片描述

anaconda激活相应环境

activate pytorch

进入项目存放的地址

E:
cd yolov5-master

1.2 yolov5项目结构

├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。但是自己的数据集不建议放在这个路径下面,而是建议把数据集放到yolov5项目的同级目录下面。

├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。

├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。

├── weights:放置训练好的权重参数。

├── detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。

├── train.py:训练自己的数据集的函数。

├── test.py:测试训练的结果的函数。

├──requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。

1.3 安装相应的包

安装所需的包

pip install -r requirements.txt

安装过程报错

Could not build wheels for pycocotools, which is required to install pyproject.toml-based projects

解决方案如下:

https://blog.csdn.net/weixin_59997235/article/details/127891839

链接:https://pan.baidu.com/s/1bM2s7XfM3zteeaUIpbkjiA?pwd=xa7d
提取码:xa7d

将解压后的文件夹移入虚拟环境相应存放包的位置即可

2.数据集和预训练权重的准备

2.1使用labelimg进行标注

cmd命令行进入存放图片的文件夹并在此文件夹中打开labelimg

cd E:\VOC2077
E:
labelimg JPEGImages predefined_classes.txt

标注后保存为yolo要求的txt格式

2.2获得预训练权重

预训练权重下载

这里先选择5s作为预训练权重

在这里插入图片描述

3.训练自己的模型

3.1 修改配置文件

3.1.1 修改数据配置文件

修改data目录下的相应的yaml文件。找到目录下的voc.yaml文件,将该文件复制一份,将复制的文件重命名。这里修改为class.yaml

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: E:/yolov5-5.0/VOCdevkit/images/train # 16551 images
val: E:/yolov5-5.0/VOCdevkit/images/val  # 4952 images

# number of classes
nc: 2

# class names
names: [ 'student', 'teacher' ]

修改模型配置文件

由于该项目使用的是yolov5s.pt这个预训练权重,所以要使用models目录下的yolov5s.yaml文件中的相应参数(因为不同的预训练权重对应着不同的网络层数,所以用错预训练权重会报错)。和前面修改data目录下的yaml文件一样,将yolov5s.yaml文件复制一份,然后将其重命名,yolov5s-class.yaml
打开yolov5s-class.yaml修改nc为识别的类别数量

# parameters
nc: 2  # number of classes

3.2进行训练

3.2.1 cpu训练

命令行执行

python train.py

对数据集进行训练

结果报错AttributeError: Can't get attribute 'SPPF' on <module 'models.common' from 'E:\\yolov5-5.0\\models\\common.py'>

解决方案:

models文件夹中的common.py中添加

class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5): # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2 # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore') # suppress torch 1.9.0 max_pool2d() warning
            y1 = self.m(x)
            y2 = self.m(y1)
            return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))

命令行再次执行

python train.py

还是有报错AssertionError: train: No labels in E:\yolov5-5.0\VOCdevkit\labels\train.cache. Can not train without labels. See https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

报错原因:

labels文件夹中存放的是xml格式的标注信息,修改为txt格式即可

3.2.2 gpu训练

python train.py --device 0

执行python train.py --device 0后报错OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\Anaconda3\envs\pytorch-gpu\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies.

utils路径下找到datasets.py这个文件,将里面的第81行里面的参数nw改为0就可以了。

# 修改前
dataloader = loader(dataset,
                        batch_size=batch_size,
                        num_workers=nw,
                        sampler=sampler,
                        pin_memory=True,
                        collate_fn=LoadImagesAndLabels.collate_fn4 if quad else LoadImagesAndLabels.collate_fn)
# 修改后
dataloader = loader(dataset,
                        batch_size=batch_size,
                        num_workers=0,
                        sampler=sampler,
                        pin_memory=True,
                        collate_fn=LoadImagesAndLabels.collate_fn4 if quad else LoadImagesAndLabels.collate_fn)

3.3 查看训练结果

训练结果存放在E:\yolov5-5.0\runs\trainexp文件夹下

在这里插入图片描述

从pr曲线来看训练效果不是很好,可能是训练集数据比较少,而且老师和学生之间差别不大的原因

3.4 使用tensorbord查看参数

tensorboard --logdir=runs/train

在这里插入图片描述

3.5 推理测试

​ 等到数据训练好了以后,就会在主目录下产生一个runs文件夹,在run/train/exp/weights目录下会产生两个权重文件,一个是最后一轮的权重文件,一个是最好的权重文件,一会我们就要利用这个最好的权重文件来做推理测试。除此以外还会产生一些验证文件的图片等一些文件。

在这里插入图片描述

找到主目录下的detect.py文件,打开该文件,然后找到主函数的入口,这里面有模型的主要参数。模型的主要参数解析如下所示。

"""
--weights:权重的路径地址
--source:测试数据,可以是图片/视频路径,也可以是'0'(电脑自带摄像头),也可以是rtsp等视频流
--output:网络预测之后的图片/视频的保存路径
--img-size:网络输入图片大小
--conf-thres:置信度阈值
--iou-thres:做nms的iou阈值
--device:是用GPU还是CPU做推理
--view-img:是否展示预测之后的图片/视频,默认False
--save-txt:是否将预测的框坐标以txt文件形式保存,默认False
--classes:设置只保留某一部分类别,形如0或者0 2 3
--agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
--augment:推理的时候进行多尺度,翻转等操作(TTA)推理
--update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False
--project:推理的结果保存在runs/detect目录下
--name:结果保存的文件夹名称
"""

先将刚刚训练好的最好权重传到推理函数中

parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp9/weights/best.pt',
                        help='model.pt path(s)')

对图片、视频或摄像头进行推理

图片:

parser.add_argument('--source', type=str, default='test/1.jpg', help='source')

视频:

parser.add_argument('--source', type=str, default='test/1.mp4', help='source')

摄像头

parser.add_argument('--source', type=str, default='0', help='source')

摄像头这里还需要再修改utils下的datasets.py,第279行

# 修改前:
# if 'youtube.com/' in url or 'youtu.be/' in url:  # if source is YouTube video
# 修改后:
  if 'youtube.com/' in str(url) or 'youtu.be/' in str(url):  # if source is YouTube video

修改完成后就可以直接测试结果

3.5.1 CPU推理测试

python detect.py

3.5.2 GPU推理测试

此处踩坑,这里我先把detect.py文件中的设置修改了,default改成了0,想让他默认调用GPU,但是执行python detect.py 就会报错AssertionError: CUDA unavailable, invalid device 1 requested,而我torch.cuda.is_available()的执行结果为true。

# 这里不要改
parser.add_argument('--device', default='', help='cudaexit() device, i.e. 0 or 0,1,2,3 or cpu')

使用python train.py --device 0在命令行中执行,才能调用GPU。这个莫名其妙的问题卡了很久。

参考:

  1. 目标检测—教你利用yolov5训练自己的目标检测模型
  2. AttributeError: Can’t get attribute ‘SPPF’ on <module ‘models.common’ from ‘C:\Users\Downloads\yolov5-pyqt5-master (1)\yolov5-pyqt5-master\models\common.py’> #5

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

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

相关文章

信号生成和可视化——周期性/非周期性波形

信号生成和可视化 此示例说明如何使用 Signal Processing Toolbox™ 中提供的函数生成广泛使用的周期和非周期性波形、扫频正弦波和脉冲序列。尝试此示例Copy Command Copy Code 周期性波形 除了 MATLAB 中的 sin 和 cos 函数外&#xff0c;Signal Processing Toolbox™ 还…

客快物流大数据项目(一百一十五):熔断器 Spring Cloud Hystrix

文章目录 熔断器 Spring Cloud Hystrix 一、​​​​​​​Hystrix 简介 二、什么是雪崩效应

如何使用 Linux find 命令查找文件?

在Linux系统中&#xff0c;find命令是一个非常强大的工具&#xff0c;可以帮助用户查找文件或目录。这篇教程将向您展示如何使用Linux find命令来查找您需要的文件。 基本语法 在使用Linux find命令之前&#xff0c;您需要了解其基本语法。Linux find命令的基本语法如下&…

初识Java:数据类型与变量、运算符

哈喽大家好&#xff0c;这篇文章我将为大家分享关于Java的数据类型与变量和运算符。 文章目录 数据类型与变量数据类型整型类型byte类型short类型int类型long类型 浮点型字符类型布尔类型 变量浮点型变量布尔型变量类型转换隐式转化显式转化 运算符算术运算符增量运算符自增/自…

CSDN 周赛 47 期

CSDN 周赛 47 期 判断题单选题12 填空题编程题1、题目名称&#xff1a;最小差值&#xff08;30分&#xff09;2、题目名称&#xff1a;风险投资&#xff08;45分&#xff09; 小结 判断题 中国古代就发现并证明了勾股定理&#xff0c;并在《周髀算经》中出现了“勾三股四弦五”…

Linux 这4个进程相关的命令,太好用!

当您在Linux系统中管理进程时&#xff0c;了解一些进程监控命令是非常重要的。这些命令可以帮助您了解当前正在运行的进程以及它们的状态&#xff0c;从而更好地管理系统资源。下面是一些常用的Linux进程监控命令及其示例&#xff1a; 1、ps命令 ps命令可以列出当前正在运行的…

验证码登录开发----手机验证码登录

手机验证码登录 需求分析 为了方便用户登录&#xff0c;移动端通常都会提供通过手机验证码登录的功能 手机验证码登录的优点&#xff1a; 方便快捷、无需注册&#xff0c;直接登录使用短信验证码作为登录凭证&#xff0c;无需记忆密码安全 登录流程&#xff1a; 输入手机…

06-文章搜索页面

文章搜索页面 6-1&#xff1a;开篇 再上一章中&#xff0c;我们完成了 热搜首页 的开发&#xff0c;虽然经历了 ”千辛万苦“ &#xff0c;但是对大家来说&#xff0c;应该也是收获满满。 那么在这一章节&#xff0c;我们将会进入新的篇章&#xff0c;来到 文章搜索 页面的开…

【C++】深度剖析string类的底层结构及其模拟实现

文章目录 前言1. string的结构2. 构造、析构2.1 无参构造2.2 带参构造2.3 问题发现及修改c_stroperator []析构 2.4 合二为一 ——全缺省 3. 拷贝构造3.1 浅拷贝的默认拷贝构造3.2 深拷贝拷贝构造的实现 4. 赋值重载4.1 浅拷贝的默认赋值重载4.2 深拷贝赋值重载的实现 5. strin…

ES6 中的类(class)

前言 ES6 引入的 class 关键字具有定义类的能力。类是 ECMAScript 中新的基础性语法糖。虽然 ES6 表面上看起来可以支持正式的面向对象编程&#xff0c;但实际上它背后使用的依旧是原型和构造函数的概念。&#xff08;笔记内容参考《JavaScript 高级程序设计&#xff08;第 4 …

TTL反相器、OC门、TS门、推挽输出、开漏输出

TTL反相器 这是一个TTL反相器&#xff0c;这是经过了很多工程师多种设计最终沉淀出来的电路&#xff0c;这个电路是比较成熟的。我们只需要对这个电路进行解析即可&#xff0c;不需要再去研究当初是如何设计出来的。 学过CMOS应该知道&#xff0c;右侧的输出级其实也是个推挽输…

为什么程序实际可用内存会远超物理内存?

背景介绍 不知道在你刚接触计算机的时候&#xff0c;有没有这么一个疑问&#xff1a;“为什么我的机器上只有两个G 的物理内存&#xff0c;但我却可以使用比这大得多的内存&#xff0c;比如 256T&#xff1f;”反正我当时还是挺疑惑的&#xff0c;不过现在我可以来告诉你这个答…

如何将销售效果最大化:从人工智能聊天机器人到即时聊天

聊天机器人的崛起 从几年前开始&#xff0c;客户支持是聊天机器人使用的第一个爆发点。B2C引领潮流&#xff0c;B2B紧随其后。市场营销和销售最近也开始加入&#xff0c;让聊天机器人承担起迎接和引导网站游客的任务。现在&#xff0c;人工智能已经进入聊天&#xff0c;可以说…

机器学习 第一周

目录 1. 什么是机器学习(课本给出的部分定义) 我理解的机器学习:

Java基础:IO流有哪些,各有什么特点和功能

具体操作分成面向字节(Byte)和面向字符(Character)两种方式。 如下图所示&#xff1a; IO流的三种分类方式 IO流的层次结构 IO流的常用基类有&#xff1a; 字节流的抽象基类&#xff1a;InputStream和OutputStream&#xff1b; 字符流的抽象基类&#xff1a;Reader和Writer…

20、单元测试

文章目录 1、JUnit5 的变化2、JUnit5常用注解3、断言&#xff08;assertions&#xff09;1、简单断言2、数组断言3、组合断言4、异常断言5、超时断言6、快速失败 4、前置条件&#xff08;assumptions&#xff09;5、嵌套测试6、参数化测试7、迁移指南 【尚硅谷】SpringBoot2零基…

JAVA性能优化实例

目录 概述 Sql性能优化 多线程 利用内存缓存 功能优化 参考博客 概述 性能优化的几个点&#xff0c;大致可以分为&#xff1a; sql优化使用多线程利用内存&#xff0c;缓存等&#xff0c;将固定不常更改的数据放入在&#xff0c;存取更快的内存当中功能实现逻辑优化 Sql性…

五分钟,说说Python 中多线程共享全局变量的问题

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 写在前面不得不看的一些P话&#xff1a; Python 中多个线程之间是可以共享全局变量的数据的。 但是&#xff0c;多线程共享全局变量是会出问题的。 假设两个线程 t1 和 t2 都要对全局变量g_num (默认是0)进行加1运算&#xff0c…

日常项目技术方案脉络

开篇引砖 软件在其生命周期中&#xff0c;当其进入稳定期后&#xff0c;大部分时间都处于迭代更新维护阶段。在这漫长的三年甚至五年的存活期内&#xff0c;我们需要面对林林种种大大小小的需求。今天我们就聊聊在这段期间&#xff0c;如何快速产出一份合格的技术方案。 方案给…

JavaScript经典教程(一)-- HTML基础部分

179&#xff1a;HTML基础部分&#xff08;元素分类、特性、特殊元素等&#xff09; 1、复习&#xff1a; HTML&#xff1a; 超文本标记语言 CSS&#xff1a; 层叠样式表 JavaScript&#xff1a; 脚本语言 http&#xff1a;超文本传输协议 https&#xff1a; 经过ssl加密的超…