yolov12-obb训练自己的数据集

yolov12-obb训练自己数据集

YOLO12 引入了一种以注意力为中心的架构,它不同于以往YOLO 模型中使用的基于 CNN 的传统方法,但仍保持了许多应用所必需的实时推理速度。该模型通过对注意力机制和整体网络架构进行新颖的方法创新,实现了最先进的物体检测精度,同时保持了实时性能。

数据集准备

roLabelImg.exe标注软件标注数据集
数据集文件夹格式为:
yolov12-level2
//images
…train
…val
…test
//labels
…train_original
…val_original
此处的标签为txt格式,需要将xml转txt。可参考yolov8-obb数据集制作

yolov12工程obb训练适配

yolov12工程位置:链接: link
将工程下载下来,然后添加自己的文件。
1、 在工程下新建dota2obbdata.py
两处路径修改为自己的路径。

// A code block

import sys
 
sys.path.append('/mnt/data/ysbo/python_examples/YOLOV12-MAIN/ultralytics')
 
from ultralytics.data.converter import convert_dota_to_yolo_obb
#==========level1=================================
# convert_dota_to_yolo_obb('/mnt/data2/ysbo/data/PuAn/level1/yolov12-level1/')
#========level2===================================
convert_dota_to_yolo_obb('/mnt/data2/ysbo/data/PinWei/1202-level1/2-min-pix/yolov12-level2/')

2、修改 ./yolo12-main/ultralytics/data/converter.py
修改line 458 将类别修改为自己的
修改 line 524 图像后缀

3、在./yolo12-main/ultralytics/cfg/datasets/中添加my-obb.yaml文件。my-obb.yaml内容如下:

// A code block
#==============level2=========================
path: /mnt/data/ysbo/python-example/yolo12-main/yolov12-level2 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images

# Classes for DOTA 1.0
names:
#================level=================
  0: person
  1: head
  2: ununiform
  3: helment
  4: uniform
  5: fire
  6: extinguisher
  7: smoke
  8: upsleeve

4、在./yolo12-main/ultralytics/cfg/models/v12/中添加yolov12-obb.yaml,修改其中的类别数。yolov12-obb.yaml内容如下:

// A code block
 # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# YOLO12-obb Oriented Bounding Boxes (OBB) model with P3/8 - P5/32 outputs
# Model docs: https://docs.ultralytics.com/models/yolo12
# Task docs: https://docs.ultralytics.com/tasks/obb

# Parameters
nc: 9 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo12n-obb.yaml' will call yolo12-obb.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 287 layers, 2,673,955 parameters, 2,673,939 gradients, 6.9 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 287 layers, 9,570,275 parameters, 9,570,259 gradients, 22.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 307 layers, 21,048,003 parameters, 21,047,987 gradients, 71.8 GFLOPs
  l: [1.00, 1.00, 512] # summary: 503 layers, 27,299,619 parameters, 27,299,603 gradients, 93.4 GFLOPs
  x: [1.00, 1.50, 512] # summary: 503 layers, 61,119,939 parameters, 61,119,923 gradients, 208.6 GFLOPs

# YOLO12n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 4, A2C2f, [512, True, 4]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 4, A2C2f, [1024, True, 1]] # 8

# YOLO12n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, A2C2f, [512, False, -1]] # 11

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, A2C2f, [256, False, -1]] # 14

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 11], 1, Concat, [1]] # cat head P4
  - [-1, 2, A2C2f, [512, False, -1]] # 17

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 8], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 20 (P5/32-large)

  - [[14, 17, 20], 1, OBB, [nc, 1]] # Detect(P3, P4, P5)

5、运行python dota2obbdata.py
此时在数据集文件夹./labels/下会生成train、val两个标签文件夹。
6、开始训练:
这里需要说明一下,官方yolov12 obb模型链接为yolo11n-obb.pt ,原本以为不能用,最后下载下来,可以进行训练。

yolo obb train data=./yolo12-main/ultralytics/cfg/datasets/my-obb.yaml model=yolo11n-obb.pt epochs=100 imgsz=640 device=0 batch=2

在这里插入图片描述

7、测试
yolo obb predict model=./yolo12-main/runs/obb/train3/weights/best.pt source=./yolo12-main/test_img/001.jpg
结果是对的,涉及到项目,这里就不贴图像了。

8、工程地址:
链接: https://github.com/YSYS101010000/YOLOV12-OBB

### YOLOv12 中的 Oriented Bounding Box 实现与使用 YOLOv12 是一种先进的目标检测框架,在其前代版本的基础上进行了多项改进,其中包括对定向边界框(Oriented Bounding Box, OBB)的支持。这种功能允许模型不仅能够检测物体的位置和大小,还能预测它们的方向角度,从而实现更高精度的目标定位。 #### 1. **Oriented Bounding Box 的基本原理** 传统的轴对齐边界框(Axis-Aligned Bounding Box, AABB)仅能表示矩形区域的宽度和高度,而无法捕捉旋转信息。相比之下,OBB 能够通过额外的角度参数来描述物体的姿态[^1]。这使得它在处理诸如无人机航拍图像、卫星遥感数据以及工业场景下的复杂形状物体时尤为重要。 为了支持这一特性,YOLOv12 对网络架构做了如下调整: - 输出层增加了用于回归角度值的分支; - 数据标注阶段需提供每条记录对应的角度标签; - 损失函数引入了针对角度误差的新项以优化训练过程。 ```python import torch.nn as nn class OBBDetectionHead(nn.Module): def __init__(self, num_classes=80): super(OBBDetectionHead, self).__init__() self.num_classes = num_classes # 增加角度预测部分 self.angle_pred = nn.Conv2d(256, 1, kernel_size=3, padding=1) def forward(self, x): angle_output = self.angle_pred(x) # 预测角度 return angle_output ``` 上述代码片段展示了如何扩展标准检测头以便输出角度信息[^2]。 #### 2. **实施细节** ##### (a) 数据准备 要利用 OBB 功能,必须准备好包含角度字段的数据集。通常情况下,这些数据会采用五元组形式存储:`[cx, cy, w, h, θ]` ,其中 `θ` 表示相对于水平线逆时针旋转的角度。 ##### (b) 训练流程 由于新增了一个维度上的学习任务——即角度估计,因此需要重新设计损失计算逻辑。常用的策略是结合 Smooth L1 Loss 和 Cosine Similarity 来衡量实际值与预测值之间的差异。 ```python def compute_angle_loss(pred_angles, true_angles): diff = pred_angles - true_angles loss = torch.mean(torch.abs(diff)) return loss ``` 此函数实现了简单的绝对差分作为基础评估指标之一。 #### 3. **应用场景举例** 借助 YOLOv12 提供的强大工具包及其内置的 OBB 支持,开发者可以在多个领域展开创新实践: - 自动驾驶车辆感知周围环境中的倾斜障碍物; - 工业生产线自动质检系统标记瑕疵品的具体方位; - 地理信息系统辅助测绘人员快速获取建筑物轮廓特征等。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值