Scene Flow
Scene Flow ist das 3D-Bewegungsfeld einer Szene: ein Verschiebungsvektor für jeden sichtbaren Punkt zwischen Bildern, geschätzt anhand von Stereo-, RGB-D- oder LiDAR-Daten.
Szenenfluss ist das dreidimensionale Bewegungsfeld einer Szene: Für jeden sichtbaren Oberflächenpunkt beschreibt ein 3D-Vektor den Weg von seiner Position in einem Bild bis zu seiner Position im nächsten. Sundar Vedula, Simon Baker und ihre Kolleginnen und Kollegen an der Carnegie Mellon University führten den Begriff in ihrer Arbeit von 1999 Three-Dimensional Scene Flow ein und definierten ihn als 3D-Entsprechung des optischen Flusses. Szenenfluss verbindet Geometrie und Bewegung. Er zeigt einem Computer-Vision-System daher sowohl, wo sich jeder Punkt befindet, als auch, wie schnell er sich in Metern bewegt – einschließlich der Bewegung auf die Kamera zu oder von ihr weg. Damit ist Szenenfluss ein wichtiges Signal für autonome Fahrzeuge und die Robotik, wo ein ausscherendes Auto oder eine Person, die auf einen Fahrweg tritt, anhand ihrer Bewegung erkannt werden muss.
Szenenfluss und optischer Fluss#
Optischer Fluss ist die Projektion des Szenenflusses auf die Bildebene: Er erfasst, wie weit sich jedes Pixel seitwärts sowie nach oben oder unten bewegt, sagt aber nichts über Bewegungen entlang der Sichtlinie der Kamera aus. Zwei Objekte mit identischem optischem Fluss können sich daher sehr unterschiedlich bewegen. Der Szenenfluss ermittelt die fehlende Komponente mithilfe der Tiefenschätzung zu beiden Zeitpunkten. Dafür wird jedes Pixel entlang seines Sehstrahls auf seine gemessene Tiefe zurückprojiziert:
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")Beide Objekte verschieben sich um 10 Pixel nach rechts. Der Radfahrer bewegt sich dabei jedoch seitwärts um 0,16 m bei 1,6 m/s, während das Auto in einer Zehntelsekunde 2 m näher kommt und dabei 20,1 m/s schnell ist. Bei einem Abstand von 6 m und einer Annäherungsgeschwindigkeit von 20 m/s erreicht das Auto die Kamera in 0,3 Sekunden.
Szenenfluss unterscheidet sich außerdem vom Objekt-Tracking, bei dem Objektidentitäten anhand von Bounding Boxes verfolgt werden, und vom Punkt-Tracking, bei dem ausgewählte 2D-Punkte über viele Bilder hinweg verfolgt werden. Die YOLO-Geschwindigkeitsschätzung von Ultralytics arbeitet auf der 2D-Tracking-Ebene: Sie verfolgt jede erfasste Box und rechnet deren Pixelverschiebung anhand eines einzigen Maßstabs von Metern pro Pixel für das gesamte Bild in km/h um. Das funktioniert, wenn die Kamera auf eine Straße herabblickt und sich der Verkehr parallel zum Bild bewegt.
So wird Szenenfluss geschätzt#
Die Eingabedaten bestimmen die Methode. Eine Stereokamera liefert Disparität zu beiden Zeitpunkten sowie optischen Fluss zwischen den Bildern. Das ist der Versuchsaufbau des KITTI-Szenenfluss-Benchmarks, den Moritz Menze und Andreas Geiger 2015 mit 200 Trainings- und 200 Testszenen auf Straßen veröffentlichten. RGB-D-Kameras und LiDAR liefern zwei Punktwolken, die häufig über Sensorfusion mit Kamerabildern zusammengeführt werden. Netzwerke wie FlowNet3D lernen, Punkte zwischen diesen Punktwolken direkt einander zuzuordnen. Eine einzelne Kamera ist für jedes Bildpaar auf gelernte monokulare Tiefenschätzung und optischen Fluss angewiesen.
Wenn sich die Kamera bewegt, scheinen sich auch alle statischen Punkte zu bewegen. Ein vollständiges System schätzt daher zusätzlich die Eigenbewegung, üblicherweise anhand von visuellem SLAM oder Odometrie. Punkte, deren Fluss davon abweicht, gelten als unabhängig bewegt. Fahrszenen bestehen überwiegend aus starren Körpern. Daher gruppieren Verfahren wie Menzes und Geigers Object Scene Flow sowie RAFT-3D Pixel zu wenigen starr bewegten Objekten. Das stabilisiert die Schätzungen bei strukturlosen Karosserien. Verdeckungen sind der schwierigste Fall, da Punkte, die zwischen Bildern auftauchen oder verschwinden, keine messbare Entsprechung haben.
Deep-Learning-Modelle benötigen dichte Referenzdaten, die reale Sensoren nicht erfassen können. Das Training stützt sich daher stark auf synthetische Daten. Die Freiburg-Szenenfluss-Datensätze, darunter FlyingThings3D, erzeugen Zehntausende Stereobilder mit exakten Angaben zu Disparität, optischem Fluss und Disparitätsänderung. FlowNet3D wurde ausschließlich mit FlyingThings3D trainiert und ließ sich auf reale KITTI-LiDAR-Aufnahmen übertragen.
Anwendungen in der Praxis#
- Mobile Roboter: Roboter, die sich Lagerhallen und Gehwege mit Menschen teilen, nutzen die 3D-Bewegung naher Hindernisse, um vorherzusagen, wo diese eine Sekunde später sein werden, und ihre Route um sie herum neu zu planen.
- Rekonstruktion dynamischer Szenen: 4D-Gaussian-Splatting und dynamische neuronale Strahlungsfelder modellieren eine bewegte Szene, indem sie lernen, wie sich jeder Punkt oder jede Gaußsche Funktion im Laufe der Zeit bewegt. Dieser erlernte Szenenfluss ermöglicht es, ein aufgezeichnetes Video aus neuen Blickwinkeln wiederzugeben.
- Autonomes Fahren: Der LiDAR-Szenenfluss unterscheidet bewegte Fahrzeuge und Fußgänger zwischen aufeinanderfolgenden Aufnahmen von der statischen Umgebung. Der Waymo Open Dataset ergänzte 2021 Szenenfluss-Markierungen und enthält etwa 1.000-mal mehr annotierte Bilder als frühere Szenenfluss-Datensätze aus der realen Welt.










