Optischer Fluss: Bewegung zwischen Bildern lesen

Motion-Tracking per optischem Fluss ist das eine Signal, auf dem jedes Skript von AutoScript Sync aufbaut. Zwischen jedem Paar abgetasteter Bilder misst dichter DIS-Fluss, wie sich die Pixel im bewegten Bereich verschoben haben. Das ergibt eine Geschwindigkeit, die die Engine zu einer Positionskurve integriert und an einem Anker hält, um die Drift zu begrenzen. Der Fluss läuft auf jedem Rechner auf der CPU.

Am 21. September 2026 mit dem Code der App abgeglichen.

DIS-Fluss auf dem bewegten Bereich

Die standardmäßige adaptive KI-Engine nutzt den DIS-Fluss (Dense Inverse Search) von OpenCV mit dem Preset FAST. Er läuft auf dem Bereich, den die Engine als bewegt erkannt hat, oder auf dem Rahmen, den du mit Set Motion Region… oder Live Track gezogen hast, in einem auf 320 px Breite verkleinerten Bild. Ein zweiter DIS-Durchgang mit halber Auflösung und dem Preset ultrafast läuft parallel, um zu prüfen, ob dem Fluss zu trauen ist.

Fast
Fluss zwischen jedem 4. Bild: 7,5 Abtastungen pro Sekunde bei 30-fps-Video.
Balanced
Jedes 3. Bild: 10 Abtastungen pro Sekunde bei 30-fps-Video. Der Standard.
High
Jedes 2. Bild: 15 Abtastungen pro Sekunde bei 30-fps-Video. Bei flachem Material (nicht VR) mit mindestens 640 px Breite wird der Fluss des verfolgten Bereichs zusätzlich mit 640 px gemessen. Die Notiz des Entwicklers hält einen kleinen Gewinn dadurch fest (+0,007 und +0,003 Hub-F1 bei zwei Filmen), bei etwa 1,4-facher Analysezeit.

Der Abstand ist eine feste Bildanzahl, daher verdoppelt sich bei 60-fps-Video jede Rate.

Anderswo liest du vielleicht, dass AutoScript Sync Farneback-Fluss nutzt. Die Haupt-Engine tut das nicht. Farneback kommt nur in der Basis-Engine vor, die du bekommst, wenn du für die Haupt-Schaltfläche Generate das Häkchen bei Use adaptive AI engine entfernst, und im Sampler hinter AI Bulk Learn.

Von der Geschwindigkeit zur Position

Der Fluss sagt dir, wie schnell sich etwas bewegt hat, nicht, wo es ist. Das Aufsummieren von Geschwindigkeiten ergibt eine Position, aber jeder kleine Fehler summiert sich mit, und die Kurve wandert. Deshalb hält die Engine den integrierten Fluss an einem Anker: einem langsameren, absoluten Positionsmaß, das pro Video aus der Mitte des bewegten Bereichs, Pose-Keypoints und relativer Tiefe gewählt wird. Standardmäßig wird der Anker zu einer Mischung pro Abtastung aus jedem lesbaren Kanal, wenn diese Mischung mindestens so gut abschneidet wie der einzelne Gewinner.

Ein Kalman-Filter mit RTS-Glätter (ein Vorwärtsdurchgang, gefolgt von einem Rückwärtsdurchgang über das ganze Video) verschmilzt beides zu einer einzigen Positionskurve. Die Einstellung Depth priority, 30 bis 90 mit dem Standardwert 85, legt fest, wie viel dieser Kurve aus der Geschwindigkeit stammt: Je höher sie ist, desto geringer das Gewicht des Ankers. Der Tooltip der Einstellung beschreibt den Kompromiss: Die Geschwindigkeit trägt die Hubgröße, während der Anker die Drift stoppt, aber die Tiefe abflacht und schnellen Hüben nicht folgen kann. Eine Änderung erfordert eine Neugenerierung, nicht nur ein erneutes Senden.

Wo das Tracking aussetzt, wird die Lücke mit rhythmischer Bewegung gefüllt, die aus den Hüben auf beiden Seiten fortgesetzt wird, und der so gefüllte Anteil der Timeline wird in den Metadaten des Skripts festgehalten.

Den Rhythmus bereinigen

Standardmäßig laufen zwei Bereinigungen über die fertige Kurve. Harmonische Faltung entfernt Zickzacks mit der doppelten echten Hubrate. Rhythmus-Regularisierung schiebt Spitzen mit geringer Konfidenz zum lokalen Takt hin. Danach werden an jeder Umkehr Punkte gesetzt, wie unter Wie die Funscript-Generierung mit KI funktioniert beschrieben.

Codec-Bewegungsvektoren und die Audio-Hüllkurve

Während der Hauptdurchgang läuft, liest ein Hintergrund-Thread mit PyAV zwei weitere Signale. Beide sind optional: Ohne PyAV oder Tonspur läuft der reine Video-Weg unverändert.

  • Codec-Bewegungsvektoren. Komprimiertes Video speichert bereits für jedes Bild, wie sich Blöcke des Bildes bewegt haben. Die App liest diese Vektoren für jedes Bild, nicht nur für die abgetasteten, innerhalb eines Zeitbudgets von 25 bis 150 Sekunden, das mit der Filmlänge wächst. Ihre Geschwindigkeit wird nur dann als Signal genutzt, wenn sie mindestens 90 % des Films abdecken.
  • Eine Lautstärke-Hüllkurve mit 50 Hz, innerhalb eines Budgets von 20 bis 120 Sekunden. Der Ton hält aufgefüllte Bewegung in Phase mit dem Takt der Tonspur.

Wegen der Budgets wird ein langer Film möglicherweise nur teilweise abgedeckt. Ihre Hauptaufgabe ist die als Frequenzzeugen: Sie helfen zu entscheiden, welche Bereiche einen zweiten Durchgang bekommen, der sie mit voller Bildrate erneut liest. Dieser Durchgang zielt auf Fenster, in denen die Bewegung zu schnell für die Abtastrate wirkt oder die Tracking-Qualität niedrig ist. Er nimmt höchstens 4 Bereiche und höchstens 35 % des Videos. In der Messung des Entwicklers deckte er tatsächlich 0,2 bis 0,6 % jedes Testfilms ab, alles in den ersten 40 Sekunden, weil die Bereiche in zeitlicher Reihenfolge behalten werden. Es ist kein Durchgang mit voller Bildrate über den ganzen Film. Für einen selbst gewählten Bereich erledigt das Re-analyze im Timeline-Editor auf Wunsch.

Erkennung von Szenenschnitten

Den Fluss über einen Schnitt hinweg zu integrieren, würde einen Kamerawechsel als riesige Bewegung behandeln. Deshalb prüft die Engine jedes Paar abgetasteter Bilder: Eine mittlere Pixeldifferenz über 28 markiert einen Schnittkandidaten, und er zählt nur als Schnitt, wenn auch die Helligkeitshistogramme der beiden Graustufenbilder mit weniger als 0,80 korrelieren. Die Histogrammprüfung trennt einen echten Schnitt von schneller Bewegung, die viele Pixel ändert, aber dasselbe Bild verschiebt, statt es zu ersetzen. Schnitte werden auf diese Weise erkannt, nicht über die Codec-Bewegungsvektoren.

Was der Fluss kostet

Der Fluss ist nicht der teure Teil. Im Fluss-Labor des Entwicklers kostete der CPU-Flussschritt im Median 4,8 bis 5,1 ms pro Abtastung bei der Einstellung Balanced und 7,6 bis 9,1 ms bei der verdoppelten Bereichsauflösung von High. Diese Zahlen stammen aus 200 bis 400 Abtastungen bei jedem von drei Filmen und messen den Flussschritt allein, keine vollständige Generierung, also betrachte sie als Größenordnung, nicht als Benchmark. Seit die Tiefe auf die GPU gewandert ist, ist die Pose-Inferenz in den Messungen des Entwicklers die größte Stufe.

Grenzen

  • Schnelle Hübe und die Abtastrate. Mit Balanced sieht die Engine bei 30-fps-Video 10 Bilder pro Sekunde. Gegenüber den von Hand geskripteten Testclips des Entwicklers fielen die Hübe bei den beiden schnellsten Filmen viel kleiner aus als die des Menschen, und die derzeitige Erklärung ist, dass diese Rate schnelle Bewegung wegglättet. High tastet dichter ab; Re-analyze liest einen markierten Bereich mit voller Bildrate.
  • Der Fluss misst Bewegung, nicht Bedeutung. Jede Bewegung innerhalb des verfolgten Bereichs wird erfasst, ob es der Hub ist, um den es dir geht, oder nicht. In Abschnitten, die ein Mensch als ohne Action markiert hatte, erzeugte die Engine trotzdem etwa 85 Richtungswechsel pro Minute.
  • Nur CPU. Der Fluss läuft auf jedem PC über die CPU-Implementierung von OpenCV. Eine schnellere GPU beschleunigt Pose und Tiefe, nicht den Fluss.

Fragen

Warum nutzt die App DIS statt Farneback?

Die adaptive KI-Engine, die der Standard ist, nutzt DIS mit dem Preset FAST plus eine Zuverlässigkeitsprüfung mit halber Auflösung. Farneback überlebt nur in der Basis-Engine und im Sampler von AI Bulk Learn. Die beiden sind unterschiedliche dichte Flussverfahren von OpenCV; diese Seite beschreibt, was der Code ausführt, keinen direkten Vergleich, den wir veröffentlicht hätten.

Braucht ein Video Ton?

Nein. Die Audio-Hüllkurve hilft, aufgefüllte Lücken im Takt zu halten, wenn es eine Tonspur gibt. Ohne sie läuft der reine Video-Weg unverändert.

Kann ich den Fluss einem bestimmten Teil des Bildes folgen lassen?

Ja. Set Motion Region… nimmt einen Rahmen für das ganze Video, und mit Live Track kannst du den Rahmen verschieben, während das Video läuft; der Track wird neben dem Video als .roitrack.json-Datei gespeichert.

Weiterlesen

Probier es mit deinen eigenen Videos

Die Testversion dauert einen Tag und läuft auf deinem eigenen PC; deine Videos werden lokal analysiert und nie hochgeladen.