文章目录
YOLOv5训练长方形图像详解
一、引言
YOLOv5 是一种高效的目标检测算法,广泛应用于各种图像识别任务。然而,当处理长方形图像时,可能会遇到一些特殊问题,如图像尺寸不匹配、标注不准确等。本文将详细介绍如何在 YOLOv5 中训练长方形图像,确保模型能够准确地检测和识别目标。
二、数据集准备
1、创建文件夹结构
首先,需要在 YOLOv5 根目录下创建一个文件夹 VOCData
,并在其中创建以下子文件夹:
images
:存放待标注的图像文件(JPG格式)。Annotations
:存放标注后的文件(采用 XML 格式)。
plaintext
VOCData/
├── images/ # 存放图像文件
├── Annotations/ # 存放标注文件
2、标注图像
使用在线标注工具如 MAKE SENSE 进行标注。标注完成后,将标注文件保存为 XML 格式,并存放在 Annotations
文件夹中。
3、生成标注文件
创建 voc_label.py
文件,将训练集、验证集、测试集生成 YOLO 格式的标注文件,并将数据集路径导入到 train.txt
和 val.txt
文件中。代码如下:
python
import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = ['train', 'val', 'test']
classes = ["class1", "class2"] # 根据实际情况修改类别名称
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]
return x * dw, y * dh, w * dw, h * dh
def convert_annotation(image_id):
in_file = open('VOCData/Annotations/%s.xml' % (image_id), encoding='UTF-8')
out_file = open('VOCData/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
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')
in_file.close()
out_file.close()
wd = getcwd()
for image_set in sets:
if not os.path.exists('VOCData/labels/'):
os.makedirs('VOCData/labels/')
image_ids = open('VOCData/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
list_file = open('VOCData/dataSet_path/%s.txt' % (image_set), 'w')
for image_id in image_ids:
list_file.write(wd + '/VOCData/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
三、配置文件
1、创建数据集配置文件
在 YOLOv5 目录下的 data
文件夹下新建一个 myvoc.yaml
文件,内容如下:
yaml
train: D:/Yolov5/yolov5/VOCData/dataSet_path/train.txt
val: D:/Yolov5/yolov5/VOCData/dataSet_path/val.txt
# number of classes
nc: 2
# class names
names: ["class1", "class2"]
确保路径和类别名称与实际情况一致。
2、选择模型配置文件
YOLOv5 有多种配置文件,如 yolov5s.yaml
、yolov5m.yaml
、yolov5l.yaml
和 yolov5x.yaml
。选择一个合适的配置文件,例如 yolov5x.yaml
,并将其复制到 models
文件夹中,重命名为 ddjc_model.yaml
,然后修改 nc
为实际的类别数。
四、训练模型
1、修改训练参数
在 train.py
文件中,找到 def parse_opt(known=False)
函数,修改训练参数。例如:
python
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5x', help='initial weights path')
parser.add_argument('--cfg', type=str, default=ROOT / 'models/ddjc_model.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/myvoc.yaml', help='dataset.yaml path')
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
parser.add_argument('--epochs', type=int, default=50)
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--device', default='cuda', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
2、开始训练
在终端中运行以下命令开始训练:
bash
python train.py --img 640 --batch 16 --epochs 50 --data data/myvoc.yaml --cfg models/ddjc_model.yaml --weights yolov5x.pt --name ddjc_model
五、使用示例
1、测试模型
训练完成后,可以使用 detect.py
文件进行测试。例如:
bash
python detect.py --weights runs/train/ddjc_model/weights/best.pt --img 640 --conf 0.25 --source data/images
2、评估模型
使用 val.py
文件评估模型性能:
bash
python val.py --weights runs/train/ddjc_model/weights/best.pt --data data/myvoc.yaml --img 640
六、总结
本文详细介绍了如何在 YOLOv5 中训练长方形图像,包括数据集准备、标注、配置文件设置和模型训练。通过这些步骤,可以确保模型能够准确地检测和识别长方形图像中的目标。希望本文对您有所帮助。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章: