Ultralytics YOLO27:
Get Started

Tracciamento di oggetti multipli con Ultralytics YOLO#

YOLO multi-object tracking with trajectory paths

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.

🚀 Nuovi tracker: OC-SORT, Deep OC-SORT, FastTracker, TrackTrack

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#

TrasportiCommercio al dettaglioAcquacoltura
Tracciamento dei veicoliTracciamento delle personeTracciamento dei pesci

Guida rapida#

Esegui il tracciamento su un video con il tracker TrackTrack predefinito. Passa a un altro tracker modificando l'argomento tracker.

Esempio
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.

Esempio
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 ByteTrack

Tracker supportati#

Ultralytics YOLO include sei tracker integrati. Attivane uno passando il relativo file di configurazione YAML all'argomento tracker.

TrackerFile di configurazioneModello del motoAspetto / ReIDCompensazione del movimento della telecameraGestione delle occlusioni
BoT-SORTbotsort.yamlKalman lineareOpzionale (with_reid)Configurabile (gmc_method)Buffer delle tracce + ricollegamento ReID
ByteTrackbytetrack.yamlKalman lineareNessunoNoRecupero in due fasi dei rilevamenti a bassa confidenza
OC-SORTocsort.yamlKalman basato sulle osservazioniNessunoNoORU, OCM, OCR: nuovo aggiornamento dall'ultima osservazione
Deep OC-SORTdeepocsort.yamlKalman basato sulle osservazioniOpzionale (with_reid)Configurabile (gmc_method)OC-SORT + EMA adattiva dell'aspetto opzionale
FastTrackerfasttrack.yamlKalman lineare + rollbackNessunoNoRollback di Kalman + ampliamento di bbox in caso di occlusione
TrackTracktracktrack.yamlKalman 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:

  1. Ti serve una soluzione di base rapida e semplice? → ByteTrack (nessun ReID, nessuna compensazione del movimento della telecamera, overhead minimo).
  2. Riprese da dispositivo portatile, drone o telecamera in movimento? → BoT-SORT (aggiunge la compensazione del movimento della telecamera e il ReID opzionale).
  3. Movimento non lineare (sport, danza, svolte brusche) e nessun ReID? → OC-SORT (correzioni basate sulle osservazioni senza costi legati all'aspetto).
  4. 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).
  5. 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.

Esempio
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.

Esempio
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).

Esempio
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:

Informazioni sulle soglie dei tracker

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.

ParametroValori o intervalli validiDescrizione
tracker_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackSpecifica il tipo di tracker.
track_high_thresh0.0-1.0Soglia per la prima associazione. Influisce sul livello di sicurezza con cui una rilevazione viene abbinata a una traccia esistente.
track_low_thresh0.0-1.0Limite 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_thresh0.0-1.0Soglia per inizializzare una nuova traccia se la rilevazione non corrisponde ad alcuna traccia esistente.
track_buffer>=0Numero di frame per cui le tracce perse restano attive prima della rimozione. Un valore più alto aumenta la tolleranza alle occlusioni.
match_thresh0.0-1.0Soglia per l'abbinamento delle tracce. Valori più alti rendono l'abbinamento più permissivo.
fuse_scoreTrue, FalseIndica se fondere i punteggi di confidenza con le distanze IoU prima dell'abbinamento.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMetodo di compensazione del movimento globale. Aiuta a tenere conto dei movimenti della videocamera.
proximity_thresh0.0-1.0IoU minimo richiesto per un abbinamento ReID valido. Garantisce una sufficiente vicinanza spaziale prima di usare gli indizi visivi.
appearance_thresh0.0-1.0Somiglianza visiva normalizzata minima richiesta per ReID.
with_reidTrue, FalseAbilita l'abbinamento basato sull'aspetto per migliorare il tracciamento attraverso le occlusioni. Supportato da BoT-SORT, Deep OC-SORT e TrackTrack.
modelauto o percorso di un modello ReID compatibileModello 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 a yolo26n-cls.pt.
  • Modello ReID personalizzato — Imposta model: su un checkpoint .pt o su un modello di embedding esportato compatibile, come .torchscript, .onnx, .engine oppure una directory di modello OpenVINO. I modelli esportati vengono caricati tramite AutoBackend e 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
Modellodimensione
(pixel)
parametri
(M)
FLOPs
(B)
YOLO26n-reid.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
ReID è disponibile solo per il tracciamento

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:

Esportare un modello ReID in 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:

ParametroValori o intervalli validiDescrizione
gmc_methodsparseOptFlow, orb, sift, ecc, noneBackend per la compensazione del movimento della videocamera. sparseOptFlow è l'impostazione predefinita. none disabilita CMC.
with_reidTrue, FalseAbilita l'abbinamento basato sull'aspetto. Disabilitato per impostazione predefinita.
modelauto o percorso di un modello ReID compatibileauto usa le caratteristiche native di YOLO quando disponibili; i modelli personalizzati possono essere checkpoint .pt o esportazioni compatibili.
proximity_thresh0.0-1.0IoU minimo prima di considerare le caratteristiche di aspetto.
appearance_thresh0.0-1.0Somiglianza visiva normalizzata minima richiesta per un abbinamento ReID. Aumentala per rendere l'abbinamento più rigoroso.

Consigli per la configurazione:

  • Videocamera fissa: imposta gmc_method: none per risparmiare qualche ms/frame.
  • Movimento intenso della videocamera: mantieni sparseOptFlow; ecc è più preciso, ma più lento.
  • Folla con soggetti simili: abilita with_reid: True e aumenta appearance_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_thresh per fornire più candidati alla seconda fase.
  • Rilevatore con alta copertura: aumenta track_high_thresh per ridurre la frammentazione degli ID.
  • Sfarfallio frequente degli ID: aumenta track_buffer affinché 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:

ParametroValori o intervalli validiDescrizione
delta_t>=1Finestra temporale (in frame) per il calcolo della direzione della velocità in OCM. Valori più alti producono un maggiore livellamento.
inertia0.0-1.0Peso del costo di coerenza della velocità. Valori più alti penalizzano i cambiamenti improvvisi di direzione.
use_byteTrue, FalseAbilita 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_buffer per 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:

ParametroValori o intervalli validiDescrizione
with_reidTrue, FalseAbilita l'abbinamento basato sull'aspetto. Disabilitato per impostazione predefinita.
modelauto o percorso di un modello ReID compatibileauto usa le caratteristiche native di YOLO quando disponibili; i modelli personalizzati possono essere checkpoint .pt o esportazioni compatibili.
proximity_thresh0.0-1.0IoU minimo prima di considerare le caratteristiche di aspetto.
appearance_thresh0.0-1.0Somiglianza visiva normalizzata minima richiesta per un abbinamento ReID.
alpha_fixed_emb0.0-1.0Fattore EMA di base per gli aggiornamenti degli embedding delle tracce. Valori più alti mantengono più a lungo il vecchio embedding.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMetodo di compensazione del movimento globale.
delta_t>=1Finestra temporale (in frame) per il calcolo della direzione della velocità in OCM (ereditata da OC-SORT).
inertia0.0-1.0Peso del costo di coerenza della velocità (ereditato da OC-SORT).
use_byteTrue, FalseAbilita 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 aumenta alpha_fixed_emb per adattare più lentamente gli embedding.
  • Videocamera in movimento: imposta gmc_method: sparseOptFlow (Deep OC-SORT usa none per 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:

ParametroValori o intervalli validiDescrizione
reset_velocity_offset_occ>=0Numero di frame indietro nella cronologia da cui ripristinare la velocità di Kalman all'inizio dell'occlusione.
reset_pos_offset_occ>=0Numero di frame indietro nella cronologia da cui ripristinare la posizione di Kalman all'inizio dell'occlusione.
enlarge_bbox_occ>=1.0Fattore di scala dell'altezza applicato al bbox predetto durante l'occlusione (la larghezza viene scalata in base al rapporto d'aspetto XYAH).
dampen_motion_occ0.0-1.0Moltiplicatore della velocità durante l'occlusione. Valori più bassi fanno "rallentare" la traccia durante l'occlusione.
active_occ_to_lost_thresh>=1Numero massimo di frame consecutivi in occlusione prima che una traccia attiva venga spostata tra quelle perse.
occ_cover_thresh0.0-1.0Frazione dell'area di una traccia coperta da un'altra traccia attiva per dichiarare un'occlusione.
occ_reappear_window>=0Numero di frame per cui una traccia persa di recente dopo un'occlusione resta più facilmente ritrovabile.
init_iou_suppress0.0-1.0Esclude 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_window e track_buffer.
  • Target in rapido movimento: aumenta dampen_motion_occ (avvicinandolo a 1.0); aumenta enlarge_bbox_occ solo 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:

ParametroValori o intervalli validiDescrizione
iou_weight0.0-1.0Peso della distanza HMIoU quando ReID è abilitato; altrimenti, HMIoU viene usato direttamente.
reid_weight0.0-1.0Peso della distanza coseno ReID quando ReID è abilitato; altrimenti, viene ignorata.
conf_weight0.0-1.0Peso della distanza di proiezione della confidenza.
angle_weight0.0-1.0Peso della distanza angolare degli angoli.
penalty_p0.0-1.0Penalità di costo per le rilevazioni a bassa confidenza.
penalty_q0.0-1.0Penalità di costo per le rilevazioni recuperate dall'NMS secondaria.
reduce_step0.0-1.0Riduzione della soglia di corrispondenza a ogni iterazione.
tai_thr0.0-1.0Soglia IoU per l'NMS di inizializzazione consapevole delle tracce.
min_track_len>=0Lunghezza minima della cronologia prima che una nuova traccia venga confermata.
lost_match_thr0.0-1.0Soglia di costo meno restrittiva per il passaggio di riassociazione delle tracce perse; 0 la disattiva.
with_reidTrue, FalseAbilita la corrispondenza dell'aspetto basata sul coseno ReID (usa le feature native di YOLO). Disattivata per impostazione predefinita.
modelauto o percorso di un modello ReID compatibileauto usa le caratteristiche native di YOLO quando disponibili; i modelli personalizzati possono essere checkpoint .pt o esportazioni compatibili.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMetodo 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; aumenta track_buffer per le occlusioni più lunghe.
  • Movimenti rapidi della videocamera: mantieni abilitato gmc_method: sparseOptFlow.
  • Oggetti piccoli/veloci: aumenta leggermente angle_weight e abbassa min_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.

Mantenere le tracce e selezionare un tracker

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".

Ciclo for di streaming con tracking
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.

Tracciare le traiettorie in più frame video
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().

Implementazione del tracking multithread
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 .pt di Ultralytics contengono i pesi del modello YOLO, mentre il tracker viene creato al momento dell'inferenza da model.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 con persist=True quando 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 per tracker_type. Usa questo file nel tuo modello di tracking, come segue:

    Esempio
    from 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 threading di Python. Ogni thread gestirà un flusso video separato. Ecco un esempio di configurazione:

    Tracking multithread
    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()
  • 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 video
    from 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.

Commenti