YOLOv5是一种基于深度学习的目标检测算法,可以用于识别图像或视频中的物体。为了训练一个高质量的YOLOv5模型,需要进行以下步骤:
-
数据采集:收集包含要检测的物体的图像和视频数据集。这些数据应该具有多样性,包括不同的光照条件、背景和角度等。
-
数据预处理:对数据进行预处理,如调整大小、裁剪、旋转、翻转等,以增加数据集的多样性和数量。
-
标注数据:对数据进行标注,即在图像中标记出要检测的物体位置和类别。可以使用各种工具来完成这项任务,如LabelImg、CVAT等。
-
数据划分:将数据集分成训练集、验证集和测试集。通常使用80%的数据作为训练集,10%作为验证集,10%作为测试集。
-
模型选择:选择适合的YOLOv5模型,如YOLOv5s、YOLOv5m、YOLOv5l或YOLOv5x,根据数据集的大小和复杂程度来选择。
-
模型训练:使用训练集对模型进行训练,调整模型参数以提高准确性和召回率。可以使用开源框架如PyTorch或TensorFlow进行训练。
-
模型评估:使用验证集对模型进行评估,计算准确率、召回率、F1分数等指标,以确定模型的性能。
-
模型优化:根据评估结果对模型进行优化,可尝试调整模型参数、增加数据集、改变数据预处理方式等。
-
模型测试:使用测试集对模型进行测试,评估其在新数据上的表现。
总之,YOLOv5的数据采集和训练需要仔细规划和执行,以获得高质量的目标检测模型。
今天就讲讲怎么在自己的数据集上对模型进行训练。
采集数据以及标注
在开始前得准备好自己需要的数据图片,然后将要标注的图片存放在yolov5的data文件夹的images文件夹中(在这里我准备的是农夫山泉矿泉水的图片)如下图所示:
接着在data文件夹下新建两个文件,一个是dataset、一个是labels, dataset用来储存标注好的图片数据,labels用来存放数据标签。
一切准备好就可以标注图片了,我是用labelimg这个标图工具进行标注(labeling可自行在终端下载:pip install labelimg),下载后完成后在终端输入labelimg按回车启动labelimg,会弹出一个界面如图所示:
出现此界面
先勾选自动保存
点击选择文件夹后就会出现图片就可以进行标注了
标完后就可以在dataset文件夹中看到和图片一一对应的xml.文件,这就是已经打好的标签。
数据预处理和源代码的修改
在工程文件下新建一个split的python程序
split代码如图所示,运行此代码
import os
import random
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--xml_path', default='data/dataset', type=str, help='input xml label path')
parser.add_argument('--txt_path', default='data/labels', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 1.0
train_percent = 0.8 #训练集
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()
再在python文件下创建名为xml_to_txt的python文件
xml_to_txt代码如图所示,在运行此代码之前需要修改classes的内容,这里我之前标注的图片的名称名为“water” ,所以得改为classes = [ 'water' ],再运行
import xml.etree.ElementTree as ET
from tqdm import tqdm
import os
from os import getcwd
sets = ['train', 'val', 'test']
classes = ['water'] # 这里改为你要训练的标签,否则会报错。比如你要识别“hand”,那这里就改为hand
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):
# try:
in_file = open('data/dataset/%s.xml' % (image_id), encoding='utf-8')
out_file = open('data/labels/%s.txt' % (image_id), 'w', encoding='utf-8')
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
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')
# except Exception as e:
# print(e, image_id)
wd = getcwd()
for image_set in sets:
if not os.path.exists('data/labels/'):
os.makedirs('data/labels/')
image_ids = open('data/labels/%s.txt' %
(image_set)).read().strip().split()
list_file = open('data/%s.txt' % (image_set), 'w')
for image_id in tqdm(image_ids):
list_file.write('data/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
以上步骤全部完成后再新建一个名为myvoc的yaml文件,具体步骤找到data文件右键单击点击New再点击File创建完成。点开这个yaml文件,输入以下代码,同时在names: [ 'water' ]也要输入训练的标签water,nc为训练几个标签类别就输入几个,这里我只要训练一个标签就输1。
注:在train,val,nc,names冒号后面一定要空一格
train: data/train.txt
val: data/val.txt
# number of classes
nc: 1
#class names
names: ['water']
最后一步需要修改的是models下的yolov5s.yaml文件
训练数据
打开终端进入到自己yolov5的工程目录下,输入命令:python train.py --epoch 300 --batch 4 --data ./data/myvoc.yaml --cfg ./models/yolov5s.yaml --weight ./weights/yolov5s.pt --workers 0 开始训练。
看到以下界面就是已经开始训练了
训练完成后找到runs文件下最新的exp文件下的的last.pt文件(如图所示,训练结束后会显示文件路径地址,找到即可),将last.pt文件复制粘贴到weights文件下
以上就是全部内容,希望对你们有帮助。