Fundamentos del flujo óptico y análisis de video - De los principios de estimación de movimiento a la implementación
Qué es el flujo óptico - Campos de vectores de movimiento entre imágenes
El flujo óptico representa un campo vectorial que describe cómo se mueve cada píxel entre fotogramas consecutivos de video. Cada píxel recibe un vector de desplazamiento 2D (dx, dy), capturando el movimiento de objetos y el movimiento de la cámara dentro de la escena. Sirve como tecnología fundamental para comprensión de video, reconocimiento de acciones, conducción autónoma y edición de video.
Flujo disperso vs. denso:
Existen dos tipos: el flujo disperso (Sparse Flow) rastrea el movimiento solo en puntos de interés (esquinas), ofreciendo cálculo rápido. El flujo denso (Dense Flow) estima el movimiento para todos los píxeles, proporcionando información detallada de movimiento a mayor costo computacional. La selección depende de los requisitos de la aplicación y los recursos de procesamiento disponibles.
Suposición de constancia de brillo:
La suposición fundamental es la constancia de brillo - la intensidad de un píxel permanece sin cambios después del movimiento. Matemáticamente: I(x, y, t) = I(x+dx, y+dy, t+dt). La expansión de Taylor produce la ecuación de restricción del flujo óptico: I_x * u + I_y * v + I_t = 0 (u, v son componentes del flujo; I_x, I_y, I_t son derivadas parciales de la imagen).
Problema de apertura:
La ecuación de restricción contiene dos incógnitas (u, v) en una ecuación, haciendo indeterminadas las soluciones de un solo píxel. Este problema de apertura significa que el movimiento a lo largo de los bordes es indetectable - solo el componente perpendicular a los bordes es estimable. Se requieren restricciones adicionales usando información de píxeles vecinos para la resolución.
Métodos clásicos - Lucas-Kanade y Horn-Schunck
Lucas-Kanade (LK) y Horn-Schunck (HS) son los métodos clásicos fundamentales de flujo óptico. Resuelven el problema de apertura mediante diferentes enfoques, convirtiéndose en métodos representativos para estimación de flujo disperso y denso respectivamente.
Método Lucas-Kanade (1981):
LK asume flujo localmente uniforme - todos los píxeles dentro de una ventana pequeña (ej. 15x15) comparten el mismo vector de flujo. Esto crea un sistema sobredeterminado resuelto por mínimos cuadrados. De n píxeles en la ventana, n ecuaciones de restricción resuelven 2 incógnitas. El sistema toma la forma A^T A d = A^T b, donde A es la matriz de gradiente espacial y b es el vector de gradiente temporal.
Características de LK:
LK funciona bien en regiones texturizadas (cerca de esquinas) pero se vuelve inestable en áreas uniformes. Combinar con buenas características de Shi-Tomasi (rastrear solo puntos donde el autovalor mínimo de A^T A excede un umbral) es práctica estándar. Las estructuras piramidales (reducción progresiva de la imagen) manejan movimientos grandes. OpenCV proporciona la implementación cv2.calcOpticalFlowPyrLK().
Método Horn-Schunck (1981):
HS introduce la suavidad del flujo como restricción global. Más allá de la restricción del flujo óptico, añade regularización minimizando la variación espacial del flujo. La función de energía E = sum[(I_x u + I_y v + I_t)^2 + alpha^2(|grad u|^2 + |grad v|^2)] se minimiza variacionalmente. Alpha controla el peso de suavidad - valores mayores producen campos de flujo más suaves.
Solución iterativa:
HS usa cálculo iterativo basado en Laplaciano, actualizando el flujo referenciando el flujo promedio del vecindario en cada iteración hasta convergencia. Típicamente 100-200 iteraciones son suficientes. Se obtiene flujo denso para todos los píxeles pero el costo computacional es alto y el manejo de movimientos grandes es difícil.
Flujo óptico con aprendizaje profundo - De FlowNet a RAFT
Desde 2015, la estimación de flujo óptico basada en aprendizaje profundo ha avanzado rápidamente, superando significativamente los métodos clásicos en precisión. La evolución desde FlowNet a través de PWC-Net hasta RAFT ha establecido a RAFT como el estándar de facto para estimación de flujo de alta precisión.
FlowNet (2015):
El primer método de estimación directa de flujo óptico basado en CNN. FlowNetS (Simple) concatena dos imágenes como entrada, prediciendo flujo mediante estructura encoder-decoder. FlowNetC (Correlation) codifica imágenes por separado, calculando correspondencias mediante capas de correlación. Entrenado en el dataset Flying Chairs, alcanzó precisión comparable a métodos clásicos en el benchmark Sintel.
PWC-Net (2018):
Nombrado por Pyramid, Warping, Cost Volume, este método refina progresivamente el flujo en estructura piramidal de grueso a fino. El flujo estimado en la etapa anterior deforma la segunda imagen, calculando volúmenes de costo entre imágenes deformadas y la primera para estimación de flujo residual. Alcanza mayor precisión con 1/17 de los parámetros de FlowNet.
RAFT (2020):
Recurrent All-Pairs Field Transforms es actualmente el método de flujo óptico de mayor precisión. Construye volúmenes de correlación de todos los pares y refina iterativamente el flujo usando actualizaciones GRU (Gated Recurrent Unit). Alcanza EPE 1.43 en Sintel (clean) y F1-all 5.10% en KITTI 2015, superando significativamente métodos anteriores.
Innovaciones de RAFT:
- Volumen de correlación 4D: Pre-calcula similitudes de todos los pares de píxeles para búsqueda eficiente
- Actualizaciones iterativas: GRU itera 12-32 veces, mejorando progresivamente el flujo
- Búsqueda de correlación multiescala: Integra información de correlación a diferentes resoluciones
- Inicialización aprendible: Comienza desde flujo cero, convergiendo a través de iteraciones
Aplicaciones del flujo óptico - Del reconocimiento de acciones a la edición de video
El flujo óptico sirve como tecnología fundamental para la comprensión de video, permitiendo diversas aplicaciones. Extraer explícitamente información de movimiento permite la comprensión semántica del video y capacidades de edición sofisticadas.
Reconocimiento de acciones:
Las redes Two-Stream (Simonyan y Zisserman, 2014) procesan fotogramas RGB y flujo óptico a través de CNNs separadas para reconocimiento de acciones. El flujo RGB captura apariencia mientras el flujo de movimiento captura movimiento, logrando alta precisión de reconocimiento mediante integración. 88% de precisión en UCF-101 demostró la importancia de la información de movimiento.
Interpolación de fotogramas de video:
El flujo óptico genera fotogramas intermedios entre dos fotogramas existentes. Calculando el flujo del fotograma 1 al fotograma 2, interpolando linealmente el flujo en marcas de tiempo intermedias y deformando, se produce video en cámara lenta suave. DAIN (Depth-Aware Video Frame Interpolation) además aprovecha información de profundidad para mejorar la calidad de interpolación en regiones ocluidas.
Estabilización de video:
El flujo óptico elimina el temblor de cámara manual para estabilización de video. El movimiento global (movimiento de cámara) estimado del flujo se invierte y aplica para corregir el temblor. La estimación de homografía basada en RANSAC separa el movimiento local (movimiento de objetos) del movimiento global (movimiento de cámara) para estabilización precisa.
Segmentación de video:
El flujo óptico ayuda a la segmentación de objetos en video (VOS) agrupando píxeles pertenecientes al mismo objeto usando consistencia de movimiento. Las discontinuidades del flujo corresponden a límites de objetos, permitiendo segmentación basada en movimiento. Métodos recientes integran información de flujo en modelos de segmentación basados en Transformer para mejorar la coherencia temporal.
Visualización del flujo y métricas de evaluación
La visualización del flujo óptico y la evaluación cuantitativa son esenciales para la comparación de métodos y la interpretación de resultados. Comprender las técnicas de visualización estándar y las métricas permite una evaluación precisa de la calidad de la estimación del flujo.
Visualización con rueda de colores:
La visualización estándar del flujo óptico usa la rueda de colores de Middlebury. La dirección del flujo se mapea al tono mientras la magnitud se mapea a la saturación. Derecha es rojo, arriba es verde, izquierda es cian, abajo es magenta. cv2.cartToPolar() de OpenCV convierte el flujo a coordenadas polares, mapeando al espacio de color HSV para visualización intuitiva.
EPE (End-Point Error):
EPE es la distancia euclidiana media entre el flujo estimado y el flujo real. EPE = (1/N) sum sqrt((u - u*)^2 + (v - v*)^2). El benchmark Sintel evalúa en pases clean y final - final incluye desenfoque de movimiento y efectos atmosféricos haciéndolo más desafiante. RAFT alcanza EPE 1.43 píxeles en Sintel clean.
Fl (Flow Error Rate):
Usado en el benchmark KITTI, Fl mide el porcentaje de píxeles con EPE superior a 3 píxeles Y error relativo superior al 5%. Esto evalúa la proporción de píxeles con errores prácticamente significativos. RAFT alcanza Fl-all 5.10% en KITTI 2015.
Datasets de referencia:
- Sintel: Generado a partir de película animada. Contiene movimientos grandes, oclusiones, desenfoque de movimiento
- KITTI: Escenas reales de conducción autónoma. Verdad fundamental dispersa de LiDAR
- Flying Chairs: Datos sintéticos ampliamente usados para entrenamiento
- Middlebury: Evaluación de alta precisión de movimientos pequeños para comparación de métodos clásicos
El entrenamiento en dos etapas - preentrenamiento en datos sintéticos (Flying Chairs, Flying Things 3D) y luego ajuste fino en datos reales (Sintel, KITTI) - es práctica estándar.
Guía de implementación - Estimación de movimiento con OpenCV y RAFT
Implementación de estimación de flujo óptico usando enfoques tanto clásicos (OpenCV) como de aprendizaje profundo (RAFT). Proporciona guía de selección de métodos y estructura de código práctica para diferentes escenarios de aplicación.
Flujo disperso con OpenCV (Lucas-Kanade):
Detectar características de seguimiento con cv2.goodFeaturesToTrack(), calcular correspondencias entre fotogramas mediante cv2.calcOpticalFlowPyrLK(). El LK piramidal rastrea movimientos de hasta aproximadamente 30 píxeles. La verificación forward-backward (calcular flujo inverso) detecta fallos de seguimiento excluyendo puntos con error de ida y vuelta por encima del umbral.
Flujo denso con OpenCV (Farneback):
cv2.calcOpticalFlowFarneback() proporciona estimación de flujo denso basada en expansión polinomial. Parámetros estándar: pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5. Permite procesamiento en tiempo real pero el manejo de movimientos grandes y oclusiones permanece limitado.
Inferencia con RAFT:
La implementación oficial de RAFT en PyTorch carga modelos preentrenados mediante torchvision.models.optical_flow.raft_large(). Entrada: dos tensores de imagen (forma: 1x3xHxW). Salida: lista de predicciones de flujo por iteración - el último elemento es la estimación final. La GPU procesa imágenes 1080p en aproximadamente 100ms.
Guía de selección de métodos:
- Tiempo real + flujo disperso: Lucas-Kanade (OpenCV). Óptimo para seguimiento de características, seguimiento de marcadores AR
- Tiempo real + flujo denso: Farneback (OpenCV) o RAFT-Small. Para efectos de video, detección simple de movimiento
- Alta precisión + offline: RAFT-Large. Óptimo para edición de video, investigación, interpolación de fotogramas
- Embebido/móvil: LiteFlowNet o PWC-Net ligero. Para inferencia en dispositivos edge