Машинное обучение
Детекция объектов: YOLO, SSD, R-CNN
Беспилотный автомобиль должен распознавать пешеходов, дорожные знаки и другие машины в реальном времени - 30 и более кадров в секунду. Детекция объектов отвечает не просто на вопрос что на изображении, а что и где именно, и разница между 100 миллисекундами и 50 миллисекундами времени отклика может спасти жизнь. Как нейросеть за доли секунды находит десятки объектов на одном кадре?
- **Автономное вождение** - Tesla, Waymo и другие компании используют детекцию объектов для распознавания пешеходов, машин, велосипедистов и дорожных знаков в реальном времени, обрабатывая до 36 кадров в секунду с нескольких камер одновременно
- **Медицинская диагностика** - детекторы находят опухоли на рентгеновских снимках, маммограммах и КТ, помогая радиологам не пропустить мелкие аномалии размером от нескольких миллиметров, что критично для ранней диагностики рака
- **Розничная торговля и склады** - Amazon Go использует object detection для автоматической фиксации товаров, которые покупатель берёт с полки, а роботы на складах распознают и сортируют тысячи посылок в час
Предварительные знания
От скользящих окон до одностадийных детекторов
У детекции история длиннее, чем принято думать. В 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