Ultralytics YOLO27:
Get Started

Seguimiento de varios objetos con Ultralytics YOLO#

YOLO multi-object tracking with trajectory paths

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

Consulta la vista previa no publicada de YOLO27 para conocer el soporte de seguimiento previsto.

🚀 Nuevos rastreadores: OC-SORT, Deep OC-SORT, FastTracker, TrackTrack

Desde la versión 8.4.63 de ultralytics, OC-SORT, Deep OC-SORT, FastTracker y TrackTrack están disponibles junto con BoT-SORT y ByteTrack.

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

La salida de los rastreadores de Ultralytics es coherente con la detección de objetos estándar, pero añade los ID de los objetos. Esto facilita el seguimiento de objetos en secuencias de vídeo y la realización de análisis posteriores. Estas son algunas razones para plantearte utilizar Ultralytics YOLO en tus necesidades de seguimiento de objetos:

  • Eficiencia: procesa secuencias de vídeo en tiempo real sin comprometer la precisión.
  • Flexibilidad: admite varios algoritmos y configuraciones de seguimiento.
  • Facilidad de uso: opciones sencillas de API de Python y CLI para una integración e implementación rápidas.
  • Personalización: fácil de usar con modelos YOLO entrenados a medida, lo que permite integrarlos en aplicaciones específicas de cada ámbito.


Ver: Cómo realizar el seguimiento de varios objetos con Ultralytics YOLO26 | BoT-SORT y ByteTrack | VisionAI 🚀

Aplicaciones en el mundo real#

TransporteComercio minoristaAcuicultura
Seguimiento de vehículosSeguimiento de personasSeguimiento de peces

Inicio rápido#

Ejecuta el seguimiento en un vídeo con el rastreador TrackTrack predeterminado. Cambia a otro rastreador modificando el argumento tracker.

Ejemplo
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Rastreador predeterminado (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)

# Cambiar a ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")

Para ejecutar el rastreador en secuencias de vídeo, utiliza un modelo entrenado Detect, Segment, Pose u OBB, como YOLO26n, YOLO26n-seg, YOLO26n-pose o YOLO26n-obb. Puedes entrenar modelos personalizados localmente o mediante el entrenamiento en la nube de Ultralytics Platform.

Ejemplo
from ultralytics import YOLO

# Cargar un modelo oficial o personalizado
model = YOLO("yolo26n.pt")  # Cargar un modelo Detect oficial
model = YOLO("yolo26n-seg.pt")  # Cargar un modelo Segment oficial
model = YOLO("yolo26n-pose.pt")  # Cargar un modelo Pose oficial
model = YOLO("path/to/best.pt")  # Cargar un modelo entrenado a medida

# Realizar el seguimiento con el modelo
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # Seguimiento con el rastreador predeterminado
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # con ByteTrack

Rastreadores compatibles#

Ultralytics YOLO incluye seis rastreadores integrados. Activa uno pasando su archivo de configuración YAML al argumento tracker.

RastreadorArchivo de configuraciónModelo de movimientoApariencia / ReIDCompensación del movimiento de la cámaraGestión de oclusiones
BoT-SORTbotsort.yamlKalman linealOpcional (with_reid)Configurable (gmc_method)Búfer de seguimiento + reasociación ReID
ByteTrackbytetrack.yamlKalman linealNingunoNoRecuperación en dos etapas de detecciones con baja confianza
OC-SORTocsort.yamlKalman centrado en las observacionesNingunoNoORU, OCM, OCR: actualización de nuevo a partir de la última observación
Deep OC-SORTdeepocsort.yamlKalman centrado en las observacionesOpcional (with_reid)Configurable (gmc_method)OC-SORT + EMA de apariencia adaptativa opcional
FastTrackerfasttrack.yamlKalman lineal + reversiónNingunoNoReversión de Kalman + ampliación de bbox en caso de oclusión
TrackTracktracktrack.yamlKalman lineal (NSA)Opcional (with_reid)Configurable (gmc_method)Asociación iterativa multicriterio + TAI

¿Qué rastreador debería utilizar?#

Utiliza este flujo para elegir un punto de partida; se utiliza tracktrack.yaml si no pasas ningún tracker:

  1. ¿Necesitas una opción básica rápida y sencilla? → ByteTrack (sin ReID, sin compensación del movimiento de la cámara y con una sobrecarga mínima).
  2. ¿Vídeos grabados a mano, con dron o con una cámara en movimiento? → BoT-SORT (añade compensación del movimiento de la cámara y ReID opcional).
  3. ¿Movimiento no lineal (deportes, baile, giros bruscos) y sin ReID? → OC-SORT (correcciones centradas en las observaciones sin el coste de apariencia).
  4. ¿Escenas concurridas con una cámara en movimiento en las que el principal problema son los cambios de ID? → Deep OC-SORT o TrackTrack (ambos admiten la comparación de apariencia opcional; TrackTrack también añade asociación multicriterio y supresión de ID duplicados).
  5. ¿Solapamientos parciales frecuentes en tiempo real y sin presupuesto para ReID? → FastTracker (variante de ByteTrack que tiene en cuenta las oclusiones y utiliza reversión de Kalman).

Cambiar de rastreador#

Pasa el nombre del archivo de configuración del rastreador a tracker=. El resto del código no cambia.

Ejemplo
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")

Configuración#

Argumentos de seguimiento#

La configuración del seguimiento comparte propiedades con el modo Predict, como conf, iou y show. Para ver más opciones de configuración, consulta la página del modelo Predict.

Ejemplo
from ultralytics import YOLO

# Configurar los parámetros de seguimiento y ejecutar el rastreador
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)

Configuración personalizada del rastreador#

Ultralytics también te permite utilizar un archivo de configuración del rastreador modificado. Para ello, solo tienes que hacer una copia de un archivo de configuración del rastreador (por ejemplo, custom_tracker.yaml) de ultralytics/cfg/trackers y modificar las opciones que necesites (excepto tracker_type).

Ejemplo
from ultralytics import YOLO

# Cargar el modelo y ejecutar el rastreador con un archivo de configuración personalizado
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")

Argumentos comunes de los rastreadores#

Los siguientes parámetros son comunes a la mayoría de los archivos YAML de rastreadores; no todos aparecen en cada configuración:

Información sobre los umbrales del rastreador

Las detecciones iguales o superiores a track_high_thresh pasan a la primera etapa de asociación. Las detecciones entre track_low_thresh y track_high_thresh pueden recuperar seguimientos existentes cuando el rastreador seleccionado activa la asociación de baja confianza, pero no inician seguimientos nuevos. Las detecciones iguales o inferiores a track_low_thresh se ignoran.

ParámetroValores o rangos válidosDescripción
tracker_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackEspecifica el tipo de rastreador.
track_high_thresh0.0-1.0Umbral para la primera asociación. Afecta al grado de confianza con el que una detección se asigna a una pista existente.
track_low_thresh0.0-1.0Límite inferior para las detecciones de recuperación con baja confianza. OC-SORT y Deep OC-SORT solo las usan cuando use_byte: True; TrackTrack las incluye en su grupo de asociación penalizado.
new_track_thresh0.0-1.0Umbral para iniciar una nueva pista si la detección no coincide con ninguna pista existente.
track_buffer>=0Número de fotogramas durante los que se mantienen activas las pistas perdidas antes de eliminarlas. Un valor más alto permite tolerar mejor las oclusiones.
match_thresh0.0-1.0Umbral para asociar pistas. Los valores más altos hacen que la asociación sea más permisiva.
fuse_scoreTrue, FalseIndica si se fusionan las puntuaciones de confianza con las distancias IoU antes de la asociación.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMétodo de compensación del movimiento global. Ayuda a tener en cuenta el movimiento de la cámara.
proximity_thresh0.0-1.0IoU mínimo necesario para una asociación ReID válida. Garantiza una proximidad espacial suficiente antes de usar indicios de apariencia.
appearance_thresh0.0-1.0Similitud de apariencia normalizada mínima necesaria para ReID.
with_reidTrue, FalseActiva la asociación basada en la apariencia para mejorar el seguimiento durante las oclusiones. Compatible con BoT-SORT, Deep OC-SORT y TrackTrack.
modelauto o ruta a un modelo ReID compatibleModelo ReID. auto utiliza las características nativas de la red troncal de YOLO cuando están disponibles; de lo contrario, recurre a yolo26n-cls.pt. Un codificador personalizado puede ser un punto de control .pt o un modelo exportado, como .torchscript, .onnx, .engine o un directorio de modelo de OpenVINO.

Argumentos específicos del rastreador#

Cada algoritmo ofrece parámetros adicionales a los compartidos. Consulta las secciones de cada rastreador a continuación para ver las descripciones y recomendaciones de ajuste, o consulta directamente los archivos de configuración:

Activar la reidentificación (ReID)#

ReID está desactivado de forma predeterminada para minimizar la sobrecarga. Actívalo estableciendo with_reid: True en un archivo de configuración del rastreador.

Opciones del modelo ReID:

  • model: auto — Utiliza las características nativas del detector YOLO con una sobrecarga mínima. Es ideal si necesitas algo de ReID sin una gran pérdida de rendimiento. Si el detector no ofrece características compatibles, recurre a yolo26n-cls.pt.
  • Modelo ReID personalizado — Asigna a model: la ruta a un punto de control .pt o a un modelo de incrustaciones exportado compatible, como .torchscript, .onnx, .engine o un directorio de modelo de OpenVINO. Los modelos exportados se cargan mediante AutoBackend y deben generar directamente un tensor de incrustaciones.

Hay codificadores ONNX listos para usar para todos los tamaños de modelo. Asigna uno de estos nombres a model: y el archivo se descargará automáticamente la primera vez que se ejecute el rastreador (igual que se descargan los pesos de YOLO); no hace falta exportarlo ni descargarlo manualmente:

# 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
Modelotamaño
(píxeles)
parámetros
(M)
FLOPs
(B)
YOLO26n-reid.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
ReID solo está disponible para el seguimiento

Actualmente solo hay codificadores ReID ONNX disponibles para la rama de apariencia del rastreador. Los modos ReID train, val y predict, así como las recetas específicas para exportar ReID, siguen en desarrollo.

Para mejorar el rendimiento con un modelo de clasificación independiente, expórtalo a un backend más rápido, como TensorRT:

Exportar un modelo ReID a TensorRT
from torch import nn

from ultralytics import YOLO

# Cargar el modelo de clasificación
model = YOLO("yolo26n-cls.pt")

# Añadir una capa de agrupación media
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

# Exportar a TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)

Una vez exportado, indica la ruta al modelo TensorRT en la configuración del rastreador.

Detalles del rastreador#

En las secciones siguientes se describe el diseño de cada rastreador, sus parámetros específicos y consejos para ajustarlo.



Ver: ¿Qué rastreador de objetos ofrece mejores resultados? | Velocidad, FPS y estabilidad de ID | Ultralytics YOLO26 📊

BoT-SORT#

BoT-SORT (Aharon et al., 2022) amplía ByteTrack con compensación del movimiento de la cámara y ReID opcional:

  • Compensación del movimiento de la cámara (CMC): se aplica una transformación afín, estimada en cada fotograma (flujo óptico disperso de forma predeterminada; también están disponibles ORB / ECC), a los estados de Kalman antes de la asociación IoU.
  • ReID opcional: las incrustaciones de apariencia pueden fusionarse en la matriz de costes. Está desactivado de forma predeterminada; actívalo con with_reid: True.

Ideal para: seguimiento de propósito general, especialmente con cámaras en movimiento. Añade ReID solo cuando las multitudes de aspecto similar provoquen cambios de ID.

Argumentos específicos de BoT-SORT:

ParámetroValores o rangos válidosDescripción
gmc_methodsparseOptFlow, orb, sift, ecc, noneBackend de compensación del movimiento de la cámara. sparseOptFlow es el valor predeterminado. none desactiva CMC.
with_reidTrue, FalseActiva la asociación basada en la apariencia. Está desactivada de forma predeterminada.
modelauto o ruta a un modelo ReID compatibleauto utiliza características nativas de YOLO cuando están disponibles; los modelos personalizados pueden ser puntos de control .pt o exportaciones compatibles.
proximity_thresh0.0-1.0IoU mínimo necesario para tener en cuenta las características de apariencia.
appearance_thresh0.0-1.0Similitud de apariencia normalizada mínima necesaria para una asociación ReID. Auméntala para que la asociación sea más estricta.

Consejos de ajuste:

  • Cámara fija: establece gmc_method: none para ahorrar unos pocos ms por fotograma.
  • Mucho movimiento de cámara: mantén sparseOptFlow; ecc es más preciso, pero más lento.
  • Multitudes de aspecto similar: activa with_reid: True y aumenta appearance_thresh (por ejemplo, 0.85+).

ByteTrack#

ByteTrack (Zhang et al., ECCV 2022) es el modelo de referencia ligero. Utiliza un filtro de Kalman lineal + IoU con una asociación en dos fases:

  • Fase 1: asocia las detecciones con puntuación alta a las pistas activas.
  • Fase 2: vuelve a comparar las pistas sin asociar con las detecciones de puntuación baja para recuperarlas tras una oclusión parcial breve.

No utiliza un modelo de apariencia ni compensación del movimiento de la cámara.

Ideal para: cámaras fijas o casi fijas en las que el coste del detector es el factor dominante y se busca reducir al mínimo la sobrecarga del rastreador.

Argumentos específicos de ByteTrack: ninguno, aparte de los argumentos compartidos del rastreador.

Consejos de ajuste:

  • Detector con ruido: reduce track_low_thresh para que la segunda fase disponga de más candidatos.
  • Detector con alta exhaustividad: aumenta track_high_thresh para reducir la fragmentación de los ID.
  • Cambios frecuentes de ID: aumenta track_buffer para que las pistas que se pierden brevemente sigan activas.

OC-SORT#

OC-SORT (Cao et al., CVPR 2023) es una extensión de SORT centrada en las observaciones. Mantiene el diseño ligero de SORT (sin características de apariencia) y añade tres correcciones:

  • Reactualización centrada en la observación (ORU): reproduce una trayectoria virtual entre la última observación y la detección actual, y vuelve a ejecutar la actualización de Kalman para corregir la velocidad desviada.
  • Impulso centrado en la observación (OCM): penaliza las detecciones que se mueven en la dirección incorrecta mediante un término de coherencia de velocidad.
  • Recuperación centrada en la observación (OCR): vuelve a comprobar las detecciones sin asociar frente a las pistas perdidas recientemente, usando su última observación en lugar del estado previsto.

Ideal para: movimiento no lineal sin el coste de un modelo ReID.

Argumentos específicos de OC-SORT:

ParámetroValores o rangos válidosDescripción
delta_t>=1Ventana temporal (en fotogramas) para calcular la dirección de la velocidad en OCM. Los valores más altos suavizan más el resultado.
inertia0.0-1.0Peso del coste de coherencia de velocidad. Los valores más altos penalizan los cambios bruscos de dirección.
use_byteTrue, FalseActiva una segunda pasada de asociación, al estilo de ByteTrack, sobre las detecciones de baja confianza.

Consejos de ajuste:

  • Movimiento no lineal: aumenta inertia (por ejemplo, 0.3-0.4).
  • Detecciones dispersas: activa use_byte: True.
  • Oclusiones prolongadas: aumenta track_buffer para que OCR disponga de más pistas perdidas que volver a asociar.

Con modelos OBB, OCR utiliza la caja orientada prevista por Kalman, ya que no se conserva el historial de la última observación orientada.

Deep OC-SORT#

Deep OC-SORT amplía OC-SORT con información de apariencia y compensación del movimiento de la cámara:

  • Asociación por apariencia: la distancia de incrustación del coseno se filtra según el solapamiento y se fusiona con el coste de movimiento.
  • EMA de apariencia dinámica: las incrustaciones de las pistas se actualizan con una EMA cuyo factor de suavizado se adapta a la confianza de la detección.
  • Compensación del movimiento de la cámara: los estados de Kalman se transforman de un fotograma al siguiente mediante flujo óptico disperso, ORB o ECC.

Ideal para: escenas concurridas o grabadas con cámaras en movimiento, donde son frecuentes los cambios de ID entre objetos visualmente distintos pero próximos en el espacio.

Argumentos específicos de Deep OC-SORT:

ParámetroValores o rangos válidosDescripción
with_reidTrue, FalseActiva la asociación basada en la apariencia. Está desactivada de forma predeterminada.
modelauto o ruta a un modelo ReID compatibleauto utiliza características nativas de YOLO cuando están disponibles; los modelos personalizados pueden ser puntos de control .pt o exportaciones compatibles.
proximity_thresh0.0-1.0IoU mínimo necesario para tener en cuenta las características de apariencia.
appearance_thresh0.0-1.0Similitud de apariencia normalizada mínima necesaria para una asociación ReID.
alpha_fixed_emb0.0-1.0Factor EMA base para actualizar las incrustaciones de las pistas. Los valores más altos conservan durante más tiempo la incrustación anterior.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMétodo de compensación del movimiento global.
delta_t>=1Ventana temporal (en fotogramas) para calcular la dirección de la velocidad en OCM (heredada de OC-SORT).
inertia0.0-1.0Peso del coste de coherencia de velocidad (heredado de OC-SORT).
use_byteTrue, FalseActiva una segunda asociación al estilo de ByteTrack sobre las detecciones de baja confianza (heredada de OC-SORT).

Consejos de ajuste:

  • Cambios de identidad en multitudes: aumenta appearance_thresh (por ejemplo, 0.92-0.95) y aumenta alpha_fixed_emb para que las incrustaciones se adapten más despacio.
  • Cámara en movimiento: establece gmc_method: sparseOptFlow (Deep OC-SORT utiliza none de forma predeterminada).
  • Menor latencia: mantén with_reid: False (valor predeterminado) para usar solo el movimiento + CMC; activa ReID solo cuando los cambios de ID sean la principal fuente de errores.

FastTracker#

FastTracker es una variante de ByteTrack que tiene en cuenta las oclusiones y no utiliza un modelo de apariencia:

  • Detección de oclusiones: marca las pistas como ocluidas cuando la cobertura por parte de otras pistas activas supera occ_cover_thresh.
  • Reversión de Kalman durante una oclusión: revierte el estado de Kalman a un fotograma anterior a la oclusión utilizando el historial almacenado en un búfer circular.
  • Amortiguación del movimiento y ampliación de la búsqueda: se amortigua la velocidad y se amplía el bbox previsto mientras dura la oclusión.
  • Supresión Init-IoU: evita que se inicien nuevas pistas encima de pistas activas.

Ideal para: procesos de detección en tiempo real con solapamientos frecuentes entre objetivos (multitudes, colas, deportes).

Argumentos específicos de FastTracker:

ParámetroValores o rangos válidosDescripción
reset_velocity_offset_occ>=0Número de fotogramas históricos para restaurar la velocidad de Kalman al comenzar una oclusión.
reset_pos_offset_occ>=0Número de fotogramas históricos para restaurar la posición de Kalman al comenzar una oclusión.
enlarge_bbox_occ>=1.0Escalado de la altura aplicado al bbox predicho durante la oclusión (la anchura se escala según la relación de aspecto XYAH).
dampen_motion_occ0.0-1.0Multiplicador de velocidad durante la oclusión. Los valores más bajos hacen que la trayectoria «reduzca la velocidad» durante la oclusión.
active_occ_to_lost_thresh>=1Número máximo de fotogramas consecutivos con oclusión antes de que una trayectoria activa pase a estar perdida.
occ_cover_thresh0.0-1.0Fracción del área de una trayectoria cubierta por otra trayectoria activa para declarar una oclusión.
occ_reappear_window>=0Número de fotogramas durante los que una trayectoria perdida que haya sufrido una oclusión reciente sigue siendo más fácil de volver a encontrar.
init_iou_suppress0.0-1.0Suprime la inicialización de nuevas trayectorias si su IoU con cualquier trayectoria activa supera este valor. Establece 1.0 para desactivarlo.

Consejos de ajuste:

  • Oclusiones parciales frecuentes: reduce occ_cover_thresh (p. ej., 0.5-0.6).
  • ID duplicados en zonas de solapamiento: reduce init_iou_suppress (p. ej., 0.5).
  • Oclusiones prolongadas: aumenta occ_reappear_window y track_buffer a la vez.
  • Objetos que se mueven rápido: aumenta dampen_motion_occ (acercándolo a 1.0); aumenta enlarge_bbox_occ solo si una región de búsqueda más amplia mejora la recuperación.

TrackTrack#

TrackTrack (Shim et al., CVPR 2025) es el tracker predeterminado. Analiza cada trayectoria desde su propia perspectiva mediante una asociación iterativa basada en varias señales:

  • Asociación basada en la perspectiva de la trayectoria (TPA): combina HMIoU, la distancia coseno opcional de ReID, la distancia de proyección de confianza y la distancia del ángulo de las esquinas. La asignación se resuelve de forma iterativa con un umbral que se relaja.
  • Inicialización adaptada a la trayectoria (TAI): suprime la creación de trayectorias duplicadas antes de asignar un ID nuevo.

Ideal para: escenas concurridas con oclusiones frecuentes que provocan problemas de ID duplicados.

Argumentos específicos de TrackTrack:

ParámetroValores o rangos válidosDescripción
iou_weight0.0-1.0Peso de la distancia HMIoU cuando ReID está activado; en caso contrario, se utiliza HMIoU directamente.
reid_weight0.0-1.0Peso de la distancia coseno de ReID cuando ReID está activado; en caso contrario, se ignora.
conf_weight0.0-1.0Peso de la distancia de proyección de confianza.
angle_weight0.0-1.0Peso de la distancia del ángulo de las esquinas.
penalty_p0.0-1.0Penalización de coste para las detecciones con poca confianza.
penalty_q0.0-1.0Penalización de coste para las detecciones recuperadas mediante NMS secundaria.
reduce_step0.0-1.0Relajación del umbral de coincidencia en cada iteración.
tai_thr0.0-1.0Umbral IoU para la NMS de inicialización adaptada a la trayectoria.
min_track_len>=0Longitud mínima del historial antes de confirmar una trayectoria nueva.
lost_match_thr0.0-1.0Límite de coste más flexible para la pasada de reasociación de trayectorias perdidas; 0 lo desactiva.
with_reidTrue, FalseActiva la asociación de apariencia con ReID coseno (utiliza las características nativas de YOLO). Está desactivada de forma predeterminada.
modelauto o ruta a un modelo ReID compatibleauto utiliza características nativas de YOLO cuando están disponibles; los modelos personalizados pueden ser puntos de control .pt o exportaciones compatibles.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMétodo de compensación del movimiento global.

Consejos de ajuste:

  • Multitudes de peatones: reduce tai_thr (p. ej., 0.45) para suprimir más trayectorias duplicadas; aumenta track_buffer para las oclusiones prolongadas.
  • Movimiento rápido de cámara: mantén activado gmc_method: sparseOptFlow.
  • Objetos pequeños o rápidos: aumenta ligeramente angle_weight y reduce min_track_len.
  • Activa ReID solo cuando sea necesario: añade coste de inferencia; para oclusiones breves, el coste predeterminado basado en varias señales suele ser suficiente.

Con los modelos Segment y Pose, TrackTrack omite la recuperación de detecciones con NMS flexible para que las máscaras y los puntos clave sigan alineados con sus detecciones.

Ejemplos de Python#



Ver: Cómo crear un sistema interactivo de seguimiento de objetos con Ultralytics YOLO | Haz clic para recortar y mostrar ⚡

Bucle para mantener las trayectorias#

Aquí tienes un script de Python que utiliza OpenCV (cv2) y YOLO26 para realizar el seguimiento de objetos en fotogramas de vídeo. Este script da por hecho que los paquetes necesarios (opencv-python y ultralytics) ya están instalados. El argumento persist=True indica al tracker que la imagen o el fotograma actual es el siguiente de una secuencia y que debe esperar trayectorias de la imagen anterior en la imagen actual.

Mantener las trayectorias y seleccionar un tracker

Usa persist=True solo al pasar fotogramas consecutivos de la misma secuencia de vídeo a model.track(). Así, el tracker puede reutilizar el estado de fotogramas anteriores y mantener ID de trayectoria coherentes a lo largo del tiempo. No uses persist=True con imágenes no relacionadas ni con otra secuencia, ya que el estado de las trayectorias anteriores podría conservarse.

También puedes elegir un backend de tracker pasando un archivo de configuración del tracker, como tracker="botsort.yaml", tracker="bytetrack.yaml" o tracker="tracktrack.yaml".

Bucle for con streaming y seguimiento
import cv2

from ultralytics import YOLO

# Carga el modelo YOLO26
model = YOLO("yolo26n.pt")

# Abre el archivo de vídeo
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Recorre los fotogramas del vídeo
while cap.isOpened():
    # Lee un fotograma del vídeo
    success, frame = cap.read()

    if success:
        # Ejecuta el seguimiento con YOLO26 en el fotograma y mantiene las trayectorias entre fotogramas
        # y utiliza el backend del tracker BoT-SORT
        results = model.track(frame, persist=True, tracker="botsort.yaml")

        # Visualiza los resultados en el fotograma
        annotated_frame = results[0].plot()

        # Muestra el fotograma anotado
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # Interrumpe el bucle si se pulsa 'q'
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Interrumpe el bucle si se llega al final del vídeo
        break

# Libera el objeto de captura de vídeo y cierra la ventana de visualización
cap.release()
cv2.destroyAllWindows()

Fíjate en el cambio de model(frame) a model.track(frame), que activa el seguimiento de objetos en lugar de la simple detección. Este script modificado ejecuta el tracker en cada fotograma del vídeo, visualiza los resultados y los muestra en una ventana. Puedes salir del bucle pulsando «q».

Representar las trayectorias a lo largo del tiempo#

Visualizar las trayectorias de los objetos en fotogramas consecutivos puede aportar información valiosa sobre los patrones de movimiento y el comportamiento de los objetos detectados en un vídeo. Con Ultralytics YOLO26, representar estas trayectorias es un proceso sencillo y eficiente.

En el siguiente ejemplo, mostramos cómo utilizar las capacidades de seguimiento de YOLO26 para representar el movimiento de los objetos detectados en varios fotogramas de vídeo. El script abre un archivo de vídeo, lo lee fotograma a fotograma y utiliza el modelo YOLO para identificar y seguir varios objetos. Al conservar los puntos centrales de los cuadros delimitadores detectados y conectarlos, podemos dibujar líneas que representan las trayectorias seguidas por los objetos.

Representar las trayectorias en varios fotogramas de vídeo
from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Carga el modelo YOLO26
model = YOLO("yolo26n.pt")

# Abre el archivo de vídeo
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Guarda el historial de trayectorias
track_history = defaultdict(list)

# Recorre los fotogramas del vídeo
while cap.isOpened():
    # Lee un fotograma del vídeo
    success, frame = cap.read()

    if success:
        # Ejecuta el seguimiento con YOLO26 en el fotograma y mantiene las trayectorias entre fotogramas
        result = model.track(frame, persist=True)[0]

        # Obtén los cuadros y los ID de las trayectorias
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Visualiza el resultado en el fotograma
            frame = result.plot()

            # Representa las trayectorias
            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)))  # Punto central x, y
                if len(track) > 30:  # Conserva 30 trayectorias durante 30 fotogramas
                    track.pop(0)

                # Dibuja las líneas de seguimiento
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Muestra el fotograma anotado
        cv2.imshow("YOLO26 Tracking", frame)

        # Interrumpe el bucle si se pulsa 'q'
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Interrumpe el bucle si se llega al final del vídeo
        break

# Libera el objeto de captura de vídeo y cierra la ventana de visualización
cap.release()
cv2.destroyAllWindows()

Seguimiento multiproceso#

El seguimiento multiproceso permite realizar el seguimiento de objetos simultáneamente en varias secuencias de vídeo. Es especialmente útil al gestionar varias entradas de vídeo, por ejemplo, de distintas cámaras de vigilancia, ya que el procesamiento simultáneo puede mejorar considerablemente la eficiencia y el rendimiento.

En el script de Python de ejemplo, utilizamos el módulo threading de Python para ejecutar varias instancias del tracker simultáneamente. Cada hilo se encarga de ejecutar el tracker en un archivo de vídeo y todos los hilos se ejecutan a la vez en segundo plano.

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

En este ejemplo se utilizan dos modelos distintos: yolo26n.pt y yolo26n-seg.pt, cada uno para seguir objetos en un archivo de vídeo diferente. Los archivos de vídeo se especifican en SOURCES.

El parámetro daemon=True de threading.Thread significa que estos hilos se cerrarán en cuanto termine el programa principal. A continuación, iniciamos los hilos con start() y utilizamos join() para que el hilo principal espere hasta que terminen ambos hilos del tracker.

Por último, cuando todos los hilos hayan terminado su tarea, las ventanas que muestran los resultados se cierran con cv2.destroyAllWindows().

Implementación del seguimiento multiproceso
import threading

import cv2

from ultralytics import YOLO

# Define los nombres de los modelos y las fuentes de vídeo
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # vídeo local, 0 para la cámara web

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

# Crea e inicia los hilos del tracker con un bucle 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()

# Espera a que terminen todos los hilos del tracker
for thread in tracker_threads:
    thread.join()

# Limpia y cierra las ventanas
cv2.destroyAllWindows()

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

Contribuye con nuevos trackers#

¿Tienes experiencia en el seguimiento de varios objetos y has implementado o adaptado con éxito un algoritmo de seguimiento para Ultralytics YOLO? ¡Te invitamos a contribuir a nuestra sección Trackers en ultralytics/cfg/trackers! Tus aplicaciones y soluciones del mundo real pueden ser muy valiosas para quienes trabajan en tareas de seguimiento.

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

Para empezar a contribuir, consulta nuestra Guía de contribución, donde encontrarás instrucciones detalladas para enviar una solicitud de incorporación de cambios (PR) 🛠️. ¡Estamos deseando ver tus propuestas!

¡Mejoremos juntos las capacidades de seguimiento del ecosistema Ultralytics YOLO 🙏!

Preguntas frecuentes#

  • El seguimiento de varios objetos en el análisis de vídeo consiste en identificar objetos y mantener un ID único para cada objeto detectado a lo largo de los fotogramas del vídeo. Ultralytics YOLO lo admite ofreciendo seguimiento en tiempo real junto con ID de objeto, lo que facilita tareas como la vigilancia de seguridad y el análisis deportivo. El sistema utiliza trackers como BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker y TrackTrack, que se pueden configurar mediante archivos YAML.

  • No. Los archivos .pt estándar de Ultralytics guardan los pesos del modelo YOLO, mientras que el tracker se crea durante la inferencia mediante model.track(). Los ID de trayectoria dependen del estado del tracker en fotogramas consecutivos, por lo que una imagen independiente puede devolver detecciones como cuadros, clases y niveles de confianza, pero no puede generar por sí sola ID de seguimiento persistentes con sentido.

    Para el despliegue, incluye el detector y el tracker juntos en tu aplicación y llama a model.track() fotograma a fotograma con persist=True cuando los fotogramas procedan de la misma secuencia de vídeo. Utiliza instancias de modelo o tracker independientes para secuencias no relacionadas, de modo que el estado no pase de un vídeo a otro.

  • Puedes configurar un tracker personalizado copiando un archivo de configuración de tracker existente (p. ej., custom_tracker.yaml) del directorio de configuración de trackers de Ultralytics y modificando los parámetros según sea necesario, excepto tracker_type. Usa este archivo en tu modelo de seguimiento así:

    Ejemplo
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
  • Para realizar el seguimiento de objetos simultáneamente en varias secuencias de vídeo, puedes utilizar el módulo threading de Python. Cada hilo se encargará de una secuencia de vídeo distinta. Aquí tienes un ejemplo de configuración:

    Seguimiento multiproceso
    import threading
    
    import cv2
    
    from ultralytics import YOLO
    
    # Define los nombres de los modelos y las fuentes de vídeo
    MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
    SOURCES = ["path/to/video.mp4", "0"]  # vídeo local, 0 para la cámara web
    
    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
    
    # Crea e inicia los hilos del tracker con un bucle 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()
    
    # Espera a que terminen todos los hilos del tracker
    for thread in tracker_threads:
        thread.join()
    
    # Limpia y cierra las ventanas
    cv2.destroyAllWindows()
  • El seguimiento de varios 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 analizar la actividad en tienda y mejorar la seguridad.
    • Acuicultura: seguimiento de peces para supervisar entornos acuáticos.
    • Análisis deportivo: seguimiento de jugadores y equipamiento para analizar el rendimiento.
    • Sistemas de seguridad: supervisión de actividades sospechosas y creación de alarmas de seguridad.

    Estas aplicaciones se benefician de la capacidad de Ultralytics YOLO para procesar en tiempo real vídeos con una alta frecuencia de fotogramas y una precisión excepcional.

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

    Representar las trayectorias en varios fotogramas de vídeo
    from 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()

    Este script representará las líneas de seguimiento que muestran las rutas de movimiento de los objetos a lo largo del tiempo y aportará información valiosa sobre su comportamiento y sus patrones.

Comentarios