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:
- Usa conceitos da Arquitetura de Transformadores (Transformer Architecture) adaptados à visão (características hierárquicas, atenção eficiente).
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 valores0..K-1(e talvezignore_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
argmaxsobre 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_indexcorretamente, - 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:
- você precisa de contagem ou identidade de objetos → Segmentação por Instância
- você precisa de localização grosseira e inferência mais rápida → Detecção de Objetos
- você só precisa de um rótulo global → classificação
Conceitos relacionados
- Segmentação de Imagens (tópico guarda-chuva e variantes)
- Detecção de Objetos (localização no nível de caixas)
- Segmentação por Instância (máscaras separadas por instância)
- Arquitetura de Transformadores (fundação para modelos no estilo SegFormer)
- Redes Neurais (Neural Networks) (aproximadores de função centrais por trás de modelos de segmentação)
- Descida do Gradiente (Gradient Descent) e Retropropagação (Backpropagation) (como modelos de segmentação são treinados)
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.