Seguimiento multiobjeto con Ultralytics YOLO
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 |
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_thresh
entonces 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_thresh
entonces 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
, iou
y show
. Para más configuraciones, consulte el Predecir página modelo.
Ejemplo
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
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.pt
cada 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
¿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.