U-Net em oncologia: análise de lâminas histopatológicas

Pesquisador analisa lâminas histopatológicas digitalizadas em tela

A U-Net para análise de lâminas histopatológicas virou uma das abordagens mais práticas em oncologia computacional. Ela segmenta estruturas em imagens complexas, separando tumor, núcleos, estroma e fundo com precisão suficiente para pesquisa translacional e pipelines de apoio diagnóstico.

Este guia mostra o caminho completo: preparação dos dados, treino, validação e um exemplo de código em PyTorch. O foco é sair da teoria e chegar a um protótipo funcional, com técnicas aplicáveis em projetos reais de patologia digital.

1) Por que U-Net funciona tão bem em histopatologia

A U-Net foi desenhada para segmentação semântica e ganhou espaço em medicina porque lida bem com poucos dados rotulados. Em histopatologia, isso importa muito: anotar pixels é caro, e um único slide pode ter milhões de elementos visuais.

Em oncologia, a tarefa costuma exigir separar regiões minúsculas, com contraste baixo e variação de coloração entre laboratórios. A arquitetura em encoder-decoder com skip connections ajuda a preservar detalhes finos, algo crítico para núcleos e bordas tumorais.

O que a literatura mostra

O artigo original da U-Net, publicado em 2015, marcou a área de segmentação biomédica. Desde então, variantes como Attention U-Net e U-Net++ passaram a ser usadas em tarefas de patologia digital. Uma boa referência introdutória está em arXiv.

Na prática, a U-Net costuma entregar bons resultados quando o problema é bem delimitado. Exemplo: segmentação de núcleos em lâminas de câncer de mama, próstata ou colo do útero. O ganho vem da combinação entre contexto global e detalhe local.

2) Preparação dos dados: o passo que decide o resultado

Em histopatologia, o pré-processamento pesa mais do que em muitas tarefas de visão computacional. Um slide inteiro pode ter resolução de 100 mil por 100 mil pixels, então treinar direto na imagem completa é inviável na maioria dos casos.

O padrão é cortar a lâmina em tiles de 256×256 ou 512×512. Isso reduz memória, acelera o treino e permite balancear melhor as classes. Em datasets públicos, esse recorte é quase sempre o ponto de partida.

Normalização de cor e augmentation

A coloração H&E varia entre scanners, protocolos e laboratórios. Por isso, normalização de cor ajuda a reduzir ruído entre amostras. Técnicas como Macenko e Reinhard são bastante usadas. Uma revisão prática pode ser vista em Nature Scientific Reports.

Além disso, use augmentation com rotação, flip, elastic transform e jitter de cor. Em um dataset com 1.000 patches, esse tipo de expansão pode multiplicar a diversidade visual sem custo de anotação.

Na histopatologia, a qualidade do recorte vale tanto quanto a arquitetura.

Exemplo de estrutura de pastas

Organize os dados assim: images/, masks/, splits/. Esse padrão simplifica pipelines com PyTorch e evita confusão entre treino, validação e teste.

3) Código prático em PyTorch para começar

A seguir, um baseline enxuto para U-Net para análise de lâminas histopatológicas. O exemplo assume imagens e máscaras binárias. Para múltiplas classes, basta ajustar a saída e a função de perda.

import torch
import torch.nn as nn
import torch.nn.functional as F

class DoubleConv(nn.Module):
    def __init__(self, in_ch, out_ch):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, 3, padding=1),
            nn.BatchNorm2d(out_ch),
            nn.ReLU(inplace=True),
            nn.Conv2d(out_ch, out_ch, 3, padding=1),
            nn.BatchNorm2d(out_ch),
            nn.ReLU(inplace=True),
        )
    def forward(self, x):
        return self.net(x)

class UNet(nn.Module):
    def __init__(self, in_ch=3, out_ch=1):
        super().__init__()
        self.down1 = DoubleConv(in_ch, 64)
        self.pool1 = nn.MaxPool2d(2)
        self.down2 = DoubleConv(64, 128)
        self.pool2 = nn.MaxPool2d(2)
        self.bridge = DoubleConv(128, 256)
        self.up2 = nn.ConvTranspose2d(256, 128, 2, stride=2)
        self.conv2 = DoubleConv(256, 128)
        self.up1 = nn.ConvTranspose2d(128, 64, 2, stride=2)
        self.conv1 = DoubleConv(128, 64)
        self.out = nn.Conv2d(64, out_ch, 1)

    def forward(self, x):
        x1 = self.down1(x)
        x2 = self.down2(self.pool1(x1))
        x3 = self.bridge(self.pool2(x2))
        x = self.up2(x3)
        x = self.conv2(torch.cat([x, x2], dim=1))
        x = self.up1(x)
        x = self.conv1(torch.cat([x, x1], dim=1))
        return self.out(x)

def dice_loss(pred, target, eps=1e-6):
    pred = torch.sigmoid(pred)
    pred = pred.view(pred.size(0), -1)
    target = target.view(target.size(0), -1)
    inter = (pred * target).sum(dim=1)
    union = pred.sum(dim=1) + target.sum(dim=1)
    dice = (2 * inter + eps) / (union + eps)
    return 1 - dice.mean()

Para treino, combine BCEWithLogitsLoss com Dice loss. Essa mistura costuma funcionar melhor que BCE isolada em segmentação médica, porque lida melhor com desbalanceamento entre fundo e tecido relevante.

Loop de treino mínimo

model = UNet().cuda()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
criterion_bce = nn.BCEWithLogitsLoss()

for images, masks in train_loader:
    images = images.cuda()
    masks = masks.cuda()
    optimizer.zero_grad()
    logits = model(images)
    loss = criterion_bce(logits, masks) + dice_loss(logits, masks)
    loss.backward()
    optimizer.step()

Esse baseline já serve para validar pipeline, dataset e métricas. Depois, vale testar schedulers, mixed precision e modelos com encoder pré-treinado, como ResNet34 ou EfficientNet.

4) Métricas e validação em oncologia

Em segmentação histopatológica, acurácia pura costuma enganar. Se 90% do slide é fundo, um modelo ruim pode parecer bom. Por isso, use Dice coefficient, IoU, precisão e recall por classe.

O Dice é especialmente útil quando a região de interesse é pequena. Em muitos casos de câncer, a área tumoral ocupa menos de 20% do patch. Nessa situação, métricas de sobreposição contam mais do que métricas globais.

Exemplo de leitura de resultado

Se um modelo atinge Dice de 0,82 em núcleos e 0,68 em bordas tumorais, já há um sinal claro de que o problema mais difícil está na delimitação fina. Isso direciona ajustes em augmentation, resolução e função de perda.

Para validação robusta, separe os dados por paciente, não por patch. Caso contrário, o modelo pode vazar informação entre treino e teste. Esse erro é comum em projetos de patologia digital e infla resultados artificialmente.

Ferramentas úteis

O ecossistema mais prático inclui PyTorch, Albumentations, OpenSlide e MONAI. O MONAI, mantido para IA médica, traz componentes prontos para pipelines biomédicos e vale uma visita em monai.io.

5) Erros comuns e ajustes que melhoram a U-Net

O primeiro erro é treinar em patches sem contexto suficiente. Se o recorte for pequeno demais, a rede perde informação estrutural. Se for grande demais, a memória estoura e o batch fica instável. Na prática, 256×256 e 512×512 são bons pontos de partida.

Uma U-Net bem treinada reduz ruído visual e entrega contornos úteis para decisão clínica e pesquisa.

O segundo erro é ignorar o desbalanceamento. Em histopatologia, o fundo domina a imagem. Use weighting, focal loss ou sampling inteligente para aumentar a presença de regiões relevantes no treinamento.

Três ajustes com ganho rápido

1. Encoder pré-treinado: usar backbone com pesos do ImageNet acelera convergência, mesmo em imagens médicas.

2. Normalização de cor: reduz variação entre lotes e melhora generalização.

3. Test-time augmentation: melhora a estabilidade na inferência sem alterar o treino.

Em experimentos de segmentação biomédica, esses ajustes frequentemente entregam ganhos de 2 a 6 pontos percentuais em Dice, dependendo do dataset. Não é milagre; é engenharia de pipeline bem feita.

6) Próximos passos: de baseline a pipeline clínico

Depois do protótipo, o caminho natural é avançar para um pipeline mais sólido. Isso inclui versionamento de dados, rastreio de experimentos, inferência em lote e integração com visualizadores de lâminas inteiras.

Se o objetivo for pesquisa, vale testar Attention U-Net, U-Net++ ou um encoder mais forte. Se a meta for produção, a prioridade muda: latência, reprodutibilidade, auditoria e explicabilidade passam a contar mais.

Casos reais de uso

Em câncer de mama, a segmentação ajuda a delimitar áreas suspeitas e medir morfologia celular. Em próstata, pode apoiar a separação entre glândulas benignas e padrões de agressividade. Em colo do útero, auxilia na detecção de regiões displásicas em slides corados por H&E.

Para aprofundar o lado técnico e regulatório, vale acompanhar materiais da National Cancer Institute e estudos de patologia digital em periódicos como Nature. O objetivo não é substituir o patologista, e sim ampliar capacidade analítica com rastreabilidade.

A IAIRON Academy ensina IA aplicada de forma prática. Conheça aqui.

Perguntas Frequentes

U-Net serve para analisar lâminas histopatológicas inteiras?
Serve, mas normalmente em patches extraídos da lâmina inteira. O slide completo é grande demais para a maioria dos treinamentos. O padrão é dividir em tiles, treinar a U-Net e depois recompor os resultados.
Qual a melhor loss para segmentação em histopatologia?
Uma combinação de BCEWithLogitsLoss com Dice loss costuma ser o ponto de partida mais seguro. Se houver forte desbalanceamento, focal loss também pode ajudar. A escolha depende da proporção entre fundo e região de interesse.
Preciso de muitos dados rotulados para usar U-Net?
Não necessariamente. A U-Net foi popularizada justamente por funcionar bem com conjuntos menores, desde que bem anotados. Data augmentation e encoder pré-treinado ajudam muito nesse cenário.
Qual tamanho de patch é mais usado em lâminas histopatológicas?
Os tamanhos mais comuns são 256x256 e 512x512 pixels. O ideal depende da resolução do scanner e do nível de detalhe necessário. Patches muito pequenos perdem contexto; muito grandes exigem mais memória.
Dá para usar U-Net em câncer de mama, próstata e colo do útero?
Sim. A arquitetura é bastante usada em tarefas de segmentação nessas áreas, especialmente para núcleos, tecido tumoral e estruturas glandulares. O sucesso depende mais do dataset e do pré-processamento do que da arquitetura isolada.
pettrus
Sobre o autor

pettrus

Editor IAIRON — Inteligência Artificial aplicada ao mercado brasileiro.