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

Instance Segmentation: Mask R-CNN

Камера беспилотника снимает улицу. Два пешехода идут рядом - их bounding boxes перекрываются. Object detection говорит: «здесь два человека». Но для планирования траектории нужен точный контур каждого. Instance segmentation - это CV-задача, где для каждого отдельного объекта на сцене строится пиксельная маска. Mask R-CNN превратил её из академической задачи в промышленный инструмент.

  • **Хирургическая робототехника** - da Vinci использует instance segmentation для точного отслеживания инструментов и тканей в реальном времени
  • **Autopilot Tesla** - раздельные маски пешеходов, автомобилей, разметки для планирования манёвров
  • **Meta AI (SAM)** - инструмент редактирования фото с точным выделением любого объекта одним кликом
  • **Медицинская диагностика** - сегментация опухолей на МРТ, каждая опухоль как отдельный экземпляр

Mask R-CNN: маска как третья голова

В 2017 году команда Facebook AI Research - Kaiming He, Georgia Gkioxari, Piotr Dollár и Ross Girshick - расширила детектор Faster R-CNN одной идеей: добавить к голове классификации и регрессии бокса третью ветвь, предсказывающую бинарную маску для каждого региона. Ключевой технический вклад - RoI Align вместо RoI Pooling: отказ от грубого округления координат дал точное выравнивание признаков и резкий рост качества масок. Работа получила Marr Prize за лучшую статью на ICCV 2017 и на годы стала базовой архитектурой instance segmentation.

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

  • Архитектура Faster R-CNN и RoI Pooling
  • Region Proposal Network
  • Пиксельные маски и метрика IoU
  • Two-Stage Detectors: семейство R-CNN
  • Semantic Segmentation

Mask R-CNN: архитектура

Системы беспилотного вождения различают сотни объектов на дороге - и им недостаточно знать, что «здесь пешеход». Им нужен **точный контур** каждого человека, отдельно от рядом стоящего. Это задача instance segmentation, и Mask R-CNN решает её, добавив третью голову к Faster R-CNN.

Faster R-CNN выдаёт bounding box и класс для каждого объекта. Mask R-CNN добавляет параллельную ветку - **mask head**: небольшую свёрточную сеть, которая для каждого найденного RoI предсказывает бинарную маску 28×28. Ключевой момент: маски предсказываются для каждого класса независимо, а не конкурируют через softmax. Это убирает межклассовую конкуренцию и упрощает обучение.

**Функция потерь Mask R-CNN** - сумма четырёх слагаемых: L_rpn_cls + L_rpn_box + L_cls + L_box + L_mask. Маскная ветка обучается только на positive RoI (где есть GT-объект) и использует бинарную cross-entropy, а не softmax.

Mask R-CNN предсказывает маски для каждого класса независимо (через sigmoid), а не конкурентно (через softmax). Зачем?

RoI Align vs RoI Pooling

RoI Pooling - изобретение Faster R-CNN - работает грубо: делит RoI на сетку ячеек и берёт max из каждой. Координаты округляются до целых пикселей, что создаёт **квантизационный сдвиг** - до 16 пикселей при stride=16. Для bounding box это терпимо. Для маски 28×28, где каждый пиксель важен, - катастрофа.

**RoI Align** (He et al., 2017) решает проблему через **билинейную интерполяцию**: вместо округления - вычисляем значение в любой дробной точке как взвешенное среднее четырёх ближайших пикселей. Никакого округления, никакого сдвига.

**Практический результат:** замена RoI Pooling на RoI Align улучшила mask AP на COCO с 23.6% до 29.2% - рост на 5.6 пунктов без изменения остальной архитектуры.

Почему для задачи маски RoI Align критичен, а для задачи bounding box квантизация RoI Pooling была терпима?

SAM: Segment Anything Model

Mask R-CNN требует обучения на конкретных классах. Хирург в операционной хочет выделить инструмент, который разработчики не предусмотрели. Геолог - отметить редкий тип породы. **SAM** (Meta, 2023) меняет постановку: модель сегментирует **любой** объект, на который указал пользователь - без знания класса, без fine-tuning.

SAM состоит из трёх компонентов. **Image Encoder** - тяжёлый ViT (ViT-H: 636M параметров), запускается один раз и создаёт эмбеддинг изображения. **Prompt Encoder** - кодирует подсказку: точки (клик), прямоугольник, маску или текст. **Mask Decoder** - лёгкий трансформер, принимает оба эмбеддинга и за миллисекунды выдаёт маску. Разделение encoder/decoder позволяет интерактивно работать: encoder - дорого, но один раз; decoder - дёшево при каждом новом промпте.

**SA-1B датасет:** SAM обучался на 1.1 миллиарда масок (11 миллионов изображений) - самый большой датасет сегментации в истории. Маски собраны human-in-the-loop: SAM-assisted аннотаторы.

В SAM Image Encoder запускается один раз, а Mask Decoder - при каждом новом промпте. Зачем такое разделение?

Grounding DINO + SAM 2

SAM сегментирует что угодно, но нужен клик. Зоолог хочет написать «зебра» - и получить маски всех зебр на фото. **Grounding DINO** - open-vocabulary детектор: принимает текстовый запрос и выдаёт bounding boxes объектов. Соединив Grounding DINO + SAM, получаем **text-to-mask** пайплайн: пишем текст, получаем пиксельные маски без разметки.

**SAM 2** (Meta, 2024) расширяет SAM на видео. Архитектура добавляет **Memory Bank** - хранит эмбеддинги предыдущих кадров - и **Memory Attention** в decoder. Объект, размеченный на кадре 1, автоматически отслеживается на кадрах 2, 3, ... - даже через частичное перекрытие.

**SAM 2 на видео:** при точной разметке одного кадра SAM 2 достигает 75.0 J&F на DAVIS benchmark - лучше методов, обученных на видео, с покадровой разметкой.

SAM сам находит объекты на изображении без подсказки

SAM требует промпт - точку, bbox или маску. Без промпта SAM может запустить automatic mask generation, но это просто перебор сетки промптов, а не понимание семантики.

SAM - это интерактивный сегментатор, а не детектор. Семантическое понимание ('что искать') добавляют отдельные модели - Grounding DINO или CLIP.

Grounding DINO + SAM работает без обучения на целевых классах. Что это означает для применения?

Instance Segmentation: Mask R-CNN и SAM

  • Mask R-CNN = Faster R-CNN + параллельная mask head: предсказывает 28×28 бинарную маску для каждого RoI
  • RoI Align заменяет квантизацию RoI Pooling билинейной интерполяцией - +5.6 mask AP на COCO
  • Маски предсказываются независимо для каждого класса (sigmoid), не конкурентно (softmax)
  • SAM = ViT image encoder + prompt encoder + лёгкий mask decoder; encoder - один раз, decoder - при каждом промпте
  • Grounding DINO + SAM = text-to-mask без разметки: open-vocabulary detection → prompt → mask
  • SAM 2 добавляет Memory Bank для отслеживания объектов по видео

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

Instance segmentation строится на детекции и добавляет пиксельный уровень точности. SAM использует ViT-архитектуру, изученную в трансформерах для CV.

  • Object Detection: Faster R-CNN и YOLO — Mask R-CNN расширяет Faster R-CNN третьей головой
  • Feature Pyramid Networks — FPN в backbone Mask R-CNN детектирует объекты разного масштаба

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

  • Почему SAM возвращает три маски разного уровня детализации (деталь / объект / группа) вместо одной?
  • В каких сценариях специализированная модель (обученная Mask R-CNN) предпочтительнее универсального SAM?
  • Как Memory Bank в SAM 2 решает проблему окклюзии объекта в видео?

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

  • cv-07 — Mask R-CNN расширяет Faster R-CNN mask-ветвью
  • cv-08 — Головы семантической сегментации и FPN backbone переиспользуются
  • dl-07 — SAM использует ViT-энкодер изображения для promptable-сегментации
  • ml-40-segmentation — Та же задача масок в классическом ML-курсе
  • alg-19-divide-conquer — Предсказание масок по регионам делит картинку на подзадачи
  • la-01-vectors-intro
Instance Segmentation: Mask R-CNN

0

1

Войти