Tracciamento di oggetti

Il tracking assegna un'identità stabile a ogni rilevamento lungo i frame di un video. LibreYOLO non lo modella come un task con pesi propri: è una modalità di predizione, model.track(), che esegue il tracker scelto sull'output per frame di un modello di rilevamento, segmentazione o posa.

Definizione

Il tracking non è una delle chiavi task di LibreYOLO, e non c'è nessun checkpoint di tracking da scaricare. È un metodo del modello, model.track(source), che esegue il rilevamento su ogni frame e associa i risultati nel tempo. Il metodo è un generatore: produce un Results per ogni frame elaborato, con result.track_id impostato a un tensore di interi (N,) allineato con result.boxes. Gli stessi ID si trovano anche su result.boxes.id.

Vengono prodotti solo gli oggetti confermati e tracciati in quel momento. Una traccia che l'associazione perde resta viva per un numero configurato di frame prima di essere scartata, track_buffer per ByteTrack e BoT-SORT e max_age per le due varianti di OC-SORT, così un oggetto ritrovato dentro quella finestra mantiene il suo ID originale.

Dato che l'associazione avviene dopo il rilevamento, gli altri contenuti del frame le sopravvivono: il Results tracciato è il Results del rilevamento ridotto alle righe abbinate, quindi maschere e keypoint arrivano insieme ai box.

Modelli

In un'esecuzione di tracking entrano due scelte indipendenti: il modello che produce i box a ogni frame, e il tracker che li collega.

Qualsiasi modello nativo di LibreYOLO il cui task sia rilevamento, segmentazione o posa espone track(), quindi la scelta del rilevatore è quella di sempre. Vedi l'indice dei modelli per l'elenco completo, oppure parti da YOLO9, RF-DETR, D-FINE o RTMDet. I task i cui risultati non hanno un box da associare rifiutano la chiamata invece di restituire ID privi di significato: classificazione, box orientati, punti, profondità, normali di superficie, bordi, segmentazione semantica e panottica, restauro, OCR e mesh corporea sollevano tutti un errore da track().

Anche due delle fasce di modelli di LibreYOLO lo rifiutano. I modelli caricati tramite LibreSAM sono segmentatori di immagini, e i modelli caricati tramite LibreOpenVocab sono rilevatori per singolo frame; entrambi sollevano un errore da track() e si usano invece con predict() su ogni frame.

Il tracking gira sui modelli PyTorch nativi. Un artefatto esportato caricato con LibreYOLO("model.onnx") restituisce un oggetto backend di runtime, che espone predict() ma non track().

La libreria include quattro tracker, selezionati dall'argomento tracker:

"bytetrack" è quello predefinito. Usa solo il movimento, con un filtro di Kalman e un'associazione a tre fasi: prima i rilevamenti ad alta confidenza, poi un secondo passaggio che dà ai rilevamenti a bassa confidenza la possibilità di abbinarsi a una traccia esistente prima di essere scartati, infine le tracce non confermate. Si configura con TrackConfig.

"botsort" mantiene il ciclo di vita a tre fasi di ByteTrack ma usa uno stato di Kalman centro-larghezza-altezza e compensa il movimento della telecamera nelle tracce predette prima dell'abbinamento. È la variante di BoT-SORT basata solo sul movimento; non esegue nessun modello di aspetto. Si configura con BoTSortConfig, che aggiunge enable_cmc, cmc_method e cmc_downscale.

Anche "ocsort" usa solo il movimento, e aggiunge al costo di associazione un termine di direzione della velocità, un secondo passaggio di associazione rispetto all'ultima osservazione reale di ogni traccia, e uno smoothing dello stato di Kalman lungo una traiettoria virtuale quando una traccia viene ritrovata. Si configura con OCSortConfig.

"deepocsort" estende OC-SORT con l'aspetto. Ogni traccia mantiene una media mobile pesata per confidenza degli embedding di re-identificazione, e un termine di similarità coseno si unisce al costo di associazione, così le identità sopravvivono a occlusioni lunghe e a bersagli che si incrociano. Costa un forward pass di una piccola rete di embedding per frame, e i suoi pesi OSNet vengono scaricati al primo utilizzo. Si configura con DeepOCSortConfig.

Predizione

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # track() è un generatore: un Results per ogni frame elaborato.for result in model.track("video.mp4"):    print(result.track_id)        # tensore int (N,), allineato con i box    print(result.boxes.xyxy)
Scegliere un tracker
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # "bytetrack" (predefinito), "botsort", "ocsort" o "deepocsort".for result in model.track("video.mp4", tracker="botsort"):    print(result.track_id)
Salvare un video annotato
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Senza output_path, il file finisce in runs/track/<video_stem>.mp4.for result in model.track("video.mp4", save=True, vid_stride=2):    pass
Regolare un tracker
from libreyolo import BoTSortConfig, LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Il tipo di config seleziona il tracker, quindi qui tracker= è ridondante.config = BoTSortConfig(track_buffer=60, frame_rate=25, enable_cmc=False)for result in model.track("video.mp4", tracker_config=config):    print(result.track_id) # Oppure passa gli stessi campi come argomenti keyword e lascia che sia track() a costruirla.for result in model.track("video.mp4", tracker="botsort", track_buffer=60):    print(result.track_id)

track_conf imposta la soglia per la prima fase di associazione: track_high_thresh per ByteTrack e BoT-SORT, det_thresh per OC-SORT e Deep OC-SORT. Non è il conf di predict(), e per ByteTrack, BoT-SORT e OC-SORT il rilevatore gira internamente con una soglia più bassa, così i rilevamenti deboli restano disponibili per il passaggio di recupero. Deep OC-SORT esegue il rilevatore proprio a det_thresh. Per ByteTrack e BoT-SORT, track_conf deve essere pari o superiore a track_low_thresh, che vale 0.1 per default.

Le impostazioni del tracker si possono fornire in due modi. Passa un'istanza di config a tracker_config=, e il suo tipo seleziona il tracker, rendendo tracker= ridondante. Oppure passa i campi come argomenti keyword e lascia che track() costruisca la config per il tracker che hai indicato; le chiavi sconosciute generano un warning invece di essere applicate in silenzio. In entrambi i casi, track_conf viene ignorato quando la chiave corrispondente è impostata esplicitamente.

Gli argomenti restanti rispecchiano quelli della predizione: iou, imgsz, classes, max_det, vid_stride, show, e save con output_path. La sorgente è il percorso di un file video. Vedi predizione per la gestione dei risultati.

Addestramento

I tracker non si addestrano. Tre dei quattro sono modelli di puro movimento senza alcun parametro appreso, e la rete di aspetto di Deep OC-SORT è un checkpoint di re-identificazione pubblicato che viene scaricato al primo utilizzo. Migliorare la qualità del tracking significa migliorare il rilevatore, o regolare le soglie di associazione descritte sopra.

Verificato con LibreYOLO v1.5.0.