Компьютерное зрение

Object Detection: YOLO, SSD

Предварительные знания

  • CNN-классификаторы как backbone детектора (cv-04, cv-05)
  • Координаты bounding box и метрики качества: precision, recall
  • Идея, что сеть может предсказывать не только класс, но и числа (регрессию координат)
  • Modern Architectures

You Only Look Once

До 2015 года детекция означала прогон классификатора по тысячам region proposals, что было медленно. Joseph Redmon с коллегами изменили саму постановку задачи в статье You Only Look Once 2015 года, представленной на CVPR 2016. YOLO рассматривает детекцию как единую задачу регрессии: одна сеть смотрит на всё изображение один раз и предсказывает все bounding boxes и вероятности классов за один forward pass, достигая 45 кадров в секунду, тогда как старые детекторы вытягивали около 7. Несколько месяцев спустя, в 2016 году, Wei Liu с коллегами опубликовали SSD (Single Shot MultiBox Detector), который использовал feature maps на нескольких масштабах, чтобы детектировать объекты разных размеров за один проход, жертвуя частью скорости YOLO ради лучшей точности на мелких объектах. Вместе эти две статьи заложили семейство single-shot детекторов, на котором сегодня работает большая часть детекции в реальном времени.

2016 год. Джозеф Редмон выходит на сцену CVPR и запускает видео: камера в реальном времени обводит рамками людей и машины - 45 кадров в секунду. Лучшие детекторы того времени давали 7 FPS. Разница не в процентах - в эпохах. Один paper, один forward pass, одно название: You Only Look Once.

  • Tesla FSD: 8 камер, real-time детекция на кастомном чипе 36 TOPS - YOLO-based архитектура в каждой машине
  • Amazon Go: магазины без кассиров используют детекцию объектов + трекинг для подсчета товаров в корзине
  • Медицинская диагностика: YOLO-based детекция полипов на колоноскопии превосходит по recall опытных эндоскопистов
  • Камеры видеонаблюдения Hikvision и Axis: edge-inference YOLO прямо в камере, без облака

Anchor Boxes и IoU: язык координат детектора

2016 год, CVPR, Сиэтл. Джозеф Редмон выходит на сцену и запускает видео: камера в реальном времени обводит рамками машины, людей, велосипеды - 45 кадров в секунду. Зал молчит секунду, потом аплодирует. Лучшие детекторы того времени - Faster R-CNN, DPM - давали 7 FPS. YOLO дал 45. Разрыв не в процентах - в эпохах.

До YOLO детекция работала в два этапа: сначала найти "интересные" регионы (region proposals), потом классифицировать каждый. R-CNN гонял CNN на 2000 вырезанных патчей с одного изображения. Медленно, громоздко, неудобно для продакшна. YOLO перевернул логику: смотреть на изображение один раз и сразу предсказывать все объекты. Отсюда название - You Only Look Once.

Ключевой примитив - **anchor box** (якорный бокс). Вместо того чтобы искать объект в произвольном месте с произвольными размерами, детектор заранее расставляет шаблонные прямоугольники по всему изображению. YOLO делит изображение на сетку S x S ячеек; каждая ячейка отвечает за объекты, центр которых попадает в неё. Каждая ячейка предсказывает B боксов. В YOLOv2 добавили явные anchor boxes, выученные через k-means кластеризацию на датасете. Не случайные шаблоны - оптимальные под конкретный домен.

Чтобы сравнивать предсказанный бокс с ground truth, нужна метрика перекрытия - **IoU** (Intersection over Union). Формула проста: площадь пересечения двух прямоугольников делить на площадь их объединения. IoU = 1.0 означает идеальное совпадение; IoU = 0 означает прямоугольники вообще не пересекаются.

Порог IoU > 0.5 традиционно считается "хорошим" совпадением. COCO benchmark использует диапазон от 0.5 до 0.95 с шагом 0.05. Чем жестче порог - тем точнее должен попасть детектор.

В процессе обучения loss функция наказывает отклонение предсказанных координат от ground truth. YOLOv1 использовал MSE на координатах; это имеет известный изъян - одинаковое отклонение в пикселях хуже для маленького объекта, чем для большого. YOLOv3 перешел на binary cross-entropy для классов и логарифм координат. YOLOv5 и далее ввели CIoU loss - Complete IoU, учитывающий соотношение сторон и расстояние центров одновременно.

Сетка YOLO 13x13, каждая ячейка предсказывает 5 боксов. IoU предсказания с ground truth = 0.72. Какое из утверждений верно?

NMS и mAP: отфильтровать шум, измерить качество

Детектор выдал 845 боксов. На изображении 3 машины. Проблема очевидна: большинство боксов - мусор, а нужные объекты детектор обнаружит несколько раз - сразу несколькими overlapping боксами с близкими confidence scores. Нужен алгоритм, который оставит лучший бокс на каждый объект и выбросит дубликаты. Это **Non-Maximum Suppression (NMS)**.

NMS - жадный алгоритм. Берет бокс с максимальным confidence score, помечает его как финальный, потом удаляет все остальные боксы, чей IoU с ним превышает порог (обычно 0.4-0.5). Затем берет следующий по confidence из оставшихся - и повторяет. Линейно по числу боксов, быстро, интерпретируемо.

У классического NMS есть слабое место: при плотной сцене - толпа людей, колонна машин - соседние объекты могут подавить друг друга, если их боксы сильно перекрываются. Soft-NMS (2017) решает это мягче: вместо удаления дубликатов снижает их confidence score пропорционально IoU. Объект не теряется, просто уходит вниз по рейтингу.

Как измерить качество детектора? Precision и Recall на одном пороге - нечестно: можно выбрать порог в свою пользу. **mAP (mean Average Precision)** решает это элегантно. Для каждого класса строится Precision-Recall кривая при всех возможных порогах confidence. Area Under Curve - это AP для данного класса. mAP - среднее AP по всем классам.

COCO mAP @ [0.5:0.95] - стандартная метрика соревнований. YOLOv8 на COCO: ~53.9 mAP. DINO (transformer-based): ~58.5 mAP. Разрыв 4.6 пункта - это годы инженерной работы.

Важный нюанс: mAP считается отдельно по IoU порогу. mAP@0.5 (PASCAL VOC) - мягкая метрика, детектор может немного промахиваться. mAP@0.5:0.95 (COCO) - строгая, требует точных боксов. Детектор с высоким mAP@0.5 и низким mAP@0.75 умеет находить объекты, но плохо локализует их.

NMS обрабатывает боксы: сначала confidence 0.92 (машина), потом 0.87 (машина, IoU=0.61 с первым), потом 0.71 (пешеход, IoU=0.08 с первым). Порог NMS = 0.5. Какие боксы останутся?

YOLO vs SSD: две философии single-shot детекции

В 2016 году вышли два детектора, навсегда изменивших область. YOLO от Редмона (CVPR 2016) и SSD - Single Shot MultiBox Detector от Liu et al. (ECCV 2016). Оба single-shot: один forward pass, никаких region proposals. Но архитектурные решения - противоположные.

**YOLO** предсказывает боксы из единой feature map в конце сети. Сетка S x S, каждая ячейка - несколько anchor boxes. Логика простая и элегантная, но есть цена: маленькие объекты теряются, потому что финальная feature map слишком грубая (13x13 для 416x416). Птица на горизонте, дорожный знак вдали - YOLO плохо справляется.

**SSD** решает проблему масштаба элегантно: предсказывает из нескольких feature maps разного масштаба. Ранние слои сети (высокое разрешение, мелкие признаки) отвечают за маленькие объекты; поздние слои (низкое разрешение, семантические признаки) - за крупные. Feature Pyramid Network (FPN, 2017) развила эту идею дальше: не просто параллельные головы, а иерархия с lateral connections - информация течет от грубых слоев к детальным.

Эволюция YOLO - отдельная сага. YOLOv2 (2017) добавил batch normalization, anchor boxes из k-means, multi-scale training. YOLOv3 (2018) стал предсказывать из 3 масштабов как SSD, добавил DarkNet-53 backbone с residual connections. YOLOv4 (2020, другая команда) ввел CSPNet, PANet, Mosaic augmentation - SOTA на тот момент. YOLOv5 (Ultralytics, не Редмон) - PyTorch, легко деплоится. YOLOv8, YOLO-NAS, YOLOv9, YOLOv10 - новые итерации каждые несколько месяцев.

Где это работает в продакшне? Tesla Autopilot гоняет детектор на кастомном чипе FSD - 36 TOPS, real-time на 8 камерах одновременно. Системы видеонаблюдения (Hikvision, Axis) встраивают YOLO прямо в камеру - edge inference без облака. Amazon Go (кассы без кассиров) использует детекцию объектов + трекинг для подсчета товаров. Медицинская диагностика: детекция полипов на колоноскопии - YOLO-based системы показывают recall выше опытных эндоскопистов.

Сравнение YOLOv8n vs SSD-MobileNet на COCO: YOLOv8n - mAP 37.3%, 8.7 ms inference (GPU). SSD-MobileNet V2 - mAP 22.1%, 3.2 ms (мобильные CPU). Выбор зависит от приоритета: точность vs скорость на конкретном железе.

YOLO 'смотрит' на изображение несколько раз - по одному разу на каждый предсказанный объект

Весь forward pass происходит один раз. Все боксы, scores и классы выдаются параллельно за один проход через сеть.

Отсюда и скорость. Сеть не итерируется по объектам - она предсказывает весь тензор предсказаний за одну матричную операцию. 45 FPS против 0.02 FPS у R-CNN - именно потому что один pass вместо тысяч.

Система детекции пешеходов для дрона плохо находит людей внизу (мелкие объекты в кадре), но хорошо - большие здания. Какое архитектурное изменение поможет больше всего?

Ключевые идеи

  • Anchor boxes - не случайные шаблоны, а кластеры из k-means на реальном датасете. Сеть предсказывает смещения от якорей, не абсолютные координаты.
  • IoU измеряет перекрытие двух прямоугольников: от 0 (нет пересечения) до 1 (идеальное совпадение). Стандартный порог - 0.5 для PASCAL VOC, 0.5-0.95 для COCO.
  • NMS - жадный отбор: берем бокс с max confidence, удаляем все боксы с IoU > порога, повторяем. Soft-NMS плавно снижает confidence вместо удаления.
  • mAP = среднее Average Precision по всем классам. AP - площадь под Precision-Recall кривой. Честная метрика, не зависящая от выбора порога.
  • SSD предсказывает из нескольких feature maps разного масштаба - ранние для мелких объектов, поздние для крупных. YOLO эволюционировал к той же идее в v3.

Связанные темы

Object detection связывает backbone-архитектуры, метрики качества и алгоритмы постобработки:

  • Modern CNN Architectures — YOLO использует как backbone - EfficientNet, ResNet, DarkNet
  • Two-Stage Detectors: R-CNN — Альтернативный подход - медленнее, но точнее на плотных сценах
  • Precision и Recall — mAP строится поверх базовых метрик классификации

Вопросы для размышления

  • YOLO делит изображение на сетку 13x13. Что произойдет с детекцией, если два объекта одного класса находятся в одной ячейке сетки - и как это ограничение обошли в YOLOv2+?
  • SSD предсказывает из 6 разных feature maps. Как, по-вашему, сеть 'знает', из какого масштаба предсказывать конкретный объект - это задается явно или возникает само в процессе обучения?
  • mAP@0.5 у двух детекторов одинаковый - 52%. Но mAP@0.5:0.95 у первого 38%, у второго 29%. Что это говорит о втором детекторе?

Связанные уроки

  • cv-05 — YOLO строится поверх backbone-архитектур CNN
  • cv-07 — Two-stage детекторы R-CNN как альтернативная ветка
  • ml-05-evaluation — mAP - метрика качества, основанная на precision/recall
  • prob-03-conditional — NMS как жадный отбор: условная вероятность vs порог IoU
  • alg-10-binary-search — Grid-поиск YOLO структурно похож на бинарный поиск в пространстве
  • ml-01-intro
Object Detection: YOLO, SSD

0

1

Войти