Scene Flow
El flujo de escena es el campo de movimiento 3D de una escena: un vector de desplazamiento para cada punto visible entre fotogramas, estimado a partir de datos estéreo, RGB-D o LiDAR.
El flujo de escena es el campo de movimiento tridimensional de una escena: para cada punto visible de una superficie, un vector 3D que indica dónde está el punto en un fotograma y dónde está en el siguiente. Sundar Vedula, Simon Baker y sus colegas de la Universidad Carnegie Mellon introdujeron el término en su artículo de 1999 Three-Dimensional Scene Flow, donde lo definieron como la contrapartida 3D del flujo óptico. El flujo de escena combina geometría y movimiento, por lo que indica a un sistema de visión artificial dónde está cada punto y a qué velocidad se mueve, en metros, incluso si se acerca a la cámara o se aleja de ella. Por eso es una señal fundamental para los vehículos autónomos y la robótica, donde hay que reconocer por su movimiento un coche que se incorpora a la vía o una persona que entra en la trayectoria.
Flujo de escena frente a flujo óptico#
El flujo óptico es la proyección del flujo de escena en el plano de la imagen: registra cuánto se desplaza cada píxel hacia los lados y hacia arriba o abajo, pero no dice nada sobre el movimiento a lo largo de la línea de visión de la cámara. Por tanto, dos objetos con un flujo óptico idéntico pueden moverse de formas muy distintas. El flujo de escena recupera el componente que falta mediante la estimación de profundidad en ambos instantes y proyecta cada píxel hacia atrás a lo largo de su rayo visual hasta la profundidad medida:
import numpy as np
K_inv = np.linalg.inv(np.array([[500.0, 0, 320], [0, 500.0, 240], [0, 0, 1]])) # inverse camera intrinsics
# Two objects with identical optical flow: each moves from pixel (400, 240) to (410, 240) in 0.1 s
for name, depth_before, depth_after in [("cyclist crossing", 8.0, 8.0), ("car approaching", 8.0, 6.0)]:
# Back-project each pixel along its viewing ray to the measured depth
before = depth_before * K_inv @ np.array([400, 240, 1.0])
after = depth_after * K_inv @ np.array([410, 240, 1.0])
# Scene flow is the 3D displacement of the same surface point
flow = after - before
print(f"{name}: scene flow {flow.round(2)} m, speed {np.linalg.norm(flow) / 0.1:.1f} m/s")Ambos objetos se desplazan 10 píxeles hacia la derecha, pero el ciclista se mueve 0,16 m lateralmente a 1,6 m/s, mientras que el coche recorre 2 m en una décima de segundo a 20,1 m/s. A 6 m de distancia y acercándose a 20 m/s, el coche llega a la cámara en 0,3 segundos.
El flujo de escena también se diferencia del seguimiento de objetos, que sigue la identidad de los objetos mediante cajas delimitadoras, y del seguimiento de puntos, que sigue puntos 2D seleccionados a lo largo de muchos fotogramas. La estimación de velocidad de Ultralytics YOLO funciona en el nivel de seguimiento 2D: sigue cada caja y convierte su desplazamiento en píxeles a km/h usando una única escala de metros por píxel para toda la vista, lo que funciona cuando la cámara apunta hacia abajo a una carretera y el tráfico se mueve en paralelo a la imagen.
Cómo se estima el flujo de escena#
El método depende de los datos de entrada. Una cámara estéreo proporciona la disparidad en dos instantes y el flujo óptico entre fotogramas: es la configuración del benchmark de flujo de escena KITTI, que Moritz Menze y Andreas Geiger publicaron en 2015 con 200 escenas de carretera para entrenamiento y 200 para prueba. Las cámaras RGB-D y LiDAR proporcionan dos nubes de puntos, a menudo combinadas con imágenes de cámara mediante fusión de sensores, y redes como FlowNet3D aprenden a asociar directamente los puntos entre ellas. Una única cámara depende de la profundidad monocular aprendida y del flujo óptico para cada par de fotogramas.
Cuando la cámara se mueve, todos los puntos estáticos parecen moverse también, así que un sistema completo estima el movimiento propio, normalmente mediante SLAM visual u odometría, y considera que los puntos cuyo flujo no coincide se mueven de forma independiente. Las escenas de conducción se componen sobre todo de cuerpos rígidos, por lo que métodos como el flujo de escena de objetos de Menze y Geiger y RAFT-3D agrupan los píxeles en unos pocos objetos que se mueven rígidamente, lo que estabiliza las estimaciones en carrocerías sin textura. Las oclusiones son el caso más difícil, ya que no hay ninguna correspondencia que medir para los puntos que aparecen o desaparecen entre fotogramas.
Los modelos de aprendizaje profundo necesitan datos de referencia densos que los sensores reales no pueden capturar, por lo que el entrenamiento depende en gran medida de los datos sintéticos. Los conjuntos de datos de flujo de escena de Friburgo, incluido FlyingThings3D, generan decenas de miles de fotogramas estéreo con valores exactos de disparidad, flujo óptico y cambio de disparidad. FlowNet3D, entrenado únicamente con FlyingThings3D, se transfirió a escaneos LiDAR reales de KITTI.
Aplicaciones en el mundo real#
- Robots móviles: Los robots que comparten almacenes y aceras con personas usan el movimiento 3D de los obstáculos cercanos para predecir dónde estarán dentro de un segundo y recalcular la ruta para esquivarlos.
- Reconstrucción de escenas dinámicas: El splatting gaussiano 4D y los campos de radiancia neuronales dinámicos modelan una escena en movimiento aprendiendo cómo se desplaza cada punto o gaussiana con el tiempo. Este flujo de escena aprendido permite reproducir un vídeo grabado desde nuevos puntos de vista.
- Conducción autónoma: El flujo de escena LiDAR distingue los vehículos y peatones en movimiento del entorno estático entre barridos consecutivos. Waymo Open Dataset añadió etiquetas de flujo de escena en 2021, con aproximadamente 1.000 veces más fotogramas anotados que los conjuntos de datos reales de flujo de escena anteriores.










