Segmentação de Imagens
Visão geral
Segmentação de imagens (image segmentation) é uma tarefa central de visão computacional em que um modelo prevê um rótulo para cada pixel em uma imagem. Em vez de perguntar “o que há na imagem?” (classificação) ou “onde está o objeto?” (detecção), a segmentação pergunta “quais pixels pertencem a qual coisa?”.
Duas configurações principais de segmentação são comumente usadas:
- Segmentação semântica (semantic segmentation): atribuir um rótulo de classe a cada pixel (por exemplo, estrada, céu, pessoa). Todos os objetos da mesma classe compartilham o mesmo rótulo. Veja também: Segmentação Semântica.
- Segmentação por instância (instance segmentation): delinear máscaras separadas para cada instância de objeto (por exemplo, pessoa #1 vs pessoa #2), geralmente junto com um rótulo de classe por instância. Veja também: Segmentação por Instância.
Uma tarefa híbrida estreitamente relacionada é a segmentação panóptica (panoptic segmentation), que combina segmentação semântica (“stuff” como céu/estrada) com segmentação por instância (“things” como carros/pessoas) em uma única saída coerente.
A segmentação sustenta muitos sistemas do mundo real porque fornece compreensão espacial de alta granularidade, permitindo medição, contagem, análise de forma e interação precisa.
Formulação do problema
Considere uma imagem de entrada (x \in \mathbb{R}^{H \times W \times C}). Um modelo de segmentação prevê uma máscara de saída na mesma grade espacial.
Saída de segmentação semântica
Para K classes, a segmentação semântica normalmente prevê:
- Logits (z \in \mathbb{R}^{H \times W \times K})
- Probabilidades por pixel via softmax: [ p_{h,w,k} = \text{softmax}(z_{h,w,:})_k ]
- Mapa de rótulos previstos: [ \hat{y}{h,w} = \arg\max_k p{h,w,k} ]
Os alvos de verdade de solo (ground truth) geralmente são índices inteiros de classe por pixel, com opcionais rótulos de ignorar (ignore labels) para regiões não rotuladas (comum em conjuntos de dados de cenas de rua).
Saída de segmentação por instância
A segmentação por instância produz um conjunto de objetos, cada um com:
- Um rótulo de classe
- Uma máscara binária (m_i \in {0,1}^{H \times W})
- Frequentemente também uma caixa delimitadora (bounding box) (dependendo da arquitetura)
Essa natureza baseada em conjuntos introduz complexidade adicional: o número de instâncias varia por imagem, e as máscaras precisam ser correspondidas a objetos de verdade de solo durante treinamento e avaliação.
A segmentação por instância está fortemente relacionada à Detecção de Objetos porque muitas arquiteturas usam detecção como etapa intermediária (por exemplo, prever caixas primeiro e depois máscaras).
Famílias de modelos e arquiteturas
Modelos modernos de segmentação em grande parte compartilham um design comum: um backbone extrai características, e uma cabeça de segmentação (segmentation head) mapeia as características de volta para previsões em nível de pixel. As diferenças se concentram em como preservam detalhes, incorporam contexto e escalam para múltiplos objetos.
Redes Totalmente Convolucionais (FCN)
FCNs estiveram entre as primeiras arquiteturas de aprendizado profundo a substituir camadas totalmente conectadas por camadas convolucionais para produzir saídas densas.
Ideias-chave:
- Usar um backbone CNN (por exemplo, ResNet) para produzir mapas de características de menor resolução.
- Usar upsampling (convoluções transpostas ou interpolação + conv) para recuperar a resolução completa.
- Opcionalmente fundir características de camadas anteriores (skip connections) para melhorar a localização.
Nota prática: modelos no estilo FCN permanecem baselines fortes e estão amplamente disponíveis em bibliotecas (por exemplo, torchvision.models.segmentation).
U-Net e arquiteturas codificador–decodificador
U-Net é uma arquitetura canônica de segmentação, especialmente popular em imagens médicas.
Design central:
- Codificador (encoder): reduz a amostragem para capturar contexto.
- Decodificador (decoder): aumenta a amostragem para restaurar a resolução.
- Conexões de atalho (skip connections): concatenam (ou somam) características do codificador ao decodificador para recuperar detalhes finos e bordas.
Por que funciona bem:
- Conexões de atalho ajudam a preservar detalhes espaciais que podem ser perdidos em representações profundas e de baixa resolução.
- Funciona bem mesmo com dados limitados (comum em contextos biomédicos), especialmente com aumento de dados (augmentation) forte.
Variantes comuns:
- U-Net residual (ResUNet)
- U-Net++ (caminhos de atalho aninhados)
- U-Net com atenção (Attention U-Net) (portões de atenção para características dos atalhos)
Agregação de contexto: convoluções dilatadas e pirâmides
A segmentação semântica frequentemente se beneficia de um grande campo receptivo sem perder resolução. Duas estratégias amplamente usadas:
- Convoluções dilatadas (atrous): ampliam o campo receptivo sem pooling adicional.
- Módulos de contexto multiescala:
- ASPP (Atrous Spatial Pyramid Pooling), popularizado pelo DeepLab
- Pyramid pooling (PSPNet)
Esses métodos melhoram o desempenho em objetos grandes e classes de “stuff” ao integrar contexto global.
Arquiteturas de segmentação por instância
A segmentação por instância adiciona a necessidade de separar objetos sobrepostos, então as arquiteturas costumam ser mais complexas.
Abordagens em duas etapas (baseadas em propostas): família Mask R-CNN
Um padrão comum:
- Gerar regiões candidatas (region proposals).
- Classificar cada região e refinar sua caixa.
- Prever uma máscara por região.
Essa família depende de componentes clássicos de detecção como:
- propostas de região
- regressão de caixa (veja Regressão de Caixa Delimitadora)
- pós-processamento como Supressão Não Máxima (NMS) (em muitos detectores não baseados em transformadores)
Mask R-CNN permanece um baseline forte, especialmente quando as bordas dos objetos importam e há disponibilidade de computação.
Abordagens de uma etapa e baseadas em protótipos
Alguns métodos miram segmentação por instância em tempo real ao prever máscaras de forma mais direta, frequentemente usando:
- protótipos de máscara compartilhados + coeficientes por instância
- pipelines de uma única passada (single-shot) no estilo detecção
Podem ser mais rápidas, mas podem trocar qualidade de borda ou robustez em cenas muito densas.
Segmentação por instância/panóptica baseada em transformadores
Modelos baseados em transformadores cada vez mais tratam a segmentação por instância como um problema de predição de conjunto (set prediction), reduzindo componentes manuais como âncoras e frequentemente reduzindo a dependência de NMS.
Ideias notáveis:
- Usar atenção para modelar relações globais.
- Prever um conjunto de consultas de objeto (object queries) e suas máscaras/classes.
- Usar correspondência bipartida (por exemplo, algoritmo Húngaro) para alinhar previsões com a verdade de solo durante o treinamento.
Essa tendência se conecta de perto à Arquitetura Transformer.
Segmentação semântica baseada em transformadores
Transformadores em segmentação frequentemente aparecem em dois lugares:
- Como um backbone, no estilo ViT, produzindo características globais poderosas.
- Como um decodificador/cabeça que usa atenção para combinar características multiescala.
Padrões práticos comuns:
- CNN híbrida + transformador para eficiência.
- Fusão de características multiescala (importante porque transformadores puros podem ser caros em alta resolução).
Modelos de segmentação baseados em transformadores são especialmente competitivos em benchmarks de larga escala e estão cada vez mais presentes em sistemas estado da arte.
Alvos de treinamento e funções de perda
O treinamento de segmentação normalmente usa aprendizado supervisionado com máscaras de pixels, otimizado via Descida do Gradiente e Retropropagação (backpropagation). A escolha da perda é crucial porque conjuntos de dados de segmentação frequentemente têm desbalanceamento de classes, estruturas finas e bordas ruidosas.
Perdas para segmentação semântica
Entropia cruzada por pixel
A escolha padrão para segmentação semântica multiclasse é a entropia cruzada por pixel:
[ \mathcal{L}{CE} = -\sum{h,w} \log p_{h,w,y_{h,w}} ]
Aprimoramentos práticos:
- Ponderação de classes: aumentar o peso de classes raras.
- Índice de ignorar (ignore index): excluir pixels não rotulados do cálculo da perda.
- Suavização de rótulos (label smoothing): às vezes melhora a calibração, mas pode borrar bordas se usada em excesso.
Perda Dice (e Dice suave)
Dice é especialmente comum em segmentação médica e binária, focando em sobreposição:
[ \text{Dice}(P, G)=\frac{2|P \cap G|}{|P|+|G|} ]
Uma “perda Dice suave (soft Dice loss)” diferenciável é frequentemente usada para lidar com probabilidades. Dice é robusta a desbalanceamento de classes porque normaliza pelos tamanhos das máscaras.
Perda IoU/Jaccard
IoU (índice de Jaccard) é outro objetivo baseado em sobreposição. Otimizá-lo diretamente pode alinhar melhor com a avaliação (mIoU).
Perda focal
Perda focal (focal loss) reduz o peso de pixels fáceis e foca o treinamento em pixels difíceis — útil em cenários altamente desbalanceados ou quando o fundo domina.
Perdas sensíveis a bordas
Se bordas forem importantes (por exemplo, marcações de faixa, contornos médicos), considere:
- termos de perda de borda (por exemplo, baseados em transformada de distância)
- perdas que enfatizam arestas
- cabeças auxiliares de predição de borda
Lovász-Softmax
Um substituto (surrogate) popular para otimizar IoU de forma mais direta em segmentação multiclasse, frequentemente melhorando mIoU em benchmarks.
Perdas para segmentação por instância
A segmentação por instância geralmente é multitarefa:
- Perda de classificação (por exemplo, entropia cruzada sobre classes)
- Perda de regressão de caixa (por exemplo, L1 / smooth L1 / GIoU), se caixas fizerem parte da arquitetura
- Perda de máscara:
- entropia cruzada binária por pixel na máscara prevista
- perda Dice para sobreposição de máscara
- às vezes uma combinação BCE + Dice
Modelos transformer de predição de conjunto frequentemente adicionam:
- custo de correspondência (matching cost) para atribuir instâncias previstas à verdade de solo (com base em classe + caixa + similaridade de máscara)
Métricas de avaliação
Métricas de segmentação avaliam o quão bem máscaras previstas correspondem à verdade de solo. Métricas diferentes capturam modos de falha diferentes (sobreposição geral vs precisão de borda vs desempenho em objetos pequenos).
Métricas de segmentação semântica
Interseção sobre União (IoU) / Jaccard
Para uma classe (k):
[ \text{IoU}_k = \frac{TP_k}{TP_k + FP_k + FN_k} ]
- mIoU (IoU média): média da IoU entre classes (métrica principal comum).
- Força: penaliza tanto supersegmentação quanto subsegmentação.
- Fraqueza: sensível a ruído de anotação nas bordas para objetos finos.
Coeficiente Dice (F1 score em pixels)
[ \text{Dice}_k = \frac{2TP_k}{2TP_k + FP_k + FN_k} ]
Dice é intimamente relacionado à IoU (relação monotônica) e frequentemente é preferido em imagens médicas.
Acurácia por pixel
[ \text{Acc} = \frac{\sum_k TP_k}{\text{total pixels}} ]
A acurácia por pixel pode ser enganosa quando o fundo domina (um modelo pode obter alta acurácia prevendo majoritariamente fundo).
Métricas de segmentação por instância
A avaliação padrão em conjuntos de dados como COCO usa Precisão Média (AP) (Average Precision) calculada em múltiplos limiares de IoU (por exemplo, 0,50 a 0,95). Isso avalia tanto detecção quanto qualidade da máscara.
- AP50: AP em IoU=0,50 (permissiva)
- AP75: requisito de sobreposição mais rigoroso
- AP (0.50:0.95): média entre limiares (mais robusta)
Para segmentação panóptica, Qualidade Panóptica (PQ) (Panoptic Quality) combina qualidade de reconhecimento e de segmentação.
Métricas sensíveis a bordas (opcionais, mas úteis)
Quando a qualidade de borda importa (por exemplo, medicina, mapeamento):
- Boundary F-score (correspondência de contorno)
- Distância de Hausdorff (mede o desvio de contorno no pior caso)
Fluxo de trabalho prático: de dados ao deploy
Dados e anotação
Rótulos de segmentação são caros porque exigem anotação densa. Formatos comuns:
- Máscaras raster (imagens PNG de rótulo com IDs de classe)
- Polígonos (contornos vetoriais, depois rasterizados)
- Codificação por comprimento de execução (RLE) (run-length encoding) (comum no COCO)
Desafios práticos:
- Bordas ambíguas (cabelo, sombras, reflexos)
- Consistência da taxonomia de rótulos (o que conta como “estrada” vs “calçada”?)
- Oclusão e truncamento (especialmente para instâncias)
Se rótulos forem limitados, estratégias de supervisão fraca incluem:
- rabiscos/pontos + refinamento
- pseudo-rotulagem a partir de um modelo professor
- alavancar modelos fundacionais (foundation models) para propostas de máscara (depois verificação humana)
Pré-processamento e aumento de dados
A segmentação se beneficia muito de aumento de dados porque modelos precisam generalizar entre formas, iluminação e texturas.
Aumentos comuns:
- geométricos: flips, rotações, escalonamento, recortes aleatórios
- fotométricos: brilho/contraste, variação de cor (color jitter)
- desfoque/ruído
- cutout / copy-paste (especialmente para segmentação por instância)
- específicos do domínio: normalização de coloração (médico), simulação de neblina/chuva (direção)
Tenha cuidado para aplicar transformações geométricas de forma consistente tanto na imagem quanto na máscara (interpolação do vizinho mais próximo para máscaras, para evitar criar IDs de rótulo inválidos).
Estratégias de treinamento
Considerações práticas principais:
- Treinamento por patches (patch-based training): para imagens de alta resolução (satélite/médicas), treinar em tiles.
- Treinamento multiescala: melhora a robustez à variação de escala dos objetos.
- Tratamento de desbalanceamento de classes: pesos de classe, perda focal, sobreamostragem, ou amostragem de recortes enviesada para classes raras.
- Supervisão profunda (deep supervision): perdas auxiliares em estágios intermediários do decodificador podem estabilizar o treinamento.
Inferência e pós-processamento
Dependendo da tarefa, o pós-processamento pode ajudar:
- Inferência por janela deslizante (sliding-window inference): para imagens muito grandes.
- Aumento em tempo de teste (TTA) (test-time augmentation): média de previsões entre flips/escalas.
- Operações morfológicas: remover pequenos artefatos, preencher buracos.
- Refinamento por CRF: pode afiar bordas (menos comum hoje, mas ainda usado em alguns pipelines).
Para segmentação por instância, etapas adicionais podem incluir:
- limiarização por score
- redimensionamento/alinhamento de máscara
- NMS (em detectores não baseados em transformadores)
Considerações de deploy
A segmentação pode ser computacionalmente pesada porque produz saídas densas.
Otimizações comuns:
- usar um backbone leve (no estilo MobileNet)
- reduzir o output stride (trocar acurácia por velocidade)
- quantização e poda (pruning)
- converter para TensorRT / ONNX para aceleração
- gerenciamento cuidadoso de memória para entradas de alta resolução (tiling/streaming)
Exemplo prático: computando IoU e Dice
Abaixo está uma implementação simples no estilo PyTorch para métricas de segmentação binária. Para segmentação multiclasse, compute métricas por classe e faça a média (frequentemente excluindo o fundo, dependendo do benchmark).
import torch
def dice_score(pred_mask, true_mask, eps=1e-6):
# pred_mask, true_mask: (H, W) boolean or {0,1} tensors
pred = pred_mask.float().reshape(-1)
true = true_mask.float().reshape(-1)
intersection = (pred * true).sum()
return (2 * intersection + eps) / (pred.sum() + true.sum() + eps)
def iou_score(pred_mask, true_mask, eps=1e-6):
pred = pred_mask.bool().reshape(-1)
true = true_mask.bool().reshape(-1)
intersection = (pred & true).sum().float()
union = (pred | true).sum().float()
return (intersection + eps) / (union + eps)
# Example usage:
logits = torch.randn(256, 256) # model output for one image (binary)
true = (torch.rand(256, 256) > 0.7) # dummy ground truth
pred = (logits.sigmoid() > 0.5)
print("Dice:", dice_score(pred, true).item())
print("IoU :", iou_score(pred, true).item())
Uma configuração comum de treinamento para segmentação binária é BCEWithLogitsLoss + perda Dice, que equilibra calibração (BCE) com sobreposição (Dice).
Aplicações
A segmentação de imagens é usada em qualquer lugar onde compreensão espacial precisa é importante:
- Direção autônoma: segmentação de faixas/estrada, área trafegável, calçada vs estrada, máscaras por instância para veículos/pedestres.
- Imagens médicas: tumores, órgãos, vasos; estimativa de volume e planejamento cirúrgico.
- Sensoriamento remoto: contornos de edificações, tipos de cultivo, mapeamento de desmatamento, extensão de enchentes.
- Manufatura e robótica: detecção de defeitos, bin picking, planejamento de preensão usando máscaras de objetos.
- Análise de documentos: segmentação de layout (tabelas, figuras), regiões de texto, carimbos/assinaturas.
- AR/VR e fotografia móvel: remoção de fundo, recorte de retrato (matting), compreensão de cena.
Armadilhas comuns e dicas práticas
- Desbalanceamento de classes: se o fundo domina, a acurácia por pixel parece boa enquanto mIoU é ruim. Use mIoU/Dice e considere perdas focais ou baseadas em Dice.
- Qualidade de borda: perdas padrão podem produzir máscaras “inchadas”. Adicione decodificação em maior resolução, perdas sensíveis a bordas, ou treine com resolução de entrada maior.
- Incompatibilidade de resolução: downsampling agressivo pode apagar objetos pequenos. Use pirâmides de características, maior output stride, ou treinamento multiescala.
- Vazamento de conjunto de dados: frames similares (vídeo) podem vazar para as divisões treino/val. Divida por cena ou sequência.
- Mudança de domínio (domain shift): segmentação é sensível a mudanças de iluminação/câmera. Use aumento de dados forte e considere adaptação de domínio se o deploy diferir do treinamento.
- Incompatibilidade de métrica: otimizar entropia cruzada nem sempre maximiza IoU. Considere perdas alinhadas à IoU (Lovász, IoU suave) quando mIoU for o objetivo.
Como este artigo se relaciona com tarefas centrais próximas
A segmentação está ao lado de outras tarefas centrais em visão computacional:
- Em comparação com Detecção de Objetos, a segmentação fornece precisão em nível de pixel em vez de caixas.
- A segmentação por instância se apoia diretamente em conceitos de detecção como Regressão de Caixa Delimitadora e frequentemente usa Supressão Não Máxima (NMS) (dependendo da família de modelos).
- O guarda-chuva da segmentação inclui tanto Segmentação Semântica quanto Segmentação por Instância, que diferem principalmente em se múltiplos objetos da mesma classe são separados.
Juntas, essas tarefas formam um conjunto de ferramentas para compreender imagens em níveis crescentes de detalhe espacial — de rótulos grosseiros a formas precisas.