Tracciamento di oggetti multipli con Ultralytics YOLO#
Il tracciamento degli oggetti nell'ambito dell'analisi video è un'attività fondamentale: non solo identifica la posizione e la classe degli oggetti nel fotogramma, ma mantiene anche un ID univoco per ogni oggetto rilevato man mano che il video procede. Le applicazioni sono infinite: dalla sorveglianza e sicurezza all'analisi sportiva in tempo reale.
Consulta l'anteprima non ancora rilasciata di YOLO27 per conoscere il supporto al tracciamento previsto.
A partire da ultralytics 8.4.63, OC-SORT, Deep OC-SORT, FastTracker e TrackTrack sono disponibili insieme a BoT-SORT e ByteTrack.
Perché scegliere Ultralytics YOLO per il tracciamento degli oggetti?#
L'output dei tracker Ultralytics è coerente con il rilevamento degli oggetti standard, ma aggiunge gli ID degli oggetti. Questo semplifica il tracciamento degli oggetti nei flussi video e l'esecuzione di analisi successive. Ecco perché dovresti valutare Ultralytics YOLO per le tue esigenze di tracciamento degli oggetti:
- Efficienza: elabora flussi video in tempo reale senza compromettere la precisione.
- Flessibilità: supporta più algoritmi e configurazioni di tracciamento.
- Facilità d'uso: API Python e opzioni CLI semplici per un'integrazione e una distribuzione rapide.
- Personalizzazione: facile da usare con modelli YOLO addestrati su misura, consentendo l'integrazione in applicazioni specifiche del dominio.
Guarda: Come eseguire il tracking multi-oggetto con Ultralytics YOLO26 | BoT-SORT e ByteTrack | VisionAI 🚀
Applicazioni nel mondo reale#
| Trasporti | Commercio al dettaglio | Acquacoltura |
|---|---|---|
| Tracciamento dei veicoli | Tracciamento delle persone | Tracciamento dei pesci |
Guida rapida#
Esegui il tracciamento su un video con il tracker TrackTrack predefinito. Passa a un altro tracker modificando l'argomento tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Tracker predefinito (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Passa a ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")Per eseguire il tracker su flussi video, usa un modello Detect, Segment, Pose o OBB addestrato, come YOLO26n, YOLO26n-seg, YOLO26n-pose o YOLO26n-obb. Puoi addestrare modelli personalizzati in locale o tramite l'addestramento cloud di Ultralytics Platform.
from ultralytics import YOLO
# Carica un modello ufficiale o personalizzato
model = YOLO("yolo26n.pt") # Carica un modello Detect ufficiale
model = YOLO("yolo26n-seg.pt") # Carica un modello Segment ufficiale
model = YOLO("yolo26n-pose.pt") # Carica un modello Pose ufficiale
model = YOLO("path/to/best.pt") # Carica un modello addestrato su misura
# Esegui il tracciamento con il modello
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracciamento con il tracker predefinito
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # con ByteTrackTracker supportati#
Ultralytics YOLO include sei tracker integrati. Attivane uno passando il relativo file di configurazione YAML all'argomento tracker.
| Tracker | File di configurazione | Modello del moto | Aspetto / ReID | Compensazione del movimento della telecamera | Gestione delle occlusioni |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman lineare | Opzionale (with_reid) | Configurabile (gmc_method) | Buffer delle tracce + ricollegamento ReID |
| ByteTrack | bytetrack.yaml | Kalman lineare | Nessuno | No | Recupero in due fasi dei rilevamenti a bassa confidenza |
| OC-SORT | ocsort.yaml | Kalman basato sulle osservazioni | Nessuno | No | ORU, OCM, OCR: nuovo aggiornamento dall'ultima osservazione |
| Deep OC-SORT | deepocsort.yaml | Kalman basato sulle osservazioni | Opzionale (with_reid) | Configurabile (gmc_method) | OC-SORT + EMA adattiva dell'aspetto opzionale |
| FastTracker | fasttrack.yaml | Kalman lineare + rollback | Nessuno | No | Rollback di Kalman + ampliamento di bbox in caso di occlusione |
| TrackTrack | tracktrack.yaml | Kalman lineare (NSA) | Opzionale (with_reid) | Configurabile (gmc_method) | Associazione iterativa basata su più indizi + TAI |
Quale tracker dovrei usare?#
Usa questo flusso per scegliere da dove iniziare; viene usato tracktrack.yaml se non passi tracker:
- Ti serve una soluzione di base rapida e semplice? → ByteTrack (nessun ReID, nessuna compensazione del movimento della telecamera, overhead minimo).
- Riprese da dispositivo portatile, drone o telecamera in movimento? → BoT-SORT (aggiunge la compensazione del movimento della telecamera e il ReID opzionale).
- Movimento non lineare (sport, danza, svolte brusche) e nessun ReID? → OC-SORT (correzioni basate sulle osservazioni senza costi legati all'aspetto).
- Scene affollate con telecamera in movimento, in cui il problema principale sono gli scambi di ID? → Deep OC-SORT o TrackTrack (entrambi supportano l'abbinamento opzionale basato sull'aspetto; TrackTrack aggiunge anche l'associazione basata su più indizi e la soppressione degli ID duplicati).
- Sovrapposizioni parziali frequenti in tempo reale, senza budget per il ReID? → FastTracker (variante di ByteTrack che tiene conto delle occlusioni e usa il rollback di Kalman).
Cambiare tracker#
Passa il nome del file di configurazione del tracker a tracker=. Il resto del codice rimane invariato.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")Configurazione#
Argomenti del tracciamento#
La configurazione del tracciamento condivide alcune proprietà con la modalità Predict, come conf, iou e show. Per altre configurazioni, consulta la pagina del modello Predict.
from ultralytics import YOLO
# Configura i parametri di tracciamento ed esegui il tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)Configurazione personalizzata del tracker#
Ultralytics ti permette anche di usare un file di configurazione del tracker modificato. Per farlo, crea semplicemente una copia di un file di configurazione del tracker (ad esempio, custom_tracker.yaml) da ultralytics/cfg/trackers e modifica le configurazioni secondo le tue esigenze (tranne tracker_type).
from ultralytics import YOLO
# Carica il modello ed esegui il tracker con un file di configurazione personalizzato
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Argomenti condivisi dai tracker#
I seguenti parametri sono comuni alla maggior parte dei file YAML dei tracker; non tutti i parametri sono presenti in ogni configurazione:
I rilevamenti con valore pari o superiore a track_high_thresh accedono alla prima fase di associazione. I rilevamenti compresi tra track_low_thresh e track_high_thresh possono recuperare tracce esistenti quando il tracker selezionato abilita l'associazione a bassa confidenza, ma non avviano nuove tracce. I rilevamenti pari o inferiori a track_low_thresh vengono ignorati.
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Specifica il tipo di tracker. |
track_high_thresh | 0.0-1.0 | Soglia per la prima associazione. Influisce sul livello di sicurezza con cui una rilevazione viene abbinata a una traccia esistente. |
track_low_thresh | 0.0-1.0 | Limite inferiore per le rilevazioni di recupero a bassa confidenza. OC-SORT e Deep OC-SORT usano queste rilevazioni solo quando use_byte: True; TrackTrack le include nel proprio insieme di associazioni penalizzate. |
new_track_thresh | 0.0-1.0 | Soglia per inizializzare una nuova traccia se la rilevazione non corrisponde ad alcuna traccia esistente. |
track_buffer | >=0 | Numero di frame per cui le tracce perse restano attive prima della rimozione. Un valore più alto aumenta la tolleranza alle occlusioni. |
match_thresh | 0.0-1.0 | Soglia per l'abbinamento delle tracce. Valori più alti rendono l'abbinamento più permissivo. |
fuse_score | True, False | Indica se fondere i punteggi di confidenza con le distanze IoU prima dell'abbinamento. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Metodo di compensazione del movimento globale. Aiuta a tenere conto dei movimenti della videocamera. |
proximity_thresh | 0.0-1.0 | IoU minimo richiesto per un abbinamento ReID valido. Garantisce una sufficiente vicinanza spaziale prima di usare gli indizi visivi. |
appearance_thresh | 0.0-1.0 | Somiglianza visiva normalizzata minima richiesta per ReID. |
with_reid | True, False | Abilita l'abbinamento basato sull'aspetto per migliorare il tracciamento attraverso le occlusioni. Supportato da BoT-SORT, Deep OC-SORT e TrackTrack. |
model | auto o percorso di un modello ReID compatibile | Modello ReID. auto usa le caratteristiche native del backbone YOLO quando disponibili; altrimenti ricorre a yolo26n-cls.pt. Un encoder personalizzato può essere un checkpoint .pt o un modello esportato come .torchscript, .onnx, .engine oppure una directory di modello OpenVINO. |
Argomenti specifici del tracker#
Ogni algoritmo offre parametri aggiuntivi oltre a quelli condivisi. Consulta le sezioni dedicate ai singoli tracker qui sotto per le descrizioni e i consigli di configurazione, oppure consulta direttamente i file di configurazione:
Abilitare la Re-Identification (ReID)#
ReID è disabilitato per impostazione predefinita per ridurre al minimo il sovraccarico. Abilitalo impostando with_reid: True in un file di configurazione del tracker.
Opzioni del modello ReID:
model: auto— Usa le caratteristiche native del rilevatore YOLO, con un sovraccarico minimo. Ideale quando ti serve un po' di ReID senza un forte impatto sulle prestazioni. Se il rilevatore non espone caratteristiche compatibili, ricorre ayolo26n-cls.pt.- Modello ReID personalizzato — Imposta
model:su un checkpoint.pto su un modello di embedding esportato compatibile, come.torchscript,.onnx,.engineoppure una directory di modello OpenVINO. I modelli esportati vengono caricati tramiteAutoBackende devono restituire direttamente un tensore di embedding.
Sono disponibili encoder ONNX pronti all'uso per ogni dimensione del modello. Imposta model: su uno di questi nomi e il file verrà scaricato automaticamente al primo avvio del tracker (come avviene per i pesi YOLO): non serve esportarlo o scaricarlo manualmente.
# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder| Modello | dimensione (pixel) | parametri (M) | FLOPs (B) |
|---|---|---|---|
| YOLO26n-reid.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
Al momento sono disponibili solo encoder ReID ONNX per il ramo di aspetto del tracker. Le modalità ReID train, val e predict, così come le procedure dedicate all'esportazione ReID, sono ancora in fase di sviluppo.
Per ottenere prestazioni migliori con un modello di classificazione separato, esportalo su un backend più veloce come TensorRT:
from torch import nn
from ultralytics import YOLO
# Carica il modello di classificazione
model = YOLO("yolo26n-cls.pt")
# Aggiungi un livello di pooling medio
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool
# Esporta in TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)Dopo l'esportazione, indica il percorso del modello TensorRT nella configurazione del tracker.
Dettagli sui tracker#
Le sezioni seguenti descrivono il funzionamento di ciascun tracker, i parametri specifici e i consigli per la configurazione.
Guarda: Quale tracker di oggetti offre prestazioni migliori? | Velocità, FPS e stabilità degli ID | Ultralytics YOLO26 📊
BoT-SORT#
BoT-SORT (Aharon et al., 2022) estende ByteTrack con la compensazione del movimento della videocamera e la ReID opzionale:
- Compensazione del movimento della videocamera (CMC): a ogni frame viene applicata agli stati di Kalman una trasformazione affine stimata (per impostazione predefinita tramite flusso ottico sparso; sono disponibili anche ORB / ECC), prima dell'abbinamento IoU.
- ReID opzionale: gli embedding di aspetto possono essere fusi nella matrice dei costi. È disabilitata per impostazione predefinita; per abilitarla, imposta
with_reid: True.
Ideale per: il tracciamento generico, soprattutto con videocamere in movimento. Aggiungi ReID solo quando le somiglianze visive tra soggetti causano scambi di ID.
Argomenti specifici di BoT-SORT:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend per la compensazione del movimento della videocamera. sparseOptFlow è l'impostazione predefinita. none disabilita CMC. |
with_reid | True, False | Abilita l'abbinamento basato sull'aspetto. Disabilitato per impostazione predefinita. |
model | auto o percorso di un modello ReID compatibile | auto usa le caratteristiche native di YOLO quando disponibili; i modelli personalizzati possono essere checkpoint .pt o esportazioni compatibili. |
proximity_thresh | 0.0-1.0 | IoU minimo prima di considerare le caratteristiche di aspetto. |
appearance_thresh | 0.0-1.0 | Somiglianza visiva normalizzata minima richiesta per un abbinamento ReID. Aumentala per rendere l'abbinamento più rigoroso. |
Consigli per la configurazione:
- Videocamera fissa: imposta
gmc_method: noneper risparmiare qualche ms/frame. - Movimento intenso della videocamera: mantieni
sparseOptFlow;eccè più preciso, ma più lento. - Folla con soggetti simili: abilita
with_reid: Truee aumentaappearance_thresh(ad es.0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) è il modello di riferimento leggero. Usa un filtro di Kalman lineare + IoU con un'associazione in due fasi:
- Fase 1: abbina le rilevazioni con punteggio alto alle tracce attive.
- Fase 2: prova di nuovo ad abbinare le tracce non abbinate alle rilevazioni con punteggio basso, per recuperarle dopo brevi occlusioni parziali.
Non usa un modello di aspetto né la compensazione del movimento della videocamera.
Ideale per: videocamere fisse o quasi fisse, quando il costo del rilevatore è predominante e vuoi ridurre al minimo il sovraccarico del tracker.
Argomenti specifici di ByteTrack: nessuno oltre agli argomenti condivisi del tracker.
Consigli per la configurazione:
- Rilevatore rumoroso: abbassa
track_low_threshper fornire più candidati alla seconda fase. - Rilevatore con alta copertura: aumenta
track_high_threshper ridurre la frammentazione degli ID. - Sfarfallio frequente degli ID: aumenta
track_bufferaffinché le tracce mancate per breve tempo sopravvivano.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023) è un'estensione di SORT incentrata sulle osservazioni. Mantiene la struttura leggera di SORT (senza caratteristiche di aspetto) e aggiunge tre correzioni:
- Ricalcolo incentrato sull'osservazione (ORU): riproduce una traiettoria virtuale tra l'ultima osservazione e la rilevazione corrente, ripetendo l'aggiornamento di Kalman per correggere la velocità deviata.
- Momento incentrato sull'osservazione (OCM): penalizza le rilevazioni che si muovono nella direzione sbagliata tramite un termine di coerenza della velocità.
- Recupero incentrato sull'osservazione (OCR): ricontrolla le rilevazioni non abbinate confrontandole con le tracce perse di recente, usando la loro ultima osservazione anziché lo stato previsto.
Ideale per: movimenti non lineari senza il costo di un modello ReID.
Argomenti specifici di OC-SORT:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
delta_t | >=1 | Finestra temporale (in frame) per il calcolo della direzione della velocità in OCM. Valori più alti producono un maggiore livellamento. |
inertia | 0.0-1.0 | Peso del costo di coerenza della velocità. Valori più alti penalizzano i cambiamenti improvvisi di direzione. |
use_byte | True, False | Abilita un secondo passaggio di associazione, in stile ByteTrack, sulle rilevazioni a bassa confidenza. |
Consigli per la configurazione:
- Movimento non lineare: aumenta
inertia(ad es.0.3-0.4). - Rilevazioni sparse: abilita
use_byte: True. - Occlusioni prolungate: aumenta
track_bufferper fornire a OCR più tracce perse da ricollegare.
Con i modelli OBB, OCR usa il riquadro orientato previsto da Kalman perché non viene conservata una cronologia dell'ultima osservazione orientata.
Deep OC-SORT#
Deep OC-SORT arricchisce OC-SORT con informazioni sull'aspetto e compensazione del movimento della videocamera:
- Abbinamento basato sull'aspetto: la distanza tra embedding coseno è soggetta a una soglia basata sulla sovrapposizione e viene fusa con il costo del movimento.
- EMA dinamica dell'aspetto: gli embedding delle tracce vengono aggiornati con un'EMA, il cui fattore di smoothing si adatta alla confidenza della rilevazione.
- Compensazione del movimento della videocamera: gli stati di Kalman vengono trasformati da un frame all'altro tramite flusso ottico sparso, ORB o ECC.
Ideale per: scene affollate o riprese con videocamera in movimento, dove sono frequenti gli scambi di ID tra oggetti visivamente diversi ma vicini nello spazio.
Argomenti specifici di Deep OC-SORT:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
with_reid | True, False | Abilita l'abbinamento basato sull'aspetto. Disabilitato per impostazione predefinita. |
model | auto o percorso di un modello ReID compatibile | auto usa le caratteristiche native di YOLO quando disponibili; i modelli personalizzati possono essere checkpoint .pt o esportazioni compatibili. |
proximity_thresh | 0.0-1.0 | IoU minimo prima di considerare le caratteristiche di aspetto. |
appearance_thresh | 0.0-1.0 | Somiglianza visiva normalizzata minima richiesta per un abbinamento ReID. |
alpha_fixed_emb | 0.0-1.0 | Fattore EMA di base per gli aggiornamenti degli embedding delle tracce. Valori più alti mantengono più a lungo il vecchio embedding. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Metodo di compensazione del movimento globale. |
delta_t | >=1 | Finestra temporale (in frame) per il calcolo della direzione della velocità in OCM (ereditata da OC-SORT). |
inertia | 0.0-1.0 | Peso del costo di coerenza della velocità (ereditato da OC-SORT). |
use_byte | True, False | Abilita una seconda associazione in stile ByteTrack sulle rilevazioni a bassa confidenza (ereditata da OC-SORT). |
Consigli per la configurazione:
- Scambi di identità nella folla: aumenta
appearance_thresh(ad es.0.92-0.95) e aumentaalpha_fixed_embper adattare più lentamente gli embedding. - Videocamera in movimento: imposta
gmc_method: sparseOptFlow(Deep OC-SORT usanoneper impostazione predefinita). - Latenza inferiore: mantieni
with_reid: False(predefinito) per usare solo il movimento + CMC; abilita ReID solo quando gli errori sono dovuti soprattutto agli scambi di ID.
FastTracker#
FastTracker è una variante di ByteTrack che gestisce le occlusioni senza un modello di aspetto:
- Rilevamento delle occlusioni: segnala le tracce come occluse quando la copertura da parte di altre tracce attive supera
occ_cover_thresh. - Ripristino di Kalman in caso di occlusione: ripristina lo stato di Kalman a un frame precedente all'occlusione usando la cronologia memorizzata in un buffer circolare.
- Attenuazione del movimento ed espansione dell'area di ricerca: la velocità viene attenuata e il bbox previsto viene ingrandito durante l'occlusione.
- Soppressione Init-IoU: impedisce la creazione di nuove tracce sopra quelle attive.
Ideale per: pipeline di rilevamento in tempo reale senza altri modelli, con frequenti sovrapposizioni tra bersagli (folla, code, sport).
Argomenti specifici di FastTracker:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
reset_velocity_offset_occ | >=0 | Numero di frame indietro nella cronologia da cui ripristinare la velocità di Kalman all'inizio dell'occlusione. |
reset_pos_offset_occ | >=0 | Numero di frame indietro nella cronologia da cui ripristinare la posizione di Kalman all'inizio dell'occlusione. |
enlarge_bbox_occ | >=1.0 | Fattore di scala dell'altezza applicato al bbox predetto durante l'occlusione (la larghezza viene scalata in base al rapporto d'aspetto XYAH). |
dampen_motion_occ | 0.0-1.0 | Moltiplicatore della velocità durante l'occlusione. Valori più bassi fanno "rallentare" la traccia durante l'occlusione. |
active_occ_to_lost_thresh | >=1 | Numero massimo di frame consecutivi in occlusione prima che una traccia attiva venga spostata tra quelle perse. |
occ_cover_thresh | 0.0-1.0 | Frazione dell'area di una traccia coperta da un'altra traccia attiva per dichiarare un'occlusione. |
occ_reappear_window | >=0 | Numero di frame per cui una traccia persa di recente dopo un'occlusione resta più facilmente ritrovabile. |
init_iou_suppress | 0.0-1.0 | Esclude l'inizializzazione di nuove tracce se il loro IoU con una qualsiasi traccia attiva supera questo valore. Imposta 1.0 per disattivare. |
Consigli per la configurazione:
- Occlusioni parziali frequenti: abbassa
occ_cover_thresh(ad es.0.5-0.6). - ID duplicati in corrispondenza delle sovrapposizioni: abbassa
init_iou_suppress(ad es.0.5). - Occlusioni prolungate: aumenta insieme
occ_reappear_windowetrack_buffer. - Target in rapido movimento: aumenta
dampen_motion_occ(avvicinandolo a1.0); aumentaenlarge_bbox_occsolo se una regione di ricerca più ampia migliora il recupero.
TrackTrack#
TrackTrack (Shim et al., CVPR 2025) è il tracker predefinito. Ragiona dal punto di vista di ogni traccia e usa un'associazione iterativa basata su più indizi:
- Associazione basata sulla prospettiva della traccia (TPA): combina HMIoU, la distanza coseno ReID opzionale, la distanza di proiezione della confidenza e la distanza angolare degli angoli. L'assegnazione viene risolta iterativamente con una soglia progressivamente meno restrittiva.
- Inizializzazione consapevole delle tracce (TAI): sopprime le creazioni duplicate prima che venga creato un nuovo ID.
Ideale per: scene affollate con occlusioni frequenti in cui gli ID duplicati sono un problema.
Argomenti specifici di TrackTrack:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
iou_weight | 0.0-1.0 | Peso della distanza HMIoU quando ReID è abilitato; altrimenti, HMIoU viene usato direttamente. |
reid_weight | 0.0-1.0 | Peso della distanza coseno ReID quando ReID è abilitato; altrimenti, viene ignorata. |
conf_weight | 0.0-1.0 | Peso della distanza di proiezione della confidenza. |
angle_weight | 0.0-1.0 | Peso della distanza angolare degli angoli. |
penalty_p | 0.0-1.0 | Penalità di costo per le rilevazioni a bassa confidenza. |
penalty_q | 0.0-1.0 | Penalità di costo per le rilevazioni recuperate dall'NMS secondaria. |
reduce_step | 0.0-1.0 | Riduzione della soglia di corrispondenza a ogni iterazione. |
tai_thr | 0.0-1.0 | Soglia IoU per l'NMS di inizializzazione consapevole delle tracce. |
min_track_len | >=0 | Lunghezza minima della cronologia prima che una nuova traccia venga confermata. |
lost_match_thr | 0.0-1.0 | Soglia di costo meno restrittiva per il passaggio di riassociazione delle tracce perse; 0 la disattiva. |
with_reid | True, False | Abilita la corrispondenza dell'aspetto basata sul coseno ReID (usa le feature native di YOLO). Disattivata per impostazione predefinita. |
model | auto o percorso di un modello ReID compatibile | auto usa le caratteristiche native di YOLO quando disponibili; i modelli personalizzati possono essere checkpoint .pt o esportazioni compatibili. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Metodo di compensazione del movimento globale. |
Consigli per la configurazione:
- Pedoni in scene affollate: abbassa
tai_thr(ad es.0.45) per sopprimere più creazioni duplicate; aumentatrack_bufferper le occlusioni più lunghe. - Movimenti rapidi della videocamera: mantieni abilitato
gmc_method: sparseOptFlow. - Oggetti piccoli/veloci: aumenta leggermente
angle_weighte abbassamin_track_len. - Abilita ReID solo quando serve: aumenta il costo dell'inferenza; per occlusioni brevi, di solito è sufficiente il costo predefinito basato su più indizi.
Con i modelli Segment e Pose, TrackTrack evita il recupero delle rilevazioni con NMS meno restrittiva, così maschere e keypoint restano allineati alle rispettive rilevazioni.
Esempi Python#
Guarda: Come creare un tracking interattivo degli oggetti con Ultralytics YOLO | Fai clic per ritagliare e visualizzare ⚡
Ciclo con tracce persistenti#
Ecco uno script Python che usa OpenCV (cv2) e YOLO26 per eseguire il tracking degli oggetti nei frame di un video. Lo script presuppone che i pacchetti necessari (opencv-python e ultralytics) siano già installati. L'argomento persist=True indica al tracker che l'immagine o il frame corrente è il successivo di una sequenza e che nell'immagine corrente sono previste tracce provenienti dall'immagine precedente.
Usa persist=True solo quando passi frame consecutivi dello stesso flusso video a model.track(). In questo modo il tracker può riutilizzare lo stato dei frame precedenti e mantenere ID delle tracce coerenti nel tempo. Non usare persist=True con immagini non correlate o con un flusso diverso, perché lo stato delle tracce precedenti potrebbe essere mantenuto.
Puoi anche scegliere un backend del tracker passando un file di configurazione del tracker, ad esempio tracker="botsort.yaml", tracker="bytetrack.yaml" o tracker="tracktrack.yaml".
import cv2
from ultralytics import YOLO
# Carica il modello YOLO26
model = YOLO("yolo26n.pt")
# Apri il file video
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Scorri i fotogrammi del video
while cap.isOpened():
# Leggi un fotogramma dal video
success, frame = cap.read()
if success:
# Esegui il tracking YOLO26 sul frame, mantenendo le tracce tra un frame e l'altro
# e usando il backend del tracker BoT-SORT
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualizza i risultati sul fotogramma
annotated_frame = results[0].plot()
# Mostra il fotogramma annotato
cv2.imshow("YOLO26 Tracking", annotated_frame)
# Interrompi il ciclo se viene premuto 'q'
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Interrompi il ciclo se il video è terminato
break
# Rilascia l'oggetto di acquisizione video e chiudi la finestra di visualizzazione
cap.release()
cv2.destroyAllWindows()Nota il passaggio da model(frame) a model.track(frame), che abilita il tracking degli oggetti anziché il semplice rilevamento. Questo script modificato esegue il tracker su ogni frame del video, visualizza i risultati e li mostra in una finestra. Puoi uscire dal ciclo premendo 'q'.
Tracciare le tracce nel tempo#
Visualizzare le tracce degli oggetti nei frame consecutivi può offrire informazioni preziose sui modelli di movimento e sul comportamento degli oggetti rilevati in un video. Con Ultralytics YOLO26, tracciare queste traiettorie è semplice ed efficiente.
Nell'esempio seguente mostriamo come usare le funzionalità di tracking di YOLO26 per tracciare il movimento degli oggetti rilevati in più frame video. Lo script apre un file video, lo legge frame per frame e usa il modello YOLO per identificare e tracciare vari oggetti. Conservando i punti centrali dei riquadri di delimitazione rilevati e collegandoli, possiamo disegnare linee che rappresentano i percorsi seguiti dagli oggetti tracciati.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Carica il modello YOLO26
model = YOLO("yolo26n.pt")
# Apri il file video
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Memorizza la cronologia delle tracce
track_history = defaultdict(list)
# Scorri i fotogrammi del video
while cap.isOpened():
# Leggi un fotogramma dal video
success, frame = cap.read()
if success:
# Esegui il tracking YOLO26 sul frame, mantenendo le tracce tra un frame e l'altro
result = model.track(frame, persist=True)[0]
# Ottieni i riquadri e gli ID delle tracce
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualizza il risultato sul frame
frame = result.plot()
# Traccia le traiettorie
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # Punto centrale x, y
if len(track) > 30: # mantieni 30 tracce per 30 frame
track.pop(0)
# Disegna le linee delle tracce
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Mostra il fotogramma annotato
cv2.imshow("YOLO26 Tracking", frame)
# Interrompi il ciclo se viene premuto 'q'
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Interrompi il ciclo se il video è terminato
break
# Rilascia l'oggetto di acquisizione video e chiudi la finestra di visualizzazione
cap.release()
cv2.destroyAllWindows()Tracking multithread#
Il tracking multithread consente di eseguire contemporaneamente il tracking degli oggetti su più flussi video. È particolarmente utile quando gestisci più input video, ad esempio da diverse telecamere di sorveglianza, perché l'elaborazione simultanea può migliorare notevolmente l'efficienza e le prestazioni.
Nello script Python fornito usiamo il modulo threading di Python per eseguire contemporaneamente più istanze del tracker. Ogni thread è responsabile del tracking su un file video e tutti i thread vengono eseguiti simultaneamente in background.
Per garantire che ogni thread riceva i parametri corretti (il file video, il modello da usare e l'indice del file), definiamo una funzione run_tracker_in_thread che accetta questi parametri e contiene il ciclo principale di tracking. La funzione legge il video frame per frame, esegue il tracker e salva i risultati annotati.
In questo esempio vengono usati due modelli diversi: yolo26n.pt e yolo26n-seg.pt, ognuno dei quali traccia gli oggetti in un file video diverso. I file video sono specificati in SOURCES.
Il parametro daemon=True in threading.Thread indica che questi thread verranno chiusi non appena termina il programma principale. Avviamo quindi i thread con start() e usiamo join() per fare in modo che il thread principale attenda la conclusione di entrambi i thread del tracker.
Infine, al termine del lavoro di tutti i thread, le finestre che mostrano i risultati vengono chiuse usando cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Definisci i nomi dei modelli e le sorgenti video
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # video locale, 0 per la webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): Model checkpoint name or path loaded inside the thread.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Crea e avvia i thread del tracker usando un ciclo for
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Attendi la conclusione di tutti i thread del tracker
for thread in tracker_threads:
thread.join()
# Pulisci e chiudi le finestre
cv2.destroyAllWindows()Puoi estendere facilmente questo esempio per gestire più file video e modelli creando altri thread e applicando la stessa metodologia.
Contribuisci con nuovi tracker#
Hai esperienza nel tracking di più oggetti e hai implementato o adattato con successo un algoritmo di tracking con Ultralytics YOLO? Ti invitiamo a contribuire alla nostra sezione Tracker in ultralytics/cfg/trackers! Le tue applicazioni e soluzioni reali potrebbero rivelarsi preziose per chi lavora su attività di tracking.
Contribuendo a questa sezione, aiuti ad ampliare la gamma di soluzioni di tracking disponibili nel framework Ultralytics YOLO, aggiungendo un ulteriore livello di funzionalità e utilità per la community.
Per iniziare a contribuire, consulta la nostra Guida per i contributi, che contiene istruzioni dettagliate per inviare una Pull Request (PR) 🛠️. Non vediamo l'ora di scoprire il tuo contributo!
Insieme, miglioriamo le capacità di tracking dell'ecosistema Ultralytics YOLO 🙏!
Domande frequenti#
Il tracking di più oggetti nell'analisi video consiste nell'identificare gli oggetti e mantenere un ID univoco per ogni oggetto rilevato nei vari frame del video. Ultralytics YOLO supporta questa funzionalità fornendo tracking in tempo reale insieme agli ID degli oggetti, agevolando attività come la videosorveglianza e l'analisi sportiva. Il sistema usa tracker come BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker e TrackTrack, configurabili tramite file YAML.
No. I file standard
.ptdi Ultralytics contengono i pesi del modello YOLO, mentre il tracker viene creato al momento dell'inferenza damodel.track(). Gli ID delle tracce dipendono dallo stato del tracker nei frame consecutivi; un'unica immagine indipendente può quindi restituire rilevazioni, come riquadri, classi e valori di confidenza, ma non può generare da sola ID di tracking persistenti e significativi.Per la distribuzione, integra il rilevatore e il tracker nella tua applicazione e chiama
model.track()frame per frame conpersist=Truequando i frame provengono dallo stesso flusso video. Usa istanze separate del modello o del tracker per flussi non correlati, in modo che lo stato non venga mantenuto tra i video.Puoi configurare un tracker personalizzato copiando un file di configurazione di un tracker esistente (ad es.
custom_tracker.yaml) dalla directory di configurazione dei tracker di Ultralytics e modificando i parametri secondo necessità, fatta eccezione pertracker_type. Usa questo file nel tuo modello di tracking, come segue:Esempiofrom ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Per eseguire contemporaneamente il tracking degli oggetti su più flussi video, puoi usare il modulo
threadingdi Python. Ogni thread gestirà un flusso video separato. Ecco un esempio di configurazione:Tracking multithreadimport threading import cv2 from ultralytics import YOLO # Definisci i nomi dei modelli e le sorgenti video MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # video locale, 0 per la webcam def run_tracker_in_thread(model_name, filename): """Run YOLO tracker in its own thread for concurrent processing. Args: model_name (str): Model checkpoint name or path loaded inside the thread. filename (str): The path to the video file or the identifier for the webcam/external camera source. """ model = YOLO(model_name) results = model.track(filename, save=True, stream=True) for r in results: pass # Crea e avvia i thread del tracker usando un ciclo for tracker_threads = [] for video_file, model_name in zip(SOURCES, MODEL_NAMES): thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True) tracker_threads.append(thread) thread.start() # Attendi la conclusione di tutti i thread del tracker for thread in tracker_threads: thread.join() # Pulisci e chiudi le finestre cv2.destroyAllWindows()Il tracking di più oggetti con Ultralytics YOLO ha numerose applicazioni, tra cui:
- Trasporti: tracking dei veicoli per la gestione del traffico e la guida autonoma.
- Commercio al dettaglio: tracking delle persone per l'analisi in negozio e la sicurezza.
- Acquacoltura: tracking dei pesci per il monitoraggio degli ambienti acquatici.
- Analisi sportiva: tracking di giocatori e attrezzature per l'analisi delle prestazioni.
- Sistemi di sicurezza: monitoraggio di attività sospette e creazione di allarmi di sicurezza.
Queste applicazioni traggono vantaggio dalla capacità di Ultralytics YOLO di elaborare in tempo reale video ad alta frequenza di fotogrammi con precisione eccezionale.
Per visualizzare le tracce degli oggetti in più frame video, puoi usare le funzionalità di tracking del modello YOLO insieme a OpenCV per disegnare i percorsi degli oggetti rilevati. Ecco uno script di esempio che lo mostra:
Tracciare le traiettorie in più frame videofrom collections import defaultdict import cv2 import numpy as np from ultralytics import YOLO model = YOLO("yolo26n.pt") video_path = "path/to/video.mp4" cap = cv2.VideoCapture(video_path) track_history = defaultdict(list) while cap.isOpened(): success, frame = cap.read() if success: result = model.track(frame, persist=True)[0] annotated_frame = result.plot() if result.boxes and result.boxes.is_track: boxes = result.boxes.xywh.cpu() track_ids = result.boxes.id.int().cpu().tolist() for box, track_id in zip(boxes, track_ids): x, y, w, h = box track = track_history[track_id] track.append((float(x), float(y))) if len(track) > 30: track.pop(0) points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2)) cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10) cv2.imshow("YOLO26 Tracking", annotated_frame) if cv2.waitKey(1) & 0xFF == ord("q"): break else: break cap.release() cv2.destroyAllWindows()Questo script traccia le linee che rappresentano i percorsi degli oggetti monitorati nel tempo, offrendo informazioni preziose sul comportamento e sui modelli degli oggetti.