Segmentación de Personas en Video con OpenSBC y Yolo

Clase 6 de 16Curso de Visión Artificial con Python

Resumen

El análisis de tráfico de personas en espacios comerciales ha evolucionado significativamente gracias a la integración de técnicas avanzadas de visión por computadora. La combinación de procesamiento de imágenes tradicional con modelos de segmentación como YOLO permite obtener resultados mucho más precisos y enfocados exclusivamente en el movimiento humano, eliminando el ruido visual que antes dificultaba estos análisis. Esta tecnología está transformando la forma en que los negocios comprenden el comportamiento de sus clientes en el espacio físico.

¿Cómo mejorar la detección de personas con segmentación?

El problema inicial con el procesamiento de imágenes tradicional es que detecta cualquier elemento en movimiento, sin discriminar si se trata de personas u otros objetos. Esto genera "ruido" en los datos, como cuando una cuerda u otro elemento se mueve y es detectado incorrectamente como tráfico relevante.

La solución implementada combina dos técnicas poderosas:

  1. Detección de movimiento: Utilizando sustracción de fondo para identificar cualquier cambio entre frames.
  2. Segmentación con YOLO: Aplicando un modelo específico para identificar y aislar únicamente a las personas.

El resultado es un hitmap refinado que muestra exclusivamente el movimiento de personas, eliminando falsos positivos y proporcionando datos mucho más limpios y útiles para el análisis.

Implementación del hitmap refinado con segmentación

Para implementar esta solución necesitamos combinar el procesamiento de imágenes tradicional con la segmentación mediante YOLO. El proceso se puede dividir en los siguientes pasos:

  1. Instalación de dependencias (ultralytics)
  2. Definición de la ruta del video
  3. Configuración del extractor de fondo
  4. Importación del modelo YOLO para segmentación
  5. Procesamiento frame por frame

El código básico para esta implementación sería:

# Instalación de dependencias
!pip install ultralytics

# Importaciones necesarias
import cv2
import numpy as np
from ultralytics import YOLO

# Definir ruta del video
video_path = "data/video.mp4"

# Configurar extractor de fondo
bg_subtractor = cv2.createBackgroundSubtractorMOG2()

# Inicializar hitmap refinado
hitmap_refinado = np.zeros((height, width), dtype=np.uint8)

# Cargar modelo YOLO para segmentación
model = YOLO('yolov8n-seg.pt')

# Abrir video
cap = cv2.VideoCapture(video_path)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # Detección de movimiento (procesamiento de imágenes)
    fg_mask = bg_subtractor.apply(frame)
    thresh = cv2.threshold(fg_mask, 200, 255, cv2.THRESH_BINARY)[1]
    
    # Segmentación con YOLO
    results = model(frame, verbose=False)
    result = results[0]
    
    # Crear máscara de segmentación
    seg_mask = np.zeros_like(fg_mask)
    
    if len(result) > 0:
        for seg, cls in zip(result.masks.data, result.boxes.cls):
            # Solo considerar personas (clase 0)
            if cls == 0:
                # Convertir segmentación a máscara binaria
                segment = seg.cpu().numpy()
                # Redimensionar al tamaño del frame
                segment = cv2.resize(segment, (width, height))
                seg_mask = np.logical_or(seg_mask, segment).astype(np.uint8) * 255
    
    # Combinar máscaras (movimiento + segmentación)
    refined_mask = cv2.bitwise_and(thresh, seg_mask)
    
    # Actualizar hitmap
    hitmap_refinado = cv2.add(hitmap_refinado, refined_mask)

cap.release()

Este código combina la detección de movimiento con la segmentación para crear un hitmap que muestra exclusivamente el movimiento de personas.

¿Qué ventajas ofrece la segmentación en el análisis de tráfico?

La implementación de segmentación con YOLO para el análisis de tráfico ofrece beneficios significativos:

  • Eliminación de falsos positivos: Objetos en movimiento que no son personas (como cuerdas, puertas, etc.) ya no son detectados.
  • Mayor precisión: El hitmap resultante muestra exclusivamente el movimiento humano.
  • Datos más limpios: La visualización es más clara y fácil de interpretar.
  • Análisis más enfocado: Permite concentrarse en el comportamiento de los clientes sin distracciones.

En el ejemplo mostrado, se pudo resolver el problema específico de una cuerda en movimiento que anteriormente era detectada incorrectamente como tráfico relevante. Con la segmentación, el sistema ahora ignora la cuerda y se enfoca exclusivamente en las personas.

¿Cómo implementar esta solución en Google Colab?

Para implementar esta solución en Google Colab, es importante asegurarse de tener acceso a una GPU para acelerar el procesamiento. El proceso es similar al local, pero con algunas consideraciones adicionales:

  1. Activar GPU: En "Configuración del cuaderno" asegúrate de que la GPU esté activada.
  2. Instalar dependencias: Instala ultralytics como se mostró anteriormente.
  3. Cargar el video: Sube el video que deseas analizar.
  4. Descargar el modelo YOLO: En caso de problemas con la descarga automática, puedes hacerlo manualmente:
!wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n-seg.pt

El código para Google Colab es esencialmente el mismo, pero optimizado para generar directamente el hitmap final sin mostrar cada frame durante el procesamiento, lo que acelera significativamente la ejecución.

Solución de problemas comunes

Un problema frecuente es que YOLO no pueda descargar automáticamente el modelo. Si esto ocurre:

  1. Ve a la documentación de Ultralytics
  2. Busca el modelo de segmentación que necesitas
  3. Haz clic derecho en el enlace y selecciona "Copiar vínculo"
  4. Usa el comando wget para descargarlo manualmente

Este enfoque garantiza que tengas acceso al modelo incluso cuando la descarga automática falla.

¿Qué resultados podemos esperar?

Los resultados de implementar segmentación con YOLO para el análisis de tráfico son notablemente superiores a los métodos tradicionales:

  • Hitmap más limpio: Sin puntos aislados o ruido visual.
  • Enfoque exclusivo en personas: Solo se visualiza el movimiento humano.
  • Patrones de movimiento claros: Es fácil identificar dónde pasan más tiempo los clientes.
  • Eliminación de falsos positivos: Elementos como cuerdas u objetos en movimiento ya no afectan el análisis.

En los ejemplos mostrados, el tiempo de procesamiento fue de aproximadamente 2 minutos y 15 segundos para un video completo utilizando GPU, lo que demuestra la eficiencia de esta solución.

La combinación de procesamiento de imágenes tradicional con segmentación mediante YOLO representa un avance significativo en el análisis de tráfico de personas. Esta técnica no solo mejora la precisión de los datos, sino que también proporciona información más valiosa para la toma de decisiones comerciales. El siguiente paso natural sería implementar un contador de personas para cuantificar el tráfico en diferentes áreas del espacio comercial, llevando el análisis a un nivel aún más profundo.