Машинное обучение

Детекция объектов: YOLO, SSD, R-CNN

Беспилотный автомобиль должен распознавать пешеходов, дорожные знаки и другие машины в реальном времени - 30 и более кадров в секунду. Детекция объектов отвечает не просто на вопрос что на изображении, а что и где именно, и разница между 100 миллисекундами и 50 миллисекундами времени отклика может спасти жизнь. Как нейросеть за доли секунды находит десятки объектов на одном кадре?

  • **Автономное вождение** - Tesla, Waymo и другие компании используют детекцию объектов для распознавания пешеходов, машин, велосипедистов и дорожных знаков в реальном времени, обрабатывая до 36 кадров в секунду с нескольких камер одновременно
  • **Медицинская диагностика** - детекторы находят опухоли на рентгеновских снимках, маммограммах и КТ, помогая радиологам не пропустить мелкие аномалии размером от нескольких миллиметров, что критично для ранней диагностики рака
  • **Розничная торговля и склады** - Amazon Go использует object detection для автоматической фиксации товаров, которые покупатель берёт с полки, а роботы на складах распознают и сортируют тысячи посылок в час

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

  • Image Classification

От скользящих окон до одностадийных детекторов

У детекции история длиннее, чем принято думать. В 2001 году Пол Виола и Майкл Джонс построили первый практичный детектор лиц реального времени на признаках Хаара и каскаде простых классификаторов, алгоритм, стоявший за десятилетием компактных камер. Глубокое обучение изменило поле в 2014 году, когда R-CNN Росса Гиршика прогнал свёрточную сеть по предложенным регионам, обменяв скорость на большой прирост точности. Узким местом была медлительность двухстадийных конвейеров. В 2015 году Джозеф Редмон переформулировал задачу в YOLO, You Only Look Once, которая предсказывала рамки и классы за один проход по изображению и работала в реальном времени. В 2016 году вышел SSD с похожей одностадийной схемой на нескольких масштабах признаков, и компромисс скорость против точности между одно- и двухстадийными детекторами до сих пор определяет поле.

Anchor Boxes и IoU

Классификация изображений отвечает на вопрос **"что?"** - на картинке кот или собака. Детекция объектов отвечает на вопрос **"что и где?"** - на картинке кот в левом верхнем углу и собака справа внизу. Для этого модель должна выдать не просто класс, а **bounding box** - прямоугольную рамку вокруг каждого объекта. Каждый bounding box описывается четырьмя числами: координаты центра (x, y), ширина w и высота h.

Как оценить, насколько хорошо предсказанный bounding box совпадает с реальным? Для этого используют метрику **IoU (Intersection over Union)** - отношение площади пересечения двух прямоугольников к площади их объединения. IoU = 1.0 означает идеальное совпадение, IoU = 0 - рамки не пересекаются вообще. На практике предсказание считается верным, если IoU >= 0.5 (а для строгих задач - IoU >= 0.75).

Но как модель генерирует bounding boxes? Наивный подход - перебрать все возможные прямоугольники на изображении - нереально медленный. Решение: **anchor boxes** (якорные рамки). Это набор **заранее заданных шаблонов** прямоугольников разного размера и пропорций. Изображение делится на сетку, и в каждой ячейке размещаются несколько anchor boxes. Модель не предсказывает координаты с нуля, а **корректирует** ближайший anchor box - сдвигает и масштабирует его. Например, сетка 6x6 с 3 шаблонами на ячейку дает 108 anchor boxes на изображение. Для каждого anchor модель предсказывает: смещение центра (dx, dy), изменение размера (dw, dh), objectness (есть ли объект) и вероятности классов.

**Non-Max Suppression (NMS) - убираем дубликаты:** Один объект часто активирует несколько anchor boxes. Например, кот может получить 5-10 рамок с высокой уверенностью. NMS оставляет только лучшую: 1. Отсортировать все рамки по confidence (уверенности) - от высокой к низкой 2. Взять рамку с наивысшим confidence 3. Удалить все рамки, у которых IoU с ней > порога (обычно 0.5) 4. Повторить для оставшихся рамок Результат: один bounding box на объект вместо десятка перекрывающихся.

Изображение разбито на сетку 8x8 с 5 anchor boxes в каждой ячейке. Сколько всего anchor boxes генерируется для одного изображения?

YOLO: You Only Look Once

До 2016 года детекция объектов работала в два этапа: сначала найди "подозрительные" области, потом классифицируй каждую. Это было точно, но медленно - 2-7 кадров в секунду. **YOLO (You Only Look Once)** перевернул подход: одна нейросеть за один проход смотрит на всё изображение и сразу выдаёт все bounding boxes и классы. Отсюда и название - "смотришь только один раз". Результат: скорость выросла до **45-155 FPS** в реальном времени.

Ключевая идея YOLO: **детекция как задача регрессии**. Вместо сложного пайплайна "предложи области - классифицируй каждую" - одна сеть, один loss, один прямой проход. Каждая ячейка сетки отвечает за объекты, чей центр попадает в эту ячейку. Если центр кота в ячейке (3, 4), именно эта ячейка предсказывает bounding box кота.

**Эволюция YOLO - от v1 до v8:** - **YOLOv1** (2016): первый real-time детектор, 45 FPS, но плохо с маленькими объектами - **YOLOv2** (2017): добавил anchor boxes, batch normalization, multi-scale training - **YOLOv3** (2018): multi-scale predictions (3 масштаба), лучше для мелких объектов - **YOLOv4** (2020): CSPDarknet backbone, Mosaic augmentation, bag of freebies - **YOLOv5** (2020): PyTorch реализация от Ultralytics, удобный API - **YOLOv8** (2023): anchor-free дизайн, decoupled head, state-of-the-art по скорости Каждая версия улучшала точность при сохранении real-time скорости. YOLOv8 достигает 50+ mAP на COCO при 100+ FPS.

Скорость YOLO делает его стандартом для real-time задач: видеонаблюдение, автопилот, робототехника. Но есть компромисс: на мелких и плотно расположенных объектах YOLO уступает двухстадийным детекторам. Каждая ячейка может предсказать ограниченное число объектов, и если в одной ячейке оказалось несколько мелких объектов, часть из них будет пропущена.

В чём главное архитектурное отличие YOLO от двухстадийных детекторов (таких как R-CNN)?

SSD: Single Shot Detector

SSD (Single Shot MultiBox Detector), как и YOLO, делает детекцию за один проход. Но у SSD есть ключевое преимущество: **мультимасштабные feature maps**. Вместо того чтобы делать предсказания только на последнем слое CNN (как YOLOv1), SSD берёт feature maps с **нескольких слоёв разного разрешения** и делает предсказания на каждом из них. Ранние слои (крупные карты) ловят мелкие объекты, поздние (мелкие карты) - крупные.

Почему мультимасштабность важна? На карте 38x38 каждая ячейка "видит" маленький участок изображения - идеально для мелких объектов (пешеход вдалеке, дорожный знак). На карте 3x3 каждая ячейка охватывает треть изображения - подходит для крупных объектов (автобус, здание). YOLO v1 предсказывал только на одном масштабе, поэтому плохо справлялся с маленькими объектами. SSD решил эту проблему ещё до YOLOv3.

**Default boxes (anchor boxes) в SSD:** На каждом масштабе SSD размещает anchor boxes разных пропорций: - Квадратные (1:1) - Прямоугольные (2:1, 1:2, 3:1, 1:3) - Дополнительный масштаб (среднее геометрическое текущего и следующего) Размер default box привязан к масштабу feature map: - На 38x38: маленькие boxes (30x30 пикселей) - На 3x3: большие boxes (250x250 пикселей) Модель для каждого default box предсказывает: - 4 смещения (dx, dy, dw, dh) для коррекции позиции - C+1 вероятность классов (+1 для фона)

SSD занимает промежуточное положение: быстрее Faster R-CNN (за счёт single-shot подхода), но часто точнее раннего YOLO на мелких объектах (за счёт мультимасштабных предсказаний). В современной практике YOLOv5-v8 обогнали SSD по обоим параметрам, но SSD остаётся важным для понимания эволюции детекторов и используется в edge-устройствах (MobileNet-SSD для мобильных приложений).

Почему SSD лучше справляется с мелкими объектами по сравнению с YOLOv1?

Faster R-CNN: двухстадийный детектор

Faster R-CNN - это **двухстадийный** (two-stage) детектор. Первая стадия - **Region Proposal Network (RPN)** - смотрит на feature map и предлагает "подозрительные" области, где *возможно* есть объекты. Вторая стадия берёт каждую предложенную область, вырезает соответствующий кусок feature map и классифицирует его: какой объект и точные координаты bounding box. Два этапа вместо одного - медленнее, но точнее.

Эволюция R-CNN семейства показывает, как детекция ускорялась: **R-CNN** (2014) - вырезал ~2000 регионов из изображения и пропускал каждый через CNN отдельно (47 секунд на изображение!). **Fast R-CNN** (2015) - пропускал изображение через CNN один раз и вырезал регионы из feature map (0.3 секунды). **Faster R-CNN** (2015) - заменил внешний алгоритм генерации регионов (Selective Search) на обучаемую RPN сеть (0.06 секунды, ~17 FPS).

**ROI Pooling - как вырезать область из feature map:** Region proposal может быть любого размера (143x87, 50x200 и т.д.), а полносвязный слой требует фиксированный вход (например, 7x7). ROI Pooling решает это: 1. Берёт область feature map, соответствующую proposal 2. Делит её на сетку 7x7 3. В каждой ячейке берёт max pooling 4. Результат: всегда 7x7, независимо от размера proposal Улучшенная версия - **ROI Align** (из Mask R-CNN): использует билинейную интерполяцию вместо грубого округления, что повышает точность для задач сегментации.

YOLO всегда лучше Faster R-CNN, потому что быстрее и современнее

Faster R-CNN лучше для задач с маленькими объектами и когда точность важнее скорости - медицинская диагностика, спутниковые снимки, научные исследования

Двухстадийный подход Faster R-CNN позволяет тщательнее анализировать каждый region proposal. RPN фильтрует фон, а вторая стадия точно классифицирует оставшиеся регионы. Для мелких объектов (менее 32x32 пикселей) Faster R-CNN стабильно превосходит одностадийные детекторы. Выбор архитектуры зависит от конкретной задачи: real-time системы выиграют от YOLO, а задачи с высокой ценой ошибки - от Faster R-CNN.

Какую роль играет Region Proposal Network (RPN) в архитектуре Faster R-CNN?

Итоги

  • **Anchor boxes и IoU:** детекция требует не только класс, но и координаты объекта - anchor boxes задают шаблоны рамок, IoU измеряет качество предсказания, а NMS убирает дублирующие рамки
  • **YOLO (one-stage):** один проход через CNN выдаёт все bounding boxes и классы за раз - 45-155 FPS, идеально для real-time задач, но может пропускать мелкие объекты
  • **SSD (one-stage, multi-scale):** предсказания на нескольких масштабах feature maps - ранние слои ловят мелкие объекты, поздние - крупные, что даёт баланс между скоростью и детализацией
  • **Faster R-CNN (two-stage):** RPN предлагает регионы, вторая стадия классифицирует каждый - медленнее, но точнее для мелких объектов и задач с высокой ценой ошибки, как в беспилотных автомобилях, где каждая миллисекунда и каждый пропущенный пешеход на счету

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

Object detection строится на классификации изображений и открывает путь к более сложным задачам компьютерного зрения:

  • Классификация изображений — Фундамент для детекции: CNN backbone (ResNet, VGG) из классификации используется как feature extractor в YOLO, SSD и Faster R-CNN. Детекция добавляет к классификации локализацию - ответ на вопрос где находится объект
  • Сегментация изображений — Следующий уровень детализации после детекции: вместо прямоугольной рамки модель предсказывает точную маску объекта пиксель за пикселем. Mask R-CNN расширяет Faster R-CNN добавлением ветки сегментации
  • Transfer Learning — Все современные детекторы используют предобученные backbone сети (ImageNet). Fine-tuning предобученного YOLO или Faster R-CNN на своих данных - стандартный подход, когда разметки мало

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

  • Если бы вы разрабатывали систему видеонаблюдения для парковки, какой детектор вы бы выбрали - YOLO, SSD или Faster R-CNN? Какие факторы повлияли бы на ваш выбор (размер объектов, скорость, точность)?
  • Почему anchor boxes разного размера и пропорций важны для детекции? Что произойдёт, если использовать только квадратные anchors одного размера?
  • Как эволюция от R-CNN (47 секунд) до Faster R-CNN (0.06 секунды) иллюстрирует общий принцип оптимизации в ML - замену ручных алгоритмов на обучаемые нейросети?

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

  • ml-38-image-classification — Детекция расширяет классификацию локализацией
  • ml-40-segmentation — Детекция предшествует instance-сегментации
  • ml-41-transfer-learning — Детекторы переиспользуют предобученные бэкбоны
  • ml-05-evaluation — mAP и IoU измеряют качество детекции
  • alg-20-greedy — Non-max suppression - жадный фильтр
  • la-06-transformations
Детекция объектов: YOLO, SSD, R-CNN

0

1

Войти