使用 Ultralytics YOLO 进行有向边界框检测#
有向目标检测比标准目标检测更进一步,通过增加一个角度来更准确地定位图像中的对象。
有向目标检测器的输出是一组旋转边界框,可精确包围图像中的对象,并附带每个框的类别标签和置信度分数。对象以各种角度出现时,有向边界框尤其有用,例如在航拍图像中,传统的轴对齐边界框可能会包含不必要的背景。典型用途包括利用卫星和无人机检测船只和车辆、分析建筑物和基础设施以进行城市规划、监测农作物,以及检查太阳能板或风力涡轮机。
观看: 如何使用 Ultralytics YOLO26 定向边界框(OBB)检测和跟踪目标 | 船舶跟踪 🚢
YOLO26 OBB 模型使用 -obb 后缀,例如 yolo26n-obb.pt,并在 DOTAv1 上预训练。
| 使用 OBB 检测船只 | 使用 OBB 检测车辆 |
|---|---|
![]() | ![]() |
模型#
以下展示了在 DOTAv1 数据集上预训练的 YOLO26 OBB 模型。
首次使用时,模型会自动从 Ultralytics 最新版本下载。
| 模型 | 尺寸 (像素) | mAP测试 50-95(e2e) | mAP测试 50(e2e) | 速度 CPU ONNX (毫秒) | 速度 T4 TensorRT10 (ms) | 参数 (M) | FLOPs (B) |
|---|---|---|---|---|---|---|---|
| YOLO26n-obb | 1024 | 52.4 | 78.9 | 97.7 ± 0.9 | 2.8 ± 0.0 | 2.4 | 14.8 |
| YOLO26s-obb | 1024 | 54.8 | 80.9 | 218.0 ± 1.4 | 4.9 ± 0.1 | 9.8 | 56.7 |
| YOLO26m-obb | 1024 | 55.3 | 81.0 | 579.2 ± 3.8 | 10.2 ± 0.3 | 21.2 | 184.9 |
| YOLO26l-obb | 1024 | 56.2 | 81.6 | 735.6 ± 3.1 | 13.0 ± 0.2 | 25.6 | 232.4 |
| YOLO26x-obb | 1024 | 56.7 | 81.7 | 1485.7 ± 11.5 | 30.5 ± 0.9 | 57.6 | 520.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.obb | OBB | (N) | 有向框。 |
result.obb.data | torch.float32 | (N,7/8) | 包含置信度/类别的原始旋转框。 |
result.obb.xywhr | torch.float32 | (N,5) | xywhr 旋转框。 |
result.obb.xyxyxyxy | torch.float32 | (N,4,2) | 四个角点。 |
result.obb.conf | torch.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 | ✅ | - |
| TorchScript | torchscript | yolo26n-obb.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-obb.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-obb_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-obb.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-obb.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n-obb.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n-obb_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-obb.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-obb_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n-obb.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-obb_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-obb.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-obb_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-obb_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-obb_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-obb_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-obb_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-obb_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-obb_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n-obb_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n-obb_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n-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)有关更多训练参数,请查看配置部分。
你可以使用 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 页面。

