Tecnología y aplicaciones de estimación de profundidad monocular - Inferir profundidad desde una sola imagen
Qué es la estimación de profundidad monocular - Recuperar 3D desde imágenes 2D
La estimación de profundidad monocular (Monocular Depth Estimation) infiere la profundidad (distancia) por píxel a partir de una sola imagen RGB. Los humanos perciben profundidad monocularmente usando pistas experienciales (perspectiva, gradientes de textura, oclusión), pero lograr esto computacionalmente es un problema mal planteado (ill-posed problem) - múltiples escenas 3D pueden producir proyecciones 2D idénticas, haciendo la tarea fundamentalmente ambigua.
Pistas de estimación de profundidad:
Los modelos de profundidad monocular aprenden pistas visuales incluyendo: convergencia de perspectiva (líneas paralelas que se encuentran en puntos de fuga), gradientes de textura (texturas que se vuelven más finas con la distancia), perspectiva atmosférica (objetos distantes que aparecen más brumosos), tamaños de objetos conocidos (estimar distancia por dimensiones de personas/coches) y relaciones de oclusión (objetos más cercanos que ocultan a los más lejanos).
Comparación con visión estéreo:
Las cámaras estéreo calculan profundidad precisa vía triangulación desde la disparidad de dos cámaras pero requieren hardware especializado. LiDAR mide directamente la distancia con láseres pero es costoso. La estimación de profundidad monocular opera con una sola cámara estándar, permitiendo fácil despliegue en smartphones y drones. Sin embargo, la precisión de distancia absoluta es inferior a los sistemas estéreo o LiDAR.
Formato de salida:
La salida del modelo de estimación de profundidad se llama mapa de profundidad - una imagen en escala de grises que almacena valores de distancia por píxel. Los objetos cercanos aparecen brillantes (u oscuros) mientras los objetos distantes aparecen oscuros (o brillantes). Existen dos tipos: profundidad relativa (solo relaciones ordinales) y profundidad absoluta (distancias métricas en metros), seleccionados según los requisitos de la aplicación.
Modelos de estimación de profundidad con aprendizaje supervisado
La estimación de profundidad supervisada entrena con pares de imagen RGB y mapa de profundidad correspondiente. La profundidad de referencia se captura vía LiDAR, sensores de luz estructurada (Kinect) o cámaras estéreo. Los datasets representativos incluyen NYU Depth v2 (interior, 654 imágenes de prueba) y KITTI (exterior, 697 imágenes de prueba) ampliamente usados para benchmarking.
Trabajo pionero de Eigen et al. (2014):
Esta investigación fundacional de profundidad monocular con aprendizaje profundo usó CNN multiescala. Una arquitectura de dos etapas combina una red global que estima profundidad gruesa con una red local que refina detalles. Logró la mejor precisión en NYU Depth v2, estableciendo la base para direcciones de investigación posteriores.
Arquitectura codificador-decodificador:
Los modelos modernos de estimación de profundidad adoptan estructuras codificador-decodificador similares a la segmentación semántica. Los codificadores (ResNet, EfficientNet) extraen características mientras los decodificadores predicen valores de profundidad por píxel. Las conexiones de salto preservan información espacial de alta resolución, produciendo bordes de profundidad nítidos en los límites de objetos.
Diseño de función de pérdida:
Las funciones de pérdida para estimación de profundidad requieren diseño cuidadoso. Las pérdidas simples L1/L2 subvaloran errores pequeños a grandes distancias, por lo que se usan ampliamente pérdidas en espacio logarítmico (Scale-Invariant Loss). La SI-Loss de Eigen: L = (1/n) sum(log d_i - log d*_i)^2 - (lambda/n^2)(sum(log d_i - log d*_i))^2 permite aprendizaje invariante a escala. Agregar pérdida de gradiente mejora efectivamente la nitidez de bordes.
Estimación de profundidad auto-supervisada - Aprendizaje desde estéreo y video
El aprendizaje supervisado requiere datos de referencia costosos de sensores de profundidad, pero los métodos auto-supervisados entrenan usando solo pares de imágenes estéreo o video monocular. Aprender sin profundidad de referencia permite entrenar con datasets a gran escala sin equipo de captura especializado.
Monodepth (Godard et al., 2017):
Un método auto-supervisado representativo usando pares de imágenes estéreo. Estima profundidad desde la imagen izquierda, reconstruye (warps) la imagen derecha usando esa profundidad, y minimiza la pérdida fotométrica entre la imagen reconstruida y la imagen derecha real. Las restricciones de consistencia izquierda-derecha mejoran la precisión en regiones ocluidas.
Monodepth2 (Godard et al., 2019):
Una versión mejorada entrenable solo con video monocular. Introduce PoseNet para estimar simultáneamente la pose relativa (movimiento de cámara) entre fotogramas consecutivos, aprendiendo profundidad a partir de pérdidas de reconstrucción entre fotogramas temporales. El auto-masking aborda problemas de objetos estacionarios (objetos moviéndose a la velocidad de la cámara). Logra precisión cercana a la supervisada en KITTI.
Mecanismo de aprendizaje:
La señal de aprendizaje de la estimación de profundidad auto-supervisada es la "consistencia de síntesis de vistas". Usando la profundidad estimada y la pose de cámara, las imágenes de un punto de vista se transforman a otro y se comparan con las imágenes reales. Minimizar el error de reconstrucción enseña a la red una estimación precisa de profundidad. Las funciones de pérdida combinan estándarmente SSIM (Structural Similarity) con pérdida L1.
Limitaciones:
- Los objetos en movimiento (vehículos, peatones) producen estimaciones de profundidad imprecisas
- Las regiones sin textura (paredes blancas, cielo) proporcionan señales de aprendizaje débiles
- La escala absoluta es indeterminada (solo se aprende profundidad relativa)
- El rendimiento se degrada en condiciones de poca luz o contraluz
MiDaS y DPT - Evolución de modelos de profundidad de propósito general
MiDaS (Mixing Datasets for Monocular Depth Estimation) y DPT (Dense Prediction Transformer), desarrollados por Intel ISL, son modelos de estimación de profundidad de propósito general. El entrenamiento con datasets mixtos logra generalización independiente del dominio a través de diversos tipos de escenas.
Innovación de MiDaS (2020):
Los modelos de profundidad anteriores se especializaban en datasets específicos (interior o exterior), pero MiDaS entrena con más de 10 datasets mixtos. Las funciones de pérdida invariantes a escala y desplazamiento resuelven las diferentes escalas de profundidad entre datasets. Esto permite una estimación de profundidad estable en escenas interiores, exteriores y paisajes naturales sin ajuste fino específico del dominio.
DPT - Introducción de Vision Transformer (2021):
DPT reemplaza los codificadores basados en CNN con Vision Transformer (ViT). El mecanismo de auto-atención global de ViT permite la estimación de profundidad considerando el contexto completo de la imagen. Mientras las CNN están limitadas a campos receptivos locales, los Transformers modelan directamente relaciones entre posiciones arbitrarias de la imagen. DPT-Large logra AbsRel 0.062 en KITTI, superando significativamente los métodos basados en CNN.
Practicidad de MiDaS v3.1:
MiDaS v3.1 ofrece múltiples backbones (DPT-BEiT-Large, DPT-SwinV2-Large, DPT-Large) para selección de compromiso precisión-velocidad. Fácilmente accesible vía torch.hub.load('intel-isl/MiDaS', 'DPT_Large'). Simplemente redimensiona la entrada a 384×384, normaliza y alimenta al modelo para obtener mapas de profundidad de alta calidad.
Depth Anything (2024):
El último modelo de propósito general que atrae atención. Pre-entrenamiento auto-supervisado a gran escala con 62 millones de imágenes sin etiquetar más ajuste fino con 1.5 millones de imágenes etiquetadas supera la generalización de MiDaS. El backbone ViT-L registra KITTI AbsRel 0.046, estableciendo un nuevo estado del arte.
Aplicaciones - RA, conducción autónoma y reconstrucción 3D
La estimación de profundidad monocular permite la adquisición de información 3D sin hardware adicional, impulsando la adopción práctica en múltiples campos. Operar solo con la cámara de un smartphone es la ventaja principal sobre los sistemas LiDAR o de cámara estéreo.
Manejo de oclusión en RA:
Las aplicaciones de RA requieren procesamiento de oclusión para colocar naturalmente objetos virtuales en el mundo real. Los mapas de profundidad permiten que los objetos reales en primer plano oculten objetos virtuales. ARKit de Apple y ARCore de Google aprovechan la estimación de profundidad para efectos de oclusión realistas en aplicaciones de consumo.
Detección de obstáculos en conducción autónoma:
La estimación de profundidad monocular complementa al LiDAR en la conducción autónoma. Tesla adopta estimación de profundidad solo con cámara sin LiDAR. Sin embargo, la precisión absoluta monocular (5-15% de error) es inferior al LiDAR (menos de 2cm de error), limitándola a roles suplementarios en escenarios críticos de seguridad.
Efecto bokeh del modo retrato:
El modo retrato de smartphones usa estimación de profundidad para separar sujetos del fondo, aplicando desenfoque (bokeh) al fondo. Google Pixel combina estimación de profundidad monocular con información de AF de doble píxel, logrando efectos de profundidad de campo reducida similares a DSLR. Mayor precisión del mapa de profundidad produce bokeh más natural siguiendo los contornos del sujeto.
Fotos 3D y síntesis de vistas:
La función 3D Photos de Facebook (Meta) genera efectos 3D a partir de fotos 2D usando estimación de profundidad. Las capas se separan basándose en mapas de profundidad estimados, aplicando efectos de paralaje para visualización estereoscópica que responde a la inclinación del dispositivo. Tecnología similar se aplica a flujos de trabajo de conversión 2D a 3D en películas.
Implementación y evaluación - Pipeline de estimación de profundidad en Python
Construye un pipeline práctico desde la implementación del modelo de estimación de profundidad monocular hasta la evaluación. Cubre inferencia con MiDaS, ajuste fino con datos personalizados y cálculo de métricas de evaluación para despliegue en producción.
Inferencia con MiDaS:
La inferencia con MiDaS se ejecuta en pocas líneas de código. Carga el modelo vía model = torch.hub.load('intel-isl/MiDaS', 'DPT_Large'), preprocesa la entrada con midas_transforms. La salida es un mapa de profundidad inversa donde valores mayores indican objetos más cercanos. Los mapas de color de Matplotlib (plasma, inferno) funcionan bien para visualización.
Métricas de evaluación:
- AbsRel (Error Relativo Absoluto): media de |d - d*| / d*. Menor es mejor
- SqRel (Error Relativo Cuadrático): media de (d - d*)^2 / d*
- RMSE: Error cuadrático medio que evalúa la precisión de distancia absoluta
- delta < 1.25: Porcentaje de píxeles donde max(d/d*, d*/d) < 1.25. Mayor es mejor
Ajuste fino:
La mejora de precisión específica del dominio (imágenes médicas, submarinas) se beneficia del ajuste fino con datos del dominio. Usando pesos pre-entrenados de MiDaS como inicialización, entrena 10-20 épocas con tasa de aprendizaje 1e-5. Incluso datasets pequeños (100-500 imágenes) muestran mejoras significativas de precisión.
Post-procesamiento del mapa de profundidad:
Los mapas de profundidad estimados pueden contener artefactos en bordes y ruido. El filtrado bilateral suaviza los mapas de profundidad preservando bordes. Detectar discontinuidades de profundidad (límites de objetos) y combinar con máscaras de segmentación produce límites de profundidad más precisos. La conversión a nube de puntos requiere parámetros intrínsecos de la cámara (distancia focal, punto principal), procesados eficientemente con la librería Open3D.