Tracciamento multi-oggetto con Ultralytics YOLO#
Il tracciamento degli oggetti nell'ambito dell'analisi video è un'attività fondamentale che non solo identifica la posizione e la classe degli oggetti all'interno del fotogramma, ma mantiene anche un ID univoco per ciascun oggetto rilevato man mano che il video procede. Le applicazioni sono illimitate e spaziano dalla sorveglianza e sicurezza all'analisi sportiva in tempo reale.
Consulta l' anteprima non rilasciata di YOLO27 per il supporto al tracciamento pianificato.
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 object detection, ma offre il valore aggiunto degli ID di oggetto. Ciò facilita il tracciamento degli oggetti nei flussi video e l'esecuzione di analisi successive. Ecco perché dovresti considerare l'uso di Ultralytics YOLO per le tue esigenze di tracciamento degli oggetti:
- Efficienza: elabora i flussi video in tempo reale senza compromettere la precisione.
- Flessibilità: supporta molteplici algoritmi e configurazioni di tracciamento.
- Facilità d'uso: semplice API Python e opzioni CLI per una rapida integrazione e distribuzione.
- Personalizzabilità: facile da usare con modelli YOLO addestrati su misura, consentendo l'integrazione in applicazioni specifiche di dominio.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Applicazioni nel mondo reale#
| Trasporti | Vendita al dettaglio | Acquacoltura |
|---|---|---|
| Tracciamento dei veicoli | Tracciamento delle persone | Tracciamento dei pesci |
Avvio rapido#
Esegui il tracciamento su un video con il tracker predefinito TrackTrack. Passa a un altro tracker modificando l'argomento tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")Per eseguire il tracker sui flussi video, usa un modello addestrato Detect, Segment, Pose o OBB come YOLO26n, YOLO26n-seg, YOLO26n-pose o YOLO26n-obb. Puoi addestrare modelli personalizzati localmente o con l'addestramento cloud di Ultralytics Platform.
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom-trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrackTracker supportati#
Ultralytics YOLO include sei tracker integrati. Abiltane uno passando il suo file di configurazione YAML all'argomento tracker.
| Tracker | File di configurazione | Modello di movimento | Aspetto / ReID | Compensazione del movimento della telecamera | Gestione delle occlusioni |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman lineare | Opzionale (with_reid) | Configurabile (gmc_method) | Buffer di traccia + ricollegamento ReID |
| ByteTrack | bytetrack.yaml | Kalman lineare | Nessuno | No | Recupero a bassa confidenza in due fasi |
| OC-SORT | ocsort.yaml | Kalman incentrato sulle osservazioni | Nessuno | No | Riappiornamento ORU, OCM, OCR dall'ultima osservazione |
| Deep OC-SORT | deepocsort.yaml | Kalman incentrato sulle osservazioni | Opzionale (with_reid) | Configurabile (gmc_method) | OC-SORT + EMA di aspetto adattivo opzionale |
| FastTracker | fasttrack.yaml | Kalman lineare + rollback | Nessuno | No | Rollback di Kalman + ingrandimento della bbox in caso di occlusione |
| TrackTrack | tracktrack.yaml | Kalman lineare (NSA) | Opzionale (with_reid) | Configurabile (gmc_method) | Associazione iterativa a più indizi + TAI |
Quale tracker dovrei usare?#
Usa questo flusso per scegliere un punto di partenza; tracktrack.yaml viene utilizzato quando non passi alcun tracker:
- Ti serve la base più veloce e semplice? → ByteTrack (nessun ReID, nessuna compensazione del movimento della telecamera, overhead minimo).
- Riprese a mano, da drone o con telecamera in movimento? → BoT-SORT (aggiunge la compensazione del movimento della telecamera e il ReID opzionale).
- Movimento non lineare (sport, danza, curve brusche) e nessun ReID? → OC-SORT (correzioni incentrate sulle osservazioni senza costi di aspetto).
- Scene affollate con telecamera in movimento in cui gli scambi di ID sono il problema principale? → Deep OC-SORT o TrackTrack (entrambi supportano la corrispondenza dell'aspetto opzionale; TrackTrack aggiunge anche l'associazione a più indizi e la soppressione dei duplicati di ID).
- Frequente sovrapposizione parziale in tempo reale, nessun budget per il ReID? → FastTracker (variante di ByteTrack consapevole delle occlusioni con rollback di Kalman).
Cambio dei tracker#
Passa il nome del file di configurazione del tracker a tracker=. Tutto 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 di tracciamento#
La configurazione del tracciamento condivide le proprietà con la modalità Predict, come conf, iou e show. Per ulteriori configurazioni, fai riferimento alla pagina del modello Predict.
from ultralytics import YOLO
# Configure the tracking parameters and run the 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 consente inoltre di utilizzare un file di configurazione del tracker modificato. Per fare ciò, è sufficiente creare una copia di un file di configurazione del tracker (ad esempio, custom_tracker.yaml) da ultralytics/cfg/trackers e modificare qualsiasi configurazione (eccetto tracker_type) in base alle proprie esigenze.
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Argomenti condivisi del tracker#
I seguenti parametri sono comuni alla maggior parte dei file YAML dei tracker; non tutti i parametri compaiono in ogni configurazione:
I rilevamenti uguali o superiori a track_high_thresh entrano nella 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 uguali 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 sulla sicurezza con cui un rilevamento viene associato a una traccia esistente. |
track_low_thresh | 0.0-1.0 | Limite inferiore per i rilevamenti di recupero a bassa confidenza. OC-SORT e Deep OC-SORT li usano solo quando use_byte: True; TrackTrack li include nel suo pool di associazioni penalizzate. |
new_track_thresh | 0.0-1.0 | Soglia per inizializzare una nuova traccia se il rilevamento non corrisponde ad alcuna traccia esistente. |
track_buffer | >=0 | Fotogrammi in cui le tracce perse vengono mantenute attive prima della rimozione. Un valore più alto indica maggiore 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 del movimento della telecamera. |
proximity_thresh | 0.0-1.0 | IoU minimo richiesto per una corrispondenza ReID valida. Garantisce la vicinanza spaziale prima di usare gli indizi visivi. |
appearance_thresh | 0.0-1.0 | Somiglianza di aspetto normalizzata minima richiesta per il ReID. |
with_reid | True, False | Abilita l'abbinamento basato sull'aspetto per un migliore tracciamento attraverso le occlusioni. Supportato da BoT-SORT, Deep OC-SORT e TrackTrack. |
model | auto o percorso del modello ReID compatibile | Modello ReID. auto usa le caratteristiche native della spina dorsale di YOLO quando disponibili; altrimenti torna a yolo26n-cls.pt. Un codificatore personalizzato può essere un checkpoint .pt o un modello esportato come .torchscript, .onnx, .engine o una directory di modelli OpenVINO. |
Argomenti specifici del tracker#
Ogni algoritmo espone ulteriori opzioni oltre ai parametri condivisi. Consulta le sezioni specifiche per ogni tracker di seguito per le descrizioni e i consigli di ottimizzazione, oppure fai riferimento direttamente ai file di configurazione:
Abilitazione della re-identificazione (ReID)#
Il ReID è disabilitato per impostazione predefinita per ridurre al minimo l'overhead. Abilitalo impostando with_reid: True in un file di configurazione del tracker.
Opzioni del modello ReID:
model: auto— Utilizza le caratteristiche native del rilevatore YOLO, aggiungendo un overhead minimo. Ideale quando ti serve un po' di ReID senza un calo drastico delle prestazioni. Torna ayolo26n-cls.ptse il rilevatore non espone caratteristiche compatibili.- Modello ReID personalizzato — Punta
model:a un checkpoint.pto a un modello di embedding esportato compatibile, come.torchscript,.onnx,.engineo una directory di modelli OpenVINO. I modelli esportati vengono caricati tramiteAutoBackende devono restituire direttamente un tensore di embedding.
I codificatori ONNX pronti all'uso vengono pubblicati per ogni dimensione di modello. Imposta model: su uno di questi nomi e il file verrà scaricato automaticamente la prima volta che il tracker viene eseguito (allo stesso modo in cui vengono recuperati i pesi di YOLO), senza che sia necessaria alcuna esportazione manuale o fase di download:
# 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) | FLOP (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 i codificatori ReID ONNX per il ramo dell'aspetto del tracker. Le modalità ReID train, val e predict, nonché le ricette di esportazione ReID dedicate, 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
# Load the classification model
model = YOLO("yolo26n-cls.pt")
# Add average pooling layer
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
# Export to TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)Una volta esportato, punta al percorso del modello TensorRT nella configurazione del tuo tracker.
Dettagli del tracker#
Le sezioni seguenti descrivono il design, i parametri specifici e i consigli di sintonizzazione di ciascun tracker.
Watch: Which Object Tracker Performs Better? | Speed, FPS & ID Stability | Ultralytics YOLO26 📊
BoT-SORT#
BoT-SORT (Aharon et al., 2022) estende ByteTrack con la compensazione del movimento della telecamera e il ReID opzionale:
- Compensazione del movimento della telecamera (CMC): una deformazione affine stimata a ogni fotogramma (flusso ottico sparso per impostazione predefinita; sono disponibili anche ORB ed ECC) viene applicata agli stati di Kalman prima dell'abbinamento IoU.
- ReID opzionale: gli embedding di aspetto possono essere fusi nella matrice dei costi. Disabilitato per impostazione predefinita; abilitalo con
with_reid: True.
Ideale per: tracciamento generico, in particolare con telecamere in movimento. Aggiungi ReID solo quando folle di persone dall'aspetto simile causano scambi di ID.
Argomenti specifici di BoT-SORT:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend di compensazione del movimento della telecamera. sparseOptFlow è l'impostazione predefinita. none disabilita la CMC. |
with_reid | True, False | Abilita il matching basato sull'aspetto. Disattivato per impostazione predefinita. |
model | auto o percorso del modello ReID compatibile | auto utilizza funzionalità 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 dell'aspetto. |
appearance_thresh | 0.0-1.0 | Somiglianza dell'aspetto normalizzata minima richiesta per una corrispondenza ReID. Aumenta per rendere il matching più rigoroso. |
Consigli per la messa a punto:
- Telecamera statica: imposta
gmc_method: noneper risparmiare pochi ms/fotogramma. - Forte movimento della telecamera: mantieni
sparseOptFlow;eccè più accurato ma più lento. - Folle dall'aspetto simile: attiva
with_reid: Truee aumentaappearance_thresh(ad es.0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) è la baseline leggera. Utilizza Kalman lineare + IoU con un'associazione in due fasi:
- Fase 1: associa le rilevazioni con punteggio alto alle tracce attive.
- Fase 2: riprova le tracce non associate con le rilevazioni a punteggio basso per recuperarle durante brevi occlusioni parziali.
Non è presente alcun modello di aspetto e nessuna compensazione del movimento della telecamera.
Ideale per: telecamere statiche o quasi statiche in cui il costo del rilevatore predomina e desideri un overhead minimo del tracker.
Argomenti specifici di ByteTrack: Nessuno oltre agli argomenti condivisi del tracker.
Consigli per la messa a punto:
- Rilevatore rumoroso: abbassa
track_low_threshin modo che la seconda fase abbia più candidati. - Rilevatore ad alto richiamo: aumenta
track_high_threshper ridurre gli ID frammentati. - Frequente sfarfallio degli ID: aumenta
track_bufferin modo che le tracce brevemente mancate sopravvivano.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023) è un'estensione di SORT incentrata sulle osservazioni. Mantiene il design leggero di SORT (senza caratteristiche di aspetto) e aggiunge tre correzioni:
- Observation-Centric Re-update (ORU): riproduce una traiettoria virtuale tra l'ultima osservazione e la rilevazione corrente, rieseguendo l'aggiornamento di Kalman per riparare la velocità derivata.
- Observation-Centric Momentum (OCM): penalizza le rilevazioni che si muovono nella direzione sbagliata tramite un termine di coerenza della velocità.
- Observation-Centric Recovery (OCR): ricontrolla le rilevazioni non associate rispetto alle tracce perse di recente utilizzando la loro ultima osservazione anziché lo stato previsto.
Ideale per: movimento non lineare senza il costo di un modello ReID.
Argomenti specifici di OC-SORT:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
delta_t | >=1 | Finestra temporale (fotogrammi) per il calcolo della direzione della velocità in OCM. Valori più grandi attenuano maggiormente. |
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 messa a punto:
- Movimento non lineare: aumenta
inertia(ad es.0.3-0.4). - Rilevazioni sparse: abilita
use_byte: True. - Occlusioni lunghe: aumenta
track_bufferin modo che OCR abbia più tracce perse da ricollegare.
Con i modelli OBB, OCR utilizza il box orientato previsto da Kalman poiché non viene mantenuta una cronologia dell'ultima osservazione orientata.
Deep OC-SORT#
Deep OC-SORT arricchisce OC-SORT con informazioni sull'aspetto e compensazione del movimento della telecamera:
- Matching dell'aspetto: la distanza di embedding del coseno è limitata dalla sovrapposizione e fusa con il costo del movimento.
- EMA dell'aspetto dinamico: gli embedding delle tracce si aggiornano con un'EMA il cui fattore di attenuazione si adatta alla confidenza di rilevamento.
- Compensazione del movimento della telecamera: gli stati di Kalman vengono deformati fotogramma per fotogramma tramite flusso ottico scarso, ORB o ECC.
Ideale per: scene affollate o con telecamera in movimento in cui gli scambi di ID tra oggetti visivamente differenti ma spazialmente vicini sono comuni.
Argomenti specifici di Deep OC-SORT:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
with_reid | True, False | Abilita il matching basato sull'aspetto. Disattivato per impostazione predefinita. |
model | auto o percorso del modello ReID compatibile | auto utilizza funzionalità 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 dell'aspetto. |
appearance_thresh | 0.0-1.0 | Somiglianza dell'aspetto normalizzata minima richiesta per una corrispondenza ReID. |
alpha_fixed_emb | 0.0-1.0 | Fattore EMA di base per gli aggiornamenti dell'embedding delle tracce. Valori più alti preservano l'embedding più vecchio più a lungo. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Metodo di compensazione del movimento globale. |
delta_t | >=1 | Finestra temporale (fotogrammi) 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 messa a punto:
- Scambi di identità nelle folle: aumenta
appearance_thresh(ad es.0.92-0.95) e aumentaalpha_fixed_embin modo che gli embedding si adattino più lentamente. - Telecamera in movimento: imposta
gmc_method: sparseOptFlow(Deep OC-SORT utilizzanonecome valore predefinito). - Latenza inferiore: mantieni
with_reid: False(predefinito) solo per movimento + CMC; abilita ReID solo quando gli scambi di ID dominano gli errori.
FastTracker#
FastTracker è una variante di ByteTrack consapevole dell'occlusione senza alcun modello di aspetto:
- Rilevamento dell'occlusione: contrassegna le tracce come occluse quando la copertura da parte di altre tracce attive supera
occ_cover_thresh. - Ripristino di Kalman in caso di occlusione: riporta lo stato di Kalman a un fotogramma precedente all'occlusione utilizzando la cronologia con buffer circolare.
- Smorzamento del movimento ed espansione della ricerca: la velocità viene smorzata e il bbox previsto viene ingrandito durante l'occlusione.
- Soppressione Init-IoU: impedisce la creazione di nuove tracce sopra quelle attive.
Ideale per: pipeline in tempo reale basate solo sul rilevamento con frequenti sovrapposizioni tra bersagli (folle, code, sport).
Argomenti specifici di FastTracker:
| Parametro | Valori o intervalli validi | Descrizione |
|---|---|---|
reset_velocity_offset_occ | >=0 | Fotogrammi di cronologia precedenti per ripristinare la velocità di Kalman all'insorgere dell'occlusione. |
reset_pos_offset_occ | >=0 | Fotogrammi di cronologia precedenti per ripristinare la posizione di Kalman all'insorgere dell'occlusione. |
enlarge_bbox_occ | >=1.0 | Ridimensionamento dell'altezza applicato al bbox previsto durante l'occlusione (la larghezza viene scalata tramite il rapporto d'aspetto XYAH). |
dampen_motion_occ | 0.0-1.0 | Moltiplicatore di velocità durante l'occlusione. Valori più bassi fanno "rallentare" la traccia durante l'occlusione. |
active_occ_to_lost_thresh | >=1 | Numero massimo di fotogrammi consecutivi occlusi prima che una traccia attiva venga spostata nello stato di persa. |
occ_cover_thresh | 0.0-1.0 | Frazione dell'area di una traccia coperta da un'altra traccia attiva per dichiarare l'occlusione. |
occ_reappear_window | >=0 | Fotogrammi in cui una traccia persa recentemente occlusi rimane preferenzialmente rintracciabile. |
init_iou_suppress | 0.0-1.0 | Sopprime l'inizializzazione di una nuova traccia se il suo IoU con qualsiasi traccia attiva supera questo valore. Imposta a 1.0 per disabilitare. |
Consigli per la messa a punto:
- Occlusioni parziali frequenti: abbassa
occ_cover_thresh(ad es.0.5-0.6). - ID duplicati attorno alla sovrapposizione: abbassa
init_iou_suppress(ad es.0.5). - Occlusioni lunghe: aumenta
occ_reappear_windowetrack_bufferinsieme. - Bersagli in rapido movimento: aumenta
dampen_motion_occ(più vicino a1.0); aumentaenlarge_bbox_occsolo quando una regione di ricerca più ampia migliora il recupero.
TrackTrack#
TrackTrack (Shim et al., CVPR 2025) è il tracker predefinito. Ragiona dalla prospettiva di ciascuna traccia con un'associazione iterativa a più segnali:
- Track-Perspective-Based Association (TPA): combina HMIoU, distanza ReID del coseno opzionale, distanza di proiezione della confidenza e distanza dell'angolo dell'angolo. L'assegnazione viene risolta in modo iterativo con una soglia di rilassamento.
- Track-Aware Initialization (TAI): sopprime le generazioni duplicate prima che venga creato un nuovo ID.
Ideale per: scene affollate con frequenti occlusioni in cui gli ID duplicati rappresentano 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 utilizzato direttamente. |
reid_weight | 0.0-1.0 | Peso della distanza ReID del coseno quando ReID è abilitato; altrimenti viene ignorato. |
conf_weight | 0.0-1.0 | Peso della distanza di proiezione della confidenza. |
angle_weight | 0.0-1.0 | Peso della distanza dell'angolo dell'angolo. |
penalty_p | 0.0-1.0 | Penalizzazione del costo per le rilevazioni a bassa confidenza. |
penalty_q | 0.0-1.0 | Penalizzazione del costo per le rilevazioni recuperate da NMS secondario. |
reduce_step | 0.0-1.0 | Rilassamento della soglia di corrispondenza per iterazione. |
tai_thr | 0.0-1.0 | Soglia IoU per NMS di Track-Aware Initialization. |
min_track_len | >=0 | Lunghezza minima della cronologia prima che una nuova traccia venga confermata. |
lost_match_thr | 0.0-1.0 | Gate di costo più permissivo per il passaggio di ricollegamento delle tracce perse rilassato; 0 lo disabilita. |
with_reid | True, False | Abilita il matching dell'aspetto cosine-ReID (utilizza le funzionalità native di YOLO). Disattivato per impostazione predefinita. |
model | auto o percorso del modello ReID compatibile | auto utilizza funzionalità 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 messa a punto:
- Pedoni affollati: abbassa
tai_thr(ad es.0.45) per sopprimere più generazioni duplicate; aumentatrack_bufferper occlusioni più lunghe. - Movimento rapido della telecamera: mantieni
gmc_method: sparseOptFlowabilitato. - Oggetti piccoli/veloci: aumenta leggermente
angle_weighte abbassamin_track_len. - Abilita ReID solo quando necessario: aggiunge costi di inferenza; per brevi occlusioni, il costo multi-segnale predefinito è solitamente sufficiente.
Con i modelli Segment e Pose, TrackTrack salta il recupero delle rilevazioni con NMS allentato in modo che le maschere e i punti chiave rimangano allineati con le rispettive rilevazioni.
Esempi Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Ciclo di persistenza delle tracce#
Ecco uno script Python che utilizza OpenCV (cv2) e YOLO26 per eseguire il tracciamento degli oggetti sui fotogrammi video. Questo 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 fotogramma corrente è il successivo in una sequenza e di attendersi tracce dall'immagine precedente nell'immagine corrente.
Usa persist=True solo quando passi fotogrammi consecutivi dallo stesso flusso video a model.track(). Ciò consente al tracker di riutilizzare lo stato dai fotogrammi precedenti e mantenere ID di traccia coerenti nel tempo. Non usare persist=True su immagini non correlate o su un flusso diverso, poiché lo stato della traccia precedente potrebbe essere ereditato.
Puoi anche scegliere un backend del tracker passando un file di configurazione del tracker, come tracker="botsort.yaml", tracker="bytetrack.yaml" o tracker="tracktrack.yaml".
import cv2
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
# and using the BoT-SORT tracker backend
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()Nota il cambiamento da model(frame) a model.track(frame), che abilita il tracciamento degli oggetti invece della semplice rilevazione. Questo script modificato eseguirà il tracker su ciascun fotogramma del video, ne visualiserà i risultati e li mostrerà in una finestra. È possibile uscire dal ciclo premendo 'q'.
Tracciamento dei percorsi nel corso del tempo#
La visualizzazione dei percorsi degli oggetti su fotogrammi consecutivi può offrire preziose informazioni sui pattern di movimento e sul comportamento degli oggetti rilevati all'interno di un video. Con Ultralytics YOLO26, tracciare questi percorsi è un processo semplice ed efficiente.
Nel seguente esempio, mostriamo come utilizzare le funzionalità di tracciamento di YOLO26 per tracciare il movimento degli oggetti rilevati su più fotogrammi video. Questo script prevede l'apertura di un file video, la sua lettura fotogramma per fotogramma e l'utilizzo del modello YOLO per identificare e tracciare vari oggetti. Mantenendo i punti centrali dei riquadri di delimitazione rilevati e collegandoli tra loro, possiamo tracciare linee che rappresentano i percorsi seguiti dagli oggetti tracciati.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(list)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
result = model.track(frame, persist=True)[0]
# Get the boxes and track IDs
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualize the result on the frame
frame = result.plot()
# Plot the tracks
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))) # x, y center point
if len(track) > 30: # retain 30 tracks for 30 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()Tracciamento multithread#
Il tracciamento multithread offre la possibilità di eseguire il tracciamento degli oggetti su più flussi video contemporaneamente. Questo è particolarmente utile quando si gestiscono più input video, ad esempio da più telecamere di sorveglianza, dove l'elaborazione simultanea può migliorare notevolmente l'efficienza e le prestazioni.
Nel codice Python fornito, utilizziamo il modulo threading di Python per eseguire più istanze del tracker contemporaneamente. Ciascun thread è responsabile dell'esecuzione del tracker su un file video e tutti i thread vengono eseguiti simultaneamente in background.
Per garantire che ciascun thread riceva i parametri corretti (il file video, il modello da utilizzare e l'indice del file), definiamo una funzione run_tracker_in_thread che accetta questi parametri e contiene il ciclo di tracciamento principale. Questa funzione legge il video fotogramma per fotogramma, esegue il tracker e visualizza i risultati.
In questo esempio vengono utilizzati due modelli differenti: yolo26n.pt e yolo26n-seg.pt, ognuno dei quali traccia oggetti in un file video diverso. I file video sono specificati in SOURCES.
Il parametro daemon=True in threading.Thread significa che questi thread verranno chiusi non appena il programma principale avrà terminato. Avviamo quindi i thread con start() e utilizziamo join() per fare in modo che il thread principale attenda fino al completamento di entrambi i thread del tracker.
Infine, dopo che tutti i thread hanno completato il loro compito, le finestre che mostrano i risultati vengono chiuse utilizzando cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for 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
# Create and start tracker threads using a for loop
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()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()Questo esempio può essere facilmente esteso per gestire un numero maggiore di file video e modelli creando ulteriori thread e applicando la stessa metodologia.
Contribuisci a nuovi tracker#
Hai esperienza nel tracciamento di oggetti multipli e hai implementato o adattato con successo un algoritmo di tracciamento con Ultralytics YOLO? Ti invitiamo a contribuire alla nostra sezione Trackers in ultralytics/cfg/trackers! Le tue applicazioni e soluzioni del mondo reale potrebbero rivelarsi preziosissime per gli utenti che lavorano su attività di tracciamento.
Contribuendo a questa sezione, aiuti ad ampliare la portata delle soluzioni di tracciamento disponibili all'interno del framework Ultralytics YOLO, aggiungendo un ulteriore livello di funzionalità e utilità per la community.
Per iniziare il tuo contributo, fai riferimento alla nostra Guida ai contributi per istruzioni dettagliate su come inviare una Pull Request (PR) 🛠️. Non vediamo l'ora di scoprire cosa porterai in tavola!
Insieme, miglioriamo le capacità di tracciamento dell'ecosistema Ultralytics YOLO 🙏!
FAQ#
Il tracciamento di oggetti multipli nell'analisi video comporta sia l'identificazione degli oggetti sia il mantenimento di un ID univoco per ciascun oggetto rilevato attraverso i fotogrammi video. Ultralytics YOLO supporta questa operazione fornendo il tracciamento in tempo reale insieme agli ID degli oggetti, facilitando attività come la sorveglianza di sicurezza e l'analisi sportiva. Il sistema utilizza tracker quali BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker e TrackTrack, configurabili tramite file YAML.
No. I file standard di Ultralytics
.ptmemorizzano i pesi del modello YOLO, mentre il tracker viene creato al momento dell'inferenza damodel.track(). Gli ID di tracciamento dipendono dallo stato del tracker su fotogrammi consecutivi, pertanto una singola immagine autonoma può restituire rilevamenti quali riquadri, classi e confidenze, ma non è in grado di produrre autonomamente ID di tracciamento persistenti significativi.Per il deployment, racchiudi insieme il rilevatore e il tracker nella tua applicazione e chiama
model.track()fotogramma per fotogramma conpersist=Truequando i fotogrammi provengono dallo stesso flusso video. Utilizza istanze separate di modello o tracker per flussi non correlati in modo che lo stato non venga propagato tra video diversi.Puoi configurare un tracker personalizzato copiando un file di configurazione del tracker esistente (ad esempio,
custom_tracker.yaml) dalla directory di configurazione del tracker di Ultralytics e modificando i parametri necessari, ad eccezione ditracker_type. Utilizza questo file nel tuo modello di tracciamento in questo modo:Esempiofrom ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Per eseguire il tracciamento degli oggetti su più flussi video contemporaneamente, puoi utilizzare il modulo
threadingdi Python. Ciascun thread gestirà un flusso video separato. Ecco un esempio di come puoi configurarlo:Tracciamento multithreadimport threading import cv2 from ultralytics import YOLO # Define model names and video sources MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for 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 # Create and start tracker threads using a for loop 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() # Wait for all tracker threads to finish for thread in tracker_threads: thread.join() # Clean up and close windows cv2.destroyAllWindows()Il tracciamento di oggetti multipli con Ultralytics YOLO ha numerose applicazioni, tra cui:
- Trasporti: Tracciamento dei veicoli per la gestione del traffico e guida autonoma.
- Retail: Tracciamento delle persone per analisi in-store e sicurezza.
- Acquacoltura: Tracciamento dei pesci per il monitoraggio degli ambienti acquatici.
- Analisi sportiva: Tracciamento 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 video ad alto frame rate in tempo reale con un'accuratezza eccezionale.
Per visualizzare i percorsi degli oggetti su più fotogrammi video, puoi utilizzare le funzionalità di tracciamento del modello YOLO insieme a OpenCV per disegnare i percorsi degli oggetti rilevati. Ecco un esempio di script che lo dimostra:
Tracciamento dei percorsi su più fotogrammi 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 tracerà le linee di tracciamento mostrando i percorsi di movimento degli oggetti tracciati nel corso del tempo, fornendo preziose informazioni sul comportamento e sui pattern degli oggetti.