YOLOv11 OBB 任务介绍与数据集构建要求及训练脚本使用指南
YOLO(You Only Look Once)是一个高效且广泛应用于目标检测任务的深度学习框架。在目标检测任务中,传统的边界框(AABB)通过四个参数来定义目标的位置信息:中心坐标、宽度、高度以及目标的旋转角度。然而,这种方法在面对旋转物体时,往往无法准确描述目标的形状与位置,尤其是当物体被倾斜或旋转时。为了解决这一问题,YOLO引入了 定向边界框(OBB, Oriented Bounding Boxes),使得在旋转物体的检测中,能够更加精确地描述物体的位置和形状。
下面将详细介绍YOLO OBB任务的标注格式、数据集构建要求以及如何使用YOLOv11模型进行训练。我们将以YOLOv11 OBB模型为例,说明如何构建数据集并编写训练脚本,帮助您顺利完成定向目标检测任务。
YOLO OBB 任务简介
YOLOv11 OBB任务中文介绍页面:YOLOv11 OBB
OBB(定向边界框)与传统边界框的区别
传统的边界框(Axis-Aligned Bounding Box,简称AABB)是通过图像中的物体的中心坐标、宽度和高度来描述物体的位置。然而,这种方式不能很好地适应旋转物体的检测。尤其是当物体的姿态发生变化时,AABB会产生较大的误差,因为它仅仅是与坐标轴对齐的矩形。
YOLO OBB(定向边界框)则通过 四个角点 来定义物体的边界框,这样可以精确描述旋转或倾斜物体的边界。这使得YOLO OBB不仅可以检测普通物体,还能有效处理旋转的目标物体。
YOLO OBB 数据集标注格式
YOLO OBB 任务的标注格式与传统的 YOLO 边界框标注略有不同。YOLO OBB 使用四个角点的归一化坐标来描述目标物体的边界框。这些坐标是在 [0, 1] 范围内,相对于图像的宽度和高度进行归一化。
YOLO OBB 数据集标注格式:
class_index x1 y1 x2 y2 x3 y3 x4 y4
class_index
:物体类别的索引。通常是整数,从 0 开始。x1, y1, x2, y2, x3, y3, x4, y4
:目标物体四个角点的坐标,范围为 [0, 1],根据图像的宽度和高度进行归一化。
这些四个角点按顺时针或逆时针顺序排列,通常与物体的边缘一致。标注的精度决定了模型在训练过程中的准确性,因此标注时要特别小心,确保角点准确。
示例:
假设我们有一张包含倾斜飞机的图像,飞机的类别编号为 0
,其四个角点的归一化坐标分别为:
(x1, y1) = (0.1, 0.2)
(x2, y2) = (0.3, 0.2)
(x3, y3) = (0.3, 0.4)
(x4, y4) = (0.1, 0.4)
则该图像的标注行如下所示:
0 0.1 0.2 0.3 0.2 0.3 0.4 0.1 0.4
通过这种方式,YOLO OBB 能够在训练过程中有效地处理旋转物体,进而提高检测精度。
定向边框(OBB)数据集概述:定向边框(OBB)数据集概述
YOLO OBB 数据集构建要求
数据集格式
为了能够成功训练YOLO OBB模型,数据集必须符合特定的结构。通常,YOLO数据集包括两个部分:图像文件和对应的标签文件。对于YOLO OBB任务,标签文件应包含每个图像中目标物体的四个角点坐标。
数据集目录结构:
dataset/
├── images/
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ...
└── labels/
├── image1.txt
├── image2.txt
└── ...
images/
目录包含所有的图像文件。labels/
目录包含与图像文件一一对应的文本标注文件,每个文件的命名与图像文件相同,扩展名为.txt
。
每个标注文件(例如 image1.txt
)的内容应按照YOLO OBB格式编写。每一行代表一个目标物体,格式如下:
class_index x1 y1 x2 y2 x3 y3 x4 y4
数据集的配置文件(YAML格式)
YOLO要求使用YAML格式的配置文件来描述数据集。数据集配置文件应包含图像路径、类别名称等信息。
示例配置文件 dota8.yaml
:
train: /path/to/train/images
val: /path/to/val/images
nc: 1 # 类别数量
names: ['airplane'] # 类别名称
YOLO OBB 模型训练脚本
YOLO提供了一个简单的API来训练定向目标检测模型。以下是一个基于YOLOv11 OBB模型的训练脚本示例。该脚本使用了预训练的YOLOv11 OBB模型,并在自定义数据集上进行训练。
训练脚本说明
from ultralytics import YOLO
# 确保多进程只在主进程中启动
if __name__ == "__main__":
# 加载预训练的 YOLOv11-OBB 模型
model = YOLO("models/yolo11n-obb.pt") # 使用 YOLOv11 预训练模型(OBB)
# 训练模型
results = model.train(
data="ultralytics/cfg/datasets/airplane.yaml", # 数据集 YAML 配置文件
epochs=100, # 训练的轮数
imgsz=640, # 输入图片的大小
batch=16, # 批量大小
device=0, # 使用的设备,0表示使用GPU0,-1表示使用CPU
project='runs/train', # 训练结果保存路径
name='yolo11n_obb_custom', # 保存的实验名称
exist_ok=True, # 如果目录已存在,是否覆盖
augment=True, # 数据增强
rect=True, # 按矩形裁剪(适用于非方形图像)
workers=4, # 数据加载工作线程数量
)
# 训练结果
print(f"训练完成. 结果保存在: {results.save_dir}")
训练脚本说明:
-
加载模型:使用YOLOv11的预训练模型
yolo11n-obb.pt
。该模型已经在DOTA数据集上进行了预训练,适用于OBB任务。 -
训练数据:通过
data="ultralytics/cfg/datasets/airplane.yaml"
指定训练数据集的路径和格式。 -
训练参数:
epochs=100
:训练轮数设置为100轮。imgsz=640
:输入图像的大小为640x640。batch=16
:每批次训练的图像数量为16。device=0
:指定使用GPU0进行训练,-1
表示使用CPU。
-
训练设置:
project='runs/train'
:训练结果将保存到runs/train
路径下。name='yolo11n_obb_custom'
:设置训练实验的名称。exist_ok=True
:如果保存路径已存在,允许覆盖。augment=True
:开启数据增强。rect=True
:采用矩形裁剪模式,以适应非方形图像。workers=4
:使用4个工作线程加载数据。
训练过程与结果
运行脚本后,训练过程将在命令行输出训练进度和结果。最终,训练好的模型会保存在指定的 results.save_dir
路径下。
YOLO OBB(定向边界框)任务通过四个角点来描述目标物体的边界框,相较于传统的AABB方法,能够更精确地处理旋转物体的检测任务。通过构建符合YOLO OBB格式的数据集并编写训练脚本,您可以使用YOLOv11模型在自定义数据集上进行训练,从而实现高效、精确的定向目标检测。