Seguimiento de varios objetos con Ultralytics YOLO#
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.
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#
| Transporte | Comercio minorista | Acuicultura |
|---|---|---|
| Seguimiento de vehículos | Seguimiento de personas | Seguimiento 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.
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.
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 ByteTrackRastreadores compatibles#
Ultralytics YOLO incluye seis rastreadores integrados. Activa uno pasando su archivo de configuración YAML al argumento tracker.
| Rastreador | Archivo de configuración | Modelo de movimiento | Apariencia / ReID | Compensación del movimiento de la cámara | Gestión de oclusiones |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman lineal | Opcional (with_reid) | Configurable (gmc_method) | Búfer de seguimiento + reasociación ReID |
| ByteTrack | bytetrack.yaml | Kalman lineal | Ninguno | No | Recuperación en dos etapas de detecciones con baja confianza |
| OC-SORT | ocsort.yaml | Kalman centrado en las observaciones | Ninguno | No | ORU, OCM, OCR: actualización de nuevo a partir de la última observación |
| Deep OC-SORT | deepocsort.yaml | Kalman centrado en las observaciones | Opcional (with_reid) | Configurable (gmc_method) | OC-SORT + EMA de apariencia adaptativa opcional |
| FastTracker | fasttrack.yaml | Kalman lineal + reversión | Ninguno | No | Reversión de Kalman + ampliación de bbox en caso de oclusión |
| TrackTrack | tracktrack.yaml | Kalman 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:
- ¿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).
- ¿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).
- ¿Movimiento no lineal (deportes, baile, giros bruscos) y sin ReID? → OC-SORT (correcciones centradas en las observaciones sin el coste de apariencia).
- ¿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).
- ¿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.
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.
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).
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:
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ámetro | Valores o rangos válidos | Descripción |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Especifica el tipo de rastreador. |
track_high_thresh | 0.0-1.0 | Umbral para la primera asociación. Afecta al grado de confianza con el que una detección se asigna a una pista existente. |
track_low_thresh | 0.0-1.0 | Lí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_thresh | 0.0-1.0 | Umbral para iniciar una nueva pista si la detección no coincide con ninguna pista existente. |
track_buffer | >=0 | Nú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_thresh | 0.0-1.0 | Umbral para asociar pistas. Los valores más altos hacen que la asociación sea más permisiva. |
fuse_score | True, False | Indica si se fusionan las puntuaciones de confianza con las distancias IoU antes de la asociación. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Método de compensación del movimiento global. Ayuda a tener en cuenta el movimiento de la cámara. |
proximity_thresh | 0.0-1.0 | IoU mínimo necesario para una asociación ReID válida. Garantiza una proximidad espacial suficiente antes de usar indicios de apariencia. |
appearance_thresh | 0.0-1.0 | Similitud de apariencia normalizada mínima necesaria para ReID. |
with_reid | True, False | Activa la asociación basada en la apariencia para mejorar el seguimiento durante las oclusiones. Compatible con BoT-SORT, Deep OC-SORT y TrackTrack. |
model | auto o ruta a un modelo ReID compatible | Modelo 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 ayolo26n-cls.pt.- Modelo ReID personalizado — Asigna a
model:la ruta a un punto de control.pto a un modelo de incrustaciones exportado compatible, como.torchscript,.onnx,.engineo un directorio de modelo de OpenVINO. Los modelos exportados se cargan medianteAutoBackendy 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| Modelo | tamaño (píxeles) | parámetros (M) | FLOPs (B) |
|---|---|---|---|
| YOLO26n-reid.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
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:
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ámetro | Valores o rangos válidos | Descripción |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend de compensación del movimiento de la cámara. sparseOptFlow es el valor predeterminado. none desactiva CMC. |
with_reid | True, False | Activa la asociación basada en la apariencia. Está desactivada de forma predeterminada. |
model | auto o ruta a un modelo ReID compatible | auto utiliza características nativas de YOLO cuando están disponibles; los modelos personalizados pueden ser puntos de control .pt o exportaciones compatibles. |
proximity_thresh | 0.0-1.0 | IoU mínimo necesario para tener en cuenta las características de apariencia. |
appearance_thresh | 0.0-1.0 | Similitud 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: nonepara ahorrar unos pocos ms por fotograma. - Mucho movimiento de cámara: mantén
sparseOptFlow;ecces más preciso, pero más lento. - Multitudes de aspecto similar: activa
with_reid: Truey aumentaappearance_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_threshpara que la segunda fase disponga de más candidatos. - Detector con alta exhaustividad: aumenta
track_high_threshpara reducir la fragmentación de los ID. - Cambios frecuentes de ID: aumenta
track_bufferpara 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ámetro | Valores o rangos válidos | Descripción |
|---|---|---|
delta_t | >=1 | Ventana temporal (en fotogramas) para calcular la dirección de la velocidad en OCM. Los valores más altos suavizan más el resultado. |
inertia | 0.0-1.0 | Peso del coste de coherencia de velocidad. Los valores más altos penalizan los cambios bruscos de dirección. |
use_byte | True, False | Activa 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_bufferpara 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ámetro | Valores o rangos válidos | Descripción |
|---|---|---|
with_reid | True, False | Activa la asociación basada en la apariencia. Está desactivada de forma predeterminada. |
model | auto o ruta a un modelo ReID compatible | auto utiliza características nativas de YOLO cuando están disponibles; los modelos personalizados pueden ser puntos de control .pt o exportaciones compatibles. |
proximity_thresh | 0.0-1.0 | IoU mínimo necesario para tener en cuenta las características de apariencia. |
appearance_thresh | 0.0-1.0 | Similitud de apariencia normalizada mínima necesaria para una asociación ReID. |
alpha_fixed_emb | 0.0-1.0 | Factor EMA base para actualizar las incrustaciones de las pistas. Los valores más altos conservan durante más tiempo la incrustación anterior. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Método de compensación del movimiento global. |
delta_t | >=1 | Ventana temporal (en fotogramas) para calcular la dirección de la velocidad en OCM (heredada de OC-SORT). |
inertia | 0.0-1.0 | Peso del coste de coherencia de velocidad (heredado de OC-SORT). |
use_byte | True, False | Activa 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 aumentaalpha_fixed_embpara que las incrustaciones se adapten más despacio. - Cámara en movimiento: establece
gmc_method: sparseOptFlow(Deep OC-SORT utilizanonede 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ámetro | Valores o rangos válidos | Descripción |
|---|---|---|
reset_velocity_offset_occ | >=0 | Número de fotogramas históricos para restaurar la velocidad de Kalman al comenzar una oclusión. |
reset_pos_offset_occ | >=0 | Número de fotogramas históricos para restaurar la posición de Kalman al comenzar una oclusión. |
enlarge_bbox_occ | >=1.0 | Escalado 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_occ | 0.0-1.0 | Multiplicador 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 | >=1 | Número máximo de fotogramas consecutivos con oclusión antes de que una trayectoria activa pase a estar perdida. |
occ_cover_thresh | 0.0-1.0 | Fracción del área de una trayectoria cubierta por otra trayectoria activa para declarar una oclusión. |
occ_reappear_window | >=0 | Nú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_suppress | 0.0-1.0 | Suprime 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_windowytrack_buffera la vez. - Objetos que se mueven rápido: aumenta
dampen_motion_occ(acercándolo a1.0); aumentaenlarge_bbox_occsolo 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ámetro | Valores o rangos válidos | Descripción |
|---|---|---|
iou_weight | 0.0-1.0 | Peso de la distancia HMIoU cuando ReID está activado; en caso contrario, se utiliza HMIoU directamente. |
reid_weight | 0.0-1.0 | Peso de la distancia coseno de ReID cuando ReID está activado; en caso contrario, se ignora. |
conf_weight | 0.0-1.0 | Peso de la distancia de proyección de confianza. |
angle_weight | 0.0-1.0 | Peso de la distancia del ángulo de las esquinas. |
penalty_p | 0.0-1.0 | Penalización de coste para las detecciones con poca confianza. |
penalty_q | 0.0-1.0 | Penalización de coste para las detecciones recuperadas mediante NMS secundaria. |
reduce_step | 0.0-1.0 | Relajación del umbral de coincidencia en cada iteración. |
tai_thr | 0.0-1.0 | Umbral IoU para la NMS de inicialización adaptada a la trayectoria. |
min_track_len | >=0 | Longitud mínima del historial antes de confirmar una trayectoria nueva. |
lost_match_thr | 0.0-1.0 | Límite de coste más flexible para la pasada de reasociación de trayectorias perdidas; 0 lo desactiva. |
with_reid | True, False | Activa la asociación de apariencia con ReID coseno (utiliza las características nativas de YOLO). Está desactivada de forma predeterminada. |
model | auto o ruta a un modelo ReID compatible | auto utiliza características nativas de YOLO cuando están disponibles; los modelos personalizados pueden ser puntos de control .pt o exportaciones compatibles. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Mé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; aumentatrack_bufferpara las oclusiones prolongadas. - Movimiento rápido de cámara: mantén activado
gmc_method: sparseOptFlow. - Objetos pequeños o rápidos: aumenta ligeramente
angle_weighty reducemin_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.
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".
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.
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().
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
.ptestándar de Ultralytics guardan los pesos del modelo YOLO, mientras que el tracker se crea durante la inferencia mediantemodel.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 conpersist=Truecuando 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, exceptotracker_type. Usa este archivo en tu modelo de seguimiento así:Ejemplofrom 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
threadingde Python. Cada hilo se encargará de una secuencia de vídeo distinta. Aquí tienes un ejemplo de configuración:Seguimiento multiprocesoimport 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ídeofrom 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.