Segmentação Semântica

Visão geral

Segmentação semântica (semantic segmentation) é a tarefa de visão computacional (computer vision) de atribuir um rótulo de classe (class label) a cada pixel em uma imagem. A saída é uma previsão densa (frequentemente chamada de mapa de segmentação (segmentation map) ou mapa de rótulos (label map)) em que cada pixel pertence a uma de (K) classes semânticas, como estrada, pessoa, céu, carro ou fundo.

Um fluxo de trabalho (pipeline) típico de segmentação semântica recebe uma imagem:

  • Entrada: (x \in \mathbb{R}^{H \times W \times 3})
  • Saída: (y \in {0,\dots,K-1}^{H \times W})

A maioria dos modelos modernos, na prática, prevê primeiro probabilidades de classe por pixel, via valores logit (logits):

  • Logits: (z \in \mathbb{R}^{H \times W \times K})
  • Probabilidades: (p_{h,w,k} = \mathrm{softmax}(z_{h,w,:})_k)
  • Rótulo final: (\hat{y}{h,w} = \arg\max_k p{h,w,k})

Por produzir saídas densas, a segmentação semântica costuma ser descrita como um problema de previsão densa (dense prediction).

Exemplo prático (como fica na prática)

Para uma foto de rua, um modelo de segmentação semântica pode rotular:

  • cada pixel de estrada como road
  • cada pixel de calçada como sidewalk
  • cada pixel de carro como car

É importante notar que todos os carros compartilham o mesmo rótulo (car) na segmentação semântica, mesmo que haja múltiplos veículos.

Como a segmentação semântica difere de tarefas relacionadas

A segmentação semântica está intimamente relacionada a outras “tarefas centrais” em visão, mas as saídas diferem de formas importantes.

vs. classificação de imagens

  • Classificação atribui um rótulo à imagem inteira (ex.: “contém um cachorro”).
  • Segmentação semântica atribui um rótulo a cada pixel (ex.: quais pixels são de cachorro vs. grama).

vs. detecção de objetos

Em Detecção de Objetos (Object Detection), o modelo prevê:

  • caixas delimitadoras (retângulos) e
  • rótulos de classe para cada caixa

A detecção localiza objetos de forma grosseira (caixas), enquanto a segmentação semântica localiza com precisão no nível de pixel.

vs. segmentação por instância

Em Segmentação por Instância (Instance Segmentation), o modelo gera:

  • uma máscara separada por instância de objeto (ex.: carro #1, carro #2),
  • além dos rótulos de classe.

A segmentação semântica combina todas as instâncias de uma classe em uma única máscara de categoria. Se sua aplicação precisa contar objetos ou acompanhar indivíduos (ex.: “quantas pessoas?”), a segmentação por instância costuma ser mais adequada.

Relação com “segmentação de imagens” como termo guarda-chuva

Segmentação de Imagens (Image Segmentation) é a família mais ampla de tarefas que divide uma imagem em regiões significativas. A segmentação semântica é uma forma específica e muito comum em que as regiões correspondem a classes semânticas predefinidas.

Formulação do problema e ideias-chave

Classificação densa por pixel

Uma visão direta da segmentação semântica é a classificação por pixel (per-pixel classification). No entanto, classificar cada pixel de forma independente ignoraria o contexto. Pixels são altamente correlacionados espacialmente: se um pixel é “estrada” depende da região ao redor e do arranjo global da cena.

Modelos modernos de segmentação, portanto, combinam:

  • pistas locais (textura/bordas)
  • estrutura de nível intermediário (partes de objetos)
  • contexto global (entendimento de cena)

Previsão totalmente convolucional e equivariância a translações

Abordagens iniciais de aprendizado profundo (deep learning) adaptaram CNNs de classificação substituindo camadas totalmente conectadas por camadas convolucionais para produzir mapas densos, levando às Redes Totalmente Convolucionais (Fully Convolutional Networks, FCNs). Modelos convolucionais são naturalmente equivariantes a translações (translation equivariance), o que combina bem com tarefas de previsão espacial.

Resolução e passo (stride)

Um desafio técnico central é equilibrar:

  • semântica de alto nível (geralmente aprendida em baixa resolução espacial devido à subamostragem (downsampling))
  • contornos finos (exigem alta resolução espacial)

A maioria das arquiteturas lida com isso usando estruturas codificador–decodificador (encoder–decoder), conexões de atalho (skip connections), convoluções dilatadas (dilated convolutions) ou fusão de características em múltiplas escalas (multi-scale feature fusion).

Famílias de modelos e arquiteturas comuns

Muitos modelos de segmentação seguem um padrão codificador–decodificador:

  • Codificador (encoder): extrai características, frequentemente reduzindo a resolução espacial (ex.: ResNet, EfficientNet, ConvNeXt). Também é chamado de rede base (backbone).
  • Decodificador (decoder): faz reamostragem e refina as características até um mapa de segmentação em resolução total. Muitas vezes é chamado de cabeça (head).

A seguir estão famílias amplamente usadas e as ideias de projeto que introduziram.

Redes Totalmente Convolucionais (FCN)

Modelos FCN (ex.: FCN-32s/16s/8s) estiveram entre as primeiras arquiteturas profundas bem-sucedidas para segmentação.

Ideias-chave:

  • Usar uma rede base de classificação (como VGG), mas mantê-la totalmente convolucional.
  • Fazer reamostragem para cima (upsampling) de mapas de características grosseiros até a resolução da imagem.
  • Adicionar conexões de atalho de camadas anteriores para recuperar detalhes.

Pontos fortes:

  • Simples e fundamental
  • Ainda conceitualmente importante para entender previsão densa

Limitações:

  • Frequentemente produz contornos excessivamente suaves sem refinamento forte

U-Net (codificador–decodificador com conexões de atalho fortes)

U-Net é especialmente popular em imagens médicas e em qualquer domínio com poucos dados rotulados.

Ideias-chave:

  • Formato “U” simétrico de codificador–decodificador
  • Conexões de atalho em múltiplas escalas: concatenar características do codificador nas do decodificador para recuperar detalhes finos
  • Funciona bem com forte aumento de dados e conjuntos de dados pequenos

Pontos fortes:

  • Excelente localização de contornos
  • Forte desempenho mesmo com conjuntos de treinamento pequenos

Variantes comuns:

  • Attention U-Net (adds gating/attention)
  • U-Net++ (nested skip connections)
  • 3D U-Net (volumetric medical scans)

DeepLab (convoluções atrous/dilatadas + contexto em múltiplas escalas)

DeepLab (v1/v2/v3/v3+) é uma família altamente influente para segmentação semântica.

Ideias-chave:

  • Convolução atrous (atrous convolution) para ampliar o campo receptivo (receptive field) sem subamostragem extra
  • ASPP (Atrous Spatial Pyramid Pooling): convoluções atrous paralelas com diferentes taxas de dilatação para capturar contexto em múltiplas escalas
  • DeepLabv3+ adiciona um decodificador mais explícito para contornos mais nítidos

Pontos fortes:

  • Alta acurácia e bom modelamento de contexto
  • Amplamente usado como baseline em pesquisa e prática

Observações:

  • Variantes do DeepLab comumente usam uma CNN poderosa como rede base (ResNet/Xception/MobileNet) e ajustam o passo de saída (output stride) (ex.: 16 ou 8).

Modelos no estilo SegFormer (segmentação baseada em Transformadores)

A segmentação baseada em Transformadores (Transformers) tornou-se mainstream, especialmente para conjuntos de dados em grande escala e cenários em que o contexto global importa.

SegFormer é um design representativo de “segmentação com Transformador prática”:

Ideias-chave:

  • Codificador Transformador (ex.: MiT: Mix Transformer) para características em múltiplas escalas
  • Cabeça decodificadora leve baseada em perceptron multicamadas (MLP, multilayer perceptron)
  • Atenção eficiente e forte desempenho sem decodificadores pesados

Pontos fortes:

  • Bom modelamento de contexto global
  • Compromissos competitivos entre acurácia e eficiência

Como isso se relaciona aos Transformadores de forma mais ampla:

Famílias em tempo real e adequadas para dispositivos móveis (quando velocidade importa)

Algumas aplicações (robótica, RA, pilhas de condução autônoma) exigem baixa latência. Famílias comuns incluem:

  • ENet, ERFNet (projetos iniciais em tempo real)
  • BiSeNet (dois ramos: espacial + contexto)
  • Fast-SCNN

Esses modelos frequentemente trocam parte da acurácia por mais quadros por segundo (FPS, frames per second) e menor consumo de memória.

Objetivos de treinamento e funções de perda

Perda padrão: entropia cruzada por pixel

O objetivo mais comum é a entropia cruzada softmax (softmax cross-entropy) sobre classes em cada pixel:

[ \mathcal{L} = - \sum_{h,w} \log p_{h,w, y_{h,w}} ]

Considerações práticas:

  • Use um índice de ignorar (ignore index) para pixels sem rótulo/void (comum em casos de borda no Cityscapes e Pascal VOC).
  • Aplique ponderação de classes (class weighting) se as classes estiverem desbalanceadas (ex.: muitos pixels de estrada, poucos pixels de pedestre).

Perda Dice / Sørensen–Dice (comum em imagens médicas)

Dice foca na sobreposição e pode ser mais estável sob forte desbalanceamento de classes:

[ \mathrm{Dice}(A,B) = \frac{2|A \cap B|}{|A| + |B|} ]

Frequentemente usada para segmentação binária ou multiclasse (calculada por classe e depois média).

Perda focal e mineração de exemplos difíceis

Para conjuntos de dados com muitos pixels fáceis (fundo domina), a perda focal (focal loss) reduz o peso de exemplos fáceis e foca em pixels difíceis. Alguns sistemas também usam mineração online de exemplos difíceis (online hard example mining, OHEM).

Perdas otimizadas para IoU

Perdas como Lovász-Softmax (nem sempre usadas em produção, mas comuns em pesquisa) buscam alinhar melhor o treinamento com a métrica de avaliação (IoU/mIoU).

Dados, anotação e conjuntos de dados

Como são os rótulos

A verdade de referência (verdade de solo (ground truth)) de segmentação semântica normalmente é armazenada como:

  • uma imagem de canal único com forma (H \times W)
  • cada valor de pixel é um ID de classe (ex.: 0..K-1)
  • às vezes um rótulo especial “void” (ex.: 255) indica pixels ignorados

Anotações podem ser produzidas via:

  • ferramentas de polígonos (LabelMe, CVAT)
  • ferramentas interativas de segmentação
  • rótulos fracos (rabiscos, pontos) com refinamento (mais avançado)

Conjuntos de dados comuns

  • Pascal VOC 2012 (frequentemente “VOC”): benchmark clássico com 20 classes de primeiro plano + fundo; historicamente muito usado e para ensino.
  • Cityscapes: cenas urbanas de rua, forte para condução autônoma; anotações finas com muitas classes “stuff” (stuff) e “thing” (thing).
  • ADE20K: cenas diversas com muitas classes, comum em benchmarks modernos de segmentação.
  • COCO-Stuff: estende COCO com rótulos “stuff”; bom para interpretação de cena.

VOC segue como uma referência educacional canônica porque popularizou mIoU e tem um conjunto de classes gerenciável.

Métricas de avaliação (com foco em mean IoU)

Matriz de confusão no nível de pixel

Métricas de segmentação geralmente são calculadas a partir de contagens de pixels por classe:

  • Verdadeiros positivos (TP_c)
  • Falsos positivos (FP_c)
  • Falsos negativos (FN_c)

Esses valores podem ser derivados de uma matriz de confusão (confusion matrix) por pixel entre classes.

Interseção sobre União (IoU / índice de Jaccard)

Para uma dada classe (c):

[ \mathrm{IoU}_c = \frac{TP_c}{TP_c + FP_c + FN_c} ]

Intuição:

  • Interseção: pixels corretamente previstos como classe (c)
  • União: pixels que foram previstos como (c) ou são realmente (c)

mean IoU (mIoU)

mIoU faz a média da IoU entre classes:

[ \mathrm{mIoU} = \frac{1}{K} \sum_{c=1}^{K} \mathrm{IoU}_c ]

Observações:

  • Frequentemente exclui o rótulo “void”.
  • Algumas avaliações incluem fundo; outras reportam apenas primeiro plano (depende do conjunto de dados).

Pascal VOC popularizou reportar mIoU como a métrica principal, tornando-a um ponto de referência padrão em segmentação.

Outras métricas comuns

  • Acurácia por pixel (pixel accuracy): fração de pixels rotulados corretamente (pode ser enganosa com desbalanceamento de classes).
  • Acurácia média por pixel (mean pixel accuracy): média das acurácias por classe.
  • IoU ponderada pela frequência (frequency-weighted IoU): pondera a IoU pela frequência da classe (menos comum em artigos hoje).
  • Dice/pontuação F1 (F1 score): comum em segmentação médica e tarefas de segmentação binária.

Exemplo de fluxo de trabalho prático (treinamento + inferência)

A seguir está um esboço mínimo no estilo PyTorch mostrando as partes móveis. Ele omite detalhes como treinamento distribuído e aumento de dados avançado, mas reflete a prática típica.

Suposições de dados

  • Imagem: tensor float32 [B, 3, H, W] normalizado
  • Máscara: tensor int64 [B, H, W] com valores 0..K-1 (e talvez ignore_index=255)

Exemplo de passo de treinamento (PyTorch)

import torch
import torch.nn.functional as F

def train_step(model, batch, optimizer, num_classes, ignore_index=255):
    model.train()
    images, masks = batch["image"], batch["mask"]  # [B,3,H,W], [B,H,W]

    logits = model(images)  # [B,K,H,W] (some models output lower-res; handle that below)

    # If logits are lower resolution, upsample to match mask size
    if logits.shape[-2:] != masks.shape[-2:]:
        logits = F.interpolate(logits, size=masks.shape[-2:], mode="bilinear", align_corners=False)

    loss = F.cross_entropy(logits, masks, ignore_index=ignore_index)

    optimizer.zero_grad(set_to_none=True)
    loss.backward()
    optimizer.step()

    return loss.item()

Inferência e pós-processamento

Em tempo de inferência (inference), você frequentemente:

  • redimensiona a entrada para a escala esperada pelo modelo (ou faz teste em múltiplas escalas (multi-scale testing)),
  • executa o modelo,
  • toma argmax sobre as classes,
  • opcionalmente mapeia IDs de classe para cores para visualização.
@torch.no_grad()
def predict_mask(model, image):
    model.eval()
    logits = model(image.unsqueeze(0))  # [1,K,H,W]
    probs = logits.softmax(dim=1)
    pred = probs.argmax(dim=1)[0]       # [H,W]
    return pred

Dicas práticas que fazem diferença em projetos reais

  • Aumento de dados (augmentation): escala aleatória, recorte, flip, variação de cor; frequentemente crítico para mIoU.
  • Treinamento baseado em recortes (crop-based training): conjuntos de dados de alta resolução (Cityscapes) geralmente são treinados com recortes aleatórios para caber na memória da GPU.
  • Qualidade de contornos: adicionar características de maior resolução (conexões de atalho) ou um decodificador melhor frequentemente melhora contornos.
  • Desbalanceamento de classes: considere entropia cruzada ponderada, perda focal ou estratégias de amostragem.

Aplicações

A segmentação semântica é usada quando você precisa de entendimento de cena com precisão de pixel, incluindo:

  • Condução autônoma: área dirigível, limites de faixa (às vezes tratados como segmentação), calçada vs. estrada vs. vegetação.
  • Imagens médicas: delimitação de tumor/órgão em CT/MRI/ultrassom; variantes de U-Net são comuns devido a restrições de dados.
  • Sensoriamento remoto: mapeamento de cobertura do solo (água/floresta/urbano), mapas semânticos de pegadas de edifícios (o nível de instância pode ser separado).
  • Robótica: navegação e manipulação (espaço livre, obstáculos, regiões de preensão).
  • Edição de fotos e RA: remoção de fundo, segmentação de retratos, substituição de céu, filtros conscientes de semântica.
  • Inspeção industrial: segmentar defeitos (riscos, corrosão) para medição e controle de qualidade.

Armadilhas comuns e boas práticas

Cuidado com métricas enganosas sob desbalanceamento de classes

Acurácia por pixel pode parecer alta mesmo se o modelo ignorar classes raras. Prefira mIoU (e o detalhamento de IoU por classe).

Alinhe o pré-processamento com o pré-treinamento

Se estiver usando redes base pré-treinadas (ImageNet ou maiores), iguale:

  • estatísticas de normalização,
  • suposições de resolução de entrada (quando relevante),
  • estratégias de aumento de dados.

Essa é uma fonte comum de mIoU “misteriosamente baixa”.

Trate ruído de rótulos e regiões “void” com cuidado

Conjuntos de dados frequentemente contêm contornos ambíguos ou pixels não rotulados. Sempre:

  • use ignore_index corretamente,
  • verifique IDs de rótulo e mapas de cores,
  • faça verificações de sanidade com visualizações cedo.

Considere mudança de domínio

Um modelo treinado no Cityscapes pode não generalizar para uma nova cidade, clima ou câmera. Adaptação de domínio e aumento de dados robusto frequentemente são necessários em sistemas implantados.

Não confie demais em contornos “nítidos” apenas por reamostragem

Reamostragem ingênua pode criar blobs suaves. Arquiteturas que preservam detalhe (conexões de atalho, decodificadores, perdas sensíveis a contorno) melhoram a qualidade das bordas.

Quando escolher segmentação semântica (e quando não)

Escolha segmentação semântica quando:

  • você precisa de análise densa da cena (dense scene parsing) (ex.: “quais pixels são estrada?”),
  • instâncias de objetos não precisam ser separadas,
  • medições dependem de área ou forma em pixels.

Considere alternativas quando:

Conceitos relacionados

A segmentação semântica continua sendo uma tarefa central em visão computacional porque força os modelos a combinar reconhecimento (o que é?) com localização precisa (onde está?) na granularidade mais fina — um pixel por vez.