Scene Flow
Il flusso di scena è il campo di moto 3D di una scena: un vettore di spostamento per ogni punto visibile tra fotogrammi, stimato da dati stereo, RGB-D o LiDAR.
Il flusso di scena è il campo di moto tridimensionale di una scena: per ogni punto visibile di una superficie, un vettore 3D indica dove si trova il punto in un fotogramma e dove si trova nel successivo. Sundar Vedula, Simon Baker e i colleghi della Carnegie Mellon University introdussero il termine nel loro articolo del 1999 Three-Dimensional Scene Flow, definendolo come la controparte 3D del flusso ottico. Il flusso di scena combina geometria e movimento, quindi indica a un sistema di visione artificiale sia dove si trova ciascun punto sia quanto velocemente si muove, in metri, anche verso o lontano dalla telecamera. È quindi un segnale fondamentale per i veicoli autonomi e la robotica, dove occorre riconoscere dal movimento un'auto che si immette nella strada o una persona che entra nel percorso.
Flusso di scena e flusso ottico#
Il flusso ottico è la proiezione del flusso di scena sul piano dell'immagine: registra quanto si sposta ogni pixel lateralmente e verso l'alto o il basso, ma non rileva il movimento lungo la linea di vista della telecamera. Due oggetti con un flusso ottico identico possono quindi muoversi in modo molto diverso. Il flusso di scena recupera la componente mancante tramite la stima della profondità in entrambi gli istanti, riproiettando ogni pixel lungo il proprio raggio di vista fino alla profondità misurata:
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")Entrambi gli oggetti si spostano di 10 pixel verso destra, eppure il ciclista si muove lateralmente di 0,16 m a 1,6 m/s, mentre l'auto si avvicina di 2 m in un decimo di secondo, a 20,1 m/s. A 6 m di distanza e con una velocità di avvicinamento di 20 m/s, l'auto raggiunge la telecamera in 0,3 secondi.
Il flusso di scena differisce anche dal tracciamento degli oggetti, che segue le identità degli oggetti tramite riquadri di delimitazione, e dal tracciamento dei punti, che segue punti 2D selezionati attraverso numerosi fotogrammi. La stima della velocità con Ultralytics YOLO opera a livello di tracciamento 2D: segue ogni riquadro tracciato e converte il suo spostamento in pixel in km/h usando un'unica scala metri per pixel per l'intera visuale, una soluzione valida quando la telecamera riprende dall'alto una strada e il traffico si muove parallelamente all'immagine.
Come si stima il flusso di scena#
Il metodo dipende dall'input. Una telecamera stereo fornisce la disparità in entrambi gli istanti e il flusso ottico tra i fotogrammi: è la configurazione del benchmark KITTI per il flusso di scena, pubblicato da Moritz Menze e Andreas Geiger nel 2015, con 200 scene stradali di addestramento e 200 di test. Le telecamere RGB-D e il LiDAR forniscono due nuvole di punti, spesso unite alle immagini della telecamera tramite la fusione dei sensori; reti come FlowNet3D apprendono a mettere direttamente in corrispondenza i punti tra le due nuvole. Una singola telecamera si affida alla profondità monoculare appresa e al flusso ottico per ogni coppia di fotogrammi.
Quando la telecamera si muove, anche ogni punto statico sembra muoversi; perciò un sistema completo stima anche il moto proprio, di solito tramite SLAM visivo o odometria, e considera in movimento autonomo i punti il cui flusso non è coerente con esso. Le scene stradali sono composte perlopiù da corpi rigidi, quindi metodi come il flusso di scena degli oggetti di Menze e Geiger e RAFT-3D raggruppano i pixel in pochi oggetti dal moto rigido, stabilizzando le stime sulle carrozzerie prive di texture. Le occlusioni sono il caso più difficile, perché i punti che compaiono o scompaiono tra i fotogrammi non hanno corrispondenze misurabili.
I modelli di apprendimento profondo richiedono dati di riferimento densi che i sensori reali non possono acquisire, quindi l'addestramento si basa molto sui dati sintetici. I dataset di flusso di scena di Friburgo, tra cui FlyingThings3D, generano decine di migliaia di fotogrammi stereo con disparità, flusso ottico e variazioni della disparità esatti; FlowNet3D, addestrato soltanto su FlyingThings3D, è stato trasferito a scansioni LiDAR reali di KITTI.
Applicazioni nel mondo reale#
- Robot mobili: I robot che condividono magazzini e marciapiedi con le persone usano il movimento 3D degli ostacoli vicini per prevedere dove saranno un secondo dopo e pianificare un nuovo percorso per evitarli.
- Ricostruzione di scene dinamiche: Il Gaussian splatting 4D e i campi di radianza neurale dinamici modellano una scena in movimento imparando come si muove nel tempo ogni punto o gaussiana; questo flusso di scena appreso consente di riprodurre un video registrato da nuovi punti di vista.
- Guida autonoma: Il flusso di scena LiDAR separa i veicoli e i pedoni in movimento dal mondo statico tra scansioni consecutive. Nel 2021 il Waymo Open Dataset ha aggiunto etichette di flusso di scena, con circa 1.000 volte più fotogrammi annotati rispetto ai precedenti dataset di flusso di scena del mondo reale.










