(win10)yolov5训练自己的数据集

文章浏览阅读756次。该文详细介绍了在Windows10系统上,利用YOLOv5框架进行目标检测训练的步骤,包括环境配置、Python包安装、数据集标注、训练集验证集测试集划分、创建配置文件以及训练模型等过程。特别提到了使用特定的标注工具简化XML转换,并提供了处理训练问题的建议。

目录

环境:

python包的配置

文件夹路径

标注数据

获取电脑/视频里的图片

开始标记数据

划分划分训练集、验证集、测试集

把相应的文件路径存入txt文件中,xml转为txt

创建配置文件

聚类获得先验框

开始训练

运行文件:

用gpu训练

查看cuda版本

​编辑

安装pytorch

训练

问题

如果出现 (页面太小,无法完成操作)的相关问题

参考文章:

环境:

  • windows 10
  • yolov5的源文件(链接yolov5
  • 标注工具(链接标注

python包的配置

打开pycharm的终端

运行

1
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

文件夹路径

在data文件中创建一个VOCData文件

进入VOCData文件夹里面创建一个Annotations文件夹用于放置你标记的数据集的数据xml或者是txt,再在VOCData文件夹里面创建一个images的文件夹里面用于放你的训练的图片

先创建好,有没有还没有关系。

标注数据

接下来就是标注数据集了

打开上面的标注数据的工具(原来用于dnf挂机的脚本工具,用了发现他的自动截图功能不错,而且标记出来的数据labels可以直接用,不用xml转txt了)

获取电脑/视频里的图片

打开自动截图

要设置区域可以按照上面的文字来设置截图区域

然后开启全屏,之后直接ctrl+q键开始截图就行了(默认时间是3秒自动截图一次)

默认是png,我用的jpg,为了防止后面代码报错,最好也改成这个吧

截图文件在软件目录下的的"截图"文件夹

开始标记数据

点击"打开图库"

把刚刚 截图的图片给复制进去

然后重启一次软件就可以开始标记了

需要注意的是最后要把没有任何标记的图片删除,以防后面执行代码时报错

划分划分训练集、验证集、测试集

在data/VOCData文件目录下面创建一个py文件(名字随意,认得出来就行)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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()

然后在data/VOCData/ImageSets/Main目录下可以看到三个文件,就是划分的数据集合

把相应的文件路径存入txt文件中,xml转为txt

因为是用刚刚的应用程序来标注的图片文件所以就不需要把xml转为yolo格式的文件了

在VOCData目录下创建一个py文件(名称随意)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import os
from os import getcwd

abs_path = os.getcwd()
print(abs_path)
wd = getcwd()
for image_set in sets:
    image_ids = open('D:/yolov5/data/VOCData/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()

    if not os.path.exists('D:/yolov5/data/VOCData/dataSet_path/'):
        os.makedirs('D:/yolov5/data/VOCData/dataSet_path/')

    list_file = open('dataSet_path/%s.txt' % (image_set), 'w')
    # 这行路径不需更改,这是相对路径
    for image_id in image_ids:
        list_file.write('D:/yolov5/data/VOCData/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

这样就会在VOCData下出现这样一个文件夹

打开

里面有各个文件的路径(因为没有划分test文件所以打开test.txt是空的)

最后需要把data/VOCData/Annotations的文件移到文件夹labels文件夹中(没有文件夹就自己创建)

创建配置文件

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

内容是:

1
2
3
4
5
6
7
8
9
train: D:/yolov5/data/VOCData/dataSet_path/train.txt
val: D:/yolov5/data/VOCData/dataSet_path/val.txt
#文件的绝对路径(要改,注意是斜杠不是反斜杠)
#如果划分了test数据也需要加上去
# number of classes
nc: 2          #类别个数(要改)

# class names
names: ["light", "post"] #类别(要改)

聚类获得先验框

因为什么提供的yolo版本很新所以一定在yolov5/utils下有 autoanchor.py文件(不用运行)

在model的文件夹中选择一个模型配置文件我选择的是yolov5s.yaml

官方的表格:

打开yolov5s.yaml

把nc的值改成标注的种类个数就行了

开始训练

打开根目录的train.py

有很多的数据

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:单类别的训练集

运行文件:

1
python train.py --weights weights/yolov5s.pt  --cfg models/yolov5s.yaml  --data data/myvoc.yaml --epoch 200 --batch-size 8 --img 640   --device cpu

用gpu训练

查看cuda版本

首先看看自己的gpu型号(a卡跑不了ai)

输入

1
nvidia-smi

选择高于他的版本的pytorch

安装pytorch

打开pytorch官网

PyTorch

把这个117改成你要安装的版本11.6就改成116

训练

最后开始训练

其实就是把–device的值改一下

打开任务管理器——性能

0号gpu就写–device 0

1
python train.py --weights weights/yolov5s.pt  --cfg models/yolov5s.yaml  --data data/myvoc.yaml --epoch 200 --batch-size 8 --img 640   --device cpu

问题

如果出现 (页面太小,无法完成操作)的相关问题

打开train.py

降低线程 –workes (默认是8) 。最后再试试调小 –batch-size,降低 –epoch

然后把刚刚运行的命令改一下参数我把worker改成1才可以跑

参考文章:

文章链接