Flusso ottico: leggere il movimento tra i fotogrammi
Il tracciamento del movimento con flusso ottico è l'unico segnale su cui si basa ogni script di AutoScript Sync. Tra ogni coppia di fotogrammi campionati, il flusso ottico denso DIS misura come si sono spostati i pixel nella regione in movimento. Questo dà una velocità, che il motore integra in una traccia di posizione e aggancia a un'ancora per limitare la deriva. Il flusso gira sulla CPU su ogni macchina.
Verificato sul codice dell'app il 21 settembre 2026.
Flusso ottico DIS sulla regione in movimento
Il motore di IA adattivo predefinito usa il flusso ottico DIS (Dense Inverse Search) di OpenCV con il preset FAST. Gira sulla regione che il motore ha trovato in movimento, oppure sul riquadro che hai disegnato con Set Motion Region… o Live Track, dentro un fotogramma ridotto a 320 px di larghezza. Un secondo passaggio DIS a metà risoluzione con il preset ultrafast gira in parallelo per verificare se il flusso è affidabile.
- Fast
- Flusso tra un fotogramma ogni 4: 7,5 campioni al secondo su video a 30 fps.
- Balanced
- Un fotogramma ogni 3: 10 campioni al secondo su video a 30 fps. Il predefinito.
- High
- Un fotogramma ogni 2: 15 campioni al secondo su video a 30 fps. Su filmati piatti (non VR) larghi almeno 640 px, il flusso della regione tracciata viene misurato anche a 640 px. La nota dello sviluppatore registra un piccolo guadagno (+0,007 e +0,003 di F1 delle corse su due film) a fronte di circa 1,4 volte il tempo di analisi.
L'intervallo è un numero fisso di fotogrammi, quindi su video a 60 fps ogni frequenza raddoppia.
Potresti leggere altrove che AutoScript Sync usa il flusso ottico Farneback. Il motore principale no. Farneback compare solo nel motore di base, che ottieni togliendo la spunta a Use adaptive AI engine per il pulsante principale Generate, e nel campionatore dietro AI Bulk Learn.
Dalla velocità alla posizione
Il flusso ti dice quanto velocemente qualcosa si è mosso, non dove si trova. Sommare le velocità dà una posizione, ma ogni piccolo errore si somma con essa e la traccia vaga. Per questo il motore aggancia il flusso integrato a un'ancora: una misura della posizione più lenta e assoluta, eletta per ogni video tra il centro della regione in movimento, i punti chiave della posa e la profondità relativa. Per impostazione predefinita l'ancora diventa una miscela, campione per campione, di tutti i canali leggibili, se quella miscela ottiene un punteggio almeno pari al singolo vincitore.
Un filtro di Kalman con uno smoother RTS (un passaggio in avanti seguito da uno all'indietro su tutto il video) fonde i due in un'unica traccia di posizione. L'impostazione Depth priority, da 30 a 90 con un valore predefinito di 85, stabilisce quanto di quella traccia viene dalla velocità: più è alta, minore è il peso dell'ancora. Il suggerimento dell'impostazione stessa descrive il compromesso: la velocità porta l'ampiezza della corsa, mentre l'ancora ferma la deriva ma appiattisce la profondità e non riesce a seguire le corse veloci. Cambiarla richiede una rigenerazione, non solo un nuovo invio.
Dove il tracciamento si interrompe, il vuoto viene riempito con un movimento ritmico che prosegue le corse ai due lati, e la quota della timeline riempita in questo modo viene registrata nei metadati dello script.
Ripulire il ritmo
Per impostazione predefinita, sulla traccia finita girano due pulizie. Il ripiegamento armonico elimina gli zigzag al doppio della frequenza reale delle corse. La regolarizzazione del ritmo sposta i picchi a bassa confidenza verso il battito locale. I punti vengono poi collocati a ogni inversione, come descritto in come funziona la generazione di funscript con IA.
Vettori di movimento del codec e inviluppo audio
Mentre gira il passaggio principale, un thread in background legge altri due segnali con PyAV. Entrambi sono opzionali: senza PyAV o senza traccia audio, il percorso solo video gira invariato.
- Vettori di movimento del codec. Il video compresso memorizza già, per ogni fotogramma, come si sono mossi i blocchi dell'immagine. L'app legge quei vettori per ogni fotogramma, non solo per quelli campionati, entro un budget di tempo da 25 a 150 secondi che cresce con la durata del film. La loro velocità viene usata come segnale solo quando coprono almeno il 90% del film.
- Un inviluppo del volume audio a 50 Hz, entro un budget da 20 a 120 secondi. L'audio mantiene il movimento dei vuoti riempiti in fase con il battito della colonna sonora.
A causa dei budget, un film lungo può essere coperto solo in parte. Il loro compito principale è fare da testimoni della frequenza: aiutano a decidere quali tratti ricevono un secondo passaggio che li rilegge alla frequenza piena dei fotogrammi. Quel passaggio punta alle finestre in cui il movimento sembra troppo veloce per la frequenza di campionamento o in cui la qualità del tracciamento è bassa. Quel passaggio riguarda al massimo 4 tratti e al massimo il 35% del video. Nella misurazione dello sviluppatore ha coperto in realtà dallo 0,2 allo 0,6% di ogni film di prova, tutto nei primi 40 secondi, perché i tratti sono tenuti in ordine di tempo. Non è un passaggio a frequenza piena sull'intero film. Per un tratto scelto da te, Re-analyze nell'editor della timeline lo fa su richiesta.
Rilevamento dei cambi di scena
Integrare il flusso attraverso uno stacco tratterebbe un cambio di inquadratura come un movimento enorme. Per questo il motore controlla ogni coppia di fotogrammi campionati: una differenza media dei pixel superiore a 28 segna un possibile stacco, che conta come stacco solo se anche gli istogrammi di luminosità dei due fotogrammi in scala di grigi hanno una correlazione inferiore a 0,80. Il controllo degli istogrammi distingue uno stacco reale da un movimento veloce, che cambia molti pixel ma sposta la stessa immagine invece di sostituirla. Gli stacchi vengono rilevati in questo modo, non dai vettori di movimento del codec.
Quanto costa il flusso
Il flusso non è la parte costosa. Nel laboratorio sul flusso dello sviluppatore, il passaggio di flusso su CPU costava una mediana da 4,8 a 5,1 ms per campione con l'impostazione Balanced, e da 7,6 a 9,1 ms con la risoluzione della regione raddoppiata di High. Questi dati vengono da 200–400 campioni su ciascuno di tre film e misurano il solo passaggio di flusso, non una generazione completa, quindi prendili come ordine di grandezza e non come benchmark. Da quando la profondità è passata alla GPU, nelle misurazioni dello sviluppatore l'inferenza della posa è stata la fase più pesante.
Limiti
- Corse veloci e frequenza di campionamento. Con Balanced su video a 30 fps il motore vede 10 fotogrammi al secondo. Rispetto alle clip di prova scriptate a mano dallo sviluppatore, le corse sui due film più veloci risultavano molto più piccole di quelle dell'umano, e la spiegazione di lavoro è che questa frequenza appiattisce il movimento veloce. High campiona più fittamente; Re-analyze legge un tratto selezionato alla frequenza piena dei fotogrammi.
- Il flusso misura il movimento, non il significato. Qualsiasi movimento dentro la regione tracciata viene registrato, che sia o no la corsa che ti interessa. Nei tratti che un umano ha segnato come senza azione, il motore produceva comunque circa 85 cambi di direzione al minuto.
- Solo CPU. Il flusso gira tramite l'implementazione su CPU di OpenCV su ogni PC. Una GPU più veloce accelera posa e profondità, non il flusso.
Domande
Perché l'app usa DIS invece di Farneback?
Il motore di IA adattivo, che è il predefinito, usa DIS con il preset FAST più un controllo di affidabilità a metà risoluzione. Farneback sopravvive solo nel motore di base e nel campionatore di AI Bulk Learn. Sono due diversi metodi di flusso denso di OpenCV; questa pagina descrive ciò che il codice esegue, non un confronto diretto che abbiamo pubblicato.
Un video ha bisogno dell'audio?
No. L'inviluppo audio aiuta a tenere a tempo i vuoti riempiti quando c'è una colonna sonora. Senza, il percorso solo video gira invariato.
Posso far seguire al flusso una parte specifica dell'inquadratura?
Sì. Set Motion Region… prende un solo riquadro per tutto il video, e Live Track ti permette di spostare il riquadro mentre il video scorre; la traccia viene salvata accanto al video come file .roitrack.json.
Da leggere dopo
- L'intera pipeline di generazioneDove si colloca il flusso tra la decodifica e il file salvato.
- Stima della profondità per l'asse che il flusso non vedeIl movimento verso la camera e via da essa.
- Punti chiave della posa YOLOv8Una delle ancore che impediscono alla traccia del flusso di derivare.
- Correggere uno script che non convinceCosa provare quando le corse vengono perse o sono troppo piccole.
Provalo sui tuoi video
La prova dura un giorno e gira sul tuo PC; i tuoi video vengono analizzati in locale e non vengono mai caricati online.