Детекция и сегментация
~22 мин

YOLO

Семейство YOLO: архитектура backbone/neck/head, YOLOv5/v8/v9, real-time inference, Ultralytics.

YOLO — real-time detection стандарт индустрии

YOLO (You Only Look Once) — семейство one-stage детекторов, ставших стандартом для real-time object detection. Идея оригинальной YOLO (2015): разбить изображение на сетку S×S, каждая ячейка предсказывает B bounding boxes + confidence + классы. Один forward pass — все детекции. 45 FPS на GPU (vs 7 FPS у Faster R-CNN).

Архитектура YOLO: backbone, neck (FPN/PAN), detection head
Архитектура YOLO: backbone (CSPDarknet/EfficientNet) → neck (FPN + PAN) → multi-scale detection heads

Эволюция YOLO

  • YOLOv1 (2015) — оригинальная идея. Быстро, но low accuracy (особенно мелкие объекты). Жёсткая сетка ограничивает число детекций.
  • YOLOv2/YOLO9000 (2016) — anchors (вместо прямого предсказания), batch normalization, multi-scale training.
  • YOLOv3 (2018) — Darknet-53 backbone, FPN-like multi-scale detection (3 масштаба), binary cross-entropy для multi-label.
  • YOLOv4 (2020) — Bag of Freebies (аугментации, label smoothing) + Bag of Specials (CSP, SAM, PAN). Самая «инженерная» версия.
  • YOLOv5 (2020, Ultralytics) — PyTorch reimplementation. Не статья, а open-source проект. Стал стандартом для индустрии благодаря удобству.
  • YOLOv8 (2023, Ultralytics) — anchor-free head, decoupled head, DFL loss. Unified API для detection, segmentation, pose, classification.
  • YOLOv9 (2024) — Programmable Gradient Information (PGI) + GELAN architecture.
  • YOLO11 (2024, Ultralytics) — lightweight, улучшенная segmentation head.

Архитектура YOLO: Backbone → Neck → Head

Все современные YOLO имеют трёхчастную архитектуру:

  • Backbone — feature extractor. CSPDarknet (v4/v5), EfficientRep (v6), C2f blocks (v8). Извлекает фичи на разных масштабах.
  • Neck — multi-scale feature fusion. PANet (Path Aggregation Network): top-down + bottom-up пути. Объединяет фичи разных масштабов для detection мелких и крупных объектов.
  • Head — prediction. Для каждого масштаба: bbox координаты + objectness + class probabilities. В YOLOv8: decoupled head (отдельные ветки для cls и reg) + anchor-free + Distribution Focal Loss.

YOLOv8 — текущий стандарт

from ultralytics import YOLO

# Загрузка pretrained модели
model = YOLO("yolov8n.pt")  # nano (3.2M params, 8.7 GFLOPs)
# Варианты: yolov8n/s/m/l/x — от быстрого к точному

# Inference
results = model("image.jpg")
for r in results:
    boxes = r.boxes.xyxy      # [N, 4] — координаты bbox
    scores = r.boxes.conf     # [N] — confidence
    classes = r.boxes.cls     # [N] — class indices

# Training на своих данных
model = YOLO("yolov8m.pt")
model.train(
    data="dataset.yaml",      # путь к конфигу датасета
    epochs=100,
    imgsz=640,
    batch=16,
    device="cuda",
)

# Export для production
model.export(format="onnx")       # ONNX Runtime
model.export(format="engine")     # TensorRT

Конфигурация датасета

# dataset.yaml
path: /data/my_dataset
train: images/train
val: images/val

names:
  0: person
  1: car
  2: bicycle

# Аннотации: YOLO format (txt рядом с изображениями)
# class_id x_center y_center width height (normalized 0-1)
# 0 0.5 0.4 0.3 0.6

YOLO размеры и speed/accuracy trade-off

Ultralytics предлагает 5 размеров каждой модели:

  • Nano (n) — 3.2M params, 8.7 GFLOPs. Для edge/mobile. ~640 FPS на A100.
  • Small (s) — 11.2M params. Баланс для embedded GPU (Jetson).
  • Medium (m) — 25.9M params. Хороший баланс speed/accuracy для production.
  • Large (l) — 43.7M params. Высокая точность, серверный inference.
  • Extra-large (x) — 68.2M params, 257.8 GFLOPs. Максимальная точность.

Практические советы

  • Разрешение: imgsz=640 — стандарт. Для мелких объектов — 1280. Больше разрешение = лучше мелкие объекты, но медленнее.
  • Аугментации: mosaic (4 images → 1), mixup, random perspective включены по умолчанию. Отключение mosaic в последних 10 эпохах стабилизирует обучение.
  • Transfer learning: всегда начинай с pretrained весов (COCO). Fine-tune на своих данных. Freeze backbone первые 5-10 эпох если мало данных.
  • Постобработка: confidence threshold (0.25-0.5), NMS IoU threshold (0.45-0.7). Подбирай под задачу.
  • Формат экспорта: ONNX → универсальный, TensorRT → максимальная скорость на NVIDIA, CoreML → Apple, TFLite → мобильные.

🎯 На собеседовании

Ключевые вопросы

Backbone/Neck/Head — что каждый делает? Backbone — фичи, Neck — multi-scale fusion (PANet), Head — bbox + class prediction. • Anchor-based vs anchor-free YOLO? YOLOv5 — anchors. YOLOv8 — anchor-free (предсказывает расстояния до краёв bbox). Anchor-free проще, меньше гиперпараметров. • Как YOLO обучается? Matching: каждый GT bbox привязывается к ячейкам/anchors. Loss: bbox loss (CIoU/DFL) + objectness (BCE) + classification (BCE). • Mosaic augmentation — зачем? 4 изображения в 1 → больше контекста, больше мелких объектов на одном forward pass, лучше batch statistics. • Как ускорить inference? Меньший размер модели (n/s), TensorRT export, FP16/INT8 quantization, уменьшить imgsz.