Introducción a la segmentación semántica - Arquitecturas U-Net y DeepLab
Qué es la segmentación semántica
La segmentación semántica asigna una etiqueta de categoría a cada píxel de una imagen, logrando comprensión de la escena a nivel de píxel. A diferencia de los cuadros delimitadores de la detección de objetos, la segmentación semántica proporciona contornos precisos de los objetos.
Definición de la tarea: Dada una imagen RGB de H×W×3, producir un mapa de etiquetas H×W donde cada valor de píxel corresponde a un ID de categoría.
Diferencia con la segmentación de instancias: La segmentación semántica no distingue entre individuos diferentes de la misma categoría. Por ejemplo, 3 peatones en una imagen se etiquetan todos como "persona", sin distinguir cuál es cuál. La segmentación de instancias asigna un ID diferente a cada peatón.
Datasets típicos:
- PASCAL VOC: 20 clases + fondo, benchmark clásico
- Cityscapes: Escenas de conducción urbana, 19 clases, anotación fina
- ADE20K: 150 clases, máxima diversidad de escenas
- COCO-Stuff: 171 clases, incluye objetos y materiales
FCN - La arquitectura pionera sin capas totalmente conectadas
FCN (Fully Convolutional Network, 2015) fue el primer método de aprendizaje profundo de extremo a extremo para segmentación semántica, sentando las bases para todos los métodos posteriores.
Idea central: Reemplazar las capas totalmente conectadas de redes de clasificación como VGG-16 por capas convolucionales 1×1, permitiendo que la red acepte entradas de cualquier tamaño y produzca mapas de segmentación del tamaño correspondiente.
Estrategias de sobremuestreo:
- FCN-32s: Sobremuestreo directo 32x, resultado tosco
- FCN-16s: Fusión de características pool4 seguida de sobremuestreo 16x
- FCN-8s: Fusión de características pool3 y pool4 seguida de sobremuestreo 8x, mejor resultado
Contribuciones: Demostró que las redes de clasificación preentrenadas pueden transferirse a tareas de segmentación; estableció el paradigma básico de codificador (submuestreo) + decodificador (sobremuestreo); la idea de conexiones de salto para fusionar características multiescala influyó en todas las arquitecturas posteriores.
Limitaciones: Bordes de segmentación toscos; falta de información de contexto global; método de sobremuestreo simple (interpolación bilineal).
U-Net - Estructura codificador-decodificador y aplicaciones en imágenes médicas
U-Net (2015) fue diseñada para segmentación de imágenes médicas; su estructura simétrica codificador-decodificador y conexiones de salto se convirtieron en el paradigma clásico de redes de segmentación.
Características de la arquitectura:
- Estructura simétrica: Codificador y decodificador con el mismo número de capas, formando una U
- Conexiones de salto: Los mapas de características de cada capa del codificador se concatenan directamente con la capa correspondiente del decodificador, preservando detalles espaciales
- Sobremuestreo gradual: El decodificador restaura la resolución gradualmente, duplicando en cada paso
Por qué es adecuada para imágenes médicas:
- Los datasets médicos suelen ser pequeños (decenas a cientos de imágenes), U-Net rinde excelentemente con pocos datos
- El aumento de datos (deformación elástica, rotación, volteo) expande efectivamente los datos de entrenamiento
- La segmentación precisa de bordes es crucial para el diagnóstico médico
Variantes:
- 3D U-Net: Versión 3D para datos volumétricos CT/MRI
- Attention U-Net: Mecanismo de compuerta de atención que enfoca regiones importantes
- U-Net++: Conexiones de salto densas, fusión de características multiescala
- nnU-Net: Framework autoconfigurado que optimiza automáticamente todos los hiperparámetros
Serie DeepLab - Alta precisión con convolución dilatada y CRF
La serie DeepLab amplía el campo receptivo sin reducir la resolución mediante convolución dilatada (Atrous/Dilated Convolution), siendo el método de referencia para segmentación semántica general.
Convolución dilatada: Inserta espacios (valores cero) entre los elementos del kernel de convolución estándar, ampliando el campo receptivo sin aumentar el número de parámetros. Con tasa de dilatación r=2, un kernel 3×3 tiene un campo receptivo efectivo equivalente a 5×5.
ASPP (Atrous Spatial Pyramid Pooling): Usa en paralelo múltiples convoluciones dilatadas con diferentes tasas de dilatación para capturar información de contexto multiescala. Configuración típica: r=6, 12, 18 más convolución 1×1 y pooling promedio global.
Evolución de versiones DeepLab:
- DeepLabV1: Convolución dilatada + postprocesamiento CRF
- DeepLabV2: Introduce ASPP para características multiescala
- DeepLabV3: ASPP mejorado con contexto global
- DeepLabV3+: Añade módulo decodificador, mejora precisión de bordes. Versión más utilizada actualmente
Rendimiento: DeepLabV3+ (backbone ResNet-101) alcanza mIoU ~82% en Cityscapes y ~89% en PASCAL VOC.
Preparación de datos de entrenamiento y métodos de anotación
La anotación de alta calidad a nivel de píxel es la base del entrenamiento de segmentación semántica y también la etapa más laboriosa.
Herramientas de anotación:
- CVAT: Código abierto, soporta polígonos, pincel, anotación asistida por IA
- Label Studio: Código abierto, soporta múltiples tipos de anotación y colaboración en equipo
- Labelme: Herramienta Python ligera, adecuada para anotación a pequeña escala
- Asistencia SAM: Usar SAM para generar máscaras iniciales, corrección humana, mejora drástica de eficiencia
Formatos de anotación:
- Imagen de máscara: Imagen monocanal del mismo tamaño que la original, valores de píxel son IDs de categoría
- Formato COCO: Archivo JSON que registra coordenadas de contornos poligonales
- Formato VOC: Máscara PNG en color, cada color corresponde a una categoría
Aumento de datos:
- Transformaciones geométricas: recorte aleatorio, volteo, rotación, escalado
- Transformaciones de color: ajuste aleatorio de brillo, contraste, saturación
- Deformación elástica: particularmente efectiva en imágenes médicas
- Mixup/CutMix: mezclar diferentes imágenes para aumentar diversidad
Implementación y despliegue - Del entrenamiento en PyTorch a la inferencia en el borde
Flujo completo desde el entrenamiento del modelo hasta el despliegue en producción.
Entrenamiento en PyTorch:
- Usar bibliotecas torchvision o segmentation_models_pytorch
- Función de pérdida: CrossEntropyLoss (estándar) o Dice Loss (para desequilibrio de clases)
- Optimizador: AdamW, lr=1e-4, weight_decay=1e-4
- Programación de tasa de aprendizaje: CosineAnnealingLR o PolynomialLR
- Técnicas de entrenamiento: precisión mixta (AMP), acumulación de gradientes, backbone preentrenado
Exportación del modelo:
- ONNX:
torch.onnx.export(model, dummy_input, 'model.onnx') - TorchScript:
torch.jit.trace(model, dummy_input) - TensorRT: ONNX → motor TensorRT, inferencia óptima en GPU NVIDIA
Despliegue en el borde:
- Móvil: Backbone MobileNetV3 + cabeza DeepLabV3, formato CoreML/TFLite
- Embebido: TensorRT en Jetson, segmentación en tiempo real
- Navegador: ONNX Runtime Web o TensorFlow.js
Optimización de inferencia: La cuantización (INT8) puede acelerar 2-4x; la destilación de conocimiento transfiere conocimiento de modelos grandes a pequeños; reducir la resolución de entrada (ej. 512×512) acelera significativamente.