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

news2024/12/23 15:03:36

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

  • 使用yolov5训练自己的目标检测模型
  • 1. 项目的克隆
  • 2. 项目代码结构
  • 3. 环境的安装和依赖的安装
  • 4. 数据集和预训练权重的准备
    • 4.1利用labelimg标注数据和数据的准备
      • 4.1.1 **labelimg介绍:**
      • 4.1. 2 labelimg的安装
    • 4.2 使用labelimg
      • 4.2.1 数据准备
      • 4.2.2 标注前的一些设置
      • 4.2.3 开始标注
    • 4.3 将数据集为划分训练集和验证集
    • 4.4 配置文件
    • 4.5 修改模型配置文件
    • 4.6 获得预训练权重
  • 5. 模型训练
    • 5.1 开始训练

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

1. 项目的克隆

YOLOv5的代码是开源的,所以我们可以从github上download其源码。

  • 本次使用的分支是master下的v5.0版本,其他版本暂未尝试,有时间的同学可自行尝试

在这里插入图片描述

  • clone 方法
git clone --recursive git@github.com:ultralytics/yolov5.git

clone不下来,或者时间较长的,检查一下github的密钥有没有添加,以及有没有相关魔法

2. 项目代码结构

将我们clone下来的好的yolov5的代码用一款IDE打开(我用的是pycharm),打开之后整个代码目录如下图
在这里插入图片描述
现在来对代码的整体目录做一个介绍:

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

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

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

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

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

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

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

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

以上就是yolov5项目代码的整体介绍。我们训练和测试自己的数据集基本就是利用到如上的代码。

3. 环境的安装和依赖的安装

关于深度学习的环境的安装,值得一提的一点就是,正常需要利用GPU去训练数据集的话,是需要安装对应的CUDAcudnn

打开requirements.txt这个文件,可以看到里面有很多的依赖库和其对应的版本要求。我们打开命令终端,在中输入如下的命令,就可以安装了。

pip3 install -r requirements.txt

在这里插入图片描述

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

4.1利用labelimg标注数据和数据的准备

4.1.1 labelimg介绍:

Labelimg是一款开源的数据标注工具,可以标注三种格式。

   1、VOC标签格式,保存为xml文件。

   2、yolo标签格式,保存为txt文件。

   3、createML标签格式,保存为json格式。

4.1. 2 labelimg的安装

pip3 install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述
运行如上命令后,系统就会自动下载labelimg相关的依赖。由于这是一个很轻量的工具,所以下载起来很快。

4.2 使用labelimg

4.2.1 数据准备

首先这里需要准备我们需要打标注的数据集。这里我建议新建一个名为VOC2007的文件夹(这个是约定俗成,不这么做也行),里面创建一个名为JPEGImages的文件夹存放我们需要打标签的图片文件;再创建一个名为Annotations存放标注的标签文件;最后创建一个名为 predefined_classes.txt 的txt文件来存放所要标注的类别名称。

VOC2007的目录结构为:

├── VOC2007
│├── JPEGImages 存放需要打标签的图片文件
│├── Annotations 存放标注的标签文件
│├── predefined_classes.txt 定义自己要标注的所有类别(这个文件可有可无,但是在我们定义类别比较多的时候,最好有这个创建一个这样的txt文件来存放类别)

4.2.2 标注前的一些设置

  1. 首先在JPEGImages这个文件夹放置待标注的图片,具体的类别因人而异。
    在这里插入图片描述
  2. 创建一个名为Annotations存放标注的标签文件

在这里插入图片描述

  1. 创建一个名为 predefined_classes.txt 的txt文件来存放所要标注的类别名称
    在这里插入图片描述
    VOC2007的目录结构为:

├── VOC2007
│├── JPEGImages 存放需要打标签的图片文件
│├── Annotations 存放标注的标签文件
│├── predefined_classes.txt 定义自己要标注的所有类别(这个文件可有可无,但是在我们定义类别比较多的时候,最好有这个创建一个这样的txt文件来存放类别)

  1. 输入如下的命令打开labelimg。这个命令的意思是打开labelimg工具;打开JPEGImage文件夹,初始化predefined_classes.txt里面定义的类。
labelImg JPEGImages predefined_classes.txt

运行如上的命令就会打开这个工具;如下。
在这里插入图片描述

  • 下面介绍图中的我们常用的按钮。

在这里插入图片描述
待标注图片数据的路径文件夹,这里输入命令的时候就选定了JPEGImages。(当然这是可以换的)

在这里插入图片描述
保存类别标签的路径文件夹,这里我们选定了Annotations文件夹。

在这里插入图片描述
这个按键可以说明我们标注的标签为voc格式,点击可以换成yolo或者createML格式。

    点击View,会出现如图红色框框中的选项。最好和我一样把勾勾勾上。

    Auto Save mode:切换到下一张图的时候,会自动保存标签。

    Display Labels:会显示标注框和标签

    Advanced Mode:标注的十字架会一直悬浮在窗口。

在这里插入图片描述

常用快捷键如下:
A:切换到上一张图片

D:切换到下一张图片

W:调出标注十字架

del :删除标注框框

Ctrl+u:选择标注的图片文件夹

Ctrl+r:选择标注好的label标签存在的文件夹

4.2.3 开始标注

由于我们设置标注的十字架一直在标注界面上,这就不需要我们按快捷键w,然后选定我们需要标注的对象。按住鼠标左键拖出框框就可以了。如下图所示,当我们选定目标以后,就会加载出来predefined_classes.txt 定义自己要标注的所有类别(如果类别多,是真的很方便,就不需要自己手打每个类别的名字了)。打好的标签框框上会有该框框的类别(图中由于颜色的原因不太清晰,仔细看会发现的)。然后界面最右边会出现打好的类别标签。打好一张照片以后,快捷键D,就会进入下一张,这时候就会自动保存标签文件(voc格式会保存xml,yolo会保存txt格式)。
在这里插入图片描述
标签打完以后可以去Annotations 文件下看到标签文件已经保存在这个目录下。

4.3 将数据集为划分训练集和验证集

在yolov5目录下创建程序data_spl.py 并运行

程序如下:(可以不更改,注意下数据集的地址)

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File  : data_spl.py
# @Author: joker-wt
# @Date  : 2024/4/18
# @Desc  :
# @Contact : tl.wt123@qq.com

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='VOC2007/Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='VOC2007/ImageSets', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0  # 训练集和验证集所占比例。 这里没有划分测试集
train_percent = 0.9     # 训练集所占比例,可自己进行调整
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行完毕后 会生成 ImagesSets文件夹,且在其下生成 测试集、训练集、验证集,存放图片的名字(无后缀.jpg)

由于没有分配测试集,所以测试集为空。

若要分配,更改第 14、15 行代码,更改所在比例即可。
在这里插入图片描述

4.4 配置文件

在 yolov5 目录下的 data 文件夹下 新建一个 my_yolov5.yaml文件(可以自定义命名),打开。

内容是:

训练集以及验证集(train.txt和val.txt)的路径(可以改为相对路径)

以及 目标的类别数目和类别名称。

给出模板: 冒号后面需要加空格

train: /home/joker/idrive_project/yolov5/VOC2007/ImageSets/train.txt
val: /home/joker/idrive_project/yolov5/VOC2007/ImageSets/val.txt

# number of classes
nc: 4

# class names
names: ["release_speed_limit", "roundabout","speed_limit","turn_left"]

4.5 修改模型配置文件

选择一个模型,在yolov5目录下的model文件夹下是模型的配置文件,有n、s、m、l、x版本,逐渐增大(随着架构的增大,训练时间也是逐渐增大)。

这里放一些官方数据: https://github.com/ultralytics/yolov5

在这里插入图片描述
在这里插入图片描述

这里选用 yolov5s.yaml.。修改参数。

自动法获取anchors,只需更改nc 标注类别数,不用更改anchors
在这里插入图片描述

4.6 获得预训练权重

一般为了缩短网络的训练时间,并达到更好的精度,我们一般加载预训练权重进行网络的训练。而yolov5的5.0版本给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重。通过如下的图可以获得权重的名字和大小信息,可以预料的到,预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。预训练权重可以通过这个网址进行下载,本次训练自己的数据集用的预训练权重为yolov5s.pt。

5. 模型训练

5.1 开始训练

打开yolov5 目录下的 train.py 程序,我们可以多看看这些参数使用。

在这里插入图片描述

训练自己的模型需要修改如下几个参数就可以训练了。首先将weights权重的路径填写到对应的参数里面,然后将修改好的models模型的my_yolov5.yaml文件路径填写到相应的参数里面,最后将data数据的hat.yaml文件路径填写到相对于的参数里面。这几个参数就必须要修改的参数。

常用参数解释如下:

这个大部分借鉴了参考链接。

  • weights:权重文件路径

  • cfg:存储模型结构的配置文件

  • data:存储训练、测试数据的文件

  • epochs:指的就是训练过程中整个数据集将被迭代(训练)了多少次,显卡不行你就调小点。

  • batch-size:训练完多少张图片才进行权重更新,显卡不行就调小点。

  • img-size:输入图片宽高,显卡不行就调小点。

  • device:cuda device, i.e. 0 or 0,1,2,3 or cpu。选择使用GPU还是CPU

  • workers:线程数。默认是8。

其它参数解释:

  • noautoanchor:不自动检验更新anchors

  • rect:进行矩形训练

  • resume:恢复最近保存的模型开始训练

  • nosave:仅保存最终checkpoint

  • notest:仅测试最后的epoch

  • evolve:进化超参数

  • bucket:gsutil bucket

  • cache-images:缓存图像以加快训练速度

  • name: 重命名results.txt to results_name.txt

  • adam:使用adam优化

  • multi-scale:多尺度训练,img-size +/- 50%

  • single-cls:单类别的训练集

进入pytorch环境,进入yolov5文件夹

训练命令如下:

python3 train.py --weights weights/yolov5s.pt  --cfg models/yolov5s.yaml  --data data/my_yolov5.yaml --epoch 200 --batch-size 8 --img 640   --device 0

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

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

相关文章

【EI、CPCI稳定检索】2024年现代化教育、知识和信息管理国际学术会议(ICMEKIM 2024)

2024 International Conference on Modern Education, Knowledge and Information Management (ICMEKIM 2024) ●会议简介 2024年现代教育、知识与信息管理国际学术会议将聚焦于教育的最新趋势和信息管理技术的创新发展。本次会议将汇集全球教育专家、学者及行业领袖&#xf…

Vue2 基础学习-案例实践

数据管理信息的增删改查的实践 主要应用&#xff1a; 数据插值&#xff1a; {{xxx}}双向绑定&#xff1a;v-model点击事件函数&#xff1a;click列表xxx的增删改实现 xxx.push(row) 增加xxx.splice(id,1) 删除 一行{x,y} xxx[id]; 编辑 <!DOCTYPE html> <html la…

4月18日N皇后+解数独

51.N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案…

LangChain入门:18.使用ReAct 框架进行生成推理痕迹和任务特定行动来实现更大的协同作用

在这篇技术博文中&#xff0c;我们将深入探讨LangChain框架中的ReAct对话模型&#xff0c;以及如何利用它构建高效的智能对话系统。ReAct模型通过反应堆&#xff08;Reactor&#xff09;处理对话中的各种情况&#xff0c;实现了对复杂对话场景的有效解构。结合思维链&#xff0…

基于Java+Vue的校园交友系统(源码+文档+包运行)

一.系统概述 选题背景&#xff1a; 在大学校园中&#xff0c;学生们面临着新的环境和人际关系的挑战。有些学生可能感到孤独或者希望扩展自己的社交圈子&#xff0c;寻找志同道合的朋友或者潜在的伴侣。因此&#xff0c;设计一款校园交友平台具有重要意义。 研究意义&#xff1…

「51媒体」权重高新闻源央级媒体邀约资料有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 权重高的央级媒体邀约资源包括了中国一些最具影响力和权威性的新闻机构。具体如下&#xff1a; 人民日报&#xff1a;作为中国共产党中央委员会的机关报&#xff0c;人民日报具有极高的权…

Spring学习(三)——AOP

AOP是在不改原有代码的前提下对其进行增强 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;在不惊动原始设计的基础上为其进行功能增强&#xff0c;前面咱们有技术就可以实现这样的功能即代理模式。Java设计模式——代理模式-CSDN博客 基础概念 连接点&#xff08…

SAM5716B 法国追梦DREAM 音频DSP芯片

法国追梦/DERAM SAM5504/5704/5716/5808音频DSP芯片,开发板&#xff0c;方案 可用于电子鼓、电子琴、电吉他、效果器、均衡器、啸叫抑制器等电声产品领域 全系列芯片&#xff1a; SAM2634 SAM2695 SAM5504B SAM5704B SAM5708B SAM5808B SAM5716B SAM5916B... 原厂开发…

【Qt】Qt Hello World 程序

文章目录 1、Qt Hello World 程序1.1 使用按钮实现1.1.1 使用可视化方式实现 1.1.2 纯代码方式实现 label创建堆&#xff08;内存泄漏&#xff09;或者栈问题Qt基础类&#xff08;Qstring、Qvector、Qlist&#xff09;乱码问题零散知识 1、Qt Hello World 程序 1.1 使用按钮实…

算法学习笔记:Bi-LSTM和Bi-GRU

这篇文章的作为前几篇RNN\LSTM\RNN的后续之作&#xff0c;主要就是补充一个这两个哥的变体&#xff0c;想详细了解RNN\LSTM\GRU的详细理论和公式推导以及代码的请前往下面链接&#xff1a; 算法学习笔记&#xff1a;循环神经网络&#xff08;Recurrent Neural Network)-CSDN博…

udemy视频教程下载:AI和ChatGPT提示工程精通指南

欢迎来到 ChatGPT 大师班&#xff01; 这个 ChatGPT 大师班&#xff1a;AI 和提示工程指南是您通往 AI 未来的全通道通行证。 以下是您的学习旅程&#xff1a; 理解和掌握 ChatGPT&#xff1a;您将深入了解 AI 和语言模型&#xff0c;重点是 ChatGPT。我们设计了这个部分&am…

前端三大件速成 01 HTML

文章目录 一、前端基础知识二、标签1、什么是标签2、标签的属性3、常用标签&#xff08;1&#xff09;声明&#xff08;2&#xff09;注释&#xff08;3&#xff09;html 根标签&#xff08;3&#xff09;head标签&#xff08;4&#xff09;body标签 三、特殊字符四、其他标签1…

java方法递归

简介 案例&#xff1a;阶乘 // 计算一个数的阶乘 public static int factorial(int n) {if (n 1) {return 1;}return n * factorial(n - 1); }案例 猴子吃桃子 // 猴子吃桃子问题 // 第一天吃了一半多一个 第十天剩一个 求第一天有多少个桃子 // 因为 f(x1) f(x)/2 - 1 // 所…

STL库 —— priority_queue 的编写

目录 一、 优先级队列的介绍 二、优先级队列的使用 2.1 建大堆 less 2.2 建小堆 greater 2.3 详解 greater 与 less 三、 priority_queue 的模拟实现 3.1 编写框架 3.2 编写简单函数 3.2 进堆 向上调整 3.3 出堆 向下调整 四、完整代码 一、 优先级队列的介绍 1.…

【Python系列】非异步方法调用异步方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

浅谈数据结构---红黑树、二叉树

红黑树简介 红黑树&#xff1a;在本质上还是二叉树&#xff0c;是一种高效的查找树。 特点 一边的数比另一边的数高太多时&#xff0c;自动旋转平衡 当数据量比较大时&#xff0c;层级比较多&#xff0c;查询效率低 如下图所示&#xff1a; 如果一边的数比另一边高太多时&…

AI智能电销机器人是什么?能给我们带来哪些便利?

科技的飞速发展&#xff0c;让很多“懒人”的幻想变成了现实&#xff0c;越来越多的人工智能产品被发明出来甚至完全替代日常生活中的工作。比如在电销行业&#xff0c;很多企业选择AI智能电销机器人进行外呼。那么你了解多少AI智能电销机器人呢&#xff1f;和小编kelaile520一…

前端js控制元素移动

背景 页面中有多个表格&#xff0c;每个表格中均有一从右到左匀速移动的元素&#xff0c;随着元素移动需要在表格中增减数据&#xff0c;由于使用css3动画无法捕捉元素移动位置&#xff0c;所以这里采用js控制dom的写法 解决办法 最终代码放在文章的最后&#xff0c;各位看官…

热塑性聚氨酯TPU的特性有哪些?UV胶水能够粘接热塑性聚氨酯TPU吗?又有哪些优势呢?

热塑性聚氨酯&#xff08;Thermoplastic Polyurethane&#xff0c;TPU&#xff09;是一种具有多种优异性能的弹性塑料&#xff0c;广泛用于各种应用领域。以下是TPU的一些主要特性&#xff1a; 弹性和柔软性&#xff1a; TPU具有良好的弹性和柔软性&#xff0c;能够在受力后迅速…

现在给政府机关医院学校部队供货的方式有哪些?

给政府机关、医院、学校和部队供货的方式主要包括以下几种&#xff1a; 直接采购&#xff1a;政府机关、医院、学校和部队通过招标或直接与供应商进行谈判&#xff0c;确定采购的产品和价格。这种方式常见于大宗或重要物资的采购&#xff0c;能够确保采购过程的透明度和公正性…