Ultralytics YOLO27:
Get Started

使用 Ultralytics YOLO 进行有向边界框检测#

Ultralytics YOLO oriented bounding box detection of boats in aerial imagery

有向目标检测比标准目标检测更进一步,通过增加一个角度来更准确地定位图像中的对象。

有向目标检测器的输出是一组旋转边界框,可精确包围图像中的对象,并附带每个框的类别标签和置信度分数。对象以各种角度出现时,有向边界框尤其有用,例如在航拍图像中,传统的轴对齐边界框可能会包含不必要的背景。典型用途包括利用卫星和无人机检测船只和车辆、分析建筑物和基础设施以进行城市规划、监测农作物,以及检查太阳能板或风力涡轮机。



观看: 如何使用 Ultralytics YOLO26 定向边界框(OBB)检测和跟踪目标 | 船舶跟踪 🚢
提示

YOLO26 OBB 模型使用 -obb 后缀,例如 yolo26n-obb.pt,并在 DOTAv1 上预训练。

使用 OBB 检测船只使用 OBB 检测车辆
使用 OBB 检测船只使用 OBB 检测车辆

模型#

以下展示了在 DOTAv1 数据集上预训练的 YOLO26 OBB 模型。

首次使用时,模型会自动从 Ultralytics 最新版本下载。

模型尺寸
(像素)
mAP测试
50-95(e2e)
mAP测试
50(e2e)
速度
CPU ONNX
(毫秒)
速度
T4 TensorRT10
(ms)
参数
(M)
FLOPs
(B)
YOLO26n-obb102452.478.997.7 ± 0.92.8 ± 0.02.414.8
YOLO26s-obb102454.880.9218.0 ± 1.44.9 ± 0.19.856.7
YOLO26m-obb102455.381.0579.2 ± 3.810.2 ± 0.321.2184.9
YOLO26l-obb102456.281.6735.6 ± 3.113.0 ± 0.225.6232.4
YOLO26x-obb102456.781.71485.7 ± 11.530.5 ± 0.957.6520.1
  • mAPtest 数值是在 DOTAv1 数据集上以单模型、多尺度方式得出的。
    使用 yolo obb val data=DOTAv1.yaml device=0 split=test nms=False 复现,并将合并后的结果提交至 DOTA 评估。
  • 速度 是使用 ONNX 在 CPU 上以及使用 TensorRT10 在 NVIDIA T4 GPU 上,对 DOTAv1 验证图像进行测试后取平均值的结果。
    使用 yolo obb val data=DOTAv1.yaml batch=1 device=0|cpu nms=False 复现
  • 参数量和 FLOPs 数值对应融合后的模型,该模型经过 Conv/BatchNorm 折叠并移除了未使用的检测分支。预训练检查点保留完整的训练架构,因此显示的数值可能更高。

初步 DOTAv1 结果请参阅尚未发布的 YOLO27 预览版。

训练#

在 DOTA8 数据集上以 640 的图像尺寸训练 YOLO26n-obb,共训练 100 个 epochs。如需查看可用参数的完整列表,请参阅 Configuration 页面。

注意

OBB 及其旋转 180° 后的形状完全相同,因此旋转角度按 180° 取模定义,框本身没有方向。训练标签会规范化为长边形式:框宽 w 是较长的一边,角度从正 x 轴起顺时针测量至 w 边的方向,并以弧度存储在 [-π/4, 3π/4)([-45°, 135°))中。预测结果不会进行规范化,因此预测框可能会将短边报告为 w;请参阅结果输出。[0°, 90°) 形式是经过规范化的 DOTA 风格约定,训练和推理时不会应用。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-obb.yaml")  # 从 YAML 构建新模型
model = YOLO("yolo26n-obb.pt")  # 加载预训练模型(推荐用于训练)
model = YOLO("yolo26n-obb.yaml").load("yolo26n-obb.pt")  # 从 YAML 构建模型并迁移权重

# 训练模型
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)


观看: 如何使用 Ultralytics Platform 在 DOTA 数据集上训练 Ultralytics YOLO-OBB(定向边界框)模型

有关 train 模式的完整详情,请参阅 Train 页面。你也可以通过 Ultralytics Platform 云训练训练 OBB 模型。

数据集格式#

OBB 数据集格式的详细说明请参阅 Dataset Guide。YOLO OBB 格式使用边界框的四个角点表示框,坐标归一化到 0 到 1 之间,格式如下。Ultralytics Platform 标注支持 OBB 标签,并提供专用的有向边界框绘制工具:

class_index x1 y1 x2 y2 x3 y3 x4 y4

在内部,YOLO 使用 xywhr 格式处理损失和输出,该格式表示边界框的中心点 (xy)、宽度、高度和旋转角度。

验证#

在 DOTA8 数据集上验证训练好的 YOLO26n-obb 模型的准确率。请显式传入 data,以确保验证使用预期的数据集 YAML 文件。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-obb.pt")  # 加载官方模型
model = YOLO("path/to/best.pt")  # 加载自定义模型

# 验证模型
metrics = model.val(data="dota8.yaml")  # 在 DOTA8 数据集上进行验证
metrics.box.map  # map50-95(B)
metrics.box.map50  # map50(B)
metrics.box.map75  # map75(B)
metrics.box.maps  # 包含每个类别 mAP50-95(B) 的列表
metrics.box.image_metrics  # 包含精确率、召回率、F1、TP、FP 和 FN 的逐图像指标字典

预测#

使用训练好的 YOLO26n-obb 模型对图像进行预测。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-obb.pt")  # 加载官方模型
model = YOLO("path/to/best.pt")  # 加载自定义模型

# 使用模型进行预测
results = model("https://ultralytics.com/images/boats.jpg")  # 对图像进行预测

# 访问结果
for result in results:
    xywhr = result.obb.xywhr  # 中心点 x、中心点 y、宽度、高度、角度(弧度)
    xyxyxyxy = result.obb.xyxyxyxy  # 四点多边形格式
    names = [result.names[cls.item()] for cls in result.obb.cls.int()]  # 每个框的类别名称
    confs = result.obb.conf  # 每个框的置信度分数

请参阅预测页面,了解完整的 predict 模式详情。

传入 save_crop=True,即可按每个 OBB 的框尺寸保存旋转对齐的裁剪图,ObjectCropper 也有同样的作用。

结果输出#

有向边界框检测会为每张图像返回一个 Results 对象。主要预测字段为 result.obb,其中包含每个检测对象的旋转框、类别 ID 和置信度分数。

属性类型形状说明
result.obbOBB(N)有向框。
result.obb.datatorch.float32(N,7/8)包含置信度/类别的原始旋转框。
result.obb.xywhrtorch.float32(N,5)xywhr 旋转框。
result.obb.xyxyxyxytorch.float32(N,4,2)四个角点。
result.obb.conftorch.float32(N,)置信度分数。

标签会规范化为长边约定,但预测结果不会,因此 result.obb.xywhr 可能会报告 w 小于 h,且旋转角度是从短边开始测量的。这两种形式都表示同一个矩形,因此无论采用哪种形式,result.obb.xyxyxyxy 都是正确的。如果下游代码需要长边形式,请将角点转换回去,并注意重写框参数可能会导致角点顺序循环移位:

from ultralytics.utils.ops import xyxyxyxy2xywhr

xywhr = xyxyxyxy2xywhr(result.obb.xyxyxyxy)  # w >= h, rotation in [-pi/4, 3pi/4)

如需了解所有任务中特定于任务的 Results 字段,请参阅按任务查看预测结果部分。

导出#

将 YOLO26n-obb 模型导出为 ONNX、CoreML 等其他格式。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-obb.pt")  # 加载官方模型
model = YOLO("path/to/best.pt")  # 加载自定义模型

# 导出模型
model.export(format="onnx")

YOLO26-obb 可导出的格式见下表。你可以使用 format 参数将模型导出为任意格式,例如 format='onnx' 或 format='engine'。你可以直接使用导出的模型进行预测或验证,例如 yolo predict model=yolo26n-obb.onnx。导出完成后,页面会显示适用于你模型的用法示例。

格式format 参数模型元数据参数
PyTorch-yolo26n-obb.pt✅-
TorchScripttorchscriptyolo26n-obb.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n-obb.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n-obb_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n-obb.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n-obb.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n-obb.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n-obb_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n-obb.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n-obb_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n-obb.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n-obb_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n-obb.mnn✅imgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n-obb_ncnn_model/✅imgsz, quantize, batch, device
IMX500imxyolo26n-obb_imx_model/✅imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n-obb_rknn_model/✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n-obb_executorch_model/✅imgsz, batch, device
Axeleraaxelerayolo26n-obb_axelera_model/✅imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n-obb_deepx_model/✅imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n-obb_qnn.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n-obb_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n-obb_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n-obb_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

nms=None 默认输出原始结果,以供外部 NMS 使用。设置 nms=False 可选择可用的无 NMS 检测头;不支持的格式会回退到其原生输出路径。上方的 nms 条目表示可以通过 nms=True 嵌入 NMS 的格式。

请参阅 Export 页面,了解完整的 export 详情。

常见问题#

  • 有向边界框(OBB)包含一个额外角度,可提高图像中物体定位的准确性。与轴对齐矩形形式的常规边界框不同,OBB 可以旋转,以更好地贴合物体的方向。这对于需要精确放置物体的应用尤其有用,例如航空或卫星图像(数据集指南)。

  • 要使用自定义数据集训练 YOLO26n-obb 模型,请参考以下示例,使用 Python 或 CLI:

    示例
    from ultralytics import YOLO
    
    # 加载预训练模型
    model = YOLO("yolo26n-obb.pt")
    
    # 训练模型
    results = model.train(data="path/to/custom_dataset.yaml", epochs=100, imgsz=640)

    有关更多训练参数,请查看配置部分。

  • YOLO26-OBB 模型使用 DOTAv1 等数据集进行预训练,但你可以使用任何采用 OBB 格式的数据集。有关 OBB 数据集格式的详细信息,请参阅数据集指南。

  • 你可以使用 Python 或 CLI 命令验证 YOLO26n-obb 模型,如下所示:

    示例
    from ultralytics import YOLO
    
    # 加载模型
    model = YOLO("yolo26n-obb.pt")
    
    # 验证模型
    metrics = model.val(data="dota8.yaml")

    请参阅 Val 部分,了解完整的验证详情。

  • 你可以使用 Python 或 CLI 轻松将 YOLO26-OBB 模型导出为 ONNX 格式:

    示例
    from ultralytics import YOLO
    
    # 加载模型
    model = YOLO("yolo26n-obb.pt")
    
    # 导出模型
    model.export(format="onnx")

    有关更多导出格式和详情,请参阅 Export 页面。

评论