Компьютерное зрение
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
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