Компьютерное зрение
Two-Stage Detectors: семейство R-CNN
Предварительные знания
- Single-shot детекторы YOLO и SSD как точка сравнения (cv-06)
- Anchor boxes, IoU и Non-Maximum Suppression
- CNN-классификатор как backbone для извлечения признаков
Семейство R-CNN
В 2014 году Ross Girshick с коллегами из UC Berkeley опубликовали R-CNN (Regions with CNN features). Подход применял CNN примерно к 2000 region proposals на изображение, подняв точность детекции на PASCAL VOC далеко за пределы прежних методов, но он был мучительно медленным, потому что каждый регион проходил через сеть отдельно. Girshick решил проблему скорости в 2015 году с Fast R-CNN, который прогонял CNN один раз по всему изображению и собирал признаки по регионам через RoI Pooling. Позже в 2015 году Shaoqing Ren, Kaiming He, Ross Girshick и Jian Sun завершили линейку с Faster R-CNN, заменив медленные внешние region proposals обучаемой Region Proposal Network, которая делит признаки с детектором. Это сделало двухстадийную детекцию почти работающей в реальном времени и задало шаблон точной детекции, используемый до сих пор.
Автопилот Tesla должен распознавать пешехода за 50 миллисекунд при скорости 120 км/ч - за это время машина проезжает полтора метра. В 2013 году лучший детектор тратил 47 секунд на одно изображение. За четыре года R-CNN семейство сократило это время в 1000 раз - без потери точности.
- **Автопилоты:** Faster R-CNN с FPN лежит в основе многих production детекторов для ADAS систем
- **Медицинская диагностика:** FPN позволяет находить микронодули в КТ-снимках лёгких (объекты < 6мм)
- **Безопасность:** детекция людей в видеопотоке аэропортов и стадионов в реальном времени
R-CNN (2013): 2000 проходов через CNN
2013 год. ImageNet CNN уже умеют распознавать объекты, но детекция - это другое: надо ещё и найти, где объект на картинке. Girshick et al. предложили простую идею: сначала выделить кандидатов на область, потом классифицировать каждую из них отдельным CNN.
- **Selective Search** генерирует ~2000 region proposals (кандидатов) через алгоритм сегментации на основе текстуры и цвета
- Каждый proposal обрезается и масштабируется до 227x227 пикселей
- AlexNet-подобный CNN извлекает вектор признаков (4096-dim) для каждого proposal
- SVM-классификатор определяет класс, отдельный регрессор уточняет bbox
**Ключевая проблема R-CNN:** CNN прогоняется 2000 раз независимо для каждого proposal. Большинство proposals перекрываются - одни и те же пиксели вычисляются снова и снова. Это прямое расточительство вычислений.
R-CNN на VOC 2012: **53.3% mAP** против 33.7% у лучшего DPM-метода. Скачок качества был огромным - но 47 секунд на кадр делали метод пригодным только для оффлайн-обработки.
Почему R-CNN работает медленно (47 сек/кадр)?
Fast R-CNN (2015): один проход, RoI Pooling
Girshick (2015) перевернул логику: а что если прогнать CNN один раз для всего изображения, а proposals проецировать на уже вычисленные feature maps? Это и есть Fast R-CNN.
- Всё изображение проходит через VGG16 (или другой backbone) один раз → получаем feature map H×W×C
- Selective Search по-прежнему даёт ~2000 proposals, но теперь они проецируются на feature map
- **RoI Pooling** нормализует каждый proposal до фиксированного размера 7×7 (max-pooling с adaptive grid)
- Единственная FC-голова предсказывает класс (softmax) и bbox - без SVM
**RoI Pooling:** proposal с координатами (x1,y1,x2,y2) на исходном изображении масштабируется на feature map, затем делится на 7×7 сетку, в каждой ячейке берётся max. Результат - всегда 7×7 вне зависимости от размера proposal.
Fast R-CNN в 9 раз быстрее R-CNN при обучении и в 213 раз быстрее при инференсе (без учёта Selective Search). Узким местом стал сам Selective Search - чисто алгоритмический метод, который занимал ~2 сек и не обучался совместно с CNN.
В чём главное нововведение Fast R-CNN по сравнению с R-CNN?
Faster R-CNN (2015): Region Proposal Network
Ren et al. (2015) устранили последний узкий момент: Selective Search заменили на **Region Proposal Network (RPN)** - свёрточную сеть, которая предсказывает proposals прямо из feature map. Теперь весь pipeline - одна нейросеть.
RPN скользит 3×3 окном по feature map и для каждой позиции предсказывает вероятность объекта и смещение bbox для 9 якорей разных масштабов. На выходе берут top-300 proposals по objectness score.
| Метод | Proposals/сек | mAP VOC 2007 | FPS |
|---|---|---|---|
| R-CNN | Selective Search (~2s) | 66.0% | 0.02 |
| Fast R-CNN | Selective Search (~2s) | 70.0% | 0.5 |
| Faster R-CNN | RPN (10ms) | 73.2% | 5-17 |
RPN обучается совместно с Fast R-CNN head в 4-шаговой схеме (попеременно) или end-to-end через approximate joint training. Shared backbone означает, что RPN и детектор используют одни и те же признаки - двойная выгода.
Зачем в RPN нужны anchors разных масштабов и соотношений сторон?
Feature Pyramid Network (2017): мультимасштабные признаки
Глубокие CNN создают иерархию feature maps: ранние слои - высокое разрешение, мелкие признаки; поздние слои - низкое разрешение, семантически богатые признаки. Маленькие объекты теряются в поздних слоях, крупные - плохо представлены в ранних. Lin et al. (2017) предложили пирамиду, которая использует оба уровня одновременно.
Lateral connection - это 1×1 conv, который выравнивает число каналов C_i → 256, затем складывается с upsampled P_{i+1}. Финальный 3×3 conv сглаживает артефакты upsampling.
| Метод | COCO mAP | Small AP (< 32px) | Large AP (> 96px) |
|---|---|---|---|
| Faster R-CNN (одна scale) | 36.2% | 19.4% | 47.4% |
| Faster R-CNN + FPN | 42.1% | 26.5% | 53.4% |
Главный выигрыш FPN - детекция **маленьких объектов**: +7.1% AP при объектах меньше 32 пикселей. Именно это критично для автопилота (пешеходы вдалеке) и медицины (микронодули в КТ).
Для чего в FPN нужны lateral connections?
Эволюция R-CNN семейства
- **R-CNN (2013):** 2000 независимых CNN-проходов → 47с/кадр, mAP 53% на VOC
- **Fast R-CNN (2015):** один backbone pass + RoI Pooling → 9x быстрее, mAP 70%
- **Faster R-CNN (2015):** RPN вместо Selective Search → 5-17 FPS, mAP 73%
- **FPN (2017):** мультимасштабная пирамида признаков → +7% AP на маленьких объектах
Связанные темы
Two-stage detectors задали архитектурные паттерны для всего object detection.
- One-Stage Detectors: YOLO, SSD — Альтернативный подход: без RPN, быстрее но менее точно
- Семантическая сегментация — Следующий шаг: не bbox, а попиксельная разметка
Вопросы для размышления
- Почему two-stage подход (proposals → классификация) точнее one-stage, и в каких задачах это преимущество критично?
- Как изменится архитектура Faster R-CNN при необходимости детектировать объекты, отличающиеся по размеру в 100 раз?
- Какие компромиссы возникают при выборе числа proposals в RPN: 300 vs 1000 vs 2000?
Связанные уроки
- cv-06 — Двухстадийные меняют скорость YOLO на точность region proposals
- cv-08 — Region-фичи и ROI Align кормят головы сегментации
- cv-09 — Mask R-CNN добавляет mask-ветку поверх Faster R-CNN
- dl-04 — Свёрточные backbone дают общие карты признаков
- ml-39-object-detection — Та же задача детекции в классическом ML-курсе
- alg-20-greedy — Non-max suppression это жадный выбор лучших боксов
- ml-01