Suivi multi-objets avec Ultralytics YOLO#
Dans le domaine de l'analyse vidéo, le suivi d'objets est une tâche essentielle : il permet non seulement d'identifier l'emplacement et la classe des objets dans l'image, mais aussi de conserver un ID unique pour chaque objet détecté au fil de la vidéo. Les possibilités sont illimitées, de la surveillance et de la sécurité à l'analyse sportive en temps réel.
Consulte l'aperçu non publié de YOLO27 pour découvrir les fonctionnalités de suivi prévues.
Depuis ultralytics 8.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 ?#
Les sorties des trackers Ultralytics sont cohérentes avec la détection d'objets standard, mais elles ajoutent des ID d'objet. Le suivi des objets dans les flux vidéo et la réalisation d'analyses ultérieures en sont ainsi simplifiés. Voici pourquoi tu devrais envisager Ultralytics YOLO pour tes besoins en 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 et options CLI simples pour une intégration et un déploiement rapides.
- Personnalisation : facile à utiliser avec des modèles YOLO entraînés sur mesure, ce qui permet leur intégration dans des applications spécifiques à un domaine.
Regarder : Comment effectuer le suivi multi-objets avec Ultralytics YOLO26 | BoT-SORT et ByteTrack | VisionAI 🚀
Applications concrètes#
| Transport | Commerce de détail | Aquaculture |
|---|---|---|
| Suivi des véhicules | Suivi des personnes | Suivi des poissons |
Démarrage rapide#
Lance le suivi sur une vidéo avec le tracker TrackTrack par défaut. Pour utiliser un autre tracker, modifie l'argument tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Tracker par défaut (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Passer à ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")Pour lancer le tracker sur des flux vidéo, utilise un modèle Detect, Segment, Pose ou OBB entraîné, comme YOLO26n, YOLO26n-seg, YOLO26n-pose ou YOLO26n-obb. Tu peux entraîner des modèles personnalisés en local ou avec l'entraînement dans le cloud de la plateforme Ultralytics.
from ultralytics import YOLO
# Charger un modèle officiel ou personnalisé
model = YOLO("yolo26n.pt") # Charger un modèle Detect officiel
model = YOLO("yolo26n-seg.pt") # Charger un modèle Segment officiel
model = YOLO("yolo26n-pose.pt") # Charger un modèle Pose officiel
model = YOLO("path/to/best.pt") # Charger un modèle entraîné sur mesure
# Effectuer le suivi avec le modèle
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Suivi avec le tracker par défaut
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # avec ByteTrackTrackers pris en charge#
Ultralytics YOLO est fourni avec six trackers intégrés. Active l'un d'eux en passant son fichier de configuration YAML à l'argument tracker.
| Tracker | Fichier de configuration | Modèle de mouvement | Apparence / ReID | Compensation du mouvement de la caméra | Gestion des occultations |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman linéaire | Facultatif (with_reid) | Configurable (gmc_method) | Tampon de suivi + réassociation ReID |
| ByteTrack | bytetrack.yaml | Kalman linéaire | Aucun | Non | Récupération en deux étapes des détections à faible confiance |
| OC-SORT | ocsort.yaml | Kalman centré sur les observations | Aucun | Non | Mise à jour ORU, OCM, OCR à partir de la dernière observation |
| Deep OC-SORT | deepocsort.yaml | Kalman centré sur les observations | Facultatif (with_reid) | Configurable (gmc_method) | OC-SORT + EMA d'apparence adaptative facultative |
| FastTracker | fasttrack.yaml | Kalman linéaire + retour arrière | Aucun | Non | Retour arrière de Kalman + agrandissement de bbox en cas d'occultation |
| TrackTrack | tracktrack.yaml | Kalman linéaire (NSA) | Facultatif (with_reid) | Configurable (gmc_method) | Association itérative multicritère + TAI |
Quel tracker choisir ?#
Suis ce parcours pour choisir un point de départ ; tracktrack.yaml est utilisé si tu ne passes pas tracker :
- Tu as besoin d'une solution de base rapide et simple ? → ByteTrack (pas de ReID, pas de compensation du mouvement de la caméra, surcharge minimale).
- Images filmées à la main, par drone ou avec une caméra en mouvement ? → BoT-SORT (ajoute la compensation du mouvement de la caméra et la ReID facultative).
- Mouvement non linéaire (sports, danse, virages brusques) et pas de ReID ? → OC-SORT (corrections centrées sur les observations, sans coût lié à l'apparence).
- Scènes encombrées filmées avec une caméra en mouvement, où les changements d'ID sont le principal problème ? → Deep OC-SORT ou TrackTrack (les deux prennent en charge la mise en correspondance facultative des apparences ; TrackTrack ajoute aussi l'association multicritère et la suppression des ID en double).
- Chevauchements partiels fréquents en temps réel, sans budget pour la ReID ? → FastTracker (variante de ByteTrack sensible aux occultations, avec retour arrière de Kalman).
Changer de tracker#
Passe le nom du fichier de configuration du tracker à tracker=. Tout le reste du code reste identique.
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, comme conf, iou et show. Pour configurer davantage le modèle, consulte la page Predict.
from ultralytics import YOLO
# Configure les paramètres de suivi et lance le 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 tracker modifié. Pour ce faire, copie simplement un fichier de configuration de tracker (par exemple, custom_tracker.yaml) depuis ultralytics/cfg/trackers, puis modifie les configurations de ton choix (à l'exception de tracker_type) selon tes besoins.
from ultralytics import YOLO
# Charge le modèle et lance le tracker avec un fichier de configuration personnalisé
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Arguments communs aux trackers#
Les paramètres suivants sont communs à la plupart des fichiers YAML de tracker ; ils ne figurent pas tous dans chaque configuration :
Les détections dont la valeur est supérieure ou égale à track_high_thresh passent à la première étape d'association. Les détections dont la valeur se situe entre track_low_thresh et track_high_thresh peuvent récupérer des pistes existantes si le tracker sélectionné active l'association à faible confiance, mais elles ne démarrent pas de nouvelles pistes. Les détections dont la valeur est inférieure ou égale à track_low_thresh sont ignorées.
| Paramètre | Valeurs ou plages autorisées | Description |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Indique le type de tracker. |
track_high_thresh | 0.0-1.0 | Seuil de la première association. Il détermine le niveau de confiance requis pour associer une détection à une piste existante. |
track_low_thresh | 0.0-1.0 | Borne 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 ensemble d’associations avec pénalité. |
new_track_thresh | 0.0-1.0 | Seuil pour initialiser une nouvelle piste si la détection ne correspond à aucune piste existante. |
track_buffer | >=0 | Nombre d’images pendant lequel les pistes perdues restent actives avant d’être supprimées. Une valeur plus élevée tolère davantage les occultations. |
match_thresh | 0.0-1.0 | Seuil d’association des pistes. Des valeurs plus élevées rendent l’association moins stricte. |
fuse_score | True, False | Indique s’il faut combiner les scores de confiance avec les distances IoU avant l’association. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Méthode de compensation du mouvement global. Elle permet de prendre en compte les mouvements de la caméra. |
proximity_thresh | 0.0-1.0 | IoU minimale requise pour qu’une association ReID soit valide. Elle garantit une proximité spatiale avant la prise en compte des caractéristiques d’apparence. |
appearance_thresh | 0.0-1.0 | Similarité d’apparence normalisée minimale requise pour ReID. |
with_reid | True, False | Active l’association basée sur l’apparence pour améliorer le suivi en cas d’occultation. Cette fonctionnalité est prise en charge par BoT-SORT, Deep OC-SORT et TrackTrack. |
model | auto ou chemin vers un modèle ReID compatible | Modèle ReID. auto utilise les caractéristiques natives du backbone YOLO lorsqu’elles sont disponibles ; sinon, il se rabat sur yolo26n-cls.pt. Un encodeur personnalisé peut être un checkpoint .pt ou un modèle exporté, tel que .torchscript, .onnx, .engine, ou un répertoire de modèle OpenVINO. |
Arguments propres aux trackers#
Chaque algorithme expose des paramètres supplémentaires en plus des paramètres communs. Consulte les sections consacrées à chaque tracker ci-dessous pour connaître les descriptions et les conseils de réglage, ou consulte directement les fichiers de configuration :
Activation de la ré-identification (ReID)#
ReID est désactivé par défaut afin de limiter la surcharge. Active-le en définissant with_reid: True dans un fichier de configuration du tracker.
Options de modèle ReID :
model: auto— Utilise les caractéristiques natives du détecteur YOLO, avec une surcharge minimale. Idéal si tu as besoin d’un peu de ReID sans trop dégrader les performances. Se rabat suryolo26n-cls.ptsi le détecteur n’expose pas de caractéristiques compatibles.- Modèle ReID personnalisé — Indique un checkpoint
.ptou un modèle d’embedding exporté compatible, tel que.torchscript,.onnx,.engine, ou un répertoire de modèle OpenVINO, pourmodel:. 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 : le fichier est téléchargé automatiquement à la première exécution du tracker, comme les poids YOLO — aucune exportation ni aucun téléchargement manuel n’est nécessaire :
# 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) | paramètres (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 destinés à la branche d’apparence du tracker sont actuellement disponibles. Les modes ReID train, val et predict, ainsi que les recettes dédiées à l’exportation ReID, sont encore en cours de développement.
Pour de meilleures performances avec un modèle de classification distinct, exporte-le vers un backend plus rapide comme TensorRT :
from torch import nn
from ultralytics import YOLO
# Charger le modèle de classification
model = YOLO("yolo26n-cls.pt")
# Ajouter une couche de pooling moyen
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
# Exporter vers TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)Une fois l’exportation terminée, indique le chemin du modèle TensorRT dans la configuration de ton tracker.
Détails des trackers#
Les sections ci-dessous décrivent la conception de chaque tracker, ses paramètres spécifiques et des conseils de réglage.
Regarder : Quel traqueur d’objets est le plus performant ? | Vitesse, FPS et stabilité des identifiants | Ultralytics YOLO26 📊
BoT-SORT#
BoT-SORT (Aharon et al., 2022) étend ByteTrack avec la compensation du mouvement de la caméra et la prise en charge facultative de ReID :
- Compensation du mouvement de la caméra (CMC) : une transformation affine estimée à chaque image (flux optique épars par défaut ; ORB / ECC également disponibles) est appliquée aux états de Kalman avant l’association IoU.
- ReID facultatif : les embeddings d’apparence peuvent être combinés à la matrice de coûts. La fonctionnalité est désactivée par défaut ; active-la avec
with_reid: True.
Idéal pour : le suivi généraliste, en particulier avec des caméras mobiles. N’ajoute ReID que si des foules de personnes qui se ressemblent provoquent des changements d’ID.
Arguments propres à BoT-SORT :
| Paramètre | Valeurs ou plages autorisées | Description |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend de compensation du mouvement de la caméra. sparseOptFlow est la valeur par défaut. none désactive la CMC. |
with_reid | True, False | Active l’association basée sur l’apparence. Désactivée par défaut. |
model | auto ou chemin vers un modèle ReID compatible | auto utilise les caractéristiques natives de YOLO lorsqu’elles sont disponibles ; les modèles personnalisés peuvent être des checkpoints .pt ou des exportations compatibles. |
proximity_thresh | 0.0-1.0 | IoU minimale requise avant la prise en compte des caractéristiques d’apparence. |
appearance_thresh | 0.0-1.0 | Similarité d’apparence normalisée minimale requise pour une association ReID. Augmente cette valeur pour rendre l’association plus stricte. |
Conseils de réglage :
- Caméra fixe : définis
gmc_method: nonepour économiser quelques ms/image. - Mouvements importants de la caméra : conserve
sparseOptFlow;eccest plus précis, mais plus lent. - Foules de personnes qui se ressemblent : active
with_reid: Trueet augmenteappearance_thresh(par ex.0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) est le modèle de référence léger. Il combine un filtre de Kalman linéaire et l’IoU dans une association en deux étapes :
- Étape 1 : associer les détections à score élevé aux pistes actives.
- Étape 2 : réessayer d’associer les pistes non appariées aux détections à score faible pour les récupérer après une brève occultation partielle.
Il n’y a ni modèle d’apparence ni compensation du mouvement de la caméra.
Idéal pour : les caméras fixes ou presque fixes lorsque le coût du détecteur prédomine et que tu veux réduire au minimum la surcharge du tracker.
Arguments propres à ByteTrack : aucun en dehors des arguments communs aux trackers.
Conseils de réglage :
- Détecteur bruité : diminue
track_low_threshpour que la deuxième étape dispose de davantage de candidats. - Détecteur à fort rappel : augmente
track_high_threshpour réduire la fragmentation des ID. - Scintillement fréquent des ID : augmente
track_bufferpour que les pistes manquées brièvement restent actives.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023) est une extension de SORT centrée sur les observations. Elle conserve la conception légère de SORT (sans 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 recalculant la mise à jour de Kalman pour corriger la dérive de la vitesse.
- Inertie centrée sur l’observation (OCM) : pénalise les détections qui se déplacent dans la mauvaise direction à l’aide d’un terme de cohérence de la vitesse.
- Récupération centrée sur l’observation (OCR) : vérifie à nouveau les détections non appariées par rapport aux pistes récemment perdues, en s’appuyant sur leur dernière observation plutôt que sur l’état prédit.
Idéal pour : les mouvements non linéaires sans le coût d’un modèle ReID.
Arguments propres à OC-SORT :
| Paramètre | Valeurs ou plages autorisées | Description |
|---|---|---|
delta_t | >=1 | Fenêtre temporelle (en images) utilisée pour calculer la direction de la vitesse dans OCM. Des valeurs plus élevées lissent davantage le résultat. |
inertia | 0.0-1.0 | Poids du coût de cohérence de la vitesse. Des valeurs plus élevées pénalisent les changements brusques de direction. |
use_byte | True, False | Active une deuxième passe d’association de type ByteTrack sur les détections à faible confiance. |
Conseils de réglage :
- Mouvement non linéaire : augmente
inertia(par ex.0.3-0.4). - Détections éparses : active
use_byte: True. - Longues occultations : augmente
track_bufferpour que l’OCR dispose de davantage de pistes perdues à réassocier.
Avec les modèles OBB, l’OCR utilise la boîte orientée prédite par Kalman, car l’historique de la dernière observation orientée n’est pas conservé.
Deep OC-SORT#
Deep OC-SORT enrichit OC-SORT avec des informations d’apparence et la compensation du mouvement de la caméra :
- Association basée sur l’apparence : la distance des embeddings cosinus est filtrée selon le chevauchement, puis combinée au coût du mouvement.
- EMA d’apparence dynamique : les embeddings des pistes sont mis à jour avec une EMA dont le facteur de lissage s’adapte à la confiance de la détection.
- Compensation du mouvement de la caméra : les états de Kalman sont recalés d’une image à l’autre à l’aide du flux optique épars, d’ORB ou d’ECC.
Idéal pour : les scènes encombrées ou filmées par une caméra mobile, où les changements d’ID entre des objets visuellement différents mais spatialement proches sont fréquents.
Arguments propres à Deep OC-SORT :
| Paramètre | Valeurs ou plages autorisées | Description |
|---|---|---|
with_reid | True, False | Active l’association basée sur l’apparence. Désactivée par défaut. |
model | auto ou chemin vers un modèle ReID compatible | auto utilise les caractéristiques natives de YOLO lorsqu’elles sont disponibles ; les modèles personnalisés peuvent être des checkpoints .pt ou des exportations compatibles. |
proximity_thresh | 0.0-1.0 | IoU minimale requise avant la prise en compte des caractéristiques d’apparence. |
appearance_thresh | 0.0-1.0 | Similarité d’apparence normalisée minimale requise pour une association ReID. |
alpha_fixed_emb | 0.0-1.0 | Facteur EMA de base pour la mise à jour des embeddings des pistes. Des valeurs plus élevées préservent plus longtemps l’ancien embedding. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Méthode de compensation du mouvement global. |
delta_t | >=1 | Fenêtre temporelle (en images) utilisée pour calculer la direction de la vitesse dans OCM (héritée 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ée d’OC-SORT). |
Conseils de réglage :
- Changements d’identité dans les foules : augmente
appearance_thresh(par ex.0.92-0.95) et augmentealpha_fixed_embpour que les embeddings s’adaptent plus lentement. - Caméra mobile : définis
gmc_method: sparseOptFlow(Deep OC-SORT utilisenonepar défaut). - Latence réduite : conserve
with_reid: False(valeur par défaut) pour le mouvement et la CMC uniquement ; n’active ReID que si les changements d’ID sont la principale source d’erreurs.
FastTracker#
FastTracker est une variante de ByteTrack qui tient compte des occultations et n’utilise pas de modèle d’apparence :
- Détection des occultations : marque les pistes comme occultées lorsque la couverture par d’autres pistes actives dépasse
occ_cover_thresh. - Retour arrière de Kalman en cas d’occultation : restaure l’état de Kalman à une image antérieure à l’occultation en s’appuyant sur l’historique conservé dans un tampon circulaire.
- Atténuation du mouvement et élargissement de la zone de recherche : la vitesse est atténuée et la bbox prédite est agrandie pendant l’occultation.
- Suppression par IoU à l’initialisation : empêche la création de nouvelles pistes par-dessus des pistes actives.
Idéal pour : les pipelines de détection en temps réel sans étape de suivi dédiée, où les cibles se chevauchent fréquemment (foules, files d’attente, sport).
Arguments propres à FastTracker :
| Paramètre | Valeurs ou plages autorisées | Description |
|---|---|---|
reset_velocity_offset_occ | >=0 | Nombre d’images d’historique à remonter pour restaurer la vitesse de Kalman au début de l’occlusion. |
reset_pos_offset_occ | >=0 | Nombre d’images d’historique à remonter pour restaurer la position de Kalman au début de l’occlusion. |
enlarge_bbox_occ | >=1.0 | Facteur d’échelle appliqué à la hauteur de la bbox prédite pendant l’occlusion (la largeur est mise à l’échelle selon le rapport d’aspect XYAH). |
dampen_motion_occ | 0.0-1.0 | Multiplicateur de vitesse pendant l’occlusion. Des valeurs plus faibles ralentissent la piste pendant l’occlusion. |
active_occ_to_lost_thresh | >=1 | Nombre maximal d’images consécutives d’occlusion avant qu’une piste active passe à l’état perdu. |
occ_cover_thresh | 0.0-1.0 | Fraction de la surface d’une piste couverte par une autre piste active pour déclarer une occlusion. |
occ_reappear_window | >=0 | Nombre d’images pendant lequel une piste perdue récemment occultée reste plus facilement réidentifiable. |
init_iou_suppress | 0.0-1.0 | Empêche l’initialisation d’une nouvelle piste si son IoU avec une piste active dépasse cette valeur. Définis 1.0 pour désactiver cette option. |
Conseils de réglage :
- Occultations partielles fréquentes : diminue
occ_cover_thresh(par ex.0.5-0.6). - ID en double autour des chevauchements : diminue
init_iou_suppress(par ex.0.5). - Occultations longues : augmente
occ_reappear_windowettrack_bufferensemble. - Cibles rapides : augmente
dampen_motion_occ(pour le rapprocher de1.0) ; augmenteenlarge_bbox_occuniquement si une zone 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 piste et utilise une association itérative à plusieurs indices :
- Association fondée sur la perspective de la piste (TPA) : combine HMIoU, la distance cosinus ReID facultative, la distance de projection de confiance et la distance angulaire des coins. L’affectation est résolue de manière itérative avec un seuil assoupli.
- Initialisation tenant compte des pistes (TAI) : supprime les créations de pistes en double avant la création d’un nouvel ID.
Idéal pour : les scènes encombrées avec des occultations fréquentes où les ID en double posent problème.
Arguments propres à TrackTrack :
| Paramètre | Valeurs ou plages autorisées | 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 cosinus ReID lorsque ReID est activé ; sinon, cette distance est ignorée. |
conf_weight | 0.0-1.0 | Poids de la distance de projection de confiance. |
angle_weight | 0.0-1.0 | Poids de la distance angulaire des coins. |
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 le NMS secondaire. |
reduce_step | 0.0-1.0 | Assouplissement du seuil de correspondance à chaque itération. |
tai_thr | 0.0-1.0 | Seuil IoU du NMS d’initialisation tenant compte des pistes. |
min_track_len | >=0 | Longueur minimale de l’historique avant qu’une nouvelle piste soit confirmée. |
lost_match_thr | 0.0-1.0 | Seuil de coût plus permissif pour la passe de réassociation des pistes perdues ; 0 désactive cette option. |
with_reid | True, False | Active la correspondance d’apparence par cosinus ReID (utilise les caractéristiques YOLO natives). Désactivée par défaut. |
model | auto ou chemin vers un modèle ReID compatible | auto utilise les caractéristiques natives de YOLO lorsqu’elles sont disponibles ; les modèles personnalisés peuvent être des checkpoints .pt ou des exportations compatibles. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Méthode de compensation du mouvement global. |
Conseils de réglage :
- Piétons dans des scènes encombrées : diminue
tai_thr(par ex.0.45) pour supprimer davantage de créations en double ; augmentetrack_bufferpour les occultations plus longues. - Mouvements rapides de la caméra : garde
gmc_method: sparseOptFlowactivé. - Objets petits ou rapides : augmente légèrement
angle_weightet diminuemin_track_len. - Active ReID uniquement si nécessaire : cette option augmente le coût d’inférence ; pour les occultations 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étections avec un NMS permissif afin que les masques et les points clés restent alignés sur leurs détections.
Exemples Python#
Regarder : Comment créer un suivi interactif des objets avec Ultralytics YOLO | Cliquer pour recadrer et afficher ⚡
Boucle avec persistance des pistes#
Voici un script Python qui utilise OpenCV (cv2) et YOLO26 pour effectuer le suivi d’objets sur des images vidéo. Ce script suppose que les packages nécessaires (opencv-python et ultralytics) sont déjà installés. L’argument persist=True indique au tracker que l’image ou l’image vidéo actuelle est la suivante dans une séquence et qu’il doit s’attendre à retrouver dans l’image actuelle des pistes provenant de l’image précédente.
Utilise persist=True uniquement lorsque tu transmets à model.track() des images consécutives provenant du même flux vidéo. Le tracker peut ainsi réutiliser l’état des images précédentes et conserver des ID de piste cohérents au fil du temps. N’utilise pas persist=True avec des images sans lien entre elles ou un autre flux, car l’état des pistes précédentes pourrait être conservé.
Tu peux aussi choisir un moteur de suivi en transmettant un fichier de configuration de tracker, tel que tracker="botsort.yaml", tracker="bytetrack.yaml" ou tracker="tracktrack.yaml".
import cv2
from ultralytics import YOLO
# Charger le modèle YOLO26
model = YOLO("yolo26n.pt")
# Ouvrir le fichier vidéo
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Parcourir les images vidéo
while cap.isOpened():
# Lire une image de la vidéo
success, frame = cap.read()
if success:
# Effectuer le suivi avec YOLO26 sur l’image et conserver les pistes entre les images
# et utiliser le moteur de suivi BoT-SORT
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualiser les résultats sur l’image
annotated_frame = results[0].plot()
# Afficher l’image annotée
cv2.imshow("YOLO26 Tracking", annotated_frame)
# Interrompre la boucle si « q » est pressé
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Interrompre la boucle si la fin de la vidéo est atteinte
break
# Libérer l’objet de capture vidéo et fermer la fenêtre d’affichage
cap.release()
cv2.destroyAllWindows()Note le passage de model(frame) à model.track(frame), qui active le suivi d’objets au lieu d’une simple détection. Ce script modifié exécute le tracker sur chaque image de la vidéo, visualise les résultats et les affiche dans une fenêtre. Tu peux quitter la boucle en appuyant sur « q ».
Tracer les pistes au fil du temps#
La visualisation des pistes d’objets sur des images consécutives peut fournir des informations précieuses sur les schémas de déplacement et le comportement des objets détectés dans une vidéo. Avec Ultralytics YOLO26, le tracé de ces pistes est simple et efficace.
Dans l’exemple suivant, nous montrons comment utiliser les capacités de suivi de YOLO26 pour tracer le déplacement des objets détectés sur plusieurs images vidéo. Ce script ouvre un fichier vidéo, le lit image par image et utilise le modèle YOLO pour identifier et suivre différents objets. En conservant les points centraux des BBox détectées et en les reliant, nous pouvons tracer les trajectoires suivies par les objets.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Charger le modèle YOLO26
model = YOLO("yolo26n.pt")
# Ouvrir le fichier vidéo
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Stocker l’historique des pistes
track_history = defaultdict(list)
# Parcourir les images vidéo
while cap.isOpened():
# Lire une image de la vidéo
success, frame = cap.read()
if success:
# Effectuer le suivi avec YOLO26 sur l’image et conserver les pistes entre les images
result = model.track(frame, persist=True)[0]
# Récupérer les boîtes et les ID de piste
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualiser le résultat sur l’image
frame = result.plot()
# Tracer les pistes
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))) # Point central x, y
if len(track) > 30: # conserver 30 pistes pendant 30 images
track.pop(0)
# Tracer les lignes de suivi
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Afficher l’image annotée
cv2.imshow("YOLO26 Tracking", frame)
# Interrompre la boucle si « q » est pressé
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Interrompre la boucle si la fin de la vidéo est atteinte
break
# Libérer l’objet de capture vidéo et fermer la fenêtre d’affichage
cap.release()
cv2.destroyAllWindows()Suivi multithread#
Le suivi multithread permet d’effectuer simultanément le suivi d’objets sur plusieurs flux vidéo. Cette approche est particulièrement utile pour traiter plusieurs entrées vidéo, par exemple celles de plusieurs caméras de surveillance, car le traitement simultané peut considérablement améliorer l’efficacité et les performances.
Dans le script Python fourni, nous utilisons le module threading de Python pour exécuter plusieurs instances du tracker simultanément. Chaque thread est chargé d’exécuter le tracker sur un fichier vidéo, et tous les threads s’exécutent en arrière-plan en même temps.
Pour garantir que chaque thread reçoit les bons paramètres (le fichier vidéo, le modèle à utiliser et l’index du fichier), nous définissons une fonction run_tracker_in_thread qui accepte ces paramètres et contient la boucle principale de suivi. Cette fonction lit la vidéo image par image, exécute le tracker et enregistre les résultats annotés.
Cet exemple utilise deux modèles différents : yolo26n.pt et yolo26n-seg.pt, qui suivent chacun des objets dans un fichier vidéo différent. Les fichiers vidéo sont indiqués dans SOURCES.
Le paramètre daemon=True de threading.Thread signifie que ces threads seront fermés dès que le programme principal se termine. Nous démarrons ensuite les threads avec start() et utilisons join() pour que le thread principal attende la fin des deux threads de suivi.
Enfin, une fois que tous les threads ont terminé leur tâche, les fenêtres affichant les résultats sont fermées avec cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Définir les noms des modèles et les sources vidéo
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # vidéo locale, 0 pour 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
# Créer et démarrer les threads de suivi à l’aide d’une boucle 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()
# Attendre la fin de tous les threads de suivi
for thread in tracker_threads:
thread.join()
# Nettoyer et fermer les fenêtres
cv2.destroyAllWindows()Tu peux facilement étendre cet exemple pour gérer davantage de fichiers vidéo et de modèles en créant d’autres threads et en appliquant la même méthode.
Contribuer de nouveaux trackers#
Tu maîtrises le suivi multi-objets et tu as réussi à implémenter ou à adapter un algorithme de suivi avec Ultralytics YOLO ? Nous t’invitons à contribuer à notre section Trackers dans ultralytics/cfg/trackers ! Tes applications et solutions concrètes pourraient être très utiles aux utilisateurs qui travaillent sur des tâches de suivi.
En contribuant à cette section, tu aides à élargir la gamme de solutions de suivi disponibles dans le framework Ultralytics YOLO, en ajoutant une fonctionnalité et une utilité supplémentaires pour la communauté.
Pour commencer ta contribution, consulte notre Guide de contribution pour obtenir des instructions détaillées sur l’envoi d’une Pull Request (PR) 🛠️. Nous avons hâte de découvrir ta contribution !
Ensemble, améliorons les capacités de suivi de l’écosystème Ultralytics YOLO 🙏 !
FAQ#
Le suivi multi-objets dans l’analyse vidéo consiste à identifier les objets et à conserver un ID unique pour chaque objet détecté d’une image vidéo à l’autre. Ultralytics YOLO prend en charge cette fonction en proposant le suivi en temps réel avec des ID d’objet, ce qui facilite des tâches comme la surveillance de sécurité et l’analyse sportive. Le système utilise des trackers tels que BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker et TrackTrack, configurables à l’aide de fichiers YAML.
Non. Les fichiers standard
.ptd’Ultralytics stockent les poids du modèle YOLO, tandis que le tracker est créé au moment de l’inférence parmodel.track(). Les ID de piste dépendent de l’état du tracker entre des images consécutives ; une image seule peut donc renvoyer des détections telles que des boîtes, des classes et des niveaux de confiance, mais ne peut pas produire à elle seule des ID de suivi persistants pertinents.Pour le déploiement, regroupe le détecteur et le tracker dans ton application et appelle
model.track()image par image, avecpersist=Truelorsque les images proviennent du même flux vidéo. Utilise des instances distinctes du modèle ou du tracker pour les flux sans lien entre eux afin que l’état ne soit pas conservé d’une vidéo à l’autre.Tu peux configurer un tracker personnalisé en copiant un fichier de configuration de tracker existant (par ex.
custom_tracker.yaml) depuis le répertoire de configuration des trackers d’Ultralytics, puis en modifiant les paramètres selon tes besoins, à l’exception detracker_type. Utilise ce fichier dans ton modèle de suivi comme suit :Exemplefrom ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Pour effectuer simultanément le suivi d’objets sur plusieurs flux vidéo, tu peux utiliser le module
threadingde Python. Chaque thread gère un flux vidéo distinct. Voici un exemple de configuration :Suivi multithreadimport threading import cv2 from ultralytics import YOLO # Définir les noms des modèles et les sources vidéo MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # vidéo locale, 0 pour 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 # Créer et démarrer les threads de suivi à l’aide d’une boucle 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() # Attendre la fin de tous les threads de suivi for thread in tracker_threads: thread.join() # Nettoyer et fermer les fenêtres cv2.destroyAllWindows()Le suivi multi-objets avec Ultralytics YOLO a de nombreuses applications, notamment :
- Transports : suivi des véhicules pour la gestion du trafic et la conduite autonome.
- Commerce de détail : suivi des personnes pour l’analyse en magasin et la sécurité.
- Aquaculture : suivi des poissons pour surveiller les milieux aquatiques.
- Analyse sportive : suivi des joueurs et du matériel pour l’analyse des performances.
- Systèmes de sécurité : surveillance des activités suspectes et création d’alarmes de sécurité.
Ces applications tirent parti de la capacité d’Ultralytics YOLO à traiter des vidéos à fréquence d’images élevée en temps réel avec une précision exceptionnelle.
Pour visualiser les pistes d’objets sur plusieurs images vidéo, tu peux utiliser les fonctionnalités de suivi du modèle YOLO avec OpenCV afin de tracer les trajectoires des objets détectés. Voici un exemple de script qui montre comment procéder :
Tracé des pistes sur plusieurs images 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: 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()Ce script tracera les lignes de suivi représentant les trajectoires des objets suivis au fil du temps, et fournira ainsi des informations précieuses sur le comportement et les schémas de déplacement des objets.