Ultralytics YOLO27:

Обнаружение объектов с ориентированными рамками с помощью 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

Модели#

Ниже представлены модели YOLO26 OBB, предобученные на наборе данных DOTAv1.

Модели автоматически загружаются из последнего релиза Ultralytics при первом использовании.

Модельразмер
(пиксели)
mAPтест
50-95(e2e)
mAPтест
50(e2e)
Скорость
CPU ONNX
(мс)
Скорость
T4 TensorRT10
(мс)
параметры
(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.
  • Скорость усреднена по изображениям валидационной выборки DOTAv1: ONNX на CPU и TensorRT10 на GPU NVIDIA T4.
    Воспроизведи результаты с помощью yolo obb val data=DOTAv1.yaml batch=1 device=0|cpu nms=False
  • Значения Params и FLOPs указаны для объединённых моделей после свёртки Conv/BatchNorm и удаления неиспользуемой ветви обнаружения. Предварительно обученные контрольные точки сохраняют полную архитектуру обучения, поэтому их показатели могут быть выше.

Предварительные результаты на DOTAv1 см. в предварительной версии YOLO27, ещё не выпущенной.

Обучение#

Обучай YOLO26n-obb на наборе данных DOTA8 в течение 100 эпох с размером изображения 640. Полный список доступных аргументов см. на странице Конфигурация.

Примечание

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 YOLO-OBB (ориентированные ограничивающие рамки) на датасете DOTA с помощью платформы Ultralytics

Полное описание режима train см. на странице Обучение. Модели OBB также можно обучать с помощью облачного обучения на платформе Ultralytics.

Формат датасета#

Подробное описание формата наборов данных OBB см. в руководстве по наборам данных. В формате YOLO OBB ограничивающие рамки задаются координатами четырёх углов, нормализованными в диапазоне от 0 до 1, в следующем формате. Инструмент аннотирования платформы Ultralytics поддерживает метки OBB и специальный инструмент для рисования ориентированных ограничивающих рамок:

class_index x1 y1 x2 y2 x3 y3 x4 y4

Внутри YOLO обрабатывает функции потерь и выходные данные в формате xywhr, который содержит координаты центра ограничивающей рамки (xy), ширину, высоту и угол поворота.

Валидация#

Проверь точность обученной модели YOLO26n-obb на наборе данных DOTA8. Явно укажи 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  # словарь метрик для каждого изображения: precision, recall, 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  # формат полигона с 4 точками
    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, которое содержит повёрнутые рамки, идентификаторы классов и оценки достоверности для каждого обнаруженного объекта.

АтрибутТипФормаОписание
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 с помощью nms=True.

Полное описание 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 смотри в руководстве по датасетам.

  • Чтобы проверить модель YOLO26n-obb, воспользуйся командами Python или CLI, приведёнными ниже:

    Пример
    from ultralytics import YOLO
    
    # Загрузить модель
    model = YOLO("yolo26n-obb.pt")
    
    # Валидировать модель
    metrics = model.val(data="dota8.yaml")

    Полную информацию о валидации смотри в разделе Val.

  • Экспортировать модель YOLO26-OBB в формат ONNX можно с помощью Python или CLI:

    Пример
    from ultralytics import YOLO
    
    # Загрузить модель
    model = YOLO("yolo26n-obb.pt")
    
    # Экспортировать модель
    model.export(format="onnx")

    Дополнительные форматы экспорта и сведения о них смотри на странице Export.

Комментарии