使用 Ultralytics YOLO 进行旋转边界框检测#
定向对象检测通过引入额外的角度来更准确地定位图像中的对象,比标准对象检测更进一步。
定向对象检测器的输出是一组旋转边界框,可精确包围图像中的对象,同时为每个框提供类别标签和置信度分数。当对象以各种角度出现时,定向边界框尤其有用,例如在航空影像中,传统的轴对齐边界框可能会包含不必要的背景。
YOLO26 OBB 模型使用 -obb 后缀,即 yolo26n-obb.pt,并在 DOTAv1 上进行预训练。
Watch: How to Detect & Track Objects with Ultralytics YOLO26 Oriented Bounding Boxes (OBB) | Ship Tracking 🚢
可视化示例#
| 使用 OBB 进行船舶检测 | 使用 OBB 进行车辆检测 |
|---|---|
![]() | ![]() |
模型#
此处展示了 YOLO26 预训练 OBB 模型,这些模型在 DOTAv1 数据集上进行预训练。
首次使用时,模型 会自动从最新的 Ultralytics 发布版本 下载。
| 模型 | 尺寸 (像素) | mAPtest 50-95(e2e) | mAPtest 50(e2e) | 速度 CPU ONNX (毫秒) | 速度 T4 TensorRT10 (毫秒) | 参数量 (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 val obb data=DOTAv1.yaml device=0 split=test nms=False重现,并将合并结果提交至 DOTA 评估。 - 速度为使用 Amazon EC2 P4d 实例在 DOTAv1 验证图像上测得的平均值。
通过yolo val obb data=DOTAv1.yaml batch=1 device=0|cpu nms=False重现 - Params 和 FLOPs 数值适用于在进行卷积与批归一化折叠以及移除未使用的检测分支之后的融合模型。预训练检查点保留完整的训练架构,可能会显示更高的数值。
查看未发布的 YOLO27 预览版以获取 DOTAv1 的初步结果。
训练#
在 DOTA8 数据集上训练 YOLO26n-obb,共进行 100 个训练周期,图像尺寸为 640。有关可用参数的完整列表,请参阅配置页面。
OBB 与其 180° 旋转后的结果相同,因此旋转角度按模 180° 定义,框没有方向。训练标签会规范化为长边形式:框宽度 w 是较长的一边,角度从正 x 轴顺时针测量至 w 边的方向,并以弧度存储在 [-π/4, 3π/4)([-45°, 135°))中。预测结果不会进行规范化,因此预测框可能将短边报告为 w;请参阅结果输出。[0°, 90°) 形式是经过正则化的 DOTA 风格约定,不会应用于训练或推理。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.yaml") # build a new model from YAML
model = YOLO("yolo26n-obb.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-obb.yaml").load("yolo26n-obb.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)Watch: How to Train Ultralytics YOLO-OBB (Oriented Bounding Boxes) Models on DOTA Dataset using Ultralytics Platform
数据集格式#
OBB 数据集格式的详细信息请参阅数据集指南。YOLO OBB 格式通过四个角点指定边界框,坐标归一化到 0 和 1 之间,结构如下。Ultralytics Platform 标注支持使用专用定向边界框绘制工具创建 OBB 标签:
class_index x1 y1 x2 y2 x3 y3 x4 y4在内部,YOLO 使用 xywhr 格式处理损失和输出,该格式表示边界框的中心点(xy)、宽度、高度和旋转角度。
验证#
在 DOTA8 数据集上验证已训练的 YOLO26n-obb 模型准确率。无需提供参数,因为 model 会将其训练时的 data 和参数保留为模型属性。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val(data="dota8.yaml") # validate on the DOTA8 dataset
metrics.box.map # map50-95(B)
metrics.box.map50 # map50(B)
metrics.box.map75 # map75(B)
metrics.box.maps # a list containing mAP50-95(B) for each category
metrics.box.image_metrics # per-image metrics dictionary with precision, recall, F1, TP, FP, and FNPredict#
使用已训练的 YOLO26n-obb 模型对图像运行预测。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/boats.jpg") # predict on an image
# Access the results
for result in results:
xywhr = result.obb.xywhr # center-x, center-y, width, height, angle (radians)
xyxyxyxy = result.obb.xyxyxyxy # polygon format with 4-points
names = [result.names[cls.item()] for cls in result.obb.cls.int()] # class name of each box
confs = result.obb.conf # confidence score of each boxWatch: How to Detect and Track Storage Tanks using Ultralytics YOLO-OBB | Oriented Bounding Boxes | DOTA
请在预测页面查看完整的 predict 模式详情。
结果输出#
定向边界框检测会为每张图像返回一个 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 可能会报告小于 h 的 w,且旋转角度从短边开始测量。两种形式描述的是同一个矩形,因此无论哪种形式,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
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
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 |
| TF SavedModel | saved_model | yolo26n-obb_saved_model/ | ✅ | imgsz、keras、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 |
| 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 |
| LiteRT | litert | yolo26n-obb.tflite | ✅ | imgsz、quantize、batch、data、fraction、device |
| Hailo | hailo | yolo26n-obb_hailo_model/ | ✅ | imgsz、name、quantize、data、fraction、simplify、conf、iou |
| Huawei Ascend | ascend | yolo26n-obb_ascend_model/ | ✅ | imgsz、batch、name、quantize、opset、simplify、nms |
| Apple Core AI | coreai | yolo26n-obb.aimodel | ✅ | imgsz、batch、quantize |
nms=None 默认对外部 NMS 使用原始输出。设置 nms=False 以选择可用的无 NMS 检测头;不支持的格式将回退到其本机输出路径。上面的 nms 条目标识了可以通过 nms=True 嵌入 NMS 的格式。
请在导出页面查看完整的 export 详情。
实际应用#
YOLO26 的 OBB 检测在各个行业中有许多实际应用:
- 海事与港口管理:以各种角度检测船舶和舰艇,用于船队管理和监控。
- 城市规划:通过航空影像分析建筑物和基础设施。
- 农业:通过无人机影像监测农作物和农业设备。
- 能源行业:以不同方向检查太阳能电池板和风力涡轮机。
- 交通运输:从各种视角跟踪道路和停车场中的车辆。
这些应用受益于 OBB 能够精确贴合任意角度的对象,相比传统边界框可提供更准确的检测结果。
常见问题#
定向边界框(OBB)包含一个额外角度,可提升图像中对象定位的准确性。常规边界框是轴对齐矩形,而 OBB 可以旋转,从而更好地贴合对象的方向。这对于需要精确定位对象的应用特别有用,例如航空或卫星影像(数据集指南)。
要使用自定义数据集训练 YOLO26n-obb 模型,请参考下面使用 Python 或 CLI 的示例:
示例from ultralytics import YOLO # Load a pretrained model model = YOLO("yolo26n-obb.pt") # Train the model results = model.train(data="path/to/custom_dataset.yaml", epochs=100, imgsz=640)有关更多训练参数,请查看配置部分。
使用 Python 或 CLI 可以轻松将 YOLO26-OBB 模型导出为 ONNX 格式:
示例from ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Export the model model.export(format="onnx")有关更多导出格式和详细信息,请参阅导出页面。
要验证 YOLO26n-obb 模型,你可以使用如下所示的 Python 或 CLI 命令:
示例from ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Validate the model metrics = model.val(data="dota8.yaml")请在验证部分查看完整的验证详情。

