Как реализовать 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-функций и тщательно подготовленных датасетов.