Saltar al contenido

Seguimiento multiobjeto con Ultralytics YOLO

Ejemplos de seguimiento multiobjeto

El seguimiento de objetos en el ámbito de la analítica de vídeo es una tarea crítica que no sólo identifica la ubicación y clase de los objetos dentro del fotograma, sino que también mantiene un ID único para cada objeto detectado a medida que avanza el vídeo. Las aplicaciones son ilimitadas: desde la vigilancia y la seguridad hasta el análisis deportivo en tiempo real.

¿Por qué elegir Ultralytics YOLO para el seguimiento de objetos?

The output from Ultralytics trackers is consistent with standard object detection but has the added value of object IDs. This makes it easy to track objects in video streams and perform subsequent analytics. Here's why you should consider using Ultralytics YOLO for your object tracking needs:

  • Efficiency: Process video streams in real-time without compromising accuracy.
  • Flexibilidad: Admite múltiples algoritmos y configuraciones de seguimiento.
  • Facilidad de uso: API Python sencilla y opciones CLI para una integración e implantación rápidas.
  • Personalizabilidad: Fácil de usar con modelos YOLO entrenados a medida, lo que permite la integración en aplicaciones específicas del dominio.



Observa: Object Detection and Tracking with Ultralytics YOLO.

Aplicaciones en el mundo real

TransporteVenta al por menorAcuicultura
Seguimiento de vehículosSeguimiento de personasSeguimiento de peces
Seguimiento de vehículosSeguimiento de personasSeguimiento de peces

Características

Ultralytics YOLO amplía sus funciones de detección de objetos para proporcionar un seguimiento de objetos robusto y versátil:

  • Seguimiento en tiempo real: Rastrea sin problemas objetos en vídeos de alta velocidad de fotogramas.
  • Compatibilidad con múltiples rastreadores: Elige entre una variedad de algoritmos de seguimiento establecidos.
  • Configuraciones personalizables del Rastreador: Adapta el algoritmo de seguimiento para satisfacer requisitos específicos ajustando diversos parámetros.

Seguidores disponibles

Ultralytics YOLO admite los siguientes algoritmos de seguimiento. Se pueden activar pasando el archivo de configuración YAML correspondiente como tracker=tracker_type.yaml:

  • BoT-SORT - Utiliza botsort.yaml para activar este rastreador.
  • ByteTrack - Utiliza bytetrack.yaml para activar este rastreador.

El rastreador por defecto es BoT-SORT.

Seguimiento

Información sobre el umbral del rastreador

Si la puntuación de confianza del objeto será baja, es decir, inferior a track_high_threshentonces no habrá ninguna pista devuelta y actualizada correctamente.

To run the tracker on video streams, use a trained Detect, Segment or Pose model such as YOLO11n, YOLO11n-seg and YOLO11n-pose.

Ejemplo

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"

Como puede verse en el uso anterior, el seguimiento está disponible para todos los modelos Detectar, Segmentar y Pose ejecutados en vídeos o fuentes de streaming.

Configuración

Información sobre el umbral del rastreador

Si la puntuación de confianza del objeto será baja, es decir, inferior a track_high_threshentonces no habrá ninguna pista devuelta y actualizada correctamente.

Argumentos de seguimiento

La configuración de seguimiento comparte propiedades con el modo Predecir, como conf, iouy show. Para más configuraciones, consulta Predecir página modelo.

Ejemplo

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

Selección del rastreador

Ultralytics también te permite utilizar un archivo de configuración del rastreador modificado. Para ello, simplemente haz una copia de un archivo de configuración del seguidor (por ejemplo, custom_tracker.yaml) de ultralytics/cfg/trackers y modificar cualquier configuración (excepto la tracker_type) según tus necesidades.

Ejemplo

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'

Para obtener una lista completa de argumentos de seguimiento, consulta la página ultralytics/cfg/trackers.

Python Ejemplos

Bucle de pistas persistentes

Here is a Python script using OpenCV (cv2) and YOLO11 to run object tracking on video frames. This script still assumes you have already installed the necessary packages (opencv-python y ultralytics). En persist=True indica al rastreador que la imagen o fotograma actual es el siguiente de una secuencia y que espere las pistas de la imagen anterior en la imagen actual.

Bucle for con seguimiento

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()

Ten en cuenta el cambio de model(frame) a model.track(frame)que permite el seguimiento de objetos en lugar de la simple detección. Este script modificado ejecutará el rastreador en cada fotograma del vídeo, visualizará los resultados y los mostrará en una ventana. Se puede salir del bucle pulsando "q".

Trazar trazados a lo largo del tiempo

Visualizing object tracks over consecutive frames can provide valuable insights into the movement patterns and behavior of detected objects within a video. With Ultralytics YOLO11, plotting these tracks is a seamless and efficient process.

In the following example, we demonstrate how to utilize YOLO11's tracking capabilities to plot the movement of detected objects across multiple video frames. This script involves opening a video file, reading it frame by frame, and utilizing the YOLO model to identify and track various objects. By retaining the center points of the detected bounding boxes and connecting them, we can draw lines that represent the paths followed by the tracked objects.

Trazar pistas sobre varios fotogramas de vídeo

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()

Seguimiento multihilo

El seguimiento multihilo permite ejecutar el seguimiento de objetos en varios flujos de vídeo simultáneamente. Esto es especialmente útil cuando se manejan varias entradas de vídeo, como las de varias cámaras de vigilancia, donde el procesamiento simultáneo puede mejorar mucho la eficacia y el rendimiento.

En el script Python proporcionado, utilizamos Python's threading para ejecutar varias instancias del rastreador simultáneamente. Cada hilo es responsable de ejecutar el rastreador en un archivo de vídeo, y todos los hilos se ejecutan simultáneamente en segundo plano.

Para asegurarnos de que cada hilo recibe los parámetros correctos (el archivo de vídeo, el modelo a utilizar y el índice del archivo), definimos una función run_tracker_in_thread que acepta estos parámetros y contiene el bucle de seguimiento principal. Esta función lee el vídeo fotograma a fotograma, ejecuta el rastreador y muestra los resultados.

En este ejemplo se utilizan dos modelos diferentes: yolo11n.pt y yolo11n-seg.ptcada uno de los cuales rastrea objetos en un archivo de vídeo diferente. Los archivos de vídeo se especifican en video_file1 y video_file2.

En daemon=True parámetro en threading.Thread significa que estos hilos se cerrarán en cuanto termine el programa principal. A continuación, iniciamos los hilos con start() y utiliza join() para que el hilo principal espere hasta que los dos hilos del rastreador hayan terminado.

Por último, una vez que todos los subprocesos han completado su tarea, las ventanas que muestran los resultados se cierran utilizando cv2.destroyAllWindows().

Bucle for con seguimiento

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()

Este ejemplo puede ampliarse fácilmente para manejar más archivos de vídeo y modelos, creando más hilos y aplicando la misma metodología.

Aportar nuevos seguidores

¿Eres experto en el seguimiento de múltiples objetos y has aplicado o adaptado con éxito un algoritmo de seguimiento con Ultralytics YOLO ? ¡Te invitamos a contribuir a nuestra sección Trackers en ultralytics/cfg/trackers! Tus aplicaciones y soluciones del mundo real podrían ser muy valiosas para los usuarios que trabajan en tareas de seguimiento.

Al contribuir a esta sección, ayudas a ampliar el alcance de las soluciones de seguimiento disponibles en el marco Ultralytics YOLO , añadiendo otra capa de funcionalidad y utilidad para la comunidad.

Para iniciar tu contribución, consulta nuestra Guía de Contribución para obtener instrucciones completas sobre cómo enviar una Pull Request (PR) 🛠️. ¡Estamos deseando ver lo que aportas!

Juntos, ¡mejoremos la capacidad de seguimiento del ecosistema Ultralytics YOLO 🙏!

PREGUNTAS FRECUENTES

¿Qué es el Seguimiento Multiobjeto y cómo lo soporta Ultralytics YOLO ?

El seguimiento multiobjeto en la analítica de vídeo implica tanto la identificación de objetos como el mantenimiento de un ID único para cada objeto detectado a través de los fotogramas de vídeo. Ultralytics YOLO apoya esto proporcionando seguimiento en tiempo real junto con IDs de objetos, facilitando tareas como la vigilancia de seguridad y la analítica deportiva. El sistema utiliza rastreadores como BoT-SORT y ByteTrack, que pueden configurarse mediante archivos YAML.

¿Cómo configuro un rastreador personalizado para Ultralytics YOLO ?

Puedes configurar un rastreador personalizado copiando un archivo de configuración de rastreadores existente (p. ej, custom_tracker.yaml) del Ultralytics directorio de configuración del rastreador y modificando los parámetros según sea necesario, excepto el tracker_type. Utiliza este archivo en tu modelo de seguimiento de la siguiente manera:

Ejemplo

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'

¿Cómo puedo ejecutar el seguimiento de objetos en varias secuencias de vídeo simultáneamente?

Para ejecutar el seguimiento de objetos en múltiples secuencias de vídeo simultáneamente, puedes utilizar Python's threading módulo. Cada hilo manejará un flujo de vídeo independiente. Aquí tienes un ejemplo de cómo puedes configurarlo:

Seguimiento multihilo

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()

¿Cuáles son las aplicaciones reales del seguimiento multiobjeto con Ultralytics YOLO ?

El seguimiento multiobjeto con Ultralytics YOLO tiene numerosas aplicaciones, entre ellas:

  • El transporte: Seguimiento de vehículos para la gestión del tráfico y la conducción autónoma.
  • Comercio minorista: Seguimiento de personas para análisis y seguridad en la tienda.
  • Acuicultura: Seguimiento de peces para vigilar los entornos acuáticos.

Estas aplicaciones se benefician de la capacidad de Ultralytics YOLO para procesar vídeos de alta velocidad de fotogramas en tiempo real.

¿Cómo puedo visualizar las pistas de objetos en varios fotogramas de vídeo con Ultralytics YOLO ?

Para visualizar las trayectorias de los objetos en varios fotogramas de vídeo, puedes utilizar las funciones de seguimiento del modelo YOLO junto con OpenCV para dibujar las trayectorias de los objetos detectados. Aquí tienes un script de ejemplo que lo demuestra:

Trazar pistas sobre varios fotogramas de vídeo

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()

Este script trazará las líneas de seguimiento mostrando las trayectorias de movimiento de los objetos seguidos a lo largo del tiempo.

📅 Created 11 months ago ✏️ Updated 20 days ago

Comentarios