L'errore che produce 10.000 immagini inutili

L'approccio ovvio per trasformare il video in dati di addestramento è estrarre ogni fotogramma. Sembra completo. È vicino alla cosa peggiore che puoi fare.

I fotogrammi consecutivi di un video a 30 fps sono distanziati di 33 millisecondi. A meno che la fotocamera o il soggetto non si muovano velocemente, il fotogramma 1.001 è quasi identico al fotogramma 1.000: stessa posa, stessa illuminazione, stesso sfondo, pochi pixel di differenza. Un set di dati di 10.000 frame di questo tipo non contiene 10.000 esempi. Contiene circa 300 situazioni distinte, ciascuna ripetuta trenta volte.

Ciò che ciò comporta per l'addestramento è specifico e dannoso. Il costo delle annotazioni varia in base al conteggio delle immagini, quindi paghi trenta volte di più per le stesse informazioni. Anche i tempi di formazione. E, cosa più importante, se questi quasi duplicati finiscono su entrambi i lati della divisione formazione/convalida, il modello ha effettivamente visto il set di convalida: ottieni un punteggio di convalida che non significa nulla.

Quindi la prima decisione non è un'impostazione dello strumento. Si tratta di: quanto deve cambiare il contenuto prima che un fotogramma venga considerato un nuovo esempio?

Scegliere l'intervallo di campionamento

Deriva dal movimento nella scena, non dal frame rate sorgente. Alcuni punti di partenza funzionanti:

  • Fotocamera statica, soggetto lento (sorveglianza, una pianta che cresce, una coda): 1 fotogramma ogni 2–10 secondi. Qualsiasi cosa più densa è ridondante.
  • Fotocamera statica, soggetto attivo (una persona che lavora su una panchina, traffico): 1 fotogramma ogni 0,5–2 secondi.
  • Telecamera mobile (palmare, drone, dashcam): 2–5 fotogrammi al secondo. Lo sfondo cambia continuamente, quindi i fotogrammi rimangono distinti.
  • Azione veloce in cui la posa stessa è l'etichetta (sport, riconoscimento dei gesti): 5–15 fotogrammi al secondo, ma solo nei segmenti che contengono l'azione.

Il modo per risolverla: estrai un segmento di test di un minuto a pochi intervalli e guarda i risultati fianco a fianco. Se puoi sfogliarle e ogni immagine ti dice qualcosa di nuovo, l'intervallo è giusto. Se sembra un flipbook, allargalo.

Fai i conti prima di estrarre. Frames = durata × frequenza target. Novanta minuti di riprese a 1 fotogramma al secondo equivalgono a 5.400 immagini, plausibilmente una settimana di annotazioni. Con 1 fotogramma ogni 5 secondi è 1.080, ovvero un paio di giorni. Questa decisione merita cinque minuti di riflessione.

In the estrattore, la modalità "Intervallo di tempo" prende direttamente il divario in secondi e il conteggio dei fotogrammi viene visualizzato durante la digitazione, quindi il numero sopra è visibile prima del commit anziché essere scoperto in seguito.

Impostazioni di estrazione che contano a valle

Formato: PNG o JPEG

La risposta onesta è che di solito non è importante quanto le persone si aspettano, ma vale la pena nei casi in cui lo fa. sapere.

Utilizza PNG quando l'attività è sensibile ai dettagli fini o agli artefatti di compressione: rilevamento di difetti sulle superfici, lavoro adiacente all'OCR, imaging medico o scientifico, qualsiasi cosa in cui potresti successivamente misurare i valori dei pixel. Usa JPEG at 90–95% per il rilevamento e la classificazione generale di oggetti, dove i modelli sono robusti fino a una compressione lieve e la differenza di archiviazione è da cinque a dieci volte.

One consistency rule regardless of choice: do not mix. Un set di dati che è per metà PNG e per metà JPEG a qualità variabile fornisce al modello un segnale spurio e i modelli sono molto bravi a trovare segnali spuri.

Resolution

Estrai alla risoluzione sorgente e ridimensiona nella pipeline di preelaborazione, non al momento dell'estrazione. Non puoi recuperare i dettagli che hai scartato e tra un anno potresti voler ritagliare 512 pixel dal metraggio estratto a 224. L'archiviazione è più economica della riestrazione, soprattutto se il metraggio sorgente è archiviato in un posto scomodo.

Denominazione

Nomi sequenziali con riempimento zero, sufficientemente larghi per il set più grande che potrai mai produrre. frame_00001.png, non frame_1.png. Gli strumenti che ordinano i nomi dei file come testo ordineranno frame_10 prima frame_2, e se l'ordine temporale è importante in qualsiasi punto della pipeline, quel bug è subdolo e difficile da individuare.

Include the source in the path rather than the filename, so provenance survives:

dataset/
                  raw/
                    cam01_2026-03-14/
                      frame_00001.png
                      frame_00002.png
                    cam02_2026-03-14/
                      frame_00001.png
                  splits/
                    train.txt
                    val.txt
                    test.txt

Keeping the split as text files listing paths — rather than physically copying images into train/ and val/ directories — means you can re-split without re-copying, and you can see exactly what went where.

La regola di suddivisione che conta davvero

Questa è la parte che vale la pena leggere due volte, perché è la differenza tra un benchmark di cui ti puoi fidare e uno di cui non puoi fidarti.

Diviso per video sorgente, mai per fotogramma.

If you shuffle all frames and take a random 80/20 split, frames from the same second of the same video land on both sides. Il set di validazione è quindi quasi una copia del set di addestramento e la precisione della convalida misura la memorizzazione. Models trained this way routinely report 97–99% and then fail on genuinely new footage, and the failure is baffling until you look at how the split was made.

L'approccio corretto: assegnare interi video al training, alla validazione e al test. Se hai solo un video lungo, dividilo in base al tempo in blocchi contigui (primo 70% di allenamento, successivo 15% di convalida, ultimo 15% di test) e scarta alcuni secondi su entrambi i lati di ciascun confine in modo che non vi siano coppie quasi duplicate a cavallo di esso.

Dove possibile, vai oltre: mostra l'intera registrazione sessioni, fotocamere o posizioni per il set di prova. Ciò misura se il modello si generalizza tra condizioni piuttosto che tra timestamp, che è quasi sempre la domanda che ti interessa davvero.

Lavorare localmente e perché spesso è importante qui

Una nota pratica specifica per questo dominio: i video industriali e di ricerca sono spesso materiale che non può essere caricato casualmente: registrazioni di pazienti, filmati di persone che hanno acconsentito a uno studio e non a un servizio cloud, linee di produzione proprietarie, esperimenti pre-pubblicazione.

Estrazione basata su browser mantiene il file sulla macchina; nulla viene trasferito, il che è importante quando il vincolo è un'approvazione etica o un accordo sul trattamento dei dati piuttosto che una preferenza. Puoi confermarlo invece di fidarti: carica la pagina, disconnettiti dalla rete ed estrai. Se funziona ancora, niente andrebbe da nessuna parte. Il metodo per verificarlo richiede circa un minuto.

Sii altrettanto chiaro sui limiti. I frame vengono mantenuti in memoria fino al download, quindi le fonti più lunghe devono essere elaborate in blocchi di intervalli di tempo. Per una pipeline ripetibile su centinaia di file, uno script FFmpeg locale è lo strumento giusto: il browser è per il lavoro esplorativo, per estrazioni una tantum e per i casi in cui desideri vedere i fotogrammi mentre decidi l'intervallo.

Una lista di controllo prima dell'inizio dell'annotazione

L'annotazione è un passaggio costoso. Catturarli prima che inizino fa risparmiare molto tempo:

  1. Scorri 50 fotogrammi casuali. Sono visibilmente diversi l'uno dall'altro? In caso contrario, allarga l'intervallo ed estrai nuovamente, ora, non dopo l'etichettatura.
  2. Controlla il saldo della classe. Il campionamento temporale uniforme fornisce fotogrammi in proporzione alla durata delle cose sullo schermo, non in proporzione a quanto ti importa di loro. Gli eventi rari richiedono un'estrazione mirata dai loro intervalli di tempo specifici.
  3. Rimuovi i fotogrammi morti. Sfumature, cornici nere ai tagli, bagliori dell'obiettivo, la mano di qualcuno sull'obiettivo. Fanno rumore e costano tempo per l'annotazione.
  4. Conferma che la suddivisione è per video o per blocco temporale, non tramite frame mescolato.
  5. Registra la provenienza. File sorgente, intervallo, data di estrazione, formato e qualità, insieme al set di dati. In sei mesi dovrai riprodurlo o estenderlo, e ricostruire "che intervallo ho usato" dalle immagini è scomodo.

None of this is difficult. Viene deciso prima dell'estrazione piuttosto che scoperto dopo l'annotazione, che è tutta la differenza.