Detecção de Pequenos Alvos Infravermelhos com UIU-Net: Arquitetura e Módulo de Atenção IC-A

A Evolução da Segmentação: Por que o UIU-Net?

A detecção de pequenos alvos em imagens infravermelhas representa um dos desafios mais persistentes na visão computacional. Diferente de objetos comuns, esses alvos frequentemente ocupam apenas alguns pixels, carecem de textura detalhada e estão imersos em fundos com ruído térmico complexo. Embora o U-Net tradicional seja um marco na segmentação, sua estrutura de skip connections simples muitas vezes falha em preservar a semântica de alvos minúsculos durante a descida e subida de amostragem.

O UIU-Net surge como uma evolução "U-Net dentro de U-Net". Ao aninhar estruturas residuais em cada estágio da rede principal, ele potencializa a extração de características multiescala sem perder a resolução necessária para identificar objetos de baixa assinatura térmica.

Estrutura do Módulo IC-A (Intreactive Cross-Attention)

O diferencial técnico do UIU-Net reside na forma como ele integra características de diferentes níveis através do módulo IC-A. Em vez de uma concatenação linear, o módulo utiliza atenção cruzada para que as camadas profundas (ricas em contexto) guiem o refinamento das camadas superficiais (ricas em detalhes espaciais).

import torch
import torch.nn as nn

class CruzamentoAtencaoInterativo(nn.Module):
    def __init__(self, dim_entrada, fator_reducao=16):
        super().__init__()
        # Ramo de Atenção por Canal
        self.atencao_canal = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(dim_entrada, dim_entrada // fator_reducao, 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(dim_entrada // fator_reducao, dim_entrada, 1),
            nn.Sigmoid()
        )
        
        # Ramo de Atenção Espacial
        self.atencao_espacial = nn.Sequential(
            nn.Conv2d(2, 1, kernel_size=7, padding=3),
            nn.Sigmoid()
        )

    def forward(self, x_profundo, x_superficial):
        # A profundidade guia o peso dos canais na camada superficial
        pesos_canal = self.atencao_canal(x_profundo)
        superficial_refinado = x_superficial * pesos_canal
        
        # Extração de estatísticas espaciais
        mapa_medio = torch.mean(superficial_refinado, dim=1, keepdim=True)
        mapa_maximo, _ = torch.max(superficial_refinado, dim=1, keepdim=True)
        
        pesos_espaciais = self.atencao_espacial(torch.cat([mapa_medio, mapa_maximo], dim=1))
        
        # A camada profunda é refinada pela espacialidade da superficial
        profundo_atendido = x_profundo * pesos_espaciais
        
        return torch.cat([x_profundo, profundo_atendido, superficial_refinado], dim=1)

Estratégias de Treinamento e Aumento de Dados

Trabalhar com conjuntos de dados infravermelhos (como o MSISTD) exige um pipeline de pré-processamento robusto para evitar o sobreajuste (overfitting), dado o volume limitado de dados. O uso de CLAHE (Contrast Limited Adaptive Histogram Equalization) é fundamental para normalizar o contraste térmico antes da inferência.

import cv2
import numpy as np

class ProcessamentoTermico:
    def __init__(self, prob_ruido=0.5):
        self.prob_ruido = prob_ruido
        self.clahe = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8, 8))

    def aplicar_transformacoes(self, frame):
        # Normalização de contraste adaptativa
        frame = self.clahe.apply(frame)
        
        # Simulação de variação de temperatura (ganho aleatório)
        if np.random.rand() > 0.5:
            frame = np.clip(frame * np.random.uniform(0.85, 1.15), 0, 255).astype(np.uint8)
            
        return frame

Para a convergência do modelo, a função de perda deve ser uma composição equilibrada. A combinação recomendada utiliza Focal Loss para lidar com o desequilíbrio entre pixels de fundo e alvo, SSIM Loss para integridade estrutural e uma perda baseada em bordas.

Componente de Perda Peso Objetivo Principal
Focal Loss 0.6 Minimizar o impacto do desequilíbrio de classes.
SSIM Loss 0.3 Preservar a topologia e estrutura do alvo.
Edge Loss (Sobel) 0.1 Refinar a definição das bordas do pequeno alvo.

Resultados Experimentais e Comparativos

Em testes comparativos utilizando o dataset MSISTD, o UIU-Net demonstrou uma superioridade clara, especialmente em alvos menores que 5x5 pixels, onde arquiteturas convencionais costumam gerar falsos negativos.

  • UIU-Net + IC-A: mAP@0.5 de 0.742, apresentando o melhor equilíbrio entre precisão e recall.
  • U^2-Net: mAP@0.5 de 0.671, com maior custo computacional devido à densidade de parâmetros.
  • U-Net Base: mAP@0.5 de 0.623, limitada pela perda de detalhes em alvos pontuais.

A robustez do UIU-Net em cenários de vigilância com drones e monitoramento industrial deve-se à capacidade do módulo IC-A de suprimir ruídos de reflexão térmica e nuvens, que são comumente confundidos com alvos em detecção infravermelah simples.

Otimização para Implantação (Deployment)

Embora a rede aninhada seja eficiente, a implantação em dispositivos de borda (Edge Devices) pode exigir técnicas de compressão. A aplicação de quantização dinâmica de 8 bits (INT8) permite uma redução drástica na latência com perda mínima de precisão.

# Exemplo de quantização pós-treinamento em PyTorch
model_proto = UIUNet()
model_quantized = torch.quantization.quantize_dynamic(
    model_proto, 
    {nn.Conv2d, nn.Linear}, 
    dtype=torch.qint8
)

Este processo de otimização, aliado ao treinamento progressivo (congelando o encoder nas épocas iniciais), garante que o UIU-Net seja não apenas preciso, mas viável para aplicações de monitoramento em tempo real.

Tags: ComputerVision DeepLearning Pytorch ObjectDetection InfraredImaging

Publicado em 6-10 16:42 por Thomas