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

Object Detection

Anchor-based (Faster R-CNN, SSD) и anchor-free (FCOS, CenterNet) детекторы. Non-Maximum Suppression (NMS).

Object Detection — что и где на картинке

Классификация отвечает на вопрос «что на картинке?». Detection — «что и где?». Для каждого объекта нужно предсказать bounding box (x, y, w, h) и класс. На одном изображении может быть 0, 1, 100 объектов — модель не знает заранее сколько. Это принципиально сложнее классификации.

Пайплайн object detection: backbone → neck → head → NMS
Общий пайплайн детекции: backbone извлекает фичи, neck агрегирует масштабы, head предсказывает boxes + classes, NMS убирает дубли
SSD (Single Shot Detector): multi-scale feature maps с предсказаниями на каждом уровне
SSD архитектура: предсказания на нескольких масштабах feature maps. Мелкие объекты — на ранних слоях, крупные — на поздних. Источник: d2l.ai (CC BY-SA 4.0)

Эволюция: от R-CNN к anchor-free

R-CNN (2014) — первый deep learning детектор. Алгоритм: 1) Selective Search генерирует ~2000 region proposals, 2) каждый region ресайзится и прогоняется через CNN (AlexNet), 3) SVM классифицирует. Проблема: 2000 forward passes = очень медленно (47 секунд на изображение).

Fast R-CNN (2015) — один forward pass через CNN для всего изображения, потом ROI Pooling вырезает фичи для каждого proposal. 25× быстрее R-CNN. Но Selective Search всё ещё bottleneck.

Faster R-CNN (2015) — заменяет Selective Search на Region Proposal Network (RPN) — маленькую CNN, которая предсказывает proposals прямо из feature map. End-to-end обучение. 5 fps на GPU — впервые пригоден для near-real-time.

Anchor-based детекторы

Anchors — предзаданные bounding boxes разных размеров и пропорций (aspect ratios) в каждой позиции feature map. Модель предсказывает не абсолютные координаты, а смещения (offsets) относительно anchor-ов + вероятность объекта.

Faster R-CNN — two-stage детектор: 1. Stage 1 (RPN): для каждого anchor предсказывает objectness score + bbox refinement → генерирует ~300 proposals 2. Stage 2 (ROI Head): для каждого proposal — классификация + финальная коррекция bbox Два стейджа дают высокую точность, но добавляют latency.

SSD (Single Shot Detector, 2016) — one-stage детектор. Предсказывает классы и bbox для anchors на нескольких масштабах feature map (multi-scale detection). Быстрее Faster R-CNN, но менее точен для мелких объектов.

RetinaNet (2017) — one-stage с Focal Loss. Проблема one-stage детекторов: 99% anchors — фон (easy negatives), модель не учится на hard examples. Focal Loss: FL(p) = -α(1-p)^γ log(p) — снижает вклад easy examples, фокусируется на трудных. Сравнялся с two-stage по точности.

Anchor-free детекторы

Anchors — гиперпараметры (размеры, ratios, количество). Их нужно подбирать под датасет. Anchor-free детекторы убирают эту зависимость:

  • FCOS (2019) — предсказывает для каждого пикселя feature map расстояния до 4 сторон bounding box (l, t, r, b) + «centerness» score. Нет anchors, нет proposals.
  • CenterNet (2019) — предсказывает heatmap центров объектов + размеры bbox. Объект = пик на heatmap. Элегантно и быстро.
  • DETR (2020) — трансформер для detection. Набор learnable queries → attention к feature map → прямое предсказание bbox + класс. Нет NMS, нет anchors. Красивая архитектура, но медленно сходится.

Non-Maximum Suppression (NMS)

Детектор выдаёт много overlapping predictions для одного объекта. NMS фильтрует дубликаты:

def nms(boxes, scores, iou_threshold=0.5):
    """Non-Maximum Suppression — удаляем дублирующие боксы."""
    order = scores.argsort()[::-1]  # сортируем по confidence
    keep = []
    while len(order) > 0:
        i = order[0]
        keep.append(i)
        if len(order) == 1:
            break
        # IoU текущего бокса со всеми оставшимися
        ious = compute_iou(boxes[i], boxes[order[1:]])
        # Убираем боксы с IoU > порога (они про тот же объект)
        mask = ious <= iou_threshold
        order = order[1:][mask]
    return keep

Варианты NMS: Soft-NMS (снижает confidence вместо удаления), Weighted NMS (усредняет координаты overlapping boxes). DETR не нуждается в NMS — Hungarian matching даёт уникальные predictions.

Feature Pyramid Network (FPN)

Объекты бывают разных размеров. Мелкие объекты лучше видны на ранних (high-resolution) feature maps, крупные — на глубоких (low-resolution). FPN строит пирамиду: top-down pathway с lateral connections. Каждый уровень пирамиды отвечает за свой масштаб объектов.

FPN — стандартный компонент в Faster R-CNN, RetinaNet, Mask R-CNN, YOLO. Без FPN детекторы плохо работают на мелких объектах.

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

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

Чем two-stage отличается от one-stage? Two-stage (Faster R-CNN): сначала proposals, потом классификация. Точнее, но медленнее. One-stage (SSD, RetinaNet, YOLO): прямое предсказание, быстрее. • Что такое anchors? Предзаданные bbox разных размеров/пропорций. Модель предсказывает offsets от anchors. Гиперпараметр, нужно подбирать под датасет. • Зачем Focal Loss? Решает class imbalance: 99% anchors = фон. FL(p) = -α(1-p)^γ log(p) — уменьшает вклад easy negatives, фокусируется на hard examples. • Что такое NMS? Фильтрация дублирующих predictions. Берём бокс с макс confidence, удаляем все с IoU > threshold. Повторяем. • FPN — зачем? Multi-scale detection. Мелкие объекты детектируются на высоком разрешении, крупные — на низком. Top-down + lateral connections.