Implementación práctica de MiDaS para visión por IA: generación de mapas de calor y análisis de datos

Implementación práctica de MiDaS para visión por IA: generación de mapas de calor y análisis de datos

  1. Introducción: importancia de la estimación de profundidad monocular en IA

En el campo de la visión por computadora, recuperar la estructura 3D a partir de imágenes 2D ha sido siempre un desafío significativo. Los métodos tradicionales dependen de la geometría de múltiples vistas o dispositivos como LiDAR, lo que implica costos elevados y complejidad en el despliegue. Con el avance del aprendizaje profundo, la tecnología de estimación de profundidad monocular ha madurado, permitiendo inferir información de profundidad de una escena a partir de una sola fotografía.

El modelo MiDaS propuesto por el laboratorio de Intel es uno de los resultados más representativos en este campo. Entrenado con grandes conjuntos de datos híbridos, puede predecir con rapidez y precisión la profundidad relativa de cada píxel en una imagen sin necesidad de sensores adicionales. Este proyecto se basa en MiDaS para construir un sistema completo de generación de mapas de calor de profundidad, funcional en CPU con interfaz web integrada, soportando implementación con un clic y análisis visual, aplicable en escenarios como seguridad inteligente, AR/VR, navegación robótica, entre otros.

Este artículo analizará en profundidad los principios de implementación, arquitectura técnica y flujo de uso del sistema, demostrando cómo utilizarlo para un efectivo análisis de datos de profundidad.

  1. Análisis técnico: funcionamiento del modelo de estimación de profundidad MiDaS

2.1 Definición esencial e innovación de MiDaS

MiDaS (Monocular depth scaling) no simplemente valores de distancia absoluta, sino que se centra en aprender una representación de escala de profundidad universal entre conjuntos de datos. Su idea fundamental es: aunque las unidades de las etiquetas de profundidad varían entre conjuntos de datos (metros, centímetros, valores normalizados), la relación relativa "objetos cercanos responden más, lejanos responden menos" es consistente.

Por lo tanto, MiDaS utiliza una función de pérdida invariante a escala para entrenar la red, permitiéndole generalizar a tipos de datos no vistos. Este diseño confiere al modelo una gran capacidad de adaptación, incluso si la entrada proviene de fotos de teléfonos, cámaras de vigilancia o imágenes de drones, puede generar mapas de profundidad razonables de manera estable.

2.2 Selección del modelo: ¿por qué elegir MiDaS_pequeño?

Este proyecto utiliza la versión ligera MiDaS_pequeño, basado en los siguientes criterios técnicos:

Dimensión MiDaS_pequeño MiDaS_completo
Parámetros ~8M ~80M
Velocidad inferencia (CPU) < 2 segundos > 10 segundos
Uso de memoria < 1GB > 4GB
Precisión (NYUv2) 0.115 RMSE 0.092 RMSE

Aunque el modelo completo ofrece mayor precisión, en aplicaciones prácticas el modelo ligero satisface la mayoría de las necesidades, especialmente para despliegue en dispositivos de borde o entornos sin GPU.

2.3 Desglose del flujo de trabajo: desde imagen de entrada a mapa de calor

Todo el proceso de inferencia se puede dividir en los siguientes pasos clave:

  1. Preprocesamiento de imagen: redimensionar la imagen de entrada a 384×384, normalizar los valores de píxeles y convertir a tensor.
  2. Inferencia de profundidad: cargar los pesos oficiales intel/midas mediante PyTorch Hub, ejecutar la propagación hacia adelante para obtener el mapa de profundidad (H×W).
  3. Mapeo postprocesamiento: usar OpenCV para mapear los valores de profundidad al espacio de color Inferno para mejorar la legibilidad.
  4. Visualización de resultados: devolver la interfaz de comparación entre imagen original y mapa de calor a través de Flask WebUI.
import torch
import cv2
import numpy as np
from PIL import Image

# Cargar modelo MiDaS
red_profundidad = torch.hub.load("intel-isl/MiDaS", "MiDaS_small")
dispositivo = torch.device("cpu")  # Soporta inferencia pura en CPU
red_profundidad.to(dispositivo)
red_profundidad.eval()

# Preprocesamiento de imagen
transformacion = torch.hub.load("intel-isl/MiDaS", "transforms").small_transform
imagen = Image.open("entrada.jpg")
tensor_imagen = transformacion(imagen).to(dispositivo)

# Inferencia de profundidad
with torch.no_grad():
    prediccion = red_profundidad(tensor_imagen)

# Postprocesamiento: generar mapa de calor
mapa_profundidad = prediccion[0].cpu().numpy()
mapa_profundidad = cv2.resize(mapa_profundidad, (imagen.width, imagen.height))
mapa_normalizado = cv2.normalize(mapa_profundidad, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
mapa_calor = cv2.applyColorMap(mapa_normalizado, cv2.COLORMAP_INFERNO)

# Guardar resultado
cv2.imwrite("salida_mapa_calor.jpg", mapa_calor)

Explicación del código: - Uso de torch.hub.load para obtener directamente el modelo oficial, evitando problemas de verificación de Token; - transforms.small_transform ajusta automáticamente el tamaño y normaliza; - cv2.applyColorMap aplica el esquema de color Inferno para resaltar detalles del primer plano.

  1. Implementación del sistema: integración WebUI y flujo completo de generación de mapas de calor

3.1 Preparación del entorno e inicio de imagen

Este proyecto se ha empaquetado como imagen Docker, soportando implementación con un clic:

docker run -p 8080:8080 tu-imagen-midas

Tras el inicio, acceder a http://localhost:8080 permite entrar en la página WebUI sin necesidad de instalar dependencias o configurar entornos Python.

3.2 Desglose detallado del flujo de operación del usuario

Paso 1: subir imagen de prueba

Se recomiendan fotografías con estructura de profundidad evidente, como:

  • Calles urbanas (primer plano: personas, medio plano: vehículos, fondo: edificios)
  • Pasillos interiores (paredes laterales que convergen en el lejano)
  • Primer plano de mascotas (nariz prominente, orejas hacia atrás)

Paso 2: activar servicio de estimación de profundidad

Hacer clic en el botón "📂 Subir foto para medir distancia" en la interfaz web, el frontend enviará la imagen mediante POST al endpoint /predict del backend.

Paso 3: visualizar salida de mapa de calor de profundidad

El sistema devolverá dos imágenes en segundos:

  • Izquierda: imagen original de entrada
  • Derecha: correspondiente mapa de calor Inferno

La semántica de colores es:

  • Áreas rojas/amarillas: indican objetos más cercanos a la lente (como caras, esquinas de mesas)
  • Áreas moradas/negras: indican fondo lejano (como cielo, montañas distantes, esquinas de pared)

3.3 Implementación clave de código: ejemplo de servicio backend Flask

from flask import Flask, request, send_file
import io

aplicacion = Flask(__name__)

@app.route('/predict', methods=['POST'])
def predecir():
    archivo = request.files['imagen']
    imagen = Image.open(archivo.stream)

    # Ejecutar estimación de profundidad (reutilizando el modelo anterior)
    tensor_imagen = transformacion(imagen).to(dispositivo)
    with torch.no_grad():
        prediccion = red_profundidad(tensor_imagen)

    mapa_profundidad = prediccion[0].cpu().numpy()
    mapa_profundidad = cv2.resize(mapa_profundidad, (imagen.width, imagen.height))
    mapa_normalizado = cv2.normalize(mapa_profundidad, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
    mapa_calor = cv2.applyColorMap(mapa_normalizado, cv2.COLORMAP_INFERNO)

    # Devolver flujo de imagen
    buffer = io.BytesIO()
    Image.fromarray(cv2.cvtColor(mapa_calor, cv2.COLOR_BGR2RGB)).save(buffer, 'JPEG')
    buffer.seek(0)
    return send_file(buffer, mimetype='image/jpeg')

if __name__ == '__main__':
    aplicacion.run(host='0.0.0.0', port=8080)

Puntos destacados: - Uso de búfer de memoria para devolver flujo de imagen, mejorando la eficiencia de respuesta; - Compatibilidad con múltiples formatos de entrada (JPG/PNG/GIF); - Soporte para procesamiento concurrente de solicitudes, adecuado para entornos de producción ligeros.

  1. Análisis de datos: extracción de valor de los mapas de calor de profundidad

4.1 Asistencia en toma de decisiones para comprensión de escenas

Los mapas de calor de profundidad proporcionan información previa importante para tareas de visión de alto nivel. Por ejemplo:

  • Seguridad inteligente: identificar si alguien se acerca a la línea de警戒ancia (aparición concentrada de áreas cálidas)
  • Simulación de conducción autónoma: determinar distancia a obstáculos delanteros, asistiendo en planificación de ruta
  • Creación de contenido: agregar automáticamente efecto de desenfoque de profundidad, mejorando el arte fotográfico

4.2 Análisis estadístico de distribución de profundidad

Se puede realizar un análisis numérico de los mapas de calor para extraer indicadores clave:

# Analizar distribución de profundidad
profundidad_plana = mapa_profundidad.flatten()
profundidad_media = np.mean(profundidad_plana)
desviacion_profundidad = np.std(profundidad_plana)
proporcion_cercana = np.sum(profundidad_plana > np.percentil(profundidad_plana, 75)) / len(profundidad_plana)

print(f"Valor medio de profundidad: {profundidad_media:.3f}")
print(f"Desviación estándar de profundidad: {desviacion_profundidad:.3f}")
print(f"Proporción de primer plano: {proporcion_cercana*100:.1f}%")

Estas estadísticas pueden usarse para:

  • Determinar automáticamente el tipo de imagen (interior vs exterior)
  • Activar mecanismos de alerta (detección de cambios súbitos en áreas cercanas)
  • Construir perfiles de comportamiento del usuario (análisis de áreas de enfoque)

4.3 Extensión de secuencias multi-frame: percepción inicial de escenas dinámicas

Si se aplica a flujos de video, se puede implementar adicionalmente:

  • Análisis de tendencia de movimiento: dirección de movimiento de áreas cálidas entre cuadros consecutivos → determinar si objetos se aproximan o alejan
  • Advertencia de riesgo de colisión: valor de profundidad disminuyendo constantemente + velocidad de aumento → indicación de alto riesgo
  • Determinación de oclusión virtual: combinando con segmentación semántica,判断 si personas en primer plano ocluirán objetivos de fondo
  1. Conclusión

5.1 Revisión del valor técnico

Este artículo ha detallado el diseño e implementación del sistema de estimación de profundidad monocular basado en Intel MiDaS. Esta solución presenta las siguientes ventajas principales:

  • Sin verificación de Token: llamada directa al modelo oficial mediante PyTorch Hub, evitando limitaciones de plataformas como ModelScope;
  • Inferencia eficiente en CPU: elección del modelo MiDaS_pequeño, adaptado para dispositivos de bajo cómputo;
  • Web lista para usar: integración completa de frontend y backend, soportando implementación con un clic;
  • Salida de mapa de calor intuitiva: uso de esquema de color Inferno, mejorando significativamente la interpretabilidad;
  • Alta escalabilidad: soporta desarrollo secundario, extendiéndose a análisis de video, reconstrucción 3D y aplicaciones avanzadas.

5.2 Recomendaciones de mejores prácticas

  1. Priorizar calidad de imagen: asegurar que las imágenes de entrada sean claras y con exposición normal, evitando sobreexposición o desenfoque que causen errores;
  2. Precisión esperable razonable: MiDaS genera profundidad relativa, no apta para mediciones precisas, pero suficiente para tareas de comprensión de escenas;
  3. Combinación con otros modelos: puede combinarse con modelos como YOLO, SAM, construyendo sistemas de percepción conjunta "semántica+profundidad";
  4. Optimización de experiencia de usuario: en WebUI, agregar deslizadores para ajustar contraste, cambiar modos de color, etc., mejorando la interacción.

Obtén más imágenes IA

¿Quieres explorar más imágenes IA y escenas de aplicación? Visita la plaza de imágenes CSDN Star, que ofrece una rica variedad de imágenes preconfiguradas, cubriendo áreas como inferencia de modelos grandes, generación de imágenes, generación de video, ajuste fino de modelos, entre otros, soportando implementación con un clic.

Etiquetas: MiDaS estimación de profundidad Visión por Computadora procesamiento de imágenes aprendizaje profundo

Publicado el 6-12 20:16