Детекция объектов с ориентированными ограничивающими прямоугольниками Object Detection#
Ориентированное обнаружение объектов идет дальше стандартного обнаружения, добавляя дополнительный угол для более точного определения местоположения объектов на изображении.
Результатом работы ориентированного детектора объектов является набор повернутых ограничивающих рамок, которые точно охватывают объекты на изображении, а также метки классов и показатели уверенности для каждой рамки. Ориентированные ограничивающие рамки особенно полезны, когда объекты расположены под разными углами, например на аэрофотоснимках, где традиционные выровненные по осям рамки могут захватывать лишний фон.
Модели 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 (мс) | параметры (М) | FLOPs (Б) |
|---|---|---|---|---|---|---|---|
| YOLO26n-obb | 1024 | 52.4 | 78.9 | 97.7 ± 0.9 | 2.8 ± 0.0 | 2.5 | 14.0 |
| YOLO26s-obb | 1024 | 54.8 | 80.9 | 218.0 ± 1.4 | 4.9 ± 0.1 | 9.8 | 55.1 |
| YOLO26m-obb | 1024 | 55.3 | 81.0 | 579.2 ± 3.8 | 10.2 ± 0.3 | 21.2 | 183.3 |
| YOLO26l-obb | 1024 | 56.2 | 81.6 | 735.6 ± 3.1 | 13.0 ± 0.2 | 25.6 | 230.0 |
| YOLO26x-obb | 1024 | 56.7 | 81.7 | 1485.7 ± 11.5 | 30.5 ± 0.9 | 57.6 | 516.5 |
- Значения mAPtest приведены для многомасштабного режима одной модели на датасете DOTAv1.
Воспроизведи с помощьюyolo val obb data=DOTAv1.yaml device=0 split=testи отправь объединенные результаты на DOTA evaluation. - Скорость усреднена по изображениям валидационного набора DOTAv1 с использованием инстанса Amazon EC2 P4d.
Воспроизведи с помощьюyolo val obb data=DOTAv1.yaml batch=1 device=0|cpu - Значения Params и FLOPs даны для слитной модели после
model.fuse(), которая объединяет слои Conv и BatchNorm и, для моделей end2end, удаляет вспомогательную голову детекции «один ко многим». Предварительно обученные чекпоинты сохраняют полную архитектуру обучения и могут показывать большие значения.
Обучение#
Обучи YOLO26n-obb на датасете DOTA8 в течение 100 epochs при размере изображения 640. Полный список доступных аргументов см. на странице Configuration.
OBB и ее поворот на 180° идентичны, поэтому поворот определяется по модулю 180°, а у рамки нет направления. Метки обучения канонизируются в форму с длинной стороной: ширина рамки w является более длинной стороной, угол измеряется по часовой стрелке от положительной оси x до ориентации стороны w, и он сохраняется в радианах в [-π/4, 3π/4) ([-45°, 135°)). Предсказания не канонизируются, поэтому предсказанная рамка может указывать короткую сторону как w; см. Results Output. Форма [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 можно найти в Dataset Guide. Формат YOLO OBB задает ограничивающие прямоугольники по их четырем угловым точкам с координатами, нормализованными от 0 до 1, в соответствии с этой структурой. Ultralytics Platform annotation поддерживает разметку OBB с помощью специального инструмента рисования ориентированных ограничивающих прямоугольников:
class_index x1 y1 x2 y2 x3 y3 x4 y4Внутри YOLO обрабатывает потери и выдает результаты в формате xywhr, который представляет центральную точку (xy), ширину, высоту и поворот bounding box.
Валидация#
Выполни валидацию accuracy обученной модели YOLO26n-obb на датасете DOTA8. Никакие аргументы не требуются, так как 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") # no arguments needed, dataset and settings remembered
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 FNПредсказание#
Используй обученную модель 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 может указывать 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
# 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 |
Смотри полную информацию об export на странице Экспорт.
Применение в реальных условиях#
Обнаружение OBB с помощью YOLO26 имеет множество практических применений в различных отраслях:
- Управление морскими судами и портами: Обнаружение кораблей и судов под разными углами для fleet management и мониторинга.
- Городское планирование: Анализ зданий и инфраструктуры по аэрофотоснимкам.
- Сельское хозяйство: Мониторинг сельскохозяйственных культур и техники с дронов.
- Энергетический сектор: Осмотр солнечных панелей и ветряных турбин с разной ориентацией.
- Транспорт: Отслеживание транспортных средств на дорогах и парковках с разных ракурсов.
Эти приложения выигрывают от способности OBB точно подгоняться под объекты под любым углом, обеспечивая более точное обнаружение, чем традиционные ограничивающие рамки.
FAQ#
Ориентированные ограничивающие прямоугольники (OBB) включают дополнительный угол для повышения точности локализации объектов на изображениях. В отличие от обычных прямоугольников, выровненных по осям, OBB могут поворачиваться, чтобы лучше соответствовать ориентации объекта. Это особенно полезно для приложений, требующих точного размещения объектов, таких как аэрофотоснимки или спутниковые изображения (Dataset Guide).
Чтобы обучить модель 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)Дополнительные аргументы обучения см. в разделе Configuration.
Модели YOLO26-OBB предварительно обучены на таких датасетах, как DOTAv1, но ты можешь использовать любой датасет, отформатированный для OBB. Подробную информацию о форматах датасетов OBB можно найти в Dataset Guide.
Экспорт модели YOLO26-OBB в формат ONNX прост при использовании Python или CLI:
Примерfrom ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Export the model model.export(format="onnx")Дополнительные форматы экспорта и подробную информацию см. на странице Export.
Для проверки модели 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")Полные сведения о валидации см. в разделе Val.

