Как реализовать semantic segmentation?

Semantic segmentation (семантическая сегментация) — это задача компьютерного зрения, в которой каждый пиксель изображения классифицируется в один из заранее заданных классов. В отличие от object detection, где каждый объект обозначается рамкой, здесь важна пиксельная точность: модель должна понять, что каждый пиксель относится, например, к человеку, машине, зданию и т. д.

1. Общая идея семантической сегментации

  • Цель: предсказать маску, которая имеет такую же пространственную размерность, как и входное изображение, но вместо RGB-каналов содержит метки классов для каждого пикселя.

  • Результат: тензор размером H×W×CH \times W \times C, где CC — количество классов, а значение в каждой позиции — вероятность принадлежности пикселя классу.

2. Архитектура нейронной сети для сегментации

Наиболее распространённый подход — энкодер-декодерная архитектура (encoder-decoder), где:

  • Энкодер извлекает признаки и понижает разрешение (обычно через свёртки и пуллинг).

  • Декодер восстанавливает пространственную структуру, создавая предсказания на уровне пикселей.

Примеры архитектур:

  • U-Net — классическая архитектура с симметричными skip-соединениями.

  • DeepLab (v1–v3+) — использует dilated (atrous) convolutions и CRF (в ранних версиях).

  • PSPNet — pyramid pooling, захватывающий глобальный контекст.

  • SegNet — энкодер на основе VGG, декодер с upsampling.

  • FCN (Fully Convolutional Networks) — замена полносвязных слоёв на свёртки.

3. Компоненты реализации семантической сегментации

(1) Подготовка данных

  • Изображения + маски (аннотированные вручную или полуавтоматически)

  • Маска — изображение той же ширины и высоты, где каждый пиксель — номер класса.

  • Форматы: PNG, TIFF (для масок); JPG, PNG (для RGB-изображений)

(2) Аугментация

  • Используется для улучшения обобщающей способности модели.

  • Методы:

    • Повороты, обрезка, зеркалирование

    • Цветовые изменения (HSV, яркость)

    • Elastic transform

    • Нужно применять **одинаково к изображению и маске
      **

(3) Архитектура модели

Обычно берётся предобученный энкодер (например, ResNet, EfficientNet, VGG), а затем добавляется декодер.

Пример (U-Net на PyTorch):

import torchvision.models as models
import torch.nn as nn
class UNet(nn.Module):
def \__init_\_(self, num_classes):
super().\__init_\_()
self.encoder = models.resnet34(pretrained=True)
\# Используем части ResNet как энкодер
self.decoder = nn.Sequential(
nn.ConvTranspose2d(512, 256, 2, stride=2),
nn.ReLU(),
nn.ConvTranspose2d(256, 128, 2, stride=2),
nn.ReLU(),
nn.ConvTranspose2d(128, 64, 2, stride=2),
nn.ReLU(),
nn.ConvTranspose2d(64, num_classes, 2, stride=2)
)
def forward(self, x):
x = self.encoder.conv1(x)
x = self.encoder.bn1(x)
x = self.encoder.relu(x)
x = self.encoder.maxpool(x)
x = self.encoder.layer1(x)
x = self.encoder.layer2(x)
x = self.encoder.layer3(x)
x = self.encoder.layer4(x)
return self.decoder(x)

(4) Loss-функции

Выбор зависит от задачи и структуры маски.

  • CrossEntropyLoss: стандартная для многоклассовой сегментации.

  • Dice Loss: особенно полезна, если классы сильно несбалансированы.

  • Focal Loss: снижает вес «лёгких» пикселей, усиливает «трудные».

  • IoU Loss: ориентирована на улучшение Intersection over Union метрики.

  • Комбинированные: например, 0.7 * BCE + 0.3 * Dice

(5) Метрики

  • Pixel Accuracy: процент правильно классифицированных пикселей.

  • IoU (Jaccard Index): мера перекрытия предсказанной и истинной маски.

  • Mean IoU: среднее по всем классам.

  • Dice Coefficient: сходная с IoU метрика.

  • Per-Class Accuracy: точность по каждому классу отдельно.

(6) Тренировка

import torch.optim as optim
model = UNet(num_classes=21)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
for epoch in range(epochs):
for x_batch, y_batch in train_loader:
optimizer.zero_grad()
preds = model(x_batch)
loss = criterion(preds, y_batch)
loss.backward()
optimizer.step()

(7) Post-processing

  • CRF (Conditional Random Fields) — уточняет границы объектов.

  • Morphological operations (opening, closing, dilation) — сглаживают шум в бинарных масках.

  • Thresholding — используется в бинарной сегментации, чтобы перевести вероятности в маску (например, > 0.5 → 1).

4. Anchor-free vs Anchor-based

В отличие от object detection, семантическая сегментация не использует anchor boxes — каждый пиксель напрямую получает класс. Это делает задачу проще с точки зрения архитектуры, но сложнее в смысле разрешения и границ.

5. Batch size и resolution

  • Из-за больших входных размеров сегментация сильно ограничена по видеопамяти (особенно в 3D или high-res)

  • Обычно приходится уменьшать вход или использовать patch-wise training: обрезка на патчи, обучение по частям

6. Использование готовых библиотек

Segmentation Models PyTorch (SMP)

pip install segmentation-models-pytorch
import segmentation_models_pytorch as smp
model = smp.Unet(encoder_name="resnet34", encoder_weights="imagenet", classes=3, activation=None)
#### **Keras**
from keras_segmentation.models.unet import unet
model = unet(n_classes=3, input_height=256, input_width=256)
model.train(...)

7. Datasets для обучения и тестирования

  • PASCAL VOC — 20 классов + фон

  • Cityscapes — сцены городов, автодороги, пешеходы, автомобили

  • ADE20K — сцены повседневной жизни, более 150 классов

  • COCO Stuff — расширение COCO с сегментацией фона

  • CamVid — видеоаннотированные кадры городов (автономное вождение)

  • Medical Segmentation — ISIC, LUNA, BraTS, DRIVE и др.

8. Semantic vs Instance vs Panoptic Segmentation

Вид сегментации Что делает
Semantic Классифицирует каждый пиксель (без учёта объектов)
--- ---
Instance Разделяет экземпляры одного класса (несколько людей)
--- ---
Panoptic Объединяет semantic + instance
--- ---

9. Inference и визуализация

Softmax и argmax

Модель даёт на выходе тензор размером B×C×H×WB \times C \times H \times W
Для получения маски:

probs = torch.softmax(preds, dim=1)
mask = torch.argmax(probs, dim=1)

Цветовая визуализация

Можно применить цветовую палитру (например, из VOC) для перевода классов в цветные маски:

palette = {
0: (0, 0, 0), # background
1: (255, 0, 0), # class 1
2: (0, 255, 0), # class 2
...
}

10. Применение семантической сегментации

  • Автономные автомобили — дороги, пешеходы, разметка

  • Медицина — органы, опухоли, клетки

  • Агроанализ — поля, растения, болезни

  • Геоинформационные системы — здания, реки, дороги на спутниковых снимках

  • Дополненная реальность — разделение переднего/заднего плана

  • Ретушь и графика — сегментация кожи, волос, одежды

Семантическая сегментация требует высокой точности и правильной работы на пиксельном уровне. Она реализуется с помощью энкодер-декодерных архитектур, продвинутых loss-функций и тщательно подготовленных датасетов.