Rastreamento de Múltiplos Objetos com Ultralytics YOLO#
O rastreamento de objetos no domínio da análise de vídeo é uma tarefa crítica que não apenas identifica a localização e a classe dos objetos dentro do quadro, mas também mantém um ID único para cada objeto detectado à medida que o vídeo progride. As aplicações são ilimitadas — variando de vigilância e segurança a análises esportivas em tempo real.
A partir do Ultralytics YOLO v8.4.63, novos algoritmos de rastreamento estão disponíveis: OC-SORT, Deep OC-SORT, FastTracker e TrackTrack. Esses rastreadores melhoram o desempenho do rastreamento de múltiplos objetos e a consistência de ID.
Por que escolher o Ultralytics YOLO para Rastreamento de Objetos?#
A saída dos rastreadores do Ultralytics é consistente com a detecção de objetos padrão, mas traz o valor adicional de IDs de objetos. Isso facilita o rastreamento de objetos em fluxos de vídeo e a realização de análises subsequentes. Eis por que deves considerar usar o Ultralytics YOLO para as tuas necessidades de rastreamento de objetos:
- Eficiência: Processa fluxos de vídeo em tempo real sem comprometer a precisão.
- Flexibilidade: Suporta múltiplos algoritmos e configurações de rastreamento.
- Facilidade de Uso: API Python simples e opções de CLI para integração e implantação rápidas.
- Customização: Fácil de usar com modelos YOLO treinados de forma personalizada, permitindo a integração em aplicações de domínio específico.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Aplicações do mundo real#
| Transporte | Varejo | Aquicultura |
|---|---|---|
| Rastreamento de Veículos | Rastreamento de Pessoas | Rastreamento de Peixes |
Início Rápido#
Executa o rastreamento em um vídeo com o rastreador BoT-SORT padrão. Muda para outro rastreador alterando o argumento tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (BoT-SORT)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")Para executar o rastreador em fluxos de vídeo, usa um modelo treinado de Detect, Segment, Pose ou OBB, como YOLO26n, YOLO26n-seg, YOLO26n-pose ou YOLO26n-obb. Podes treinar modelos personalizados localmente ou com o treinamento na nuvem do Ultralytics Platform.
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-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 ByteTrackRastreadores Suportados#
O Ultralytics YOLO vem com seis rastreadores integrados. Ativa um deles passando o seu arquivo de configuração YAML para o argumento tracker.
| Rastreador | Arquivo de configuração | Modelo de movimento | Aparência / ReID | Compensação de movimento da câmera | Tratamento de oclusão |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman Linear | Opcional (with_reid) | Sim (sparseOptFlow / ECC) | Buffer de rastreamento + religação ReID |
| ByteTrack | bytetrack.yaml | Kalman Linear | Nenhuma | Não | Resgate de baixa confiança em dois estágios |
| OC-SORT | ocsort.yaml | Kalman centrado na observação | Nenhuma | Não | Reatualização ORU, OCM, OCR a partir da última observação |
| Deep OC-SORT | deepocsort.yaml | Kalman centrado na observação | Opcional (with_reid) | Opcional (gmc_method) | OC-SORT + EMA de aparência adaptativa |
| FastTracker | fasttrack.yaml | Kalman Linear + reversão | Nenhuma | Não | Reversão Kalman + ampliação de BBox em oclusão |
| TrackTrack | tracktrack.yaml | Kalman Linear (NSA) | Opcional (fallback HMIoU) | Sim (sparseOptFlow / ECC) | Associação iterativa de múltiplas pistas + TAI |
Qual Rastreador Devo Usar?#
Use este fluxo para escolher um ponto de partida:
- Precisa da base mais rápida e simples? → ByteTrack (sem ReID, sem compensação de movimento de câmera, sobrecarga mínima).
- Filmagem portátil, de drone ou com câmera em movimento? → BoT-SORT (padrão; adiciona compensação de movimento de câmera e ReID opcional).
- Movimento não linear (esportes, dança, curvas bruscas) e sem ReID? → OC-SORT (correções centradas na observação sem custo de aparência).
- Cenas movimentadas com câmera em movimento onde as trocas de ID são o problema principal? → Deep OC-SORT ou TrackTrack (ambos adicionam fusão de aparência adaptativa; TrackTrack também adiciona associação de múltiplas pistas e supressão de ID duplicado).
- Sobreposição parcial frequente em tempo real, sem orçamento de ReID? → FastTracker (variante do ByteTrack consciente de oclusão com reversão Kalman).
Alternando Rastreadores#
Passa o nome do arquivo de configuração do rastreador para tracker=. Todo o restante código permanece igual.
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")Configuração#
Argumentos de Rastreamento#
A configuração de rastreamento partilha propriedades com o modo Predict, tais como conf, iou e show. Para mais configurações, consulta a página do modelo Predict.
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)Configuração de Rastreador Personalizado#
O Ultralytics também permite usar um arquivo de configuração de rastreador modificado. Para isso, basta fazeres uma cópia de um arquivo de configuração de rastreador (por exemplo, custom_tracker.yaml) em ultralytics/cfg/trackers e modificar quaisquer configurações (exceto o tracker_type) de acordo com as tuas necessidades.
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Argumentos Compartilhados do Rastreador#
Os seguintes parâmetros são comuns à maioria dos arquivos YAML de rastreador; nem todo parâmetro aparece em todas as configurações:
Se a pontuação de confiança de uma detecção cair abaixo de track_high_thresh, o rastreador não atualizará esse objeto, resultando em nenhum rastreamento ativo.
| Parâmetro | Valores Válidos ou Intervalos | Descrição |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Especifica o tipo de rastreador. |
track_high_thresh | 0.0-1.0 | Limiar para a primeira associação. Afeta a confiança com que uma detecção é combinada com um rastreamento existente. |
track_low_thresh | 0.0-1.0 | Limiar para a segunda associação sobre detecções de baixa confiança. Para OC-SORT e Deep OC-SORT, isto aplica-se apenas quando use_byte: True. |
new_track_thresh | 0.0-1.0 | Limiar para inicializar um novo rastreamento se a detecção não corresponder a nenhum rastreamento existente. |
track_buffer | >=0 | Quadros que rastreamentos perdidos são mantidos vivos antes da remoção. Um valor mais alto significa mais tolerância para oclusão. |
match_thresh | 0.0-1.0 | Limiar para combinar rastreamentos. Valores mais altos tornam a correspondência mais leniente. |
fuse_score | True, False | Se deve fundir pontuações de confiança com distâncias IoU antes de corresponder. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Método de compensação de movimento global. Ajuda a considerar o movimento da câmera. |
proximity_thresh | 0.0-1.0 | IoU mínimo necessário para uma correspondência ReID válida. Garante proximidade espacial antes de usar dicas de aparência. |
appearance_thresh | 0.0-1.0 | Similaridade de aparência mínima necessária para ReID. |
with_reid | True, False | Ative a correspondência baseada em aparência para um rastreamento melhor durante oclusões. Suportado por BoT-SORT, Deep OC-SORT e TrackTrack. |
model | auto ou caminho para um arquivo exportado | Modelo ReID. auto usa recursos nativos da espinha dorsal (backbone) do YOLO quando disponíveis; caso contrário, recorre a yolo26n-cls.pt. Passa um arquivo .torchscript, .onnx, .engine, .openvino, … para um codificador personalizado. |
Argumentos específicos do rastreador#
Cada algoritmo expõe botões adicionais além dos parâmetros compartilhados. Consulte as seções por rastreador abaixo para obter descrições e dicas de ajuste, ou consulte diretamente os arquivos de configuração:
Habilitando a Reidentificação (ReID)#
O ReID é desativado por padrão para minimizar a sobrecarga. Ativa-o definindo with_reid: True em um arquivo de configuração do rastreador.
Opções de modelo de ReID:
model: auto— Usa recursos nativos do detector YOLO, adicionando sobrecarga mínima. Ideal quando precisas de algum ReID sem um grande impacto no desempenho. Recorre ayolo26n-cls.ptse o detector não expuser recursos compatíveis.- Modelo ReID exportado — Aponta
model:para um arquivo exportado (.torchscript,.onnx,.engine,.openvino, etc.) para obter embeddings mais discriminativos ao custo de uma passada para a frente (forward pass) extra por recorte. O codificador é carregado viaAutoBackend, de modo que qualquer formato de exportação compatível com o Ultralytics funciona sem alterações de código.
Codificadores ONNX prontos a usar são publicados para cada tamanho de modelo. Define model: para um destes nomes e o arquivo é baixado automaticamente na primeira vez que o rastreador é executado (da mesma forma que os pesos do YOLO são obtidos) — sem necessidade de etapas manuais de exportação ou download:
# 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 | tamanho (pixels) | 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 |
Atualmente, apenas os codificadores ReID ONNX para o ramo de aparência do rastreador estão disponíveis. Os modos ReID train, val e predict, bem como as receitas de exportação ReID dedicadas, ainda estão em desenvolvimento.
Para um melhor desempenho com um modelo de classificação separado, exporte-o para um backend mais rápido como o TensorRT:
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo26n-cls.pt")
# Add average pooling layer
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
# Export to TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)Uma vez exportado, aponte para o caminho do modelo TensorRT na sua configuração de rastreador.
Detalhes do rastreador#
Expanda as seções abaixo para ver o design, os parâmetros específicos e as dicas de ajuste de cada rastreador.
BoT-SORT#
BoT-SORT (Aharon et al., 2022) é o rastreador padrão. Ele estende o ByteTrack com compensação de movimento de câmara e ReID opcional:
- Compensação de Movimento da Câmera (CMC): uma transformação afim estimada a cada quadro (fluxo óptico esparso por padrão; ORB / ECC também estão disponíveis) é aplicada aos estados de Kalman antes da correspondência de IoU.
- ReID Opcional: os embeddings de aparência podem ser fundidos na matriz de custos. Desativado por padrão; ativa com
with_reid: True.
Melhor para: rastreamento de propósito geral, especialmente com câmeras em movimento. Adicione ReID apenas quando multidões semelhantes causarem trocas de ID.
Argumentos específicos do BoT-SORT:
| Parâmetro | Valores Válidos ou Intervalos | Descrição |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend de compensação de movimento de câmara. sparseOptFlow é o padrão. none desativa o CMC. |
with_reid | True, False | Habilita a correspondência baseada em aparência. Desativado por padrão. |
model | auto ou caminho para um modelo ReID | Modelo ReID. auto usa recursos nativos do YOLO quando disponíveis; caso contrário, passa um caminho .torchscript / .onnx / .engine. |
proximity_thresh | 0.0-1.0 | IoU mínima antes que os recursos de aparência sejam considerados. |
appearance_thresh | 0.0-1.0 | Similaridade de cosseno mínima necessária para uma correspondência de ReID. Aumente para reduzir trocas de identidade. |
Dicas de ajuste:
- Câmara estática: define
gmc_method: nonepara poupar alguns ms/quadro. - Movimento intenso da câmara: mantém
sparseOptFlow;eccé mais preciso, mas mais lento. - Multidões semelhantes: ativa
with_reid: Truee aumentaappearance_thresh(por exemplo,0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) é a linha de base leve. Ele usa Kalman linear + IoU com uma associação em duas etapas:
- Estágio 1: faz a correspondência de detecções de alta pontuação com trilhas ativas.
- Estágio 2: tenta novamente a correspondência de trilhas não correspondidas com detecções de baixa pontuação para recuperar através de uma breve oclusão parcial.
Não há modelo de aparência nem compensação de movimento da câmera.
Melhor para: câmeras estáticas ou quase estáticas onde o custo do detector domina e você deseja o mínimo de sobrecarga de rastreador.
Argumentos específicos do ByteTrack: Nenhum além dos argumentos de rastreador partilhados.
Dicas de ajuste:
- Detector ruidoso: reduz
track_low_threshpara que a segunda etapa tenha mais candidatos. - Detector de alta recuperação (high-recall): aumenta
track_high_threshpara reduzir IDs fragmentados. - Frequente oscilação de ID: aumenta
track_bufferpara que os rastreamentos perdidos brevemente sobrevivam.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023) é uma extensão centrada na observação do SORT. Mantém o design leve do SORT (sem recursos de aparência) e adiciona três correções:
- Reatualização Centrada na Observação (ORU): reproduz uma trajetória virtual entre a última observação e a detecção atual, executando novamente a atualização de Kalman para reparar a velocidade com desvio.
- Momento Centrado na Observação (OCM): penaliza detecções que se movem na direção errada através de um termo de consistência de velocidade.
- Recuperação Centrada na Observação (OCR): verifica novamente detecções não correspondidas contra trilhas perdidas recentemente usando sua última observação em vez do estado previsto.
Melhor para: movimento não linear sem o custo de um modelo de ReID.
Argumentos específicos do OC-SORT:
| Parâmetro | Valores Válidos ou Intervalos | Descrição |
|---|---|---|
delta_t | >=1 | Janela temporal (quadros) para o cálculo da direção da velocidade no OCM. Valores maiores suavizam mais. |
inertia | 0.0-1.0 | Peso do custo de consistência da velocidade. Valores mais altos penalizam mudanças repentinas de direção. |
use_byte | True, False | Habilita uma segunda passagem de associação estilo ByteTrack sobre detecções de baixa confiança. |
Dicas de ajuste:
- Movimento não linear: aumenta
inertia(por exemplo,0.3-0.4). - Detecções esparsas: ativa
use_byte: True. - Oclusões longas: aumenta
track_bufferpara que o OCR tenha mais rastreamentos perdidos para reassociar.
Deep OC-SORT#
Deep OC-SORT complementa o OC-SORT com informações de aparência e compensação de movimento de câmara:
- Fusão adaptativa de aparência: embeddings de detecção são fundidos na matriz de custo com peso modulado pela confiança da detecção e sobreposição.
- EMA de aparência dinâmica: embeddings de trilha são atualizados com um EMA cujo fator de suavização se adapta à confiança da detecção.
- Compensação de Movimento da Câmera: estados de Kalman são deformados quadro a quadro via fluxo óptico esparso, ORB ou ECC.
Melhor para: cenas lotadas ou com câmera em movimento onde trocas de ID entre objetos visualmente diferentes mas espacialmente próximos são comuns.
Argumentos específicos do Deep OC-SORT:
| Parâmetro | Valores Válidos ou Intervalos | Descrição |
|---|---|---|
with_reid | True, False | Habilita a correspondência baseada em aparência. Desativado por padrão. |
model | auto, arquivo de modelo ReID exportado | Modelo ReID. auto reutiliza recursos nativos do YOLO; caso contrário, passa um arquivo exportado (.torchscript, .onnx, .engine, …). |
proximity_thresh | 0.0-1.0 | IoU mínima antes que os recursos de aparência sejam considerados. |
appearance_thresh | 0.0-1.0 | Similaridade de cosseno mínima necessária para uma correspondência de ReID. |
alpha_fixed_emb | 0.0-1.0 | Fator EMA base para atualizações de embedding de trilha. Valores mais altos preservam o embedding antigo por mais tempo. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Método de compensação de movimento global. |
delta_t | >=1 | Janela temporal (quadros) para o cálculo da direção da velocidade no OCM (herdado do OC-SORT). |
inertia | 0.0-1.0 | Peso do custo de consistência da velocidade (herdado do OC-SORT). |
use_byte | True, False | Habilita uma segunda associação estilo ByteTrack sobre detecções de baixa confiança (herdado do OC-SORT). |
Dicas de ajuste:
- Trocas de identidade em multidões: aumenta
appearance_thresh(por exemplo,0.92-0.95) e reduzalpha_fixed_embpara que os embeddings se adaptem mais lentamente. - Câmara em movimento: define
gmc_method: sparseOptFlow(o Deep OC-SORT assumenonepor padrão). - Menor latência: mantém
with_reid: False(padrão) apenas para movimento + CMC; ativa o ReID apenas quando as trocas de ID dominam os erros.
FastTracker#
FastTracker é uma variante do ByteTrack ciente de oclusão, sem modelo de aparência:
- Detecção de oclusão: sinaliza rastreamentos como ocluídos quando a cobertura por outros rastreamentos ativos excede
occ_cover_thresh. - Rollback de Kalman na oclusão: reverte o estado de Kalman para um quadro pré-oclusão usando histórico de buffer circular.
- Amortecimento de movimento e expansão de busca: a velocidade é amortecida e a bbox prevista é ampliada enquanto ocluída.
- Supressão de Init-IoU: evita que novas trilhas surjam sobre trilhas ativas.
Melhor para: pipelines de detecção em tempo real com sobreposição frequente de alvo-em-alvo (multidões, filas, esportes).
Argumentos específicos do FastTracker:
| Parâmetro | Valores Válidos ou Intervalos | Descrição |
|---|---|---|
reset_velocity_offset_occ | >=0 | Quadros de histórico para restaurar a velocidade de Kalman no início da oclusão. |
reset_pos_offset_occ | >=0 | Quadros de histórico para restaurar a posição de Kalman no início da oclusão. |
enlarge_bbox_occ | >=1.0 | Escalonamento de altura aplicado à bbox prevista enquanto ocluída (a largura escala via proporção XYAH). |
dampen_motion_occ | 0.0-1.0 | Multiplicador de velocidade enquanto ocluída. Valores mais baixos fazem a trilha "desacelerar" através da oclusão. |
active_occ_to_lost_thresh | >=1 | Máximo de quadros ocluídos consecutivos antes que uma trilha ativa seja movida para perdida. |
occ_cover_thresh | 0.0-1.0 | Fração da área de um rastreamento coberta por outro rastreamento ativo para declarar oclusão. |
occ_reappear_window | >=0 | Quadros em que um rastreamento perdido e recentemente ocluído permanece preferencialmente encontrável. |
init_iou_suppress | 0.0-1.0 | Suprime a inicialização de um novo rastreamento se o seu IoU com qualquer rastreamento ativo exceder isto. Define como 1.0 para desativar. |
Dicas de ajuste:
- Oclusões parciais frequentes: reduz
occ_cover_thresh(por exemplo,0.5-0.6). - IDs duplicados em torno de sobreposições: reduz
init_iou_suppress(por exemplo,0.5). - Oclusões longas: aumenta
occ_reappear_windowetrack_bufferem conjunto. - Alvos de movimento rápido: aumenta
dampen_motion_occ(mais perto de1.0) e reduzenlarge_bbox_occ.
TrackTrack#
TrackTrack (Shim et al., CVPR 2025) raciocina a partir da perspectiva de cada rastreamento com associação iterativa de múltiplos indícios (multi-cue):
- Associação baseada na perspectiva do rastreamento (TPA): combina HMIoU, distância de ReID de cosseno, distância de projeção de confiança e distância de ângulo de canto. A atribuição é resolvida iterativamente com um limite de relaxamento.
- Inicialização com reconhecimento de rastreamento (TAI): suprime gerações duplicadas antes que um novo ID seja criado.
Melhor para: cenas lotadas com oclusão frequente onde IDs duplicados são um problema.
Argumentos específicos do TrackTrack:
| Parâmetro | Valores Válidos ou Intervalos | Descrição |
|---|---|---|
iou_weight | 0.0-1.0 | Peso da distância HMIoU na matriz de custo multicanal. |
reid_weight | 0.0-1.0 | Peso da distância de ReID de cosseno. Recorre ao HMIoU se o ReID estiver desativado. |
conf_weight | 0.0-1.0 | Peso da distância de projeção de confiança. |
angle_weight | 0.0-1.0 | Peso da distância de ângulo de canto. |
penalty_p | 0.0-1.0 | Penalidade de custo para detecções de baixa confiança. |
penalty_q | 0.0-1.0 | Penalidade de custo para detecções recuperadas por NMS secundário. |
reduce_step | 0.0-1.0 | Relaxamento do limite de correspondência por iteração. |
tai_thr | 0.0-1.0 | Limite de IoU para NMS de inicialização com reconhecimento de rastreamento. |
min_track_len | >=0 | Atualizações bem-sucedidas mínimas antes que um novo rastreamento seja confirmado. |
lost_match_thr | 0.0-1.0 | Portão de custo mais flexível para a passada relaxada de reassociação de perdidos; 0 desativa-o. |
with_reid | True, False | Ative a correspondência de aparência ReID de cosseno (usa recursos nativos do YOLO). Desativado por padrão. |
model | auto, arquivo ReID | Modelo ReID; auto usa recursos nativos do YOLO, caso contrário, um arquivo ReID exportado. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Método de compensação de movimento global. |
Dicas de ajuste:
- Pedestres aglomerados: reduz
tai_thr(por exemplo,0.45) para suprimir mais gerações duplicadas; aumentatrack_bufferpara oclusões mais longas. - Movimento rápido da câmara: mantém
gmc_method: sparseOptFlowativado. - Objetos pequenos/rápidos: aumenta ligeiramente
angle_weighte reduzmin_track_len. - Ative o ReID apenas quando necessário: ele aumenta o custo de inferência; para oclusões curtas, o custo multicanal padrão geralmente é suficiente.
Exemplos em Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Loop de persistência de rastreamentos#
Aqui está um script em Python que usa o OpenCV (cv2) e o YOLO26 para executar o rastreamento de objetos em quadros de vídeo. Este script assume que os pacotes necessários (opencv-python e ultralytics) já estão instalados. O argumento persist=True diz ao rastreador que a imagem ou quadro atual é o seguinte em uma sequência e para esperar rastreamentos da imagem anterior na imagem atual.
Usa persist=True apenas ao passar quadros consecutivos do mesmo fluxo de vídeo para model.track(). Isto permite que o rastreador reutilize o estado de quadros anteriores e mantenha IDs de rastreamento consistentes ao longo do tempo. Não uses persist=True em imagens não relacionadas ou em um fluxo diferente, pois o estado de rastreamento anterior pode propagar-se.
Podes também escolher um backend de rastreador passando um arquivo de configuração de rastreador, tal como tracker="botsort.yaml", tracker="bytetrack.yaml" ou tracker="tracktrack.yaml".
import cv2
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.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 YOLO26 tracking on the frame, persisting tracks between frames
# and using the BoT-SORT tracker backend
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO26 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()Observa a mudança de model(frame) para model.track(frame), que ativa o rastreamento de objetos em vez de uma simples detecção. Este script modificado executará o rastreador em cada quadro do vídeo, visualizará os resultados e os exibirá em uma janela. O loop pode ser fechado pressionando 'q'.
Plotando rastreamentos ao longo do tempo#
Visualizar rastreamentos de objetos ao longo de quadros consecutivos pode fornecer insights valiosos sobre os padrões de movimento e o comportamento dos objetos detectados dentro de um vídeo. Com o Ultralytics YOLO26, plotar esses rastreamentos é um processo contínuo e eficiente.
No exemplo a seguir, demonstramos como utilizar os recursos de rastreamento do YOLO26 para plotar o movimento de objetos detectados em vários quadros de vídeo. Este script envolve abrir um arquivo de vídeo, lê-lo quadro a quadro e utilizar o modelo YOLO para identificar e rastrear vários objetos. Ao reter os pontos centrais das caixas delimitadoras detectadas e conectá-los, podemos desenhar linhas que representam os caminhos seguidos pelos objetos rastreados.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(list)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
result = model.track(frame, persist=True)[0]
# Get the boxes and track IDs
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualize the result on the frame
frame = result.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 30 tracks for 30 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", 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()Rastreamento multithread#
O rastreamento multithread oferece a capacidade de executar o rastreamento de objetos em vários fluxos de vídeo simultaneamente. Isso é particularmente útil ao lidar com múltiplas entradas de vídeo, como de várias câmeras de vigilância, onde o processamento simultâneo pode melhorar muito a eficiência e o desempenho.
No script Python fornecido, utilizamos o módulo threading do Python para executar várias instâncias do rastreador simultaneamente. Cada thread é responsável por executar o rastreador em um arquivo de vídeo, e todas as threads são executadas em simultâneo em segundo plano.
Para garantir que cada thread receba os parâmetros corretos (o arquivo de vídeo, o modelo a ser usado e o índice do arquivo), definimos uma função run_tracker_in_thread que aceita esses parâmetros e contém o loop principal de rastreamento. Esta função lê o vídeo quadro a quadro, executa o rastreador e exibe os resultados.
Dois modelos diferentes são usados neste exemplo: yolo26n.pt e yolo26n-seg.pt, cada um rastreando objetos em um arquivo de vídeo diferente. Os arquivos de vídeo são especificados em SOURCES.
O parâmetro daemon=True em threading.Thread significa que essas threads serão fechadas assim que o programa principal terminar. Em seguida, iniciamos as threads com start() e usamos join() para fazer a thread principal esperar até que ambas as threads do rastreador tenham terminado.
Finalmente, após todas as threads concluírem a sua tarefa, as janelas que exibem os resultados são fechadas usando cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-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 YOLO26 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 exemplo pode ser facilmente estendido para lidar com mais arquivos de vídeo e modelos criando mais threads e aplicando a mesma metodologia.
Contribua com novos rastreadores#
Tens experiência em rastreamento de múltiplos objetos e implementaste ou adaptaste com sucesso um algoritmo de rastreamento com o Ultralytics YOLO? Convidamos-te a contribuir para a nossa seção Trackers em ultralytics/cfg/trackers! As tuas aplicações e soluções do mundo real podem ser inestimáveis para utilizadores que trabalham em tarefas de rastreamento.
Ao contribuir para esta seção, você ajuda a expandir o escopo de soluções de rastreamento disponíveis na estrutura do Ultralytics YOLO, adicionando outra camada de funcionalidade e utilidade para a comunidade.
Para iniciar a tua contribuição, consulta o nosso Guia de Contribuição para obter instruções abrangentes sobre como enviar um Pull Request (PR) 🛠️. Estamos entusiasmados para ver o que tens para oferecer!
Juntos, vamos melhorar as capacidades de rastreamento do ecossistema Ultralytics YOLO 🙏!
FAQ#
O que é rastreamento de múltiplos objetos e como o Ultralytics YOLO o suporta?#
O rastreamento de múltiplos objetos em análise de vídeo envolve tanto a identificação de objetos quanto a manutenção de um ID exclusivo para cada objeto detectado ao longo dos quadros de vídeo. O Ultralytics YOLO suporta isto fornecendo rastreamento em tempo real juntamente com IDs de objetos, facilitando tarefas como vigilância de segurança e análise desportiva. O sistema usa rastreadores como BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker e TrackTrack, que podem ser configurados através de arquivos YAML.
Posso armazenar o rastreador dentro de um arquivo de modelo YOLO?#
Não. Os arquivos padrão .pt do Ultralytics armazenam os pesos do modelo YOLO, enquanto o rastreador é criado no momento da inferência por model.track(). Os IDs de rastreamento dependem do estado do rastreador em quadros consecutivos, de modo que uma única imagem isolada pode retornar detecções como caixas, classes e confianças, mas não consegue produzir IDs de rastreamento persistentes e significativos por si só.
Para a implantação, empacota o detector e o rastreador juntos na tua aplicação e chama model.track() quadro a quadro com persist=True quando os quadros vierem do mesmo fluxo de vídeo. Usa instâncias separadas de modelo ou rastreador para fluxos não relacionados, para que o estado não seja propagado entre vídeos.
Como configuro um rastreador personalizado para o Ultralytics YOLO?#
Podes configurar um rastreador personalizado copiando um arquivo de configuração de rastreador existente (por exemplo, custom_tracker.yaml) do diretório de configuração de rastreadores do Ultralytics e modificando os parâmetros conforme necessário, exceto o tracker_type. Usa este arquivo no teu modelo de rastreamento da seguinte forma:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Como posso executar o rastreamento de objetos em vários fluxos de vídeo simultaneamente?#
Para executar o rastreamento de objetos em múltiplos fluxos de vídeo simultaneamente, podes usar o módulo threading do Python. Cada thread lidará com um fluxo de vídeo separado. Aqui está um exemplo de como podes configurar isto:
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-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 YOLO26 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()Quais são as aplicações do mundo real do rastreamento de múltiplos objetos com o Ultralytics YOLO?#
O rastreamento de múltiplos objetos com o Ultralytics YOLO tem inúmeras aplicações, incluindo:
- Transportes: Rastreamento de veículos para gestão de tráfego e condução autônoma.
- Varejo: Rastreamento de pessoas para análises em loja e segurança.
- Aquicultura: Rastreamento de peixes para monitoramento de ambientes aquáticos.
- Análise Esportiva: Rastreamento de jogadores e equipamentos para análise de desempenho.
- Sistemas de Segurança: Monitorização de atividades suspeitas e criação de alarmes de segurança.
Essas aplicações se beneficiam da capacidade do Ultralytics YOLO de processar vídeos com alta taxa de quadros em tempo real com precisão excepcional.
Como posso visualizar rastreamentos de objetos em vários quadros de vídeo com o Ultralytics YOLO?#
Para visualizar rastreamentos de objetos em vários quadros de vídeo, você pode usar os recursos de rastreamento do modelo YOLO junto com o OpenCV para desenhar os caminhos dos objetos detectados. Aqui está um exemplo de script que demonstra isso:
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:
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("YOLO26 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()Este script plotará as linhas de rastreamento mostrando os caminhos de movimento dos objetos rastreados ao longo do tempo, fornecendo insights valiosos sobre o comportamento e padrões dos objetos.