YOLOv5训练⾃⼰的数据集(VOC格式的数据集和txt格式的数据集)
本⽂章主要介绍了两种数据集的准备,第⼀种是我只有VOC格式,这是需转txt。第⼆种是我只有txt格式的。
*
准备⼯作
环境:ubuntu18,虚拟环境python=3.8,CUDA=11.3(这是我的环境,其实根据yolov5官⽅需求就可以)
先把项⽬克隆:
git clone github/ultralytics/yolov5.git
在YOLOv5⽂件⾥打开终端,创建虚拟环境:
conda create -n yolov5 python=3.8
创建完成后:
conda activate yolov5
进⼊虚拟环境安装yolov5所需要的环境
pip install -i pypi.tuna.tsinghua.edu/simple -```
OK环境没问题了
开始准备数据咯
*⼀.第⼀种数据保存(VOC转txt):
**
1.在yolov5⽂件夹中创建my_data⽂件夹,⽬录结构如下
--my_data
--Annotations#保存的是⽤labelimage标注⼯具标注出来的.xml⽂件
--images#我们的数据集图⽚ .jpg
-
-ImageSets#之后会在该⽬录下创建Main⽂件,并⾃动⽣成,,和四个⽂件,存放训练集、验证集、测试集图⽚的名字(⽆后缀.jpg)
--Main#z在这⾥创建⼀个空的⽂件夹
开始创建Main下的txt⽂件路径
在my_data⽂件夹下出创建⼀个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='/home/lad/yolov5/my_data/Annotations',type=str,help='input xml label path')
#数据集的划分,地址选择⾃⼰数据下的ImageSets/Main
parser.add_argument('--txt_path', default='/home/lad/yolov5/my_data/ImageSets/Main',type=str,help='output txt label path')
opt = parser.parse_args()
trainval_percent =1.0
train_percent =0.9
xmlfilepath = l_path
txtsavepath = _path
total_xml = os.listdir(xmlfilepath)
if not ists(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 +'/','w')
file_test =open(txtsavepath +'/','w')
file_train =open(txtsavepath +'/','w')
file_val =open(txtsavepath +'/','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()
运⾏结束后,不出意外的在Main⽂件下⽣成四个txt⽂件
--Main
--#这个应该是空的,毕竟⼀般只⽤训练集和验证集(⼜名测试集),我不⽤这个test测试集。为了让数据更加多的参与训练
--
--
--
2.开始准备标签,把VOC的格式转成yolo的需要的格式,即xml转txt。
创建voc_label.py⽂件,将训练集、验证集、测试集⽣成label标签(训练中要⽤到),同时将数据集路径导⼊txt⽂件中,代码内容如下:
# -*- coding: utf-8 -*-
ElementTree as ET
import os
from os import getcwd
sets =['train','val','test']
classes =["crack0"]# 改成⾃⼰的类别
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('/home/lad/yolov5_hcb/my_data/Annotations/%s.xml'%(image_id), encoding='UTF-8')
out_file =open('/home/lad/yolov5_hcb/my_data/labels/%s.txt'%(image_id),'w')
tree = ET.parse(in_file)
root = t()
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:
python处理xml文件
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 ists('/home/lad/yolov5_hcb/my_data/labels/'):
os.makedirs('/home/lad/yolov5_hcb/my_data/labels/')
image_ids =open('/home/lad/yolov5_hcb/my_data/ImageSets/Main/%s.txt'%(image_set)).read().strip().split() list_file =open('paper_data/%s.txt'%(image_set),'w')
for image_id in image_ids:
list_file.write(abs_path +'/my_data/images/%s.jpg\n'%(image_id))
convert_annotation(image_id)
list_file.close()
运⾏后会⽣成如下labels⽂件夹和三个包含数据集的txt⽂件,其中labels中为不同图像的标注⽂件,等txt⽂件为划分后图像所在位置的绝对路径,如就含有所有训练集图像的绝对路径。
最后的数据集⽬录应该是:
--my_data
--Annotations
--images
--ImageSets
--Main#这⾥⾯有第⼀步⽣成的四个⽂件夹
--labels#刚⽣成的
--#刚⽣成的
--#刚⽣成的
--#刚⽣成的
3.配置⽂件
1.在yolov5⽬录下的data⽂件夹下新建⼀个ab.yaml⽂件(可以⾃定义命名),⽤来存放训练集和验证集的划分⽂件(和
<),这两个⽂件是通过运⾏voc_label.py代码⽣成的(就是上⾯备注:#刚⽣成的那三个),然后是⽬标的类别数⽬和具体类别列表,ab.yaml内容如下:
(不过注意发现冒号后⾯需要加空格,否则会被认为是字符串⽽不是字典)
train:/home/lad/yolov5/my_ # voclabel.py⽣成的的路径
val:/home/lad/yolov5/my_ # voclabel.py⽣成的的路径
# number of classes
nc:5
# class names
names:['a','b','c','d','e']
2.选择⼀个你需要的模型:⽐如就yolov5s吧
在models/yolov5s.yaml修改类别nc:
3.修改train.py
把这个对应的修改成我们为刚才的路径
以上参数解释如下:
epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不⾏你就调⼩点。
batch-size:⼀次看完多少张图⽚才进⾏权重更新,梯度下降的mini-batch,显卡不⾏你就调⼩点。
cfg:存储模型结构的配置⽂件
data:存储训练、测试数据的⽂件
img-size:输⼊图⽚宽⾼,显卡不⾏你就调⼩点。
rect:进⾏矩形训练
resume:恢复最近保存的模型开始训练
nosave:仅保存最终checkpoint
notest:仅测试最后的epoch
evolve:进化超参数
bucket:gsutil bucket
cache-images:缓存图像以加快训练速度
weights:权重⽂件路径
name: 重命名 to
device:cuda device, i.e. 0 or 0,1,2,3 or cpu
adam:使⽤adam优化
multi-scale:多尺度训练,img-size +/- 50%
single-cls:单类别的训练集
之后运⾏训练命令如下:
(路径依然改哦)
python train.py --img 640--batch 16--epoch 300--data data/ab.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --device '0'# 0号GPU
4.训练过程可视化
利⽤tensorboard可视化训练过程,训练开始会在yolov5⽬录⽣成⼀个runs⽂件夹,利⽤tensorboard打开即可查看训练⽇志,打开新的终端,命令如下:
tensorboard --logdir=路径/runs/expx --host=127.0.0.1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论