【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程

YOLOv5--详细版训练自己的数据集 保姆级学习日志记录 手把手教程

  • 一、配置与源码下载
    • 1.项目下载
    • 2.代码解压
    • 3.下载权重文件
    • 4.安装依赖包
      • 4.1使用Anaconda Prompt安装依赖包
      • 4.2在终端安装依赖包
  • 二、初步测试程序
  • 三、划分数据集
    • 1.文件夹准备
    • 2.split.py文件--划分数据集
    • 3.xml转yolo_txt
    • 4.配置文件
      • 4.1参数配置文件
      • 4.2模型配置文件
  • 五、训练
  • 参考链接

一、配置与源码下载

我的基本配置
在这里插入图片描述
电脑配置 拯救者Y7000 i5 RTX3050
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第1张图片
版本与配置声明
这个在github的源代码里有 是requitements.txt文件

# YOLOv5 requirements
# Usage: pip install -r requirements.txt

# Base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.1
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.64.0
protobuf<4.21.3  # https://github.com/ultralytics/yolov5/issues/8012

# Logging -------------------------------------
tensorboard>=2.4.1
# wandb

# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0

# Export --------------------------------------
# coremltools>=4.1  # CoreML export
# onnx>=1.9.0  # ONNX export
# onnx-simplifier>=0.4.1  # ONNX simplifier
# nvidia-pyindex  # TensorRT export
# nvidia-tensorrt  # TensorRT export
# scikit-learn==0.19.2  # CoreML quantization
# tensorflow>=2.4.1  # TFLite export
# tensorflowjs>=3.9.0  # TF.js export
# openvino-dev  # OpenVINO export

# Extras --------------------------------------
ipython  # interactive notebook
psutil  # system utilization
thop>=0.1.1  # FLOPs computation
# albumentations>=1.0.3
# pycocotools>=2.0  # COCO mAP
# roboflow

1.项目下载

地址:yolov5
打开之后页面是这个样子的
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第2张图片
这个项目会不断的完善修复 现在已经进行到v6.1了 我们下载最新的
点击左边的master tags 选择最新的版本v6.1
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第3张图片
这个是进入到v6.1的版本页面了 可以在作者名字旁边看见版本号,下一步点击右边的绿色按钮code下载,选择安装包下载。
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第4张图片

2.代码解压

将我们下载好的yolov5的代码解压,用一款IDE打开(我用的是vscode),打开之后整个代码目录如下图
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第5张图片

现在来对代码的整体目录做一个介绍:
├── 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.下载权重文件

这里目前是没有权重 weights文件的 需要我们来下载。

这里release下载权重文件。
yolov5的6.0版本给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。
这里选择yolov5s。yolov5s是目标检测速度最快,但其网络参数少,相应地检测效果比较差,而yolov5x是检测效果最好的,参数最多的,而时间最慢。
把下载好的yolov5s.pt文件放到yolov5源码的文件夹下
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第6张图片

4.安装依赖包

官方要求python>=3.7.0,pytorch>=1.7
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第7张图片

4.1使用Anaconda Prompt安装依赖包

切换到Yolov5的位置,pip install -r requirements.txt即可一步到位全部下完。
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第8张图片
具体操作如下:

cmd中由c盘切换到e盘 输入E:
想要进入e盘的某一文件夹下 cd E:\path 绝对路径
进入yolov5-6.1的文件夹下后 再pip install -r requirements.txt
开始安装依赖包

pip install -r requirements.txt

【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第9张图片
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第10张图片
wrrning警告可以忽略
到此,基础设置已经ok啦!

4.2在终端安装依赖包

进入自己创建的新环境

conda activate yolov5

pip安装依赖包

pip install -r requirements.txt

【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第11张图片在这里插入图片描述
依赖包安装完成!

二、初步测试程序

新建终端

查看conda环境

conda info -e

激活进入环境

conda activate yolov5

【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第12张图片
运行detect.py文件

python detect.py

在这里插入图片描述
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第13张图片
在runs/detect/exp中能发现被处理过的标签,说明成功了!

若程序报错,大概率是因为有的库版本不正确或者还未安装,这个自己调试一下即可,应该没有太大难度
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第14张图片
这里的两张图片是项目自带的,可以把自己想检测的图片放到images目录下。
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第15张图片
【小插曲】这里第一次我就报错了 看下原因
在这里插入图片描述
熟悉的 python: can’t open file ‘…detect.py’ : [Errno 2] No such file or directory 出现了

看下代码目录 detect.py文件是存在的,那么为什么报错说找不到呢?

原因

是看上面红色标红的这个框
有两个重复的yolov5-6.1的文件夹(代码是我从github上直接下载的,它的原始文件里就是嵌套了两个同名的yolov5-6.1文件夹)我们自己去删掉一个
只需要一个yolov5-6.1的文件夹

这样就ok了!
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第16张图片
修改后正确的目录如下图:
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第17张图片
到这里 我们的测试就完成了!在runs里找到了检测的图片结果 说明初步的配置是没有问题的

现在万里长征第一步完成了 我们继续进行 加油哦!

三、划分数据集

训练集至少100张起步才有效果。要想效果好,用公开的数据集,几千张才会有较好的效果。

1.文件夹准备

新建一个文件夹,命名为MyData。 在这个文件夹下,里面有两个文件夹
Annotations里存放的是标注图片后产生的内容(xml格式)
images里存放的是要标注的图片(png格式)
再创建一个文件夹,命名为:ImageSets,里面再新建Main文件夹

【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第18张图片

2.split.py文件–划分数据集

ImageSets文件夹下面有个Main子文件夹,其下面存放训练集、验证集、测试集的划分。
通过脚本生成,可以创建一个split.py文件,这是为了划分训练集、验证集,代码内容如下:

# coding:utf-8

import os
import random
import argparse

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

地址为绝对地址,运行split.py文件,如果报错,地址里的/改为\
spilt.py运行成功后,在ImageSets/Main里会生成4个txt文件。
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第19张图片

3.xml转yolo_txt

yolo只认txt格式,我们需要把xml格式的文件转为txt文件。
创建程序xml2yolo.py

需要将第 7 行改成自己所标注的类别
以及修改各绝对路径
绝对路径需为:d:\images 或者 d:/images 双右斜线或者单左斜线

程序如下:

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["pothole"]   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h

def convert_annotation(image_id):
    in_file = open('MyData/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('MyData/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        # difficult = obj.find('difficult').text
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()
for image_set in sets:
    if not os.path.exists('MyData/labels/'):
        os.makedirs('MyData/labels/')
    image_ids = open('MyData/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('MyData/%s.txt' % (image_set), 'w')# 这里是mydata下生成3个txt文件
    for image_id in image_ids:
        list_file.write(abs_path + '\MyData\images\%s.jpg\n' % (image_id))  
        convert_annotation(image_id) 
    list_file.close()


运行后会生成如下 labels 文件夹MyData文件夹下的三个txt文件
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第20张图片

这里的train.txtval.txt是后面mydata.yaml参数文件里的train和val的路径。

下面是labels文件夹里生成的.txt文件。
是 labels 中为不同图像的标注文件。每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式,这种即为 yolo_txt格式
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第21张图片
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第22张图片
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第23张图片

4.配置文件

4.1参数配置文件

在 yolov5-6.1 目录下的data文件夹下新建一个 mydata.yaml文件(可以自定义命名),用记事本打开。
内容是:

训练集以及验证集(train.txt和val.txt)的绝对路径(可以改为相对路径)
这两个文件是通过运行xml2yolo.py代码生成的 是MyData下的三个txt文件(是代码倒数第三行生成的txt文件)
以及 目标的类别数目和类别名称。

train: E:\VScode_Projects\yolov5-6.1\MyData\train.txt
val: E:\VScode_Projects\yolov5-6.1\MyData\val.txt

# train/val 可以是直接读取文件夹,也可以是读取.txt文件建立索引。
# 你这里用的.txt文件索引,那么就需要把路径填到.txt文件这一级,就像现在。

# number of classes
nc: 1 

# class names
names: ["phothle"]

注意: 冒号后面需要加空格

【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第24张图片

4.2模型配置文件

对models文件夹下的yolov5s.yaml文件进行修改(我们采用yolov5s.pt作为初始模型)
在其基础上进行训练,所以要对yolov5s.yaml中的参数进行修改。
只将如下的nc修改为训练集种类即可
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第25张图片

五、训练

train.py,找到def parse_opt(known=False)这行,这下面是我们要修改的程序部分
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第26张图片
我标注“*”的,是一定要修改的;其他的注释是一些较为重要的参数。

–weigths:是初始权重的位置,是以.pt结尾的文件;
–cfg:训练模型文件,在本项目中对应mydatayolov5s.yaml;
-data:数据集参数文件,在本项目中对于mydata.yaml;
–hyp:超参数设置,是人为设定的参数。包括学习率啥的等等,可不改;
–epochs:训练轮数,决定了训练时间与训练效果;
–batch-size:批量处理文件数,这个要设置地小一些,否则会out of memory。这个决定了我们训练的速度;
–imgsz:图片大小,虽然我们训练集的图片是已经固定下来了,但是传入神经网络时可以resize大小,太大了训练时间会很长,且有可能报错,这个根据自己情况调小一些;
–resume:断续训练,如果说在训练过程中意外地中断,那么下一次可以在这里填True,会接着上一次runs/exp继续训练
–device:GPU加速,填0是电脑默认的CUDA,前提是电脑已经安装了CUDA才能GPU加速训练,安装过程可查博客
–workers:多线程设置,越大读取数据越快,但是太大了也会报错,因此也要根据自己状况填小。电脑不行就填0.

这里的红框是我标注出来的几个重要的内容
–cfg是模型配置文件 是修改过的yolov5s.yaml文件
–data是参数配置文件 mydata.yaml文件放在data文件夹下
–batch-size 电脑不行就设置小一点
-cache 电脑不行 报错后设置默认为false 报错后解决办法
-workers 电脑不行设置为0
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第27张图片

终端进入环境后运行train.py文件

python train.py --epochs 10 

这样就是代码跑成功了
【YOLOv5】--详细版训练自己的数据集 保姆级学习日志记录 手把手教程_第28张图片

参考链接

【Yolov5】1.认真总结6000字Yolov5保姆级教程(全新版本2022.06.28)
yolov5训练自己的数据集(从零开始)
YOLOV5训练自己的数据集(踩坑经验之谈)
YOLOv5训练自己的数据集(超详细完整版)
Yolov5训练自己的数据集(详细完整版)
半小时搞定Yolov5安装配置及使用(详细过程)
YOLOv5超详细的入门级教程(训练篇)(二)——VOC2007模型复现

你可能感兴趣的:(目标检测,学习)