Flux optique : lire le mouvement entre les images

Le suivi de mouvement par flux optique est le seul signal sur lequel repose chaque script AutoScript Sync. Entre chaque paire d'images échantillonnées, le flux optique dense DIS mesure comment les pixels de la zone en mouvement se sont déplacés. Cela donne une vitesse, que le moteur intègre en une courbe de position et tient à un point d'ancrage pour limiter la dérive. Le flux tourne sur le CPU sur toutes les machines.

Vérifié par rapport au code de l'application le 21 septembre 2026.

Flux optique DIS sur la zone en mouvement

Le moteur d'IA adaptatif par défaut utilise le flux optique DIS (Dense Inverse Search) d'OpenCV avec son préréglage FAST. Il s'applique à la zone que le moteur a détectée en mouvement, ou au cadre que vous avez tracé avec Set Motion Region… ou Live Track, dans une image réduite à 320 px de large. Une seconde passe DIS en demi-résolution, avec le préréglage ultrafast, tourne en parallèle pour vérifier si le flux est fiable.

Fast
Flux entre une image sur 4 : 7,5 échantillons par seconde sur une vidéo à 30 i/s.
Balanced
Une image sur 3 : 10 échantillons par seconde sur une vidéo à 30 i/s. Réglage par défaut.
High
Une image sur 2 : 15 échantillons par seconde sur une vidéo à 30 i/s. Sur des images plates (non VR) d'au moins 640 px de large, le flux de la zone suivie est aussi mesuré en 640 px. La note du développeur relève un petit gain (+0,007 et +0,003 de F1 sur les mouvements, sur deux films) pour environ 1,4 fois le temps d'analyse.

L'intervalle est un nombre fixe d'images, donc sur une vidéo à 60 i/s toutes les fréquences doublent.

Vous lirez peut-être ailleurs qu'AutoScript Sync utilise le flux optique Farneback. Ce n'est pas le cas du moteur principal. Farneback n'apparaît que dans le moteur de base, que vous obtenez en décochant Use adaptive AI engine pour le bouton Generate principal, et dans l'échantillonneur derrière AI Bulk Learn.

De la vitesse à la position

Le flux indique à quelle vitesse quelque chose a bougé, pas où il se trouve. Additionner les vitesses donne une position, mais chaque petite erreur s'additionne aussi et la courbe dérive. Le moteur tient donc le flux intégré à un point d'ancrage : une mesure absolue de la position, plus lente, élue pour chaque vidéo parmi le centre de la zone en mouvement, les points clés de pose et la profondeur relative. Par défaut, l'ancrage devient un mélange, échantillon par échantillon, de tous les canaux lisibles, si ce mélange obtient un score au moins aussi bon que le gagnant unique.

Un filtre de Kalman avec un lisseur RTS (une passe avant suivie d'une passe arrière sur toute la vidéo) fusionne les deux en une seule courbe de position. Le réglage Depth priority, de 30 à 90 avec 85 par défaut, fixe la part de cette courbe qui vient de la vitesse : plus il est élevé, plus le poids de l'ancrage est faible. L'infobulle du réglage décrit le compromis : la vitesse porte l'amplitude des mouvements, tandis que l'ancrage empêche la dérive mais aplatit la profondeur et ne peut pas suivre les mouvements rapides. Le modifier nécessite une régénération, pas seulement un nouvel envoi.

Là où le suivi décroche, le trou est comblé par un mouvement rythmique prolongé à partir des mouvements de part et d'autre, et la part de la timeline comblée ainsi est enregistrée dans les métadonnées du script.

Nettoyer le rythme

Deux nettoyages s'appliquent par défaut à la courbe finie. Le repliement harmonique (harmonic folding) supprime les zigzags au double de la vraie cadence des mouvements. La régularisation du rythme (rhythm regularisation) déplace les pics peu fiables vers le temps fort local. Les points sont ensuite placés à chaque inversion, comme décrit dans comment fonctionne la génération de funscript par IA.

Vecteurs de mouvement du codec et enveloppe audio

Pendant la passe principale, un thread d'arrière-plan lit deux signaux supplémentaires avec PyAV. Les deux sont optionnels : sans PyAV ou sans piste audio, le chemin vidéo seul fonctionne sans changement.

  • Vecteurs de mouvement du codec. La vidéo compressée stocke déjà, pour chaque image, comment les blocs de l'image se sont déplacés. L'application lit ces vecteurs pour chaque image, pas seulement les images échantillonnées, dans un budget de temps de 25 à 150 secondes proportionnel à la durée du film. Leur vitesse n'est utilisée comme signal que s'ils couvrent au moins 90 % du film.
  • Une enveloppe de volume sonore à 50 Hz, dans un budget de 20 à 120 secondes. L'audio garde le mouvement comblé en phase avec le rythme de la bande-son.

À cause de ces budgets, un long film peut n'être couvert qu'en partie. Leur rôle principal est de servir de témoins de fréquence : ils aident à décider quelles plages bénéficient d'une seconde passe qui les relit à pleine fréquence d'images. Cette passe vise les fenêtres où le mouvement semble trop rapide pour la fréquence d'échantillonnage ou où la qualité du suivi est faible. Elle porte sur 4 plages au maximum et 35 % de la vidéo au maximum. Dans la mesure du développeur, elle n'a en réalité couvert que 0,2 à 0,6 % de chaque film de test, entièrement dans les 40 premières secondes, car les plages sont retenues dans l'ordre chronologique. Ce n'est pas une passe à pleine fréquence d'images sur tout le film. Pour une plage que vous choisissez, Re-analyze dans l'éditeur de timeline le fait à la demande.

Détection des changements de plan

Intégrer le flux à travers un changement de plan traiterait un changement de caméra comme un mouvement énorme. Le moteur vérifie donc chaque paire d'images échantillonnées : une différence moyenne de pixels supérieure à 28 signale un changement de plan candidat, qui n'est retenu que si les histogrammes de luminosité des deux images en niveaux de gris ont aussi une corrélation inférieure à 0,80. La vérification par histogramme distingue un vrai changement de plan d'un mouvement rapide, qui modifie beaucoup de pixels mais déplace la même image au lieu de la remplacer. Les changements de plan sont détectés ainsi, pas à partir des vecteurs de mouvement du codec.

Ce que coûte le flux

Le flux n'est pas la partie coûteuse. Dans le banc d'essai de flux du développeur, l'étape de flux sur CPU a coûté en médiane 4,8 à 5,1 ms par échantillon en Balanced, et 7,6 à 9,1 ms avec la résolution de zone doublée de High. Ces chiffres viennent de 200 à 400 échantillons sur chacun de trois films et mesurent l'étape de flux seule, pas une génération complète : prenez-les comme un ordre de grandeur plutôt que comme un benchmark. Depuis que la profondeur est passée sur le GPU, l'inférence de pose est l'étape la plus lourde dans les mesures du développeur.

Limites

  • Mouvements rapides et fréquence d'échantillonnage. En Balanced sur une vidéo à 30 i/s, le moteur voit 10 images par seconde. Comparés aux extraits de test scriptés à la main par le développeur, les mouvements des deux films les plus rapides sont sortis bien plus petits que ceux de l'humain, et l'explication retenue pour l'instant est que cette fréquence lisse et efface le mouvement rapide. High échantillonne plus densément ; Re-analyze lit une plage sélectionnée à pleine fréquence d'images.
  • Le flux mesure le mouvement, pas le sens. Tout mouvement dans la zone suivie est enregistré, qu'il s'agisse ou non du mouvement qui vous intéresse. Sur les passages qu'un humain a marqués comme sans action, le moteur produisait encore environ 85 changements de direction par minute.
  • CPU uniquement. Le flux passe par l'implémentation CPU d'OpenCV sur tous les PC. Un GPU plus rapide accélère la pose et la profondeur, pas le flux.

Questions

Pourquoi l'application utilise-t-elle DIS plutôt que Farneback ?

Le moteur d'IA adaptatif, utilisé par défaut, emploie DIS avec le préréglage FAST plus une vérification de fiabilité en demi-résolution. Farneback ne subsiste que dans le moteur de base et l'échantillonneur d'AI Bulk Learn. Ce sont deux méthodes de flux dense différentes d'OpenCV ; cette page décrit ce que le code exécute, pas une comparaison directe que nous aurions publiée.

Une vidéo a-t-elle besoin de son ?

Non. L'enveloppe audio aide à garder les trous comblés sur le rythme quand il y a une bande-son. Sans elle, le chemin vidéo seul fonctionne sans changement.

Puis-je faire suivre au flux une partie précise de l'image ?

Oui. Set Motion Region… prend un seul cadre pour toute la vidéo, et Live Track vous permet de déplacer le cadre pendant la lecture ; le suivi est enregistré à côté de la vidéo dans un fichier .roitrack.json.

À lire ensuite

Essayez-le sur vos propres vidéos

L'essai dure une journée et tourne sur votre propre PC ; vos vidéos sont analysées localement et jamais envoyées en ligne.