Scene Flow
Le flux de scène est le champ de mouvement 3D d’une scène : un vecteur de déplacement pour chaque point visible entre les images, estimé à partir de données stéréo, RGB-D ou LiDAR.
Le flux de scène est le champ de mouvement tridimensionnel d’une scène : pour chaque point de surface visible, il s’agit d’un vecteur 3D allant de la position du point dans une image à celle qu’il occupe dans la suivante. Sundar Vedula, Simon Baker et leurs collègues de l’université Carnegie Mellon ont introduit ce terme dans leur article de 1999 Three-Dimensional Scene Flow, où ils le définissent comme l’équivalent 3D du flux optique. Le flux de scène combine géométrie et mouvement : il indique donc à un système de vision par ordinateur où se trouve chaque point et à quelle vitesse il se déplace, en mètres, y compris vers la caméra ou dans la direction opposée. C’est un signal essentiel pour les véhicules autonomes et la robotique, où il faut reconnaître le mouvement d’une voiture qui s’engage sur la route ou d’une personne qui s’avance sur la trajectoire du véhicule.
Flux de scène et flux optique#
Le flux optique est la projection du flux de scène sur le plan de l’image : il indique de combien chaque pixel se déplace vers la gauche ou la droite, vers le haut ou vers le bas, mais ne renseigne pas sur le mouvement le long de la ligne de visée de la caméra. Deux objets ayant un flux optique identique peuvent donc se déplacer de façons très différentes. Le flux de scène récupère la composante manquante par estimation de profondeur aux deux instants, en reprojetant chaque pixel le long de son rayon de visée jusqu’à la profondeur mesurée :
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")Les deux objets se déplacent de 10 pixels vers la droite, mais le cycliste parcourt 0,16 m latéralement à 1,6 m/s, tandis que la voiture avance de 2 m en un dixième de seconde à 20,1 m/s. À 6 m de distance et approchant à 20 m/s, la voiture atteint la caméra en 0,3 seconde.
Le flux de scène diffère aussi du suivi d’objets, qui suit l’identité des objets au moyen de boîtes englobantes, et du suivi de points, qui suit des points 2D choisis sur plusieurs images. L’estimation de vitesse avec Ultralytics YOLO s’effectue au niveau du suivi en 2D : elle suit chaque boîte et convertit son déplacement en pixels en km/h à l’aide d’une seule échelle mètres par pixel pour toute la vue. Cette méthode convient lorsque la caméra surplombe une route et que la circulation se déplace parallèlement à l’image.
Comment le flux de scène est estimé#
La méthode dépend des données d’entrée. Une caméra stéréo fournit la disparité aux deux instants ainsi que le flux optique entre les images, comme dans le banc d’essai KITTI consacré au flux de scène, publié par Moritz Menze et Andreas Geiger en 2015 et composé de 200 scènes routières d’entraînement et de 200 scènes de test. Les caméras RGB-D et le LiDAR fournissent deux nuages de points, souvent fusionnés avec les images de caméra au moyen de la fusion de capteurs, et des réseaux comme FlowNet3D apprennent à apparier directement les points entre les deux nuages. Une caméra unique s’appuie sur la profondeur monoculaire apprise et le flux optique de chaque paire d’images.
Lorsque la caméra bouge, tous les points immobiles semblent eux aussi se déplacer. Un système complet estime donc également le mouvement propre de la caméra, généralement à partir du SLAM visuel ou de l’odométrie, et considère comme indépendamment mobiles les points dont le flux ne correspond pas à ce mouvement. Les scènes de conduite sont composées principalement de corps rigides. Des méthodes comme le flux de scène par objets de Menze et Geiger et RAFT-3D regroupent donc les pixels en quelques objets animés par un mouvement rigide, ce qui stabilise les estimations sur les carrosseries sans texture. Les occultations constituent le cas le plus difficile, car les points qui apparaissent ou disparaissent entre deux images n’ont aucun correspondant mesurable.
Les modèles d’apprentissage profond ont besoin de vérités terrain denses que les capteurs réels ne peuvent pas capturer. Leur entraînement repose donc largement sur les données synthétiques. Les jeux de données de flux de scène de Fribourg, dont FlyingThings3D, génèrent des dizaines de milliers d’images stéréo avec des valeurs exactes de disparité, de flux optique et de variation de disparité. FlowNet3D, entraîné uniquement sur FlyingThings3D, a été transféré aux données LiDAR réelles de KITTI.
Applications concrètes#
- Robots mobiles : Les robots qui partagent des entrepôts et des trottoirs avec des personnes utilisent le mouvement 3D des obstacles proches pour prévoir leur position une seconde plus tard et recalculer leur trajectoire afin de les éviter.
- Reconstruction de scènes dynamiques : Le Gaussian splatting 4D et les champs de radiance neuronaux dynamiques modélisent une scène en mouvement en apprenant comment chaque point ou gaussienne se déplace dans le temps. Ce flux de scène appris permet de revoir une vidéo enregistrée depuis de nouveaux points de vue.
- Conduite autonome : Le flux de scène LiDAR distingue les véhicules et les piétons en mouvement du monde statique entre deux balayages consécutifs. En 2021, le Waymo Open Dataset a ajouté des étiquettes de flux de scène, avec environ 1 000 fois plus d’images annotées que les précédents jeux de données réels consacrés au flux de scène.










