Машинное обучение
Сегментация изображений
Когда врач смотрит на МРТ-снимок, ему нужно определить не просто "здесь есть опухоль", а её точные границы - каждый пиксель имеет значение. Сегментация изображений даёт компьютерам эту способность: классифицировать каждый отдельный пиксель на картинке. Эта технология помогает врачам находить опухоли на 40% быстрее и используется в беспилотных автомобилях, чтобы понимать, где заканчивается дорога и начинается тротуар.
- **Медицинская визуализация** - U-Net и его вариации сегментируют опухоли, органы и сосуды на МРТ и КТ-снимках с точностью, сравнимой с опытными радиологами, сокращая время анализа одного снимка с 30 минут до 5 минут
- **Автономное вождение** - Mask R-CNN и подобные модели в реальном времени размечают каждый пиксель дорожной сцены: дорога, тротуар, пешеходы, машины, светофоры, знаки - это критически важно для принятия решений о торможении и маневрировании
- **Спутниковый анализ и сельское хозяйство** - семантическая сегментация спутниковых снимков выделяет поля, леса, водоемы и здания, а в точном земледелии определяет здоровые и больные участки посевов для адресного внесения удобрений и пестицидов
Предварительные знания
Полностью свёрточные сети, U-Net и Mask R-CNN
Сегментация ставит вопрос сложнее классификации: метка для каждого пикселя. Прорыв случился в 2015 году, когда Джонатан Лонг, Эван Шелхамер и Тревор Даррелл в Беркли показали, что полностью свёрточная сеть может превратить классификационную модель в плотный попиксельный предиктор, заменив финальные слои на повышающую дискретизацию. В том же году Олаф Роннебергер с коллегами представил U-Net для биомедицинских изображений, соединив сужающийся энкодер с расширяющимся декодером и пропускными связями, переносившими мелкие детали через бутылочное горлышко; симметричная форма сделала её стандартом для медицинских и научных изображений. В 2017 году команда Кайминга Хэ расширила Faster R-CNN до Mask R-CNN, добавив ветвь, выдающую пиксельную маску для каждого найденного объекта, и объединила детекцию и сегментацию экземпляров в одной модели.
Семантическая сегментация
В задаче классификации изображений мы присваиваем одну метку всей картинке: "кошка" или "собака". Object detection идет дальше - находит *где* находится объект через bounding box. Но bounding box - это грубый прямоугольник, внутри которого могут быть пиксели фона. **Семантическая сегментация** решает задачу на уровне каждого пикселя: для каждого из миллионов пикселей изображения модель определяет, к какому классу он принадлежит. Результат - не прямоугольник, а точная маска объекта.
Первой архитектурой для семантической сегментации стали **FCN (Fully Convolutional Networks)**. Ключевая идея: заменить полносвязные слои в обычной CNN (например, VGG-16) на свёрточные. Обычная CNN принимает картинку 224x224 и выдает вектор из N классов. FCN принимает картинку *любого* размера и выдает карту классов того же размера - **dense prediction**. Для этого используется **encoder-decoder** архитектура: encoder (сверточные слои) сжимает изображение в компактное представление, а decoder (слои upsampling) восстанавливает его до исходного размера.
**Loss-функции для сегментации:** **Pixel-wise Cross-Entropy** - стандартная cross-entropy, но вычисляется для каждого пикселя отдельно, потом усредняется. Проблема: если 90% пикселей - фон, модель может предсказывать "фон" везде и получить 90% accuracy. **Dice Loss** решает проблему дисбаланса классов: - Dice = 2 * |A пересечение B| / (|A| + |B|) - Измеряет перекрытие предсказанной маски (A) и реальной (B) - Значение от 0 (нет совпадения) до 1 (идеальное совпадение) - Dice Loss = 1 - Dice - Не зависит от соотношения классов - одинаково штрафует ошибки на маленьких и больших объектах
**Применения семантической сегментации** охватывают критически важные области. В **медицине** - выделение опухолей, органов и сосудов на МРТ и КТ-снимках: врач получает точные границы патологии, а не приблизительный прямоугольник. В **автономном вождении** - разметка каждого пикселя на классы: дорога, тротуар, пешеход, автомобиль, светофор. В **сельском хозяйстве** - анализ спутниковых снимков: карта полей, определение здоровых и больных растений. Ключевая метрика качества - **mIoU** (mean Intersection over Union): среднее IoU по всем классам.
Почему Dice Loss лучше подходит для сегментации, чем обычная pixel-wise Cross-Entropy, когда объект занимает малую часть изображения?
Instance сегментация
Семантическая сегментация присваивает каждому пикселю *класс*, но не различает отдельные объекты внутри класса. Если на фотографии три кошки стоят рядом, семантическая сегментация покрасит все их пиксели одним цветом - "кошка". Мы узнаем *что* это, но не *сколько* их и *где* границы каждой. **Instance сегментация** решает эту проблему: каждый отдельный объект получает уникальный идентификатор. Три кошки - три разных маски: кошка_1, кошка_2, кошка_3.
Существуют два принципиальных подхода к instance сегментации. **Top-down (сверху вниз):** сначала найти объекты через object detection (bounding boxes), потом внутри каждого box выполнить бинарную сегментацию. Mask R-CNN использует именно этот подход. **Bottom-up (снизу вверх):** сначала выполнить семантическую сегментацию всех пикселей, потом группировать пиксели одного класса в отдельные объекты (через embedding-пространство или watershed алгоритм). Top-down подход обычно точнее для стандартных задач.
**Panoptic сегментация = семантическая + instance:** Panoptic сегментация объединяет оба типа. Все пиксели изображения делятся на: - **Things (вещи)** - счетные объекты (люди, машины, кошки). Для них нужна instance сегментация - различать каждый объект. - **Stuff (вещества)** - несчетные области (небо, дорога, трава). Для них достаточно семантической сегментации - все пиксели неба одинаковы. Panoptic Quality (PQ) = SQ * RQ: - SQ (Segmentation Quality) - насколько точны маски - RQ (Recognition Quality) - насколько хорошо обнаружены объекты Современные модели (Panoptic FPN, MaskFormer) решают обе задачи одной сетью.
Instance сегментация критична в задачах, где нужно *считать* и *отслеживать* объекты. Автономный автомобиль должен знать не просто "на дороге есть пешеходы", а сколько их, где каждый, и отслеживать траекторию каждого. В **робототехнике** робот должен схватить конкретный предмет из кучи одинаковых деталей - ему нужна маска *этой* детали. В **медицине** подсчет отдельных клеток на микроскопическом снимке невозможен без instance сегментации.
На изображении видны 5 человек, стоящих группой. Какой тип сегментации позволит определить точное количество людей?
U-Net
**U-Net** - архитектура, которая произвела революцию в медицинской сегментации изображений. Создана в 2015 году для сегментации клеток на микроскопических снимках, где обучающих данных катастрофически мало (десятки изображений вместо тысяч). Главная проблема encoder-decoder архитектур: при downsampling (сжатии) в encoder пространственная информация теряется - мы знаем *что* есть на картинке, но не *где точно*. При upsampling (восстановлении) в decoder мелкие детали и точные границы размываются. U-Net решает это через **skip connections**.
**Skip connections** - ключевая инновация U-Net. На каждом уровне encoder feature map *копируется* и *конкатенируется* с соответствующим уровнем decoder. Зачем? Encoder на ранних слоях содержит информацию о точных краях, текстурах и мелких деталях - эта информация теряется при pooling. Decoder через skip connections получает доступ к этим деталям напрямую, минуя bottleneck. Результат: decoder может восстанавливать точные границы объектов, комбинируя семантическую информацию из глубоких слоев с пространственной информацией из ранних.
**Почему skip connections работают:** Без skip connections decoder получает только сжатый bottleneck (28x28). Из него надо восстановить 572x572 - но информация о точных границах уже потеряна после 4 pooling. Со skip connections decoder на каждом уровне получает: - Из decoder ниже: ЧТО есть (семантика, но размытые границы) - Из encoder через skip: ГДЕ точно (края, текстуры, детали) Concatenation объединяет оба источника: - decoder feature: 40x40x512 (семантика) - encoder feature: 40x40x512 (детали) - после concat: 40x40x1024 (оба!) Свёрточные слои после concat учатся комбинировать семантику с деталями. Аналогия: представьте, что вы рисуете портрет. Bottleneck - это словесное описание ("круглое лицо, карие глаза"). Skip connections - фотография для справки по деталям.
U-Net изначально создан для **медицинских** задач, где данных мало: сегментация клеток, выделение органов на КТ, определение границ опухолей на МРТ. Архитектура использует data augmentation (elastic deformations, повороты) для компенсации малого объёма данных. Сегодня U-Net и его вариации (U-Net++, Attention U-Net, nnU-Net) - стандарт в медицинской визуализации. nnU-Net автоматически подбирает архитектуру, предобработку и augmentation под конкретный датасет, выигрывая 33 из 53 соревнований на Medical Segmentation Decathlon.
Какую проблему решают skip connections в U-Net?
Mask R-CNN
**Mask R-CNN** - расширение Faster R-CNN для instance сегментации. Напомним: Faster R-CNN выполняет object detection в два этапа - Region Proposal Network (RPN) предлагает области с объектами, потом для каждого региона сеть предсказывает класс и уточняет bounding box. Mask R-CNN добавляет **третью ветвь (mask branch)**: параллельно с классификацией и bbox-регрессией сеть предсказывает бинарную маску объекта внутри каждого bounding box. Три задачи решаются одновременно: *что* это (класс), *где* (bbox), и *какие пиксели* принадлежат объекту (маска).
Ключевая инновация Mask R-CNN - **ROI Align** вместо ROI Pooling. В Faster R-CNN ROI Pooling округляет координаты региона до целых пикселей, теряя точность. Для detection потеря 1-2 пикселей допустима - bbox всё равно грубый. Но для сегментации каждый пиксель важен! ROI Align использует **билинейную интерполяцию** вместо округления: координаты могут быть дробными, а значения в них вычисляются как взвешенное среднее соседних пикселей. Это даёт на 10-50% более точные маски.
**Mask branch - предсказание маски:** Mask branch - это мини-FCN (полностью свёрточная сеть) внутри каждого ROI: - Вход: ROI Align feature 14x14x256 - 4 свёрточных слоя 3x3 (256 каналов) - Deconvolution 2x2 (upsample до 28x28) - Выход: 28x28 x K (K = число классов) Важный дизайн: маска предсказывается **для каждого класса отдельно** (K масок). Класс определяется ветвью classification. Это разделяет задачи: classification решает *что*, mask branch решает *форму*. На inference: берём предсказанный класс, выбираем соответствующую маску, ресайзим до размера bounding box, и накладываем на изображение.
Mask R-CNN обучен на **COCO dataset** (80 классов, 200K+ изображений с масками) и достигает около 37-39 AP (Average Precision) на COCO benchmark. Для кастомных задач Detectron2 позволяет дообучить (fine-tune) модель на своих данных: нужно подготовить аннотации масок (например, через CVAT или Label Studio), зарегистрировать датасет и запустить обучение. Обычно хватает 1000-5000 размеченных изображений для хорошего качества на узкой предметной области.
Сегментация нужна только для автономных автомобилей
Сегментация используется в медицине (выделение опухолей и органов), сельском хозяйстве (анализ состояния посевов), робототехнике (захват объектов), видео-эффектах (замена фона), дополненной реальности (AR) и многих других областях
Автономное вождение - самый известный, но далеко не единственный пример. В медицине сегментация помогает врачам обнаруживать опухоли на 40% быстрее. В сельском хозяйстве дроны сегментируют поля для точного внесения удобрений. В видеозвонках (Zoom, Teams) сегментация отделяет человека от фона в реальном времени. В робототехнике сегментация позволяет роботам распознавать и захватывать конкретные предметы.
Почему Mask R-CNN использует ROI Align вместо ROI Pooling из Faster R-CNN?
Итоги
- **Семантическая сегментация** классифицирует каждый пиксель изображения через encoder-decoder архитектуру (FCN), используя Dice Loss для устойчивости к дисбалансу классов и mIoU как главную метрику качества
- **Instance сегментация** идет дальше - различает отдельные объекты одного класса, присваивая каждому уникальную маску, а panoptic сегментация объединяет оба подхода для полного понимания сцены
- **U-Net** решает проблему потери пространственных деталей через skip connections - конкатенация features из encoder с decoder на каждом уровне позволяет восстановить точные границы, что критически важно для медицинских снимков
- **Mask R-CNN** добавляет mask branch к Faster R-CNN и использует ROI Align вместо ROI Pooling для попиксельной точности - именно так компьютер определяет точные границы каждого объекта, как врач из нашего примера определяет точные границы опухоли на МРТ
Связанные темы
Сегментация изображений опирается на свёрточные сети и detection, расширяя их до попиксельного понимания визуальной сцены:
- Object Detection — Прямой предшественник: Faster R-CNN находит объекты через bounding boxes, а Mask R-CNN расширяет его третьей ветвью для предсказания масок. Понимание RPN и ROI Pooling необходимо для работы с Mask R-CNN
- Свёрточные нейронные сети (CNN) — Фундамент всех архитектур сегментации: encoder в U-Net и FCN - это обычная CNN (VGG, ResNet), а backbone в Mask R-CNN использует ResNet + FPN для извлечения multi-scale features
- Transfer Learning — На практике encoder в U-Net и backbone в Mask R-CNN почти всегда инициализируются весами, предобученными на ImageNet, что критически ускоряет обучение и улучшает качество, особенно при малом количестве данных
Вопросы для размышления
- Почему skip connections в U-Net используют конкатенацию (concat), а не сложение (add), как residual connections в ResNet? Какая разница в том, сколько информации передаётся из encoder в decoder?
- Mask R-CNN предсказывает отдельную маску для каждого класса (K масок на объект), хотя используется только одна. Почему такой избыточный подход работает лучше, чем предсказание одной маски, зависящей от класса?
- Если вам нужно сегментировать клетки на микроскопическом снимке (200 обучающих изображений) - какую архитектуру вы выберете: FCN, U-Net или Mask R-CNN? Какие факторы определяют этот выбор?
Связанные уроки
- ml-39-object-detection — Сегментация уточняет детекцию до пикселей
- ml-29-cnn — Encoder-decoder из CNN-блоков
- ml-41-transfer-learning — Предобученные энкодеры ускоряют сегментацию
- ml-32-autoencoders — U-Net повторяет структуру энкодер-декодер
- prob-09-discrete-dist — Пиксельный softmax даёт распределения классов
- la-06-transformations