Skip to content

Suivi de plusieurs objets avec Ultralytics YOLO

Exemples de suivi de plusieurs objets

Le suivi des objets dans le domaine de l'analyse vidéo est une tâche essentielle qui permet non seulement d'identifier l'emplacement et la classe des objets dans l'image, mais aussi de conserver un identifiant unique pour chaque objet détecté au fur et à mesure de la progression de la vidéo. Les applications sont illimitées, allant de la surveillance et de la sécurité à l'analyse sportive en temps réel.

Pourquoi choisir Ultralytics YOLO pour le suivi d'objets ?

Les résultats des trackers Ultralytics sont cohérents avec la détection d'objets standard, mais ils ont la valeur ajoutée des identifiants d'objets. Cela facilite le suivi des objets dans les flux vidéo et l'analyse qui s'ensuit. Voici pourquoi vous devriez envisager d'utiliser Ultralytics YOLO pour vos besoins en matière de suivi d'objets :

  • EfficacitĂ© : Traitez les flux vidĂ©o en temps rĂ©el sans compromettre la prĂ©cision.
  • FlexibilitĂ© : Prise en charge de plusieurs algorithmes et configurations de suivi.
  • FacilitĂ© d'utilisation : Python API simple et CLI options pour une intĂ©gration et un dĂ©ploiement rapides.
  • Personnalisation : Facile Ă  utiliser avec des modèles YOLO formĂ©s sur mesure, permettant l'intĂ©gration dans des applications spĂ©cifiques Ă  un domaine.



Regarder : DĂ©tection et suivi d'objets avec Ultralytics YOLO .

Applications dans le monde réel

Transport Vente au détail Aquaculture
Suivi des véhicules Suivi des personnes Suivi des poissons
Suivi des véhicules Suivi des personnes Suivi des poissons

Aperçu des caractéristiques

Ultralytics YOLO étend ses fonctions de détection d'objets pour offrir un suivi d'objets robuste et polyvalent :

  • Suivi en temps rĂ©el : Suivi transparent d'objets dans des vidĂ©os Ă  haute frĂ©quence d'images.
  • Prise en charge de plusieurs algorithmes de suivi : Choisissez parmi une variĂ©tĂ© d'algorithmes de suivi Ă©tablis.
  • Configurations de suivi personnalisables : Adaptez l'algorithme de suivi aux besoins spĂ©cifiques en ajustant divers paramètres.

Traqueurs disponibles

Ultralytics YOLO prend en charge les algorithmes de suivi suivants. Ils peuvent être activés en passant le fichier de configuration YAML approprié, tel que tracker=tracker_type.yaml:

  • BoT-SORT - Utilisation botsort.yaml pour activer ce traceur.
  • ByteTrack - Utilisation bytetrack.yaml pour activer ce traceur.

Le tracker par défaut est BoT-SORT.

Suivi

Informations sur le seuil de suivi

Si le score de confiance de l'objet est faible, c'est-à-dire inférieur à track_high_threshalors aucune trace ne sera renvoyée et mise à jour avec succès.

Pour faire fonctionner le tracker sur des flux vidéo, utilisez un modèle entraîné de détection, de segmentation ou de pose tel que YOLO11n, YOLO11n-seg et YOLO11n-pose.

Exemple

from ultralytics import YOLO

# Load an official or custom model
model = YOLO("yolo11n.pt")  # Load an official Detect model
model = YOLO("yolo11n-seg.pt")  # Load an official Segment model
model = YOLO("yolo11n-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 ByteTrack
# Perform tracking with various models using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4"  # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4"  # Official Segment model
yolo track model=yolo11n-pose.pt source="https://youtu.be/LNwODJXcvt4"  # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4"  # Custom trained model

# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"

Comme le montre l'utilisation ci-dessus, le suivi est disponible pour tous les modèles Detect, Segment et Pose exécutés sur des vidéos ou des sources de streaming.

Configuration

Informations sur le seuil de suivi

Si le score de confiance de l'objet est faible, c'est-à-dire inférieur à track_high_threshalors aucune trace ne sera renvoyée et mise à jour avec succès.

Suivi des arguments

La configuration du suivi partage des propriétés avec le mode prédictif, telles que conf, iouet show. Pour d'autres configurations, se référer au Prévoir page modèle.

Exemple

from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show

SĂ©lection du traceur

Ultralytics vous permet également d'utiliser un fichier de configuration de tracker modifié. Pour ce faire, il suffit de faire une copie d'un fichier de configuration du tracker (par exemple, custom_tracker.yaml) de ultralytics/cfg/trackers et de modifier toutes les configurations (à l'exception de la tracker_type) en fonction de vos besoins.

Exemple

from ultralytics import YOLO

# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

Pour obtenir une liste complète des arguments de suivi, consultez la page ultralytics/cfg/trackers.

Python Exemples

Boucle de pistes persistantes

Voici un script Python utilisant OpenCV (cv2) et YOLO11 pour effectuer le suivi d'objets sur des images vidéo. Ce script suppose que vous avez déjà installé les paquets nécessaires (opencv-python et ultralytics). Les persist=True indique au tracker que l'image ou la trame en cours est la suivante d'une séquence et qu'il doit s'attendre à des traces de l'image précédente dans l'image en cours.

Boucle for-loop en continu avec suivi

import cv2

from ultralytics import YOLO

# Load the YOLO11 model
model = YOLO("yolo11n.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 YOLO11 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Display the annotated frame
        cv2.imshow("YOLO11 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 changement 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 tracker 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 des pistes dans le temps

La visualisation des trajectoires d'objets sur des images consécutives peut fournir des informations précieuses sur les modèles de mouvement et le comportement des objets détectés dans une vidéo. Avec Ultralytics YOLO11 , le traçage de ces pistes est un processus transparent et efficace.

Dans l'exemple suivant, nous montrons comment utiliser les capacités de suivi de YOLO11 pour tracer le mouvement des objets détectés sur plusieurs images vidéo. Ce script implique l'ouverture d'un fichier vidéo, sa lecture image par image et l'utilisation du modèle YOLO pour identifier et suivre divers objets. En conservant les points centraux des boîtes de délimitation détectées et en les reliant, nous pouvons tracer des lignes qui représentent les trajectoires suivies par les objets suivis.

Tracer des pistes sur plusieurs images vidéo

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Load the YOLO11 model
model = YOLO("yolo11n.pt")

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Store the track history
track_history = defaultdict(lambda: [])

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLO11 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Get the boxes and track IDs
        boxes = results[0].boxes.xywh.cpu()
        track_ids = results[0].boxes.id.int().cpu().tolist()

        # Visualize the results on the frame
        annotated_frame = results[0].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 90 tracks for 90 frames
                track.pop(0)

            # Draw the tracking lines
            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Display the annotated frame
        cv2.imshow("YOLO11 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()

Suivi multithread

Le suivi multithread permet d'exécuter le suivi d'objets sur plusieurs flux vidéo simultanément. Cette fonction est particulièrement utile lorsqu'il s'agit de traiter plusieurs entrées vidéo, provenant par exemple de plusieurs caméras de surveillance, où le traitement simultané peut considérablement améliorer l'efficacité et les performances.

Dans le script Python fourni, nous utilisons le script Python's threading pour exécuter plusieurs instances du tracker simultanément. Chaque thread est responsable de l'exécution du tracker sur un fichier vidéo, et tous les threads s'exécutent simultanément 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'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 affiche les résultats.

Deux modèles différents sont utilisés dans cet exemple : yolo11n.pt et yolo11n-seg.ptchaque suivi d'objets dans un fichier vidéo différent. Les fichiers vidéo sont spécifiés dans video_file1 et video_file2.

Le daemon=True paramètre 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 utiliser join() pour que le thread principal attende que les deux threads du tracker aient terminé.

Enfin, lorsque tous les threads ont terminé leur tâche, les fenêtres affichant les résultats sont fermées à l'aide de la fonction cv2.destroyAllWindows().

Boucle for-loop en continu avec suivi

import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-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): The YOLO11 model object.
        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 facilement être étendu à d'autres fichiers vidéo et modèles en créant davantage de fils de discussion et en appliquant la même méthodologie.

Contribuer Ă  de nouveaux traqueurs

Vous maîtrisez le suivi de plusieurs objets et avez réussi à mettre en œuvre ou à adapter un algorithme de suivi à l'aide de Ultralytics YOLO ? Nous vous invitons à contribuer à notre section Trackers sur ultralytics/cfg/trackers ! Vos applications et solutions réelles pourraient être d'une valeur inestimable pour les utilisateurs travaillant sur des tâches de suivi.

En contribuant à cette section, vous contribuez à élargir la portée des solutions de suivi disponibles dans le cadre de Ultralytics YOLO , en ajoutant une nouvelle couche de fonctionnalité et d'utilité pour la communauté.

Pour initier votre contribution, veuillez vous référer à notre Guide de contribution pour des instructions complètes sur la soumission d'une demande d'extraction (PR) 🛠️. Nous sommes impatients de voir ce que vous apporterez à la table !

Ensemble, améliorons les capacités de suivi de l'écosystème Ultralytics YOLO 🙏 !

FAQ

Qu'est-ce que le suivi d'objets multiples et comment Ultralytics YOLO le prend-il en charge ?

Le suivi d'objets multiples dans l'analyse vidéo implique à la fois l'identification des objets et le maintien d'un identifiant unique pour chaque objet détecté sur l'ensemble des images vidéo. Ultralytics YOLO prend en charge cette tâche en fournissant un suivi en temps réel ainsi que des identifiants d'objets, facilitant ainsi des tâches telles que la surveillance de sécurité et l'analyse sportive. Le système utilise des trackers tels que BoT-SORT et ByteTrack, qui peuvent être configurés via des fichiers YAML.

Comment configurer un tracker personnalisé pour Ultralytics YOLO ?

Vous pouvez configurer un tracker personnalisé en copiant un fichier de configuration de tracker existant (par exemple, custom_tracker.yaml) de l Ultralytics répertoire de configuration du tracker et en modifiant les paramètres si nécessaire, à l'exception de l'option tracker_type. Utilisez ce fichier dans votre modèle de suivi comme suit :

Exemple

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

Comment puis-je effectuer un suivi d'objet sur plusieurs flux vidéo simultanément ?

Pour effectuer un suivi d'objet sur plusieurs flux vidéo simultanément, vous pouvez utiliser la fonction de suivi d'objet de Python. threading module. Chaque thread gérera un flux vidéo distinct. Voici un exemple de configuration :

Suivi multithread

import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-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): The YOLO11 model object.
        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()

Quelles sont les applications réelles du suivi d'objets multiples avec Ultralytics YOLO ?

Le suivi de plusieurs objets Ă  l'aide de Ultralytics YOLO a de nombreuses applications, notamment :

  • Transport : Suivi des vĂ©hicules pour la gestion du trafic et la conduite autonome.
  • Commerce de dĂ©tail : Suivi des personnes pour l'analyse et la sĂ©curitĂ© en magasin.
  • Aquaculture : Suivi des poissons pour la surveillance des environnements aquatiques.

Ces applications bénéficient de la capacité de Ultralytics YOLO à traiter des vidéos à haute fréquence d'images en temps réel.

Comment puis-je visualiser des pistes d'objets sur plusieurs images vidéo avec Ultralytics YOLO ?

Pour visualiser les trajectoires d'objets sur plusieurs images vidéo, vous pouvez utiliser les fonctions de suivi du modèle YOLO avec OpenCV pour dessiner les trajectoires des objets détectés. Voici un exemple de script qui en fait la démonstration :

Tracer des pistes sur plusieurs images vidéo

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])

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("YOLO11 Tracking", annotated_frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

Ce script trace les lignes de suivi montrant les trajectoires des objets suivis au fil du temps.

📅C réé il y a 1 an ✏️ Mis à jour il y a 2 mois

Commentaires