Suivi multi-objets avec Ultralytics YOLO#
Le suivi d'objets dans le domaine de l'analyse vidéo est une tâche essentielle qui non seulement identifie l'emplacement et la classe des objets dans l'image, mais maintient également un identifiant unique pour chaque objet détecté au fur et à mesure que la vidéo progresse. Les applications sont illimitées, allant de la surveillance et de la sécurité à l'analyse sportive en temps réel.
À partir d'Ultralytics YOLO v8.4.63, OC-SORT, Deep OC-SORT, FastTracker et TrackTrack sont disponibles aux côtés de BoT-SORT et ByteTrack.
Pourquoi choisir Ultralytics YOLO pour le suivi d'objets ?#
Le résultat des traqueurs Ultralytics est cohérent avec la détection d'objets standard, mais offre la valeur ajoutée des ID d'objets. Cela facilite le suivi d'objets dans les flux vidéo et l'exécution d'analyses ultérieures. Voici pourquoi tu devrais envisager d'utiliser Ultralytics YOLO pour tes besoins de suivi d'objets :
- Efficacité : Traite les flux vidéo en temps réel sans compromettre la précision.
- Flexibilité : Prend en charge plusieurs algorithmes et configurations de suivi.
- Facilité d'utilisation : API Python simple et options CLI pour une intégration et un déploiement rapides.
- Personnalisation : Facile à utiliser avec des modèles YOLO entraînés sur mesure, permettant une intégration dans des applications spécifiques à un domaine.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Applications concrètes#
| Transports | Commerce de détail | Aquaculture |
|---|---|---|
| Suivi de véhicules | Suivi de personnes | Suivi de poissons |
Démarrage rapide#
Exécute le suivi sur une vidéo avec le tracker par défaut TrackTrack. Change de tracker en modifiant l'argument 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")Pour exécuter le traqueur sur des flux vidéo, utilise un modèle entraîné Detect, Segment, Pose ou OBB tel que YOLO26n, YOLO26n-seg, YOLO26n-pose ou YOLO26n-obb. Tu peux entraîner des modèles personnalisés localement ou avec l'entraînement cloud d'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 ByteTrackTrackers pris en charge#
Ultralytics YOLO est fourni avec six traqueurs intégrés. Active-le en passant son fichier de configuration YAML à l'argument tracker.
| Tracker | Fichier de config | Modèle de mouvement | Apparence / ReID | Compensation de mouvement de caméra | Gestion des occlusions |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman linéaire | Facultatif (with_reid) | Configurable (gmc_method) | Tampon de suivi + ReID rebinding |
| ByteTrack | bytetrack.yaml | Kalman linéaire | Aucune | Non | Sauvetage à faible confiance en deux étapes |
| OC-SORT | ocsort.yaml | Kalman centré sur l'observation | Aucune | Non | ORU, OCM, OCR ré-actualisation depuis la dernière observation |
| Deep OC-SORT | deepocsort.yaml | Kalman centré sur l'observation | Facultatif (with_reid) | Configurable (gmc_method) | OC-SORT + EMA d'apparence adaptative optionnel |
| FastTracker | fasttrack.yaml | Kalman linéaire + retour en arrière | Aucune | Non | Retour en arrière Kalman + agrandissement de la bbox en cas d'occlusion |
| TrackTrack | tracktrack.yaml | Kalman linéaire (NSA) | Facultatif (with_reid) | Configurable (gmc_method) | Association multi-indices itérative + TAI |
Quel tracker utiliser ?#
Utilise ce flux pour choisir un point de départ ; tracktrack.yaml est utilisé lorsque tu ne passes aucun tracker :
- Besoin de la base de référence la plus rapide et la plus simple ? → ByteTrack (pas de ReID, pas de compensation de mouvement de caméra, surcharge minimale).
- Images de caméra à main, de drone ou en mouvement ? → BoT-SORT (ajoute la compensation du mouvement de la caméra et la ré-identification optionnelle).
- Mouvement non linéaire (sport, danse, virages brusques) et pas de ReID ? → OC-SORT (corrections centrées sur l'observation sans coût d'apparence).
- Scènes encombrées avec caméra en mouvement où les inversions d'ID constituent le principal problème ? → Deep OC-SORT ou TrackTrack (tous deux prennent en charge la correspondance d'apparence optionnelle ; TrackTrack ajoute également une association multi-indices et une suppression d'ID en double).
- Chevauchement partiel fréquent en temps réel, pas de budget ReID ? → FastTracker (variante ByteTrack sensible aux occlusions avec retour en arrière Kalman).
Changement de tracker#
Passe le nom du fichier de configuration du traqueur à tracker=. Tout le reste du code reste inchangé.
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")Configuration#
Arguments de suivi#
La configuration du suivi partage des propriétés avec le mode Predict, telles que conf, iou et show. Pour d'autres configurations, consulte la page du modèle 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)Configuration personnalisée du tracker#
Ultralytics te permet également d'utiliser un fichier de configuration de traqueur modifié. Pour ce faire, fais simplement une copie d'un fichier de configuration de traqueur (par exemple, custom_tracker.yaml) depuis ultralytics/cfg/trackers et modifie les configurations (sauf le tracker_type) selon tes besoins.
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")Arguments de suivi partagés#
Les paramètres suivants sont communs à la plupart des fichiers YAML de suivi ; tous les paramètres ne figurent pas dans chaque configuration :
Les détections supérieures ou égales à track_high_thresh entrent dans la première étape d'association. Les détections situées entre track_low_thresh et track_high_thresh peuvent récupérer des pistes existantes lorsque le tracker sélectionné active l'association à faible confiance, mais elles ne démarrent pas de nouvelles pistes. Les détections inférieures ou égales à track_low_thresh sont ignorées.
| Paramètre | Valeurs valides ou plages | Description |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Spécifie le type de tracker. |
track_high_thresh | 0.0-1.0 | Seuil pour la première association. Affecte le niveau de confiance avec lequel une détection est associée à un suivi existant. |
track_low_thresh | 0.0-1.0 | Limite inférieure pour les détections de récupération à faible confiance. OC-SORT et Deep OC-SORT les utilisent uniquement lorsque use_byte: True ; TrackTrack les inclut dans son bassin d'association pénalisé. |
new_track_thresh | 0.0-1.0 | Seuil pour initialiser un nouveau suivi si la détection ne correspond à aucun suivi existant. |
track_buffer | >=0 | Nombre de frames pendant lesquelles les suivis perdus sont maintenus en vie avant suppression. Une valeur plus élevée signifie une plus grande tolérance aux occlusions. |
match_thresh | 0.0-1.0 | Seuil pour la correspondance des suivis. Des valeurs plus élevées rendent la correspondance plus indulgente. |
fuse_score | True, False | Indique s'il faut fusionner les scores de confiance avec les distances IoU avant la correspondance. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Méthode de compensation du mouvement global. Aide à prendre en compte le mouvement de la caméra. |
proximity_thresh | 0.0-1.0 | IoU minimum requis pour une correspondance ReID valide. Assure une proximité spatiale avant d'utiliser des indices d'apparence. |
appearance_thresh | 0.0-1.0 | Similarité d'apparence normalisée minimale requise pour ReID. |
with_reid | True, False | Active la correspondance basée sur l'apparence pour un meilleur suivi en cas d'occlusions. Pris en charge par BoT-SORT, Deep OC-SORT et TrackTrack. |
model | auto ou chemin de modèle ReID compatible | Modèle ReID. auto utilise les fonctionnalités natives du backbone YOLO lorsqu'elles sont disponibles ; sinon, il se replie sur yolo26n-cls.pt. Un encodeur personnalisé peut être un point de contrôle .pt ou un modèle exporté tel que .torchscript, .onnx, .engine, ou un répertoire de modèles OpenVINO. |
Arguments spécifiques au tracker#
Chaque algorithme expose des options supplémentaires en plus des paramètres partagés. Consulte les sections dédiées à chaque tracker ci-dessous pour obtenir des descriptions et des conseils de réglage, ou reporte-toi directement aux fichiers de configuration :
Activer la ré-identification (ReID)#
Le ReID est désactivé par défaut pour minimiser la surcharge. Active-le en définissant with_reid: True dans un fichier de configuration de traqueur.
Options du modèle ReID :
model: auto— Utilise les caractéristiques natives du détecteur YOLO, ajoutant une surcharge minime. Idéal lorsque tu as besoin d'un certain ReID sans baisse importante des performances. Revient àyolo26n-cls.ptsi le détecteur n'expose pas de caractéristiques compatibles.- Modèle ReID personnalisé — Pointe
model:vers un point de contrôle.ptou un modèle d'embedding exporté compatible, tel que.torchscript,.onnx,.engine, ou un répertoire de modèles OpenVINO. Les modèles exportés sont chargés viaAutoBackendet doivent produire directement un tenseur d'embedding.
Des encodeurs ONNX prêts à l'emploi sont publiés pour chaque taille de modèle. Définis model: sur l'un de ces noms et le fichier sera téléchargé automatiquement lors de la première exécution du traqueur (de la même manière que les poids YOLO sont récupérés) — aucune étape d'exportation ou de téléchargement manuel requise :
# 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| Modèle | taille (pixels) | params (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 |
Seuls les encodeurs ReID ONNX pour la branche d'apparence du traqueur sont actuellement disponibles. Les modes ReID train, val et predict, ainsi que les recettes d'exportation ReID dédiées, sont encore en cours de développement.
Pour de meilleures performances avec un modèle de classification séparé, exporte-le vers un backend plus rapide comme 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)Une fois exporté, indique le chemin du modèle TensorRT dans ta configuration de tracker.
Détails sur les trackers#
Développe les sections ci-dessous pour découvrir la conception, les paramètres spécifiques et les conseils de réglage de chaque tracker.
BoT-SORT#
BoT-SORT (Aharon et al., 2022) étend ByteTrack avec la compensation du mouvement de la caméra et la ré-identification optionnelle :
- Compensation du mouvement de la caméra (CMC) : une déformation affine estimée à chaque image (flux optique épars par défaut ; ORB / ECC également disponibles) est appliquée aux états de Kalman avant la mise en correspondance IoU.
- ReID facultatif : les embeddings d'apparence peuvent être fusionnés dans la matrice des coûts. Désactivé par défaut ; active-le avec
with_reid: True.
Idéal pour : le suivi à usage général, surtout avec des caméras mobiles. N'ajoute la ReID que lorsque des foules aux apparences similaires provoquent des échanges d'ID.
Arguments spécifiques à BoT-SORT :
| Paramètre | Valeurs valides ou plages | Description |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend de compensation du mouvement de la caméra. sparseOptFlow est le choix par défaut. none désactive le CMC. |
with_reid | True, False | Active la correspondance basée sur l'apparence. Désactivé par défaut. |
model | auto ou chemin de modèle ReID compatible | auto utilise les fonctionnalités natives de YOLO lorsqu'elles sont disponibles ; les modèles personnalisés peuvent être des points de contrôle .pt ou des exportations compatibles. |
proximity_thresh | 0.0-1.0 | IoU minimum avant que les caractéristiques d'apparence ne soient prises en compte. |
appearance_thresh | 0.0-1.0 | Similarité d'apparence normalisée minimale requise pour une correspondance ReID. Augmente pour rendre la correspondance plus stricte. |
Conseils de réglage :
- Caméra fixe : définis
gmc_method: nonepour économiser quelques ms/image. - Mouvement important de la caméra : conserve
sparseOptFlow;eccest plus précis mais plus lent. - Foules similaires : active
with_reid: Trueet augmenteappearance_thresh(par exemple,0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) est la ligne de base légère. Il utilise Kalman linéaire + IoU avec une association en deux étapes :
- Étape 1 : fait correspondre les détections à score élevé avec les pistes actives.
- Étape 2 : réessaye avec les pistes non appariées contre les détections à faible score pour récupérer après une brève occlusion partielle.
Il n'y a pas de modèle d'apparence ni de compensation de mouvement de la caméra.
Idéal pour : les caméras statiques ou quasi statiques où le coût du détecteur prédomine et où tu souhaites une surcharge de suivi minimale.
Arguments spécifiques à ByteTrack : Aucun en dehors des arguments de traqueur partagés.
Conseils de réglage :
- Détecteur bruyant : diminue
track_low_threshpour que la deuxième étape ait plus de candidats. - Détecteur à haut rappel : augmente
track_high_threshpour réduire les identifiants fragmentés. - Scintillement fréquent des identifiants : augmente
track_bufferpour que les pistes brièvement manquées survivent.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023) est une extension axée sur l'observation de SORT. Il conserve la conception légère de SORT (pas de caractéristiques d'apparence) et ajoute trois corrections :
- Ré-actualisation centrée sur l'observation (ORU) : rejoue une trajectoire virtuelle entre la dernière observation et la détection actuelle, en relançant la mise à jour de Kalman pour corriger la dérive de vitesse.
- Momentum centré sur l'observation (OCM) : pénalise les détections se déplaçant dans la mauvaise direction via un terme de cohérence de vitesse.
- Récupération centrée sur l'observation (OCR) : revérifie les détections non appariées par rapport aux pistes récemment perdues en utilisant leur dernière observation plutôt que l'état prédit.
Idéal pour : le mouvement non linéaire sans le coût d'un modèle ReID.
Arguments spécifiques à OC-SORT :
| Paramètre | Valeurs valides ou plages | Description |
|---|---|---|
delta_t | >=1 | Fenêtre temporelle (images) pour le calcul de la direction de la vitesse dans OCM. Des valeurs plus grandes lissent davantage. |
inertia | 0.0-1.0 | Poids du coût de cohérence de la vitesse. Des valeurs plus élevées pénalisent les changements de direction soudains. |
use_byte | True, False | Active un deuxième passage d'association de type ByteTrack sur les détections à faible confiance. |
Conseils de réglage :
- Mouvement non linéaire : augmente
inertia(par exemple,0.3-0.4). - Détections éparses : active
use_byte: True. - Occlusions longues : augmente
track_bufferpour que l'OCR ait plus de pistes perdues à réassocier.
Avec les modèles OBB, OCR utilise la boîte orientée prédite par le filtre de Kalman car un historique d'observation précédente orienté n'est pas conservé.
Deep OC-SORT#
Deep OC-SORT complète OC-SORT avec des informations d'apparence et une compensation du mouvement de la caméra :
- Correspondance d'apparence : la distance d'embedding cosinus est filtrée par le chevauchement et fusionnée avec le coût de mouvement.
- EMA d'apparence dynamique : les embeddings de piste se mettent à jour avec une EMA dont le facteur de lissage s'adapte à la confiance de détection.
- Compensation du mouvement de la caméra : les états de Kalman sont déformés image par image via un flux optique épars, ORB ou ECC.
Idéal pour : les scènes bondées ou à caméra mobile où les échanges d'ID entre des objets visuellement différents mais spatialement proches sont courants.
Arguments spécifiques à Deep OC-SORT :
| Paramètre | Valeurs valides ou plages | Description |
|---|---|---|
with_reid | True, False | Active la correspondance basée sur l'apparence. Désactivé par défaut. |
model | auto ou chemin de modèle ReID compatible | auto utilise les fonctionnalités natives de YOLO lorsqu'elles sont disponibles ; les modèles personnalisés peuvent être des points de contrôle .pt ou des exportations compatibles. |
proximity_thresh | 0.0-1.0 | IoU minimum avant que les caractéristiques d'apparence ne soient prises en compte. |
appearance_thresh | 0.0-1.0 | Similarité d'apparence normalisée minimale requise pour une correspondance ReID. |
alpha_fixed_emb | 0.0-1.0 | Facteur EMA de base pour les mises à jour des embeddings de piste. Des valeurs plus élevées préservent l'ancien embedding plus longtemps. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Méthode globale de compensation de mouvement. |
delta_t | >=1 | Fenêtre temporelle (images) pour le calcul de la direction de la vitesse dans OCM (hérité d'OC-SORT). |
inertia | 0.0-1.0 | Poids du coût de cohérence de la vitesse (hérité d'OC-SORT). |
use_byte | True, False | Active une deuxième association de type ByteTrack sur les détections à faible confiance (hérité d'OC-SORT). |
Conseils de réglage :
- Inversions d'ID dans les foules : augmente
appearance_thresh(par exemple0.92-0.95) et augmentealpha_fixed_embpour que les embeddings s'adaptent plus lentement. - Caméra en mouvement : définis
gmc_method: sparseOptFlow(Deep OC-SORT utilisenonepar défaut). - Faible latence : conserve
with_reid: False(par défaut) pour le mouvement + CMC uniquement ; n'active le ReID que lorsque les échanges d'identifiants dominent les erreurs.
FastTracker#
FastTracker est une variante de ByteTrack consciente des occlusions sans modèle d'apparence :
- Détection d'occlusion : marque les pistes comme occluses lorsque la couverture par d'autres pistes actives dépasse
occ_cover_thresh. - Retour en arrière de Kalman lors d'une occlusion : ramène l'état de Kalman à une image pré-occlusion en utilisant un historique en anneau.
- Atténuation du mouvement et expansion de la recherche : la vitesse est amortie et la bbox prédite est agrandie pendant l'occlusion.
- Suppression Init-IoU : empêche les nouvelles pistes de se créer au-dessus des pistes actives.
Idéal pour : les pipelines en temps réel dédiés à la détection avec des chevauchements fréquents de cibles (foules, files d'attente, sports).
Arguments spécifiques à FastTracker :
| Paramètre | Valeurs valides ou plages | Description |
|---|---|---|
reset_velocity_offset_occ | >=0 | Images d'historique en arrière pour restaurer la vitesse de Kalman au début de l'occlusion. |
reset_pos_offset_occ | >=0 | Images d'historique en arrière pour restaurer la position de Kalman au début de l'occlusion. |
enlarge_bbox_occ | >=1.0 | Mise à l'échelle de la hauteur appliquée à la bbox prédite pendant l'occlusion (la largeur s'ajuste via le rapport d'aspect XYAH). |
dampen_motion_occ | 0.0-1.0 | Multiplicateur de vitesse pendant l'occlusion. Des valeurs plus faibles font "ralentir" la piste lors de l'occlusion. |
active_occ_to_lost_thresh | >=1 | Nombre maximal d'images occluses consécutives avant qu'une piste active ne soit déplacée vers "perdue". |
occ_cover_thresh | 0.0-1.0 | Fraction de la zone d'une trace couverte par une autre trace active pour déclarer une occlusion. |
occ_reappear_window | >=0 | Nombre de frames pendant lesquelles une trace perdue récemment occluse reste préférentiellement retrouvable. |
init_iou_suppress | 0.0-1.0 | Supprime l'initialisation d'une nouvelle piste si son IoU avec n'importe quelle piste active dépasse cette valeur. Définis sur 1.0 pour désactiver. |
Conseils de réglage :
- Occlusions partielles fréquentes : diminue
occ_cover_thresh(par exemple,0.5-0.6). - Identifiants en double autour du chevauchement : diminue
init_iou_suppress(par exemple,0.5). - Occlusions longues : augmente
occ_reappear_windowettrack_bufferensemble. - Cibles en mouvement rapide : augmente
dampen_motion_occ(plus près de1.0) ; augmenteenlarge_bbox_occuniquement lorsqu'une région de recherche plus large améliore la récupération.
TrackTrack#
TrackTrack (Shim et al., CVPR 2025) est le tracker par défaut. Il raisonne du point de vue de chaque trace avec une association itérative multi-indice :
- Association basée sur la perspective de suivi (TPA) : combine HMIoU, la distance ReID cosinus optionnelle, la distance de projection de confiance et la distance d'angle de coin. L'affectation est résolue de manière itérative avec un seuil assoupli.
- Initialisation consciente des traces (TAI) : supprime les apparitions en double avant la création d'un nouvel identifiant.
Idéal pour : les scènes bondées avec des occlusions fréquentes où les identifiants en double posent problème.
Arguments spécifiques à TrackTrack :
| Paramètre | Valeurs valides ou plages | Description |
|---|---|---|
iou_weight | 0.0-1.0 | Poids de la distance HMIoU lorsque ReID est activé ; sinon, HMIoU est utilisé directement. |
reid_weight | 0.0-1.0 | Poids de la distance ReID cosinus lorsque ReID est activé ; sinon, il est ignoré. |
conf_weight | 0.0-1.0 | Poids de la distance de projection de confiance. |
angle_weight | 0.0-1.0 | Poids de la distance d'angle de coin. |
penalty_p | 0.0-1.0 | Pénalité de coût pour les détections à faible confiance. |
penalty_q | 0.0-1.0 | Pénalité de coût pour les détections récupérées par NMS secondaire. |
reduce_step | 0.0-1.0 | Relaxation du seuil de correspondance par itération. |
tai_thr | 0.0-1.0 | Seuil IoU pour le NMS d'initialisation consciente des traces. |
min_track_len | >=0 | Longueur d'historique minimale avant qu'une nouvelle piste ne soit confirmée. |
lost_match_thr | 0.0-1.0 | Barrière de coût plus souple pour la passe de réassociation assouplie des éléments perdus ; 0 la désactive. |
with_reid | True, False | Active la correspondance d'apparence ReID cosinus (utilise les fonctionnalités natives de YOLO). Désactivé par défaut. |
model | auto ou chemin de modèle ReID compatible | auto utilise les fonctionnalités natives de YOLO lorsqu'elles sont disponibles ; les modèles personnalisés peuvent être des points de contrôle .pt ou des exportations compatibles. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Méthode globale de compensation de mouvement. |
Conseils de réglage :
- Piétons en foule : diminue
tai_thr(par exemple,0.45) pour supprimer davantage de duplications ; augmentetrack_bufferpour des occlusions plus longues. - Mouvement rapide de la caméra : garde
gmc_method: sparseOptFlowactivé. - Petits objets / objets rapides : augmente légèrement
angle_weightet diminuemin_track_len. - Active ReID uniquement si nécessaire : cela ajoute un coût d'inférence ; pour les occlusions courtes, le coût multi-indices par défaut est généralement suffisant.
Avec les modèles Segment et Pose, TrackTrack ignore la récupération de détection NMS lâche afin que les masques et les points clés restent alignés avec leurs détections.
Exemples Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Boucle de persistance des traces#
Voici un script Python utilisant OpenCV (cv2) et YOLO26 pour exécuter le suivi d'objets sur des images vidéo. Ce script suppose que les paquets nécessaires (opencv-python et ultralytics) sont déjà installés. L'argument persist=True indique au traqueur que l'image ou la trame actuelle est la suivante dans une séquence et qu'il doit s'attendre à retrouver les pistes de l'image précédente dans l'image actuelle.
Utilise persist=True uniquement lors du passage de trames consécutives provenant du même flux vidéo à model.track(). Cela permet au traqueur de réutiliser l'état des trames précédentes et de maintenir des identifiants de piste cohérents au fil du temps. N'utilise pas persist=True sur des images non apparentées ou un flux différent, car l'état de la piste précédente pourrait être reporté.
Tu peux également choisir un backend de traqueur en passant un fichier de configuration de traqueur, tel que tracker="botsort.yaml", tracker="bytetrack.yaml" ou 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()Veuillez noter le passage de model(frame) à model.track(frame), qui permet le suivi d'objets au lieu d'une simple détection. Ce script modifié exécutera le traqueur sur chaque image de la vidéo, visualisera les résultats et les affichera dans une fenêtre. La boucle peut être quittée en appuyant sur 'q'.
Tracer les trajectoires dans le temps#
Visualiser les traces d'objets sur des frames consécutives peut fournir des informations précieuses sur les modèles de mouvement et le comportement des objets détectés au sein d'une vidéo. Avec Ultralytics YOLO26, tracer ces trajectoires est un processus fluide et efficace.
Dans l'exemple suivant, nous montrons comment utiliser les capacités de suivi de YOLO26 pour tracer le mouvement des objets détectés à travers plusieurs frames vidéo. Ce script implique l'ouverture d'un fichier vidéo, sa lecture frame par frame, et l'utilisation du modèle YOLO pour identifier et suivre divers objets. En conservant les points centraux des boîtes englobantes détectées et en les connectant, nous pouvons dessiner des lignes qui représentent les chemins suivis par les objets suivis.
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()Suivi multi-thread#
Le suivi multi-thread offre la capacité d'exécuter le suivi d'objets sur plusieurs flux vidéo simultanément. Ceci est particulièrement utile lors du traitement de multiples entrées vidéo, comme depuis plusieurs caméras de surveillance, où le traitement simultané peut grandement améliorer l'efficacité et la performance.
Dans le script Python fourni, nous utilisons le module Python threading pour exécuter plusieurs instances du traqueur simultanément. Chaque thread est responsable de l'exécution du traqueur sur un fichier vidéo, et tous les threads s'exécutent en même temps en arrière-plan.
Pour s'assurer que chaque thread reçoit les bons paramètres (le fichier vidéo, le modèle à utiliser et l'indice du fichier), nous définissons une fonction run_tracker_in_thread qui accepte ces paramètres et contient la boucle de suivi principale. Cette fonction lit la vidéo image par image, exécute le traqueur et affiche les résultats.
Deux modèles différents sont utilisés dans cet exemple : yolo26n.pt et yolo26n-seg.pt, chacun suivant des objets dans un fichier vidéo différent. Les fichiers vidéo sont spécifiés dans SOURCES.
Le paramètre daemon=True dans threading.Thread signifie que ces threads seront fermés dès que le programme principal se terminera. Nous démarrons ensuite les threads avec start() et utilisons join() pour faire attendre le thread principal jusqu'à ce que les deux threads du traqueur aient terminé.
Enfin, une fois que tous les threads ont terminé leur tâche, les fenêtres affichant les résultats sont fermées à l'aide de 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()Cet exemple peut être facilement étendu pour gérer davantage de fichiers vidéo et de modèles en créant plus de threads et en appliquant la même méthodologie.
Contribuer à de nouveaux trackers#
Tu maîtrises le suivi multi-objets et tu as réussi à mettre en œuvre ou à adapter un algorithme de suivi avec Ultralytics YOLO ? Nous t'invitons à contribuer à notre section Trackers dans ultralytics/cfg/trackers ! Tes applications et solutions du monde réel pourraient s'avérer inestimables pour les utilisateurs travaillant sur des tâches de suivi.
En contribuant à cette section, tu aides à élargir la portée des solutions de suivi disponibles au sein du framework Ultralytics YOLO, ajoutant une couche supplémentaire de fonctionnalité et d'utilité pour la communauté.
Pour initier ta contribution, consulte notre Guide de contribution pour obtenir des instructions complètes sur la soumission d'une Pull Request (PR) 🛠️. Nous avons hâte de voir ce que tu as à offrir !
Ensemble, améliorons les capacités de suivi de l'écosystème Ultralytics YOLO 🙏 !
FAQ#
Le suivi multi-objets dans l'analyse vidéo implique à la fois l'identification des objets et le maintien d'un identifiant unique pour chaque objet détecté à travers les images vidéo. Ultralytics YOLO prend en charge cela en fournissant un suivi en temps réel ainsi que des identifiants d'objets, facilitant des tâches telles que la surveillance de sécurité et l'analyse sportive. Le système utilise des traqueurs tels que BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker et TrackTrack, qui peuvent être configurés via des fichiers YAML.
Non. Les fichiers
.ptstandard d'Ultralytics stockent les poids du modèle YOLO, tandis que le traqueur est créé au moment de l'inférence parmodel.track(). Les identifiants de suivi dépendent de l'état du traqueur sur des images consécutives, de sorte qu'une seule image isolée peut renvoyer des détections telles que des boîtes, des classes et des confidences, mais elle ne peut pas produire par elle-même des identifiants de suivi persistants significatifs.Pour le déploiement, regroupe le détecteur et le traqueur dans ton application et appelle
model.track()image par image avecpersist=Truelorsque les images proviennent du même flux vidéo. Utilise des instances de modèle ou de traqueur distinctes pour les flux non apparentés afin que l'état ne soit pas reporté d'une vidéo à l'autre.Pour exécuter le suivi d'objets sur plusieurs flux vidéo simultanément, tu peux utiliser le module Python
threading. Chaque thread gérera un flux vidéo distinct. Voici un exemple de la façon dont tu peux configurer cela :Suivi multi-threadimport 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()Le suivi multi-objets avec Ultralytics YOLO a de nombreuses applications, notamment :
- Transport : Suivi de véhicules pour la gestion du trafic et la conduite autonome.
- Commerce de détail : Suivi de personnes pour l'analyse en magasin et la sécurité.
- Aquaculture : Suivi de poissons pour la surveillance d'environnements aquatiques.
- Analyse sportive : Suivi des joueurs et de l'équipement pour l'analyse de performance.
- Systèmes de sécurité : Surveillance d'activités suspectes et création d'alarmes de sécurité.
Ces applications bénéficient de la capacité d'Ultralytics YOLO à traiter des vidéos à haut taux de rafraîchissement en temps réel avec une précision exceptionnelle.
Pour visualiser les trajectoires d'objets sur plusieurs frames vidéo, tu peux utiliser les fonctionnalités de suivi du modèle YOLO avec OpenCV pour dessiner les chemins des objets détectés. Voici un exemple de script qui démontre cela :
Tracer les trajectoires sur plusieurs frames vidéofrom 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: results = model.track(frame, persist=True) boxes = results[0].boxes.xywh.cpu() track_ids = results[0].boxes.id.int().cpu().tolist() annotated_frame = results[0].plot() 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()Ce script tracera les lignes de suivi montrant les chemins de mouvement des objets suivis au fil du temps, fournissant des informations précieuses sur le comportement et les modèles des objets.
Tu peux configurer un traqueur personnalisé en copiant un fichier de configuration de traqueur existant (par exemple,
custom_tracker.yaml) du répertoire de configuration des traqueurs Ultralytics et en modifiant les paramètres selon tes besoins, à l'exception detracker_type. Utilise ce fichier dans ton modèle de suivi comme ceci :