首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于YOLOv8-OBB旋转目标检测数据集与模型训练

基于YOLOv8-OBB旋转目标检测数据集与模型训练

作者头像
老周聊架构
发布2025-12-24 14:37:43
发布2025-12-24 14:37:43
3590
举报

一、准备训练数据集

1.1 YOLOv8 数据集的格式

YOLOv8 对数据集有明确的格式要求,图像文件通常是 jpg、png 等图像格式,其标准结构可概括为三级目录体系与镜像式文件映射。以下为结构化说明:

代码语言:javascript
复制
数据集根目录/
├── images/            # 图像存储主目录
│   ├── train/         # 训练集图像 (必须存在)
│   │   ├── img1.jpg
│   │   └── img2.jpg
│   └── val/           # 验证集图像 (必须存在)
│       ├── img3.jpg
│       └── img4.jpg
│
├── labels/            # 标注文件主目录
│   ├── train/         # 训练集标注 (与images/train一一对应)
│   │   ├── img1.txt
│   │   └── img2.txt
│   └── val/           # 验证集标注 (与images/val一一对应)
│       ├── img3.txt
│       └── img4.txt
│
└── test_images/       # 测试集图像 (可选)
    ├── test1.jpg
    └── test2.jpg

1.2 标注文件的格式

YOLO格式的标注文件通常是一个文本文件,每一行代表一个目标物体的标注信息。 标注信息通常包含类别编号、目标中心横坐标(相对于图像宽度)、目标中心纵坐标(相对于图像高度)、目标宽度(相对于图像宽度)和目标高度(相对于图像高度),具体格式如下:

代码语言:javascript
复制
<object-class-id> <x> <y> <width> <height>

其中:

  • 是目标对象的类别编号,整数表示。
  • 和是目标中心位置的坐标,经过归一化处理(即目标的真实x、y值除以图像的宽度和高度),是小于1的浮点数。
  • 和是目标的宽度和高度(同样经过归一化处理),也是小于1的浮点数。

例如,一行标注信息为 “0 0.5 0.6 0.3 0.4”,其中“0”表示类别编号,后面的数字表示目标在图像中的位置和大小信息‌。

但老周这里是YOLO-OBB(Oriented Bounding Box),与上面标准检测任务(水平框)的关键差异在于需要表示旋转框的几何信息:

标注文件仍为文本文件(.txt),每行描述一个旋转目标,格式为:

代码语言:javascript
复制
<class_id> <x1> <y1> <x2> <y2> <x3> <y3> <x4> <y4>

字段

含义

范围

class_id

目标类别索引(整数,从0开始)

0,1,2,...

x1, y1

旋转框第一个角点的归一化坐标(相对于图像宽度/高度)

[0.0, 1.0]

x2, y2

旋转框第二个角点的归一化坐标

[0.0, 1.0]

x3, y3

旋转框第三个角点的归一化坐标

[0.0, 1.0]

x4, y4

旋转框第四个角点的归一化坐标

[0.0, 1.0]

坐标归一化计算:

假设图像宽度为 W,高度为 H,实际像素坐标为 (px, py),则归一化坐标为:

代码语言:javascript
复制
x_normalized = px / W
y_normalized = py / H

1.2 下载 YOLOv8 数据集

这里老周说明下,我本来是自定义数据集来训练,要很多时间去做标注,我这里直接用网上提供好的数据集来训练。

下面来介绍下这款工具:

Roboflow Annotate:YOLO数据集构建与管理工具

Roboflow Annotate 是一款专为计算机视觉任务设计的在线协作标注平台,其核心优势包括:

  • 跨平台标注支持:支持多边形、旋转框(OBB)、关键点等复杂标注类型,适配YOLO系列格式导出。
  • 自动化格式转换:一键将原始数据集(COCO、Pascal VOC等)转换为YOLOv5/v7/v8/OBB格式。
  • 数据增强与版本管理:提供实时数据增强(旋转、裁剪、亮度调整)及数据集版本控制功能。

本文选择 水族馆数据集(Aquarium Dataset),该数据集标记了 7 个类别:鱼类(fish)、水母(jellyfish)、企鹅(penguins)、鲨鱼(sharks)、海雀(puffins)、黄貂鱼(stingrays)和海星(starfish)。大多数图像包含多个边界框。

Roboflow 提供了多种下载格式,主要是数据集组织和标注格式的区别。老周这里以YOLOv8-OBB 格式导出,如下图所示。

在这里插入图片描述
在这里插入图片描述

选择 YOLOv8-OBB 格式,下载水族馆数据集(Aquarium Dataset)。

在这里插入图片描述
在这里插入图片描述

1.3 整理 YOLOv8 数据集

YOLOv8 模型训练对于格式的要求非常严格:数据集要保存在项目的指定路径 datasets 下,并按照

1.3.1 据集要保存在项目的指定路径 datasets 下,并按下面的格式组织样本图片和标签。

代码语言:javascript
复制
- yolov8
   - datasets
      - Aquarium
         - images
            - test
            - train
            - val
         - labels
            - test
            - train
            - val
         - dataAquarium.yaml
   - ultralytics
   - yolov8n.pt

把这数据集放到 YOLO源码里,目录结构如下:

在这里插入图片描述
在这里插入图片描述

1.3.2 编写数据集配置文件 YAML 文件( .yaml)。

YOLO 模型训练时,要调用数据集配置文件 YAML 文件( .yaml),指定数据集的路径和分类类别。

在 YOLOv8 项目中,提供了多个数据集配置文件,例如“\YOLOv8\ultralytics\cfg\datasets\coco8.yaml” 可供参考。

根据Aquarium Dataset 数据集配置文件 data.yaml ,编写本项目的数据集配置文件 dataAquarium.yaml,保存到数据集的根目录,内容如下。

代码语言:javascript
复制
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Aquarium dataset 
# parent
# ├── ultralytics
# └── datasets
#     └── Aquarium

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /Users/Riemann/Code/Workspace/AI/YOLO8/datasets/Aquarium  # dataset root dir
train: images/train  # train images (relative to 'path')
val: images/val  # val images (relative to 'path')
test:  # test images (optional)

# Classes
names:
  0: fish
  1: jellyfish
  2: penguin
  3: puffin
  4: shark
  5: starfish
  6: stingray

二、YOLOv8 自定义数据集的训练

2.1 载 YOLOv8 预训练模型

在 YOLO/GitHub 项目仓,提供了检测(Detection)、分类(Classification)、分割(Segmentation)、姿态估计(Pose)、定向边界框检测(OBB)等任务的预训练模型。YOLOv8 有多个不同规模的模型,从小到大依次是:YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x。这些模型与各种操作模式兼容,包括推理、验证、训练和导出,便于在部署和开发的不同阶段使用。

由于 YOLO 更新频繁,预训练模型的入口不容易找,现将下载地址列表如下。

代码语言:javascript
复制
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-pose.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-pose.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-pose.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-pose.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-pose.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-seg.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-seg.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-seg.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-seg.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-seg.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-cls.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-cls.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-cls.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-cls.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-cls.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-obb.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-obb.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-obb.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-obb.pt
https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-obb.pt

本文选择 yolov8n-obb.pt,载完成后,将下载的预训练模型文件 yolov8n-obb.pt 放在 YOLO8 项目的根目录路径下,例如 “/Users/Riemann/Code/Workspace/AI/YOLO8”。

2.2 命令行(CLI)接口的模型训练

YOLOv8 支持使用命令行接口(command line interface, CLI)对模型进行训练、验证或运行推断。

YOLOv8 命令行接口(CLI)方便在各种任务和版本上训练、验证或推断模型,不需要定制或代码,可以使用 yolo 命令从终端运行所有任务。

语法:

代码语言:javascript
复制
yolo task=detect    mode=train    model=yolov8n.yaml      args...
          classify       predict        yolov8n-cls.yaml  args...
          segment        val            yolov8n-seg.yaml  args...
                         export         yolov8n.pt        format=onnx  args...

使用 Aquarium 数据集进行模型训练的具体操作步骤如下:

  • 使用 miniconda Prompt 命令行,或使用 PyCharm 的命令行窗口;
  • 激活 YOLO8 虚拟环境;
  • 输入如下命令就可以进行模型训练。注意其中的 model 和 data 的文件路径与用户的具体设置有关。
代码语言:javascript
复制
yolo task=obb mode=train model=./yolov8n-obb.pt data=/Users/Riemann/Code/Workspace/AI/YOLO8/datasets/Aquarium/dataAquarium.yaml epochs=10 workers=1 batch=16

我刚开始用上面的指令去训练,效果不太行,所以我优化了下:

代码语言:javascript
复制
yolo task=obb mode=train \
    model=./yolov8n-obb.pt \
    data=/Users/Riemann/Code/Workspace/AI/YOLO8/datasets/Aquarium/dataAquarium.yaml \
    epochs=10 \
    imgsz=512 \          # 降低分辨率以加速计算
    batch=32 \           # 增大批次但需确保不OOM
    device=mps \
    workers=6 \          # 根据CPU物理核心数调整(建议核心数*0.75)
    optimizer=AdamW \    # 替代默认SGD以加速收敛
    lr0=0.001 \          # AdamW建议更小的初始学习率
    cos_lr=True \        # 余弦学习率调度加速收敛
    amp=True \           # 启用混合精度训练(MPS兼容性需验证)
    cache=ram \          # 缓存数据集到内存减少IO延迟
    patience=3 \         # 早停机制避免无效训练
    project=aquarium-obb \
    name=train_v2

注意:

  • 必须先激活 YOLO 虚拟环境。
  • 当前路径必须是 YOLOv8 项目所在的目录,例如 “/Users/Riemann/Code/Workspace/AI/YOLO8”。
  • 预训练模型 yolov8n.pt 必须保存在模型配置参数 “model” 指定的路径。例如,如果预训练模型保存在 “/Users/Riemann/Code/Workspace/AI/YOLO8/yolov8n-obb.pt”,则将模型配置参数修改为 “model=./yolov8n-obb.pt”。
  • 训练好的模型及训练日志保存在 “.\runs\obb\train” 目录下。

运行结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 3 使用 Python 接口的模型推理

YOLOv8 也提供了 Python 接口的调用方式。它提供了加载和运行模型以及处理模型输出的函数。该界面设计易于使用,以便用户可以在他们的项目中快速实现目标检测。

使用 Aquarium 数据集进行模型训练的 Python 参考例程如下。

代码语言:javascript
复制
from ultralytics import YOLO

if __name__ == '__main__':
   # 创建 YOLO 模型对象,加载指定的模型配置
   model = YOLO('./ultralytics/cfg/models/v8/yolov8-obb.yaml')
   # 加载预训练的权重文件,加速训练并提升模型性能
   model.load('yolov8n-obb.pt')
   # 用指定数据集训练模型
   model.train(data="./datasets/Aquarium/dataAquarium.yaml",  # 指定训练数据集的配置文件路径
               cache=False,  # 是否缓存数据集以加快后续训练速度
               imgsz=640,  # 指定训练时使用的图像尺寸
               epochs=100,  # 设置训练的总轮数为100轮
               batch=16,  # 设置每个训练批次的大小为16
               close_mosaic=10,  # 设置在训练的最后 10 轮中关闭 Mosaic 数据增强
               workers=4,  # 设置用于数据加载的线程数为4
               device='0',  # 指定使用的 GPU 设备
               optimizer='SGD'# 设置优化器为SGD(随机梯度下降)
               )

2.4 模型训练参数说明

YOLOv8 在默认配置文件 “./ultralytics/cfg/default.yaml” 中给出了模型训练参数的说明。

在这里插入图片描述
在这里插入图片描述

2.5 训练结果文件说明

训练日志的图表对于评估和理解模型的性能非常重要,可以帮助我们分析模型的优势和弱点。

  • weights 文件夹
    • best.pt:损失值最小的模型文件
    • last.pt:训练到最后的模型文件
  • args.yaml:模型训练的配置参数
  • confusion_matrix.png:混淆矩阵,展示了分类模型的性能。 每一行代表模型预测的类别,每一列代表实际的类别。对角线上的数值表示模型正确预测的数量。对角线上较深的颜色表示该类别预测正确的数量较多。
  • confusion_matrix_normalized.png:标准化混淆矩阵,显示每个类别的预测正确比例。
  • F1_curve.png:F1-置信度曲线,显示了F1得分随着置信度阈值的变化。 F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。
  • labels.jpg:标签分布图和边界框分布图。 柱状图显示了不同类别的实例分布数量。散点图则展示了目标检测任务中边界框的空间分布情况,反映了常见的尺寸和长宽比。
  • labels_correlogram.jpg:标签相关图 相关图提供了不同类别标签之间的关系,以及它们在图像中位置的相关性。这有助于理解模型在识别不同类别时可能出现的关联或混淆。
  • P_curve.png:精确度-置信度曲线,展示了模型预测的精确度随着置信度阈值的变化。 精确度是模型预测正确正例与预测为正例总数的比值。
  • PR_curve.png:精确度-召回曲线,展示了模型的精确度与召回率之间的关系。 理想情况下,模型应在精确度和召回率之间保持良好的平衡。
  • R_curve.png:召回-置信度曲线,显示了模型的召回率随置信度阈值的变化。 召回率是模型正确预测的正例与实际正例总数的比值。
  • results.png 和 results.csv:训练结果图表和数据 展示了模型在训练过程中的性能变化,包括损失函数的变化和评估指标(如精确度、召回率和mAP)的变化。

三、模型验证与模型预测

3.1 模型验证

训练后验证。

  • 将训练好的模型 best.pt 保存在项目的根目录,并改名为 “yolov8nObbAquarium.pt”。
  • 模型验证程序如下。
代码语言:javascript
复制
yolo task=obb mode=val \
    model=/Users/Riemann/Code/Workspace/AI/YOLO8/yolov8nObbAquarium.pt \
    data=/Users/Riemann/Code/Workspace/AI/YOLO8/datasets/Aquarium/dataAquarium.yaml \
    epochs=10 \
    device=mps \
    batch=8 \
    workers=4
  • 运行模型验证程序,结果保存在 “.\runs\detect\val” 文件夹。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 模型预测

训练后验证。

  • 将训练好的模型 best.pt 保存在项目的根目录,并改名为 “yolov8nObbAquarium.pt”。
  • 模型预测程序如下。

参数 source 可以是一个或多个图片文件,一个视频文件,也可以是一个文件夹,或视频采集设备。

代码语言:javascript
复制
from ultralytics import YOLO

if __name__ == '__main__':
    # 读取模型,传入训练好的模型
    model = YOLO('yolov8nObbAquarium.pt')
    outputs = model.predict(source="./datasets/Aquarium/images/val", save=True)  # treat predict as a Python generator
    for output in outputs:
        # each output here is a dict.
        # for detection
        print(output["det"])  # np.ndarray, (N, 6), xyxy, score, cls
  • 运行模型预测程序,结果保存在 “.\runs\detect\predict” 文件夹。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老周聊架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、准备训练数据集
  • 二、YOLOv8 自定义数据集的训练
  • 三、模型验证与模型预测
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档