Детекция ориентированных ограничивающих прямоугольников с помощью 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. - Скорость усреднена по изображениям валидационной выборки DOTAv1 с использованием экземпляра Amazon EC2 P4d.
Воспроизведи результаты с помощьюyolo val obb data=DOTAv1.yaml batch=1 device=0|cpu nms=False - Значения Params и FLOPs приводятся для слитных моделей после свертки/пакетной нормализации (Conv/BatchNorm folding) и удаления неиспользуемой ветки детекции. Предварительно обученные контрольные точки сохраняют полную архитектуру обучения и могут показывать большие значения.
Смотри предварительный просмотр невыпущенного YOLO27 для предварительных результатов DOTAv1.
Обучение#
Обучи YOLO26n-obb на наборе данных DOTA8 в течение 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 поддерживает метки OBB со специальным инструментом рисования ориентированных ограничивающих рамок:
class_index x1 y1 x2 y2 x3 y3 x4 y4Внутри YOLO обрабатывает функции потерь и выходные данные в формате xywhr, который представляет центральную точку ограничивающей рамки (xy), ширину, высоту и поворот.
Val#
Проверь точность обученной модели 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") # 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 см. на странице Predict.
Выходные данные результатов#
Обнаружение ориентированных ограничивающих рамок возвращает один объект Results для каждого изображения. Основное поле предсказаний — result.obb,
которое содержит повернутые рамки, идентификаторы классов и оценки уверенности для каждого обнаруженного объекта.
| Атрибут | Тип | Форма | Описание |
|---|---|---|---|
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 |
nms=None по умолчанию выдает сырые результаты для внешнего NMS. Установи nms=False, чтобы выбрать доступный головной модуль без NMS; неподдерживаемые форматы возвращаются к своему родному пути вывода. Записи nms выше определяют форматы, которые могут встраивать NMS с помощью nms=True.
Полное описание export см. на странице Экспорт.
Практические применения#
Обнаружение OBB с помощью YOLO26 имеет множество практических применений в различных отраслях:
- Морской транспорт и управление портами: обнаружение кораблей и судов под разными углами для управления флотом и мониторинга.
- Городское планирование: анализ зданий и инфраструктуры по аэрофотоснимкам.
- Сельское хозяйство: мониторинг посевов и сельскохозяйственного оборудования по видеозаписям с дронов.
- Энергетический сектор: проверка солнечных панелей и ветряных турбин, расположенных под разными углами.
- Транспорт: отслеживание транспортных средств на дорогах и парковках с разных ракурсов.
Эти применения используют способность 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)Дополнительные аргументы обучения смотри в разделе Конфигурация.
Модели YOLO26-OBB предварительно обучены на таких датасетах, как DOTAv1, но ты можешь использовать любой датасет, отформатированный для OBB. Подробную информацию о форматах датасетов OBB смотри в Руководстве по датасетам.
Экспортировать модель YOLO26-OBB в формат ONNX можно с помощью Python или CLI:
Пример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")Полные сведения о валидации смотри в разделе Val.

