yolov5训练自己的数据集

1.制作数据集

1.1标注数据集

本人采用的是电力标识牌(200张图片)作为数据集,首先在电脑终端cmd输入labelimg,回车,打开标注软件

 

 左侧open dir选择数据集图片路径,change save dir是标签路径,文件格式选择yolo,也可以选择voc,然后通过脚本转换成yolo。本文直接采用yolo格式。连续打200张图片标注。

数据集文件dianlibiaoshipaiA的结构

1.2划分数据集

 接下来划分训练集和验证集,创建python脚本,路径为dianlibiaoshipaiA/split_train_val.py

# coding:utf-8

import os
import random
import argparse

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

读者可修改其中的两个路径即可,一个输入,一个输出

划分比例也可修改,本人采用0.9,也即训练集:验证集=9:1

运行脚本,可得

 

 

 表明数据集划分好了,接下来生成训练集和验证集路径,创建脚本,路径如下dianlibiaoshipaiA/hualujin.py

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

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

wd = getcwd()
for image_set in sets:
    if not os.path.exists('dianlibiaoshipaiA/Annotations'):
        os.makedirs('dianlibiaoshipaiA/Annotations')
    image_ids = open('dianlibiaoshipaiA/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()

    if not os.path.exists('dianlibiaoshipaiA/dataSet_path/'):
        os.makedirs('dianlibiaoshipaiA/dataSet_path/')

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

读者可修改绿色部分,运行结果

 

1.3 配置yaml文件

 最后,创建yaml文件,路径为dianlibiaoshipaiA/biaoshipai.yaml

train: dianlibiaoshipaiA/dataSet_path/train.txt
val: dianlibiaoshipaiA/dataSet_path/val.txt

# number of classes
nc: 1

# class names
names: ["signboard"]

最后检查utils/datasets.py文件

快捷键输入ctr+F,搜索框内输入如下

 修改训练图片和标签的文件名,与自己用的文件夹一一对应,笔者训练的图片文件名和标签名分别是train_images和 labels

否则在训练时会报如下错误

 

2. 训练

2.1 修改train.py

weights:预训练权重地址

data:数据集配置yaml地址

hyp:超参数配置yaml文件地址

adam:修改成store_false,采用adam优化器

其他参数可以自行调节

2.2 运行train.py

nohup python3 -u train.py  > log_file.txt &

输出权重,训练配置文件如下4幅图

 

 可视化训练过程

tensorboard --logdir=runs/train/exp

 

 3 验证

修改val.py,改data ,weights,运行python val.py

 

 

 4 预测

修改detect.py,改weights,source,运行detect.py 

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年8月8日
下一篇 2023年8月8日

相关推荐