Ir al contenido

Seguimiento multiobjeto con Ultralytics YOLO

Ejemplos de seguimiento multiobjeto

El seguimiento de objetos en el ámbito del análisis de vídeo es una tarea crítica que no sólo identifica la ubicación y la clase de 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?

El resultado de los rastreadores de Ultralytics es coherente con la detección de objetos estándar, pero tiene el valor añadido de los identificadores de objetos. Esto facilita el seguimiento de objetos en secuencias de vídeo y la posterior realización de análisis. A continuación te explicamos por qué deberías considerar el uso de Ultralytics YOLO para tus necesidades de seguimiento de objetos:

  • Eficacia: Procesa flujos de vídeo en tiempo real sin comprometer la precisión.
  • 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.
  • Personalización: Fácil de usar con modelos YOLO entrenados a medida, lo que permite la integración en aplicaciones específicas del dominio.



Observa: Detección y seguimiento de objetos con Ultralytics YOLO .

Aplicaciones reales

Transporte Venta al por menor Acuicultura
Seguimiento de vehículos Seguimiento de personas Seguimiento de peces
Seguimiento de vehículos Seguimiento de personas Seguimiento de peces

Características

Ultralytics YOLO amplía sus funciones de detección de objetos para ofrecer 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: Elija entre una variedad de algoritmos de seguimiento establecidos.
  • Configuraciones de seguimiento personalizables: Adapte el algoritmo de seguimiento para satisfacer requisitos específicos ajustando varios parámetros.

Seguidores disponibles

Ultralytics YOLO admite los siguientes algoritmos de seguimiento. Pueden activarse pasando el archivo de configuración YAML correspondiente, como por ejemplo tracker=tracker_type.yaml:

  • BoT-SORT - Utilización botsort.yaml para activar este rastreador.
  • ByteTrack - Utilización 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 es baja, es decir, inferior a track_high_threshentonces no habrá ninguna pista devuelta y actualizada correctamente.

Para ejecutar el rastreador en secuencias de vídeo, utilice un modelo entrenado de Detección, Segmento o Pose como YOLO11n, YOLO11n-seg y 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 Detect, Segment 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 es 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, tales como conf, iouy show. Para más configuraciones, consulte el 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 de rastreadores

Ultralytics también le permite utilizar un archivo de configuración del rastreador modificado. Para ello, basta con hacer una copia de un archivo de configuración del rastreador (por ejemplo, custom_tracker.yaml) de ultralytics/cfg/trackers y modificar cualquier configuración (excepto la tracker_type) según sus 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, consulte la página ultralytics/cfg/trackers.

Python Ejemplos

Bucle de pistas persistentes

He aquí un script Python que utiliza OpenCV (cv2) y YOLO11 para ejecutar el seguimiento de objetos en fotogramas de vídeo. Este script todavía asume que usted ya ha instalado los paquetes necesarios (opencv-python y ultralytics). En persist=True indica al rastreador que la imagen o el fotograma actual es el siguiente de una secuencia y que debe esperar las pistas de la imagen anterior en la imagen actual.

Streaming for-loop 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()

Tenga 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'.

Trazado de pistas a lo largo del tiempo

La visualización de rastros de objetos en fotogramas consecutivos puede proporcionar información valiosa sobre los patrones de movimiento y el comportamiento de los objetos detectados en un vídeo. Con Ultralytics YOLO11 , trazar estas pistas es un proceso fluido y eficaz.

En el siguiente ejemplo, demostramos cómo utilizar las capacidades de seguimiento de YOLO11 para trazar el movimiento de los objetos detectados a través de múltiples fotogramas de vídeo. Este script consiste en abrir un archivo de vídeo, leerlo fotograma a fotograma y utilizar el modelo YOLO para identificar y rastrear varios objetos. Reteniendo los puntos centrales de los cuadros delimitadores detectados y conectándolos, podemos trazar líneas que representan las trayectorias seguidas por los objetos rastreados.

Trazado de pistas en 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 resulta especialmente útil cuando se manejan varias entradas de vídeo, como las procedentes de varias cámaras de vigilancia, en las que el procesamiento simultáneo puede mejorar enormemente la eficacia y el rendimiento.

En el script Python proporcionado, utilizamos Python's threading para ejecutar múltiples 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 garantizar que cada subproceso 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 utilizar join() para que el subproceso principal espere hasta que ambos subprocesos de seguimiento 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().

Streaming for-loop 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.

Contribuir con nuevos rastreadores

¿Domina el seguimiento de múltiples objetos y ha aplicado o adaptado con éxito un algoritmo de seguimiento con Ultralytics YOLO ? ¡Le invitamos a contribuir a nuestra sección Trackers en ultralytics/cfg/trackers! Sus aplicaciones y soluciones reales podrían ser muy valiosas para los usuarios que trabajan en tareas de seguimiento.

Al contribuir a esta sección, ayuda 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 su contribución, consulte nuestra Guía de Contribución para obtener instrucciones completas sobre cómo enviar una Pull Request (PR) 🛠️. Estamos impacientes por ver lo que aportas.

Juntos, ¡mejoremos las capacidades de seguimiento del ecosistema Ultralytics YOLO 🙏!

PREGUNTAS FRECUENTES

¿Qué es el seguimiento multiobjeto y cómo lo soporta Ultralytics YOLO ?

El seguimiento multiobjeto en el análisis de vídeo implica tanto la identificación de objetos como el mantenimiento de un identificador único para cada objeto detectado a lo largo de los fotogramas de vídeo. Ultralytics YOLO lo soporta proporcionando seguimiento en tiempo real junto con identificadores de objetos, facilitando tareas como la vigilancia de seguridad y el análisis deportivo. El sistema utiliza rastreadores como BoT-SORT y ByteTrack, que pueden configurarse mediante archivos YAML.

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

Puede configurar un rastreador personalizado copiando un archivo de configuración de rastreadores existente (por ejemplo, custom_tracker.yaml) del Ultralytics directorio de configuración del rastreador y modificando los parámetros según sea necesario, excepto para el tracker_type. Utilice este archivo en su 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, puede utilizar Python's threading módulo. Cada hilo manejará un flujo de vídeo independiente. He aquí un ejemplo de cómo se puede configurar esto:

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 de múltiples objetos con Ultralytics YOLO tiene numerosas aplicaciones, entre ellas:

  • 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 tiendas.
  • Acuicultura: Seguimiento de peces para vigilar los medios acuáticos.

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

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

Para visualizar el seguimiento de objetos en varios fotogramas de vídeo, puede 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:

Trazado de pistas en 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 rastreo mostrando las trayectorias de movimiento de los objetos rastreados a lo largo del tiempo.

Creado hace 1 año ✏️ Actualizado hace 2 meses

Comentarios