Ultralytics YOLO27:
Get Started

Rastreamento de múltiplos objetos com Ultralytics YOLO#

YOLO multi-object tracking with trajectory paths

O rastreamento de objetos no domínio da análise de vídeo é uma tarefa fundamental que não só identifica a localização e a classe dos objetos no enquadramento, como também mantém um ID único para cada objeto detetado à medida que o vídeo avança. As aplicações são inúmeras — desde vigilância e segurança até à análise desportiva em tempo real.

Consulta a pré-visualização não lançada do YOLO27 para saber mais sobre o suporte de rastreamento planeado.

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

A partir de ultralytics 8.4.63, OC-SORT, Deep OC-SORT, FastTracker e TrackTrack estão disponíveis juntamente com BoT-SORT e ByteTrack.

Porquê escolher Ultralytics YOLO para o rastreamento de objetos?#

A saída dos rastreadores Ultralytics é consistente com a deteção de objetos padrão, mas acrescenta IDs de objeto. Isto facilita o rastreamento de objetos em fluxos de vídeo e a realização de análises subsequentes. Eis por que motivo deves considerar usar 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: Compatível com vários algoritmos e configurações de rastreamento.
  • Facilidade de utilização: API Python e opções de CLI simples para integração e implementação rápidas.
  • Personalização: Fácil de usar com modelos YOLO treinados de forma personalizada, permitindo a integração em aplicações específicas de cada domínio.


Assista: Como executar rastreamento de múltiplos objetos com Ultralytics YOLO26 | BoT-SORT e ByteTrack | VisionAI 🚀

Aplicações no mundo real#

TransportesRetalhoAquacultura
Rastreamento de veículosRastreamento de pessoasRastreamento de peixes

Início rápido#

Executa o rastreamento num vídeo com o rastreador TrackTrack predefinido. Muda para outro rastreador alterando o argumento tracker.

Exemplo
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

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

# Mudar para 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 deteção, segmentação, pose ou OBB, como YOLO26n, YOLO26n-seg, YOLO26n-pose ou YOLO26n-obb. Podes treinar modelos personalizados localmente ou através do treino na nuvem da Ultralytics Platform.

Exemplo
from ultralytics import YOLO

# Carrega um modelo oficial ou personalizado
model = YOLO("yolo26n.pt")  # Carrega um modelo oficial de deteção
model = YOLO("yolo26n-seg.pt")  # Carrega um modelo oficial de segmentação
model = YOLO("yolo26n-pose.pt")  # Carrega um modelo oficial de pose
model = YOLO("path/to/best.pt")  # Carrega um modelo treinado de forma personalizada

# Executa o rastreamento com o modelo
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # Rastreamento com o rastreador predefinido
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # com ByteTrack

Rastreadores compatíveis#

Ultralytics YOLO inclui seis rastreadores integrados. Ativa um deles indicando o respetivo ficheiro de configuração YAML no argumento tracker.

RastreadorFicheiro de configuraçãoModelo de movimentoAparência / ReIDCompensação do movimento da câmaraGestão de oclusões
BoT-SORTbotsort.yamlKalman linearOpcional (with_reid)Configurável (gmc_method)Buffer de rastreamento + reassociação ReID
ByteTrackbytetrack.yamlKalman linearNenhumNãoRecuperação em duas etapas de deteções com baixa confiança
OC-SORTocsort.yamlKalman centrado na observaçãoNenhumNãoORU, OCM, OCR: atualização a partir da última observação
Deep OC-SORTdeepocsort.yamlKalman centrado na observaçãoOpcional (with_reid)Configurável (gmc_method)OC-SORT + EMA de aparência adaptativa opcional
FastTrackerfasttrack.yamlKalman linear + reversãoNenhumNãoReversão de Kalman + ampliação da bbox durante oclusões
TrackTracktracktrack.yamlKalman linear (NSA)Opcional (with_reid)Configurável (gmc_method)Associação iterativa com múltiplas pistas + TAI

Que rastreador devo usar?#

Usa este fluxo para escolher um ponto de partida; utiliza-se tracktrack.yaml quando não indicas tracker:

  1. Precisas da opção mais rápida e simples? → ByteTrack (sem ReID, sem compensação do movimento da câmara, sobrecarga mínima).
  2. Vídeos captados à mão, por drone ou com câmara em movimento? → BoT-SORT (acrescenta compensação do movimento da câmara e ReID opcional).
  3. Movimento não linear (desporto, dança, mudanças bruscas de direção) e sem ReID? → OC-SORT (correções centradas na observação sem custos de aparência).
  4. Cenas concorridas com câmara em movimento, em que as trocas de ID são o principal problema? → Deep OC-SORT ou TrackTrack (ambos permitem correspondência de aparência opcional; TrackTrack também acrescenta associação com múltiplas pistas e supressão de IDs duplicados).
  5. Sobreposições parciais frequentes em tempo real, sem margem para ReID? → FastTracker (variante do ByteTrack sensível a oclusões, com reversão de Kalman).

Mudar de rastreador#

Indica o nome do ficheiro de configuração do rastreador em tracker=. Todo o restante código permanece igual.

Exemplo
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 do rastreamento partilha propriedades com o modo Predict, como conf, iou e show. Para mais opções de configuração, consulta a página do modelo Predict.

Exemplo
from ultralytics import YOLO

# Configura os parâmetros de rastreamento e executa o rastreador
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)

Configuração personalizada do rastreador#

A Ultralytics também te permite usar um ficheiro de configuração de rastreador modificado. Para isso, basta fazeres uma cópia de um ficheiro de configuração de rastreador (por exemplo, custom_tracker.yaml) de ultralytics/cfg/trackers e modificares as configurações conforme as tuas necessidades (exceto tracker_type).

Exemplo
from ultralytics import YOLO

# Carrega o modelo e executa o rastreador com um ficheiro de configuração personalizado
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")

Argumentos comuns dos rastreadores#

Os parâmetros seguintes são comuns à maioria dos ficheiros YAML dos rastreadores; nem todos aparecem em todas as configurações:

Informações sobre os limiares do rastreador

As deteções com valor igual ou superior a track_high_thresh entram na primeira etapa de associação. As deteções com valores entre track_low_thresh e track_high_thresh podem recuperar rastreamentos existentes quando o rastreador selecionado permite a associação de baixa confiança, mas não iniciam novos rastreamentos. As deteções com valor igual ou inferior a track_low_thresh são ignoradas.

ParâmetroValores ou intervalos válidosDescrição
tracker_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackEspecifica o tipo de rastreador.
track_high_thresh0.0-1.0Limiar para a primeira associação. Afeta o grau de confiança com que uma detecção é associada a uma trilha existente.
track_low_thresh0.0-1.0Limite inferior para detecções de recuperação com baixa confiança. OC-SORT e Deep OC-SORT usam essas detecções somente quando use_byte: True; TrackTrack as inclui no conjunto de associações penalizadas.
new_track_thresh0.0-1.0Limiar para inicializar uma nova trilha quando a detecção não corresponde a nenhuma trilha existente.
track_buffer>=0Número de quadros durante os quais trilhas perdidas são mantidas ativas antes da remoção. Um valor maior significa mais tolerância à oclusão.
match_thresh0.0-1.0Limiar para associar trilhas. Valores maiores tornam a associação mais permissiva.
fuse_scoreTrue, FalseIndica se as pontuações de confiança devem ser combinadas com as distâncias de IoU antes da associação.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMétodo de compensação global de movimento. Ajuda a levar em conta o movimento da câmera.
proximity_thresh0.0-1.0IoU mínimo necessário para uma correspondência ReID válida. Garante proximidade espacial antes de usar pistas de aparência.
appearance_thresh0.0-1.0Similaridade mínima de aparência normalizada necessária para ReID.
with_reidTrue, FalseAtiva a associação baseada em aparência para melhorar o rastreamento durante oclusões. Compatível com BoT-SORT, Deep OC-SORT e TrackTrack.
modelauto ou caminho para um modelo ReID compatívelModelo ReID. auto usa recursos nativos do backbone YOLO quando disponíveis; caso contrário, recorre a yolo26n-cls.pt. Um codificador personalizado pode ser um checkpoint .pt ou um modelo exportado, como .torchscript, .onnx, .engine ou um diretório de modelo OpenVINO.

Argumentos específicos do rastreador#

Cada algoritmo oferece parâmetros adicionais além dos parâmetros compartilhados. Consulte as seções de cada rastreador abaixo para ver as descrições e recomendações de ajuste, ou consulte diretamente os arquivos de configuração:

Ativar a reidentificação (ReID)#

A ReID fica desativada por padrão para minimizar a sobrecarga. Ative-a definindo with_reid: True em um arquivo de configuração do rastreador.

Opções de modelo ReID:

  • model: auto — Usa recursos nativos do detector YOLO, com sobrecarga mínima. Ideal quando você precisa de alguma ReID sem grande impacto no desempenho. Recorre a yolo26n-cls.pt se o detector não disponibilizar recursos compatíveis.
  • Modelo ReID personalizado — Defina model: como um checkpoint .pt ou como um modelo de incorporação exportado compatível, como .torchscript, .onnx, .engine ou um diretório de modelo OpenVINO. Os modelos exportados são carregados por meio de AutoBackend e devem gerar diretamente um tensor de incorporação.

Há codificadores ONNX prontos para uso publicados para todos os tamanhos de modelo. Defina model: como um desses nomes e o arquivo será baixado automaticamente na primeira execução do rastreador (da mesma forma que os pesos YOLO são obtidos) — não é necessário exportar nem baixar 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
Modelotamanho
(pixels)
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
A ReID é exclusiva do rastreamento

Atualmente, só há codificadores ReID ONNX disponíveis para o ramo de aparência do rastreador. Os modos ReID train, val e predict, assim como receitas dedicadas para exportação ReID, ainda estão em desenvolvimento.

Para obter melhor desempenho com um modelo de classificação separado, exporte-o para um back-end mais rápido, como TensorRT:

Exportar um modelo ReID para TensorRT
from torch import nn

from ultralytics import YOLO

# Carrega o modelo de classificação
model = YOLO("yolo26n-cls.pt")

# Adiciona uma camada de pooling médio
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

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

Depois de exportar, indique o caminho do modelo TensorRT na configuração do rastreador.

Detalhes dos rastreadores#

As seções abaixo descrevem o projeto de cada rastreador, seus parâmetros específicos e dicas de ajuste.



Assista: Qual rastreador de objetos tem melhor desempenho? | Velocidade, FPS e estabilidade de ID | Ultralytics YOLO26 📊

BoT-SORT#

BoT-SORT (Aharon et al., 2022) amplia o ByteTrack com compensação do movimento da câmera e ReID opcional:

  • Compensação do movimento da câmera (CMC): aplica-se aos estados de Kalman, antes da associação por IoU, uma transformação afim estimada a cada quadro (por padrão, fluxo óptico esparso; ORB/ECC também estão disponíveis).
  • ReID opcional: as incorporações de aparência podem ser combinadas na matriz de custos. Desativada por padrão; ative com with_reid: True.

Ideal para: rastreamento de uso geral, especialmente com câmeras em movimento. Adicione ReID somente quando multidões com aparência semelhante causarem trocas de ID.

Argumentos específicos do BoT-SORT:

ParâmetroValores ou intervalos válidosDescrição
gmc_methodsparseOptFlow, orb, sift, ecc, noneBack-end para compensação do movimento da câmera. sparseOptFlow é o padrão. none desativa a CMC.
with_reidTrue, FalseAtiva a associação baseada em aparência. Desativada por padrão.
modelauto ou caminho para um modelo ReID compatívelauto usa recursos nativos do YOLO quando disponíveis; os modelos personalizados podem ser checkpoints .pt ou exportações compatíveis.
proximity_thresh0.0-1.0IoU mínimo para considerar os recursos de aparência.
appearance_thresh0.0-1.0Similaridade mínima de aparência normalizada necessária para uma correspondência ReID. Aumente o valor para tornar a associação mais rigorosa.

Dicas de ajuste:

  • Câmera estática: defina gmc_method: none para economizar alguns ms/quadro.
  • Muito movimento da câmera: mantenha sparseOptFlow; ecc é mais preciso, mas mais lento.
  • Multidões com aparência semelhante: ative with_reid: True e aumente appearance_thresh (por exemplo, 0.85+).

ByteTrack#

ByteTrack (Zhang et al., ECCV 2022) é a referência leve. Usa Kalman linear + IoU com uma associação em duas etapas:

  • Etapa 1: associa detecções com pontuações altas às trilhas ativas.
  • Etapa 2: tenta novamente associar as trilhas não associadas às detecções com pontuações baixas para recuperá-las após oclusões parciais breves.

Não há modelo de aparência nem compensação do movimento da câmera.

Ideal para: câmeras estáticas ou quase estáticas, nas quais o custo do detector predomina e você quer minimizar a sobrecarga do rastreador.

Argumentos específicos do ByteTrack: nenhum além dos argumentos compartilhados do rastreador.

Dicas de ajuste:

  • Detector ruidoso: diminua track_low_thresh para que a segunda etapa tenha mais candidatos.
  • Detector com alta cobertura: aumente track_high_thresh para reduzir a fragmentação dos IDs.
  • Oscilações frequentes de ID: aumente track_buffer para que as trilhas perdidas brevemente persistam.

OC-SORT#

OC-SORT (Cao et al., CVPR 2023) é uma extensão do SORT centrada nas observações. Mantém o projeto 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 corrigir a velocidade desviada.
  • Momentum centrado na observação (OCM): penaliza detecções que se movem na direção errada por meio de um termo de consistência da velocidade.
  • Recuperação centrada na observação (OCR): verifica novamente as detecções não associadas em relação às trilhas perdidas recentemente, usando a última observação em vez do estado previsto.

Ideal para: movimento não linear sem o custo de um modelo ReID.

Argumentos específicos do OC-SORT:

ParâmetroValores ou intervalos válidosDescrição
delta_t>=1Janela temporal (em quadros) para calcular a direção da velocidade no OCM. Valores maiores suavizam mais.
inertia0.0-1.0Peso do custo de consistência da velocidade. Valores maiores penalizam mudanças bruscas de direção.
use_byteTrue, FalseAtiva uma segunda etapa de associação, no estilo ByteTrack, para detecções com baixa confiança.

Dicas de ajuste:

  • Movimento não linear: aumente inertia (por exemplo, 0.3-0.4).
  • Detecções esparsas: ative use_byte: True.
  • Oclusões longas: aumente track_buffer para que a OCR tenha mais trilhas perdidas para reassociar.

Com modelos OBB, a OCR usa a caixa orientada prevista pelo Kalman, pois o histórico da última observação orientada não é mantido.

Deep OC-SORT#

Deep OC-SORT amplia o OC-SORT com informações de aparência e compensação do movimento da câmera:

  • Associação por aparência: a distância de incorporação por cosseno é limitada pela sobreposição e combinada com o custo de movimento.
  • EMA dinâmica da aparência: as incorporações das trilhas são atualizadas com uma EMA cujo fator de suavização se adapta à confiança da detecção.
  • Compensação do movimento da câmera: os estados de Kalman são transformados entre quadros por meio de fluxo óptico esparso, ORB ou ECC.

Ideal para: cenas lotadas ou com câmeras em movimento, nas quais são comuns trocas de ID entre objetos visualmente diferentes, mas espacialmente próximos.

Argumentos específicos do Deep OC-SORT:

ParâmetroValores ou intervalos válidosDescrição
with_reidTrue, FalseAtiva a associação baseada em aparência. Desativada por padrão.
modelauto ou caminho para um modelo ReID compatívelauto usa recursos nativos do YOLO quando disponíveis; os modelos personalizados podem ser checkpoints .pt ou exportações compatíveis.
proximity_thresh0.0-1.0IoU mínimo para considerar os recursos de aparência.
appearance_thresh0.0-1.0Similaridade mínima de aparência normalizada necessária para uma correspondência ReID.
alpha_fixed_emb0.0-1.0Fator EMA base para atualizações das incorporações das trilhas. Valores maiores preservam por mais tempo a incorporação antiga.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMétodo de compensação global de movimento.
delta_t>=1Janela temporal (em quadros) para calcular a direção da velocidade no OCM (herdada do OC-SORT).
inertia0.0-1.0Peso do custo de consistência da velocidade (herdado do OC-SORT).
use_byteTrue, FalseAtiva uma segunda etapa de associação, no estilo ByteTrack, para detecções com baixa confiança (herdada do OC-SORT).

Dicas de ajuste:

  • Trocas de identidade em multidões: aumente appearance_thresh (por exemplo, 0.92-0.95) e aumente alpha_fixed_emb para que as incorporações se adaptem mais lentamente.
  • Câmera em movimento: defina gmc_method: sparseOptFlow (o padrão do Deep OC-SORT é none).
  • Menor latência: mantenha with_reid: False (padrão) apenas para movimento + CMC; ative ReID somente quando as trocas de ID forem a principal fonte de erros.

FastTracker#

FastTracker é uma variante do ByteTrack que leva as oclusões em conta e não usa modelo de aparência:

  • Detecção de oclusão: sinaliza trilhas como oclusas quando a cobertura por outras trilhas ativas excede occ_cover_thresh.
  • Reversão de Kalman em caso de oclusão: reverte o estado de Kalman para um quadro anterior à oclusão usando um histórico armazenado em buffer circular.
  • Redução do movimento e ampliação da busca: a velocidade é reduzida e a bbox prevista é ampliada enquanto há oclusão.
  • Supressão Init-IoU: impede a criação de novas trilhas sobre trilhas ativas.

Ideal para: pipelines de detecção em tempo real sem rastreamento que apresentam sobreposição frequente entre alvos (multidões, filas, esportes).

Argumentos específicos do FastTracker:

ParâmetroValores ou intervalos válidosDescrição
reset_velocity_offset_occ>=0Número de frames anteriores a recuperar para restaurar a velocidade de Kalman no início da oclusão.
reset_pos_offset_occ>=0Número de frames anteriores a recuperar para restaurar a posição de Kalman no início da oclusão.
enlarge_bbox_occ>=1.0Escala de altura aplicada à bbox prevista durante a oclusão (a largura é escalada pela proporção XYAH).
dampen_motion_occ0.0-1.0Multiplicador de velocidade durante a oclusão. Valores menores fazem o rastreamento "abrandar" durante a oclusão.
active_occ_to_lost_thresh>=1Número máximo de frames consecutivos de oclusão antes de mover um rastreamento ativo para o estado perdido.
occ_cover_thresh0.0-1.0Fração da área de um rastreamento coberta por outro rastreamento ativo para declarar uma oclusão.
occ_reappear_window>=0Número de frames durante os quais um rastreamento perdido recentemente ocluído permanece preferencialmente localizável de novo.
init_iou_suppress0.0-1.0Suprime a inicialização de um novo rastreamento se o IoU dele com qualquer rastreamento ativo exceder este valor. Defina como 1.0 para desativar.

Dicas de ajuste:

  • Oclusões parciais frequentes: reduza occ_cover_thresh (por exemplo, 0.5-0.6).
  • IDs duplicados perto de sobreposições: reduza init_iou_suppress (por exemplo, 0.5).
  • Oclusões longas: aumente occ_reappear_window e track_buffer em conjunto.
  • Alvos em movimento rápido: aumente dampen_motion_occ (aproximando-o de 1.0); aumente enlarge_bbox_occ apenas quando uma região de busca mais ampla melhorar a recuperação.

TrackTrack#

TrackTrack (Shim et al., CVPR 2025) é o rastreador padrão. Ele raciocina a partir da perspectiva de cada rastreamento com associação iterativa baseada em múltiplas pistas:

  • Associação baseada na perspectiva do rastreamento (TPA): combina HMIoU, distância ReID de cosseno opcional, distância de projeção de confiança e distância de ângulo de canto. A atribuição é resolvida iterativamente com um limiar que vai sendo relaxado.
  • Inicialização com reconhecimento do rastreamento (TAI): suprime a criação de rastreamentos duplicados antes da criação de um novo ID.

Ideal para: cenas lotadas com oclusões frequentes, nas quais IDs duplicados são um problema.

Argumentos específicos do TrackTrack:

ParâmetroValores ou intervalos válidosDescrição
iou_weight0.0-1.0Peso da distância HMIoU quando o ReID está ativado; caso contrário, o HMIoU é usado diretamente.
reid_weight0.0-1.0Peso da distância ReID de cosseno quando o ReID está ativado; caso contrário, ela é ignorada.
conf_weight0.0-1.0Peso da distância de projeção de confiança.
angle_weight0.0-1.0Peso da distância de ângulo de canto.
penalty_p0.0-1.0Penalidade de custo para detecções de baixa confiança.
penalty_q0.0-1.0Penalidade de custo para detecções recuperadas pelo NMS secundário.
reduce_step0.0-1.0Relaxamento do limiar de correspondência por iteração.
tai_thr0.0-1.0Limiar de IoU para o NMS da inicialização com reconhecimento do rastreamento.
min_track_len>=0Comprimento mínimo do histórico antes de confirmar um novo rastreamento.
lost_match_thr0.0-1.0Limite de custo mais permissivo para a etapa de reassociação de rastreamentos perdidos com limiar relaxado; 0 desativa essa etapa.
with_reidTrue, FalseAtiva a correspondência de aparência com ReID de cosseno (usa as características nativas do YOLO). Desativada por padrão.
modelauto ou caminho para um modelo ReID compatívelauto usa recursos nativos do YOLO quando disponíveis; os modelos personalizados podem ser checkpoints .pt ou exportações compatíveis.
gmc_methodsparseOptFlow, orb, sift, ecc, noneMétodo de compensação global de movimento.

Dicas de ajuste:

  • Pedestres em cenas lotadas: reduza tai_thr (por exemplo, 0.45) para suprimir mais criações duplicadas; aumente track_buffer para oclusões mais longas.
  • Movimento rápido da câmera: mantenha gmc_method: sparseOptFlow ativado.
  • Objetos pequenos/em movimento rápido: aumente ligeiramente angle_weight e reduza min_track_len.
  • Ative o ReID apenas quando necessário: ele aumenta o custo de inferência; para oclusões curtas, o custo padrão baseado em múltiplas pistas costuma ser suficiente.

Com modelos de Segmentação e Pose, o TrackTrack ignora a recuperação de detecções com NMS permissivo para manter as máscaras e os pontos-chave alinhados com as respetivas detecções.

Exemplos em Python#



Assista: Como criar rastreamento interativo de objetos com Ultralytics YOLO | Clique para recortar e exibir ⚡

Loop para persistir os rastreamentos#

Segue um script Python que usa OpenCV (cv2) e YOLO26 para rastrear objetos em frames de vídeo. Este script pressupõe que os pacotes necessários (opencv-python e ultralytics) já estão instalados. O argumento persist=True informa o rastreador de que a imagem ou o frame atual é o próximo de uma sequência e de que deve esperar encontrar na imagem atual rastreamentos da imagem anterior.

Como persistir rastreamentos e selecionar um rastreador

Use persist=True apenas ao passar frames consecutivos do mesmo fluxo de vídeo para model.track(). Isso permite que o rastreador reutilize o estado de frames anteriores e mantenha IDs de rastreamento consistentes ao longo do tempo. Não use persist=True com imagens não relacionadas ou com outro fluxo, pois o estado anterior do rastreamento pode ser mantido.

Também podes escolher um backend de rastreador passando um ficheiro de configuração do rastreador, como tracker="botsort.yaml", tracker="bytetrack.yaml" ou tracker="tracktrack.yaml".

Loop for com streaming e rastreamento
import cv2

from ultralytics import YOLO

# Carrega o modelo YOLO26
model = YOLO("yolo26n.pt")

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

# Percorre os quadros do vídeo
while cap.isOpened():
    # Lê um quadro do vídeo
    success, frame = cap.read()

    if success:
        # Executa o rastreamento YOLO26 no frame, persistindo os rastreamentos entre frames
        # e usando o backend de rastreador BoT-SORT
        results = model.track(frame, persist=True, tracker="botsort.yaml")

        # Visualiza os resultados no quadro
        annotated_frame = results[0].plot()

        # Exibe o quadro anotado
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # Interrompe o loop se 'q' for pressionado
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Interrompe o loop se o vídeo chegar ao fim
        break

# Libera o objeto de captura de vídeo e fecha a janela de exibição
cap.release()
cv2.destroyAllWindows()

Repara na alteração de model(frame) para model.track(frame), que ativa o rastreamento de objetos em vez da deteção simples. Este script modificado executa o rastreador em cada frame do vídeo, visualiza os resultados e apresenta-os numa janela. Podes sair do loop premindo 'q'.

Representar os rastreamentos ao longo do tempo#

Visualizar os rastreamentos de objetos em frames consecutivos pode fornecer informações valiosas sobre os padrões de movimento e o comportamento dos objetos detetados num vídeo. Com o Ultralytics YOLO26, representar esses rastreamentos é um processo simples e eficiente.

No exemplo seguinte, mostramos como usar os recursos de rastreamento do YOLO26 para representar o movimento dos objetos detetados ao longo de vários frames de vídeo. Este script abre um ficheiro de vídeo, lê-o frame a frame e usa o modelo YOLO para identificar e rastrear vários objetos. Ao guardar os pontos centrais das caixas delimitadoras detetadas e ligá-los, podemos desenhar linhas que representam os percursos seguidos pelos objetos rastreados.

Representação dos rastreamentos em vários frames de vídeo
from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Carrega o modelo YOLO26
model = YOLO("yolo26n.pt")

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

# Armazena o histórico do rastreamento
track_history = defaultdict(list)

# Percorre os quadros do vídeo
while cap.isOpened():
    # Lê um quadro do vídeo
    success, frame = cap.read()

    if success:
        # Executa o rastreamento YOLO26 no frame, persistindo os rastreamentos entre frames
        result = model.track(frame, persist=True)[0]

        # Obtém as caixas e os IDs de rastreamento
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Visualiza o resultado no frame
            frame = result.plot()

            # Representa os rastreamentos
            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)))  # ponto central x, y
                if len(track) > 30:  # mantém 30 rastreamentos durante 30 frames
                    track.pop(0)

                # Desenha as linhas de rastreamento
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Exibe o quadro anotado
        cv2.imshow("YOLO26 Tracking", frame)

        # Interrompe o loop se 'q' for pressionado
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Interrompe o loop se o vídeo chegar ao fim
        break

# Libera o objeto de captura de vídeo e fecha a janela de exibição
cap.release()
cv2.destroyAllWindows()

Rastreamento multithread#

O rastreamento multithread permite executar o rastreamento de objetos em vários fluxos de vídeo em simultâneo. Isto é particularmente útil ao processar várias entradas de vídeo, como as provenientes de várias câmaras de vigilância, em que o processamento simultâneo pode aumentar significativamente a eficiência e o desempenho.

No script Python apresentado, usamos o módulo threading do Python para executar várias instâncias do rastreador em simultâneo. Cada thread é responsável por executar o rastreador num ficheiro de vídeo, e todas as threads são executadas simultaneamente em segundo plano.

Para garantir que cada thread recebe os parâmetros corretos (o ficheiro de vídeo, o modelo a usar e o índice do ficheiro), definimos uma função run_tracker_in_thread que aceita estes parâmetros e contém o loop principal de rastreamento. Esta função lê o vídeo frame a frame, executa o rastreador e guarda os resultados anotados.

Neste exemplo, são usados dois modelos diferentes: yolo26n.pt e yolo26n-seg.pt, cada um a rastrear objetos num ficheiro de vídeo diferente. Os ficheiros de vídeo são especificados em SOURCES.

O parâmetro daemon=True em threading.Thread significa que estas 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 aguardar até que ambas as threads do rastreador terminem.

Por fim, depois de todas as threads concluírem a tarefa, as janelas que apresentam os resultados são fechadas com cv2.destroyAllWindows().

Implementação de rastreamento multithread
import threading

import cv2

from ultralytics import YOLO

# Define os nomes dos modelos e as fontes de vídeo
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # vídeo local, 0 para webcam

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

# Cria e inicia threads do rastreador usando um loop 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()

# Aguarda que todas as threads do rastreador terminem
for thread in tracker_threads:
    thread.join()

# Limpa e fecha as janelas
cv2.destroyAllWindows()

Este exemplo pode ser facilmente ampliado para processar mais ficheiros de vídeo e modelos, criando mais threads e aplicando a mesma metodologia.

Contribui com novos rastreadores#

Tens experiência em rastreamento de vários objetos e implementaste ou adaptaste com sucesso um algoritmo de rastreamento com o Ultralytics YOLO? Convidamos-te a contribuir para a nossa secção de rastreadores em ultralytics/cfg/trackers! As tuas aplicações e soluções do mundo real podem ser valiosas para quem trabalha em tarefas de rastreamento.

Ao contribuir para esta secção, ajudas a ampliar o conjunto de soluções de rastreamento disponíveis no framework Ultralytics YOLO, acrescentando mais uma camada de funcionalidade e utilidade para a comunidade.

Para iniciares a tua contribuição, consulta o nosso Guia de Contribuição para obter instruções completas sobre como enviar um Pull Request (PR) 🛠️. Estamos ansiosos por ver o que tens para partilhar!

Juntos, vamos melhorar os recursos de rastreamento do ecossistema Ultralytics YOLO 🙏!

Perguntas frequentes#

  • O rastreamento de vários objetos em análise de vídeo envolve identificar objetos e manter um ID único para cada objeto detetado ao longo dos frames do vídeo. O Ultralytics YOLO suporta esta funcionalidade ao fornecer 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 ficheiros YAML.

  • Não. Os ficheiros 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 ao longo de frames consecutivos; por isso, uma única imagem autónoma pode devolver deteções, como caixas, classes e níveis de confiança, mas não pode produzir por si só IDs de rastreamento persistentes com significado.

    Para a implementação, inclui o detetor e o rastreador na tua aplicação e chama model.track() frame a frame com persist=True quando os frames vierem do mesmo fluxo de vídeo. Usa instâncias separadas do modelo ou do rastreador para fluxos não relacionados, para que o estado não transite de um vídeo para outro.

  • Podes configurar um rastreador personalizado copiando um ficheiro 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 tracker_type. Usa este ficheiro no teu modelo de rastreamento da seguinte forma:

    Exemplo
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
  • Para executar o rastreamento de objetos em vários fluxos de vídeo em simultâneo, podes usar o módulo threading do Python. Cada thread processa um fluxo de vídeo separado. Segue um exemplo de como podes configurar isto:

    Rastreamento multithread
    import threading
    
    import cv2
    
    from ultralytics import YOLO
    
    # Define os nomes dos modelos e as fontes de vídeo
    MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
    SOURCES = ["path/to/video.mp4", "0"]  # vídeo local, 0 para webcam
    
    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
    
    # Cria e inicia threads do rastreador usando um loop 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()
    
    # Aguarda que todas as threads do rastreador terminem
    for thread in tracker_threads:
        thread.join()
    
    # Limpa e fecha as janelas
    cv2.destroyAllWindows()
  • O rastreamento de vários 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.
    • Retalho: rastreamento de pessoas para análise em lojas e segurança.
    • Aquacultura: rastreamento de peixes para monitorizar ambientes aquáticos.
    • Análise desportiva: rastreamento de jogadores e equipamento para análise de desempenho.
    • Sistemas de segurança: monitorização de atividades suspeitas e criação de alarmes de segurança.

    Estas aplicações beneficiam da capacidade do Ultralytics YOLO de processar vídeos com elevada taxa de frames em tempo real e com precisão excecional.

  • Para visualizar os rastreamentos de objetos ao longo de vários frames de vídeo, podes usar os recursos de rastreamento do modelo YOLO juntamente com OpenCV para desenhar os percursos dos objetos detetados. Segue um script de exemplo que demonstra como fazer isso:

    Representação dos rastreamentos em vários frames 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 representa as linhas de rastreamento que mostram os percursos de movimento dos objetos rastreados ao longo do tempo, fornecendo informações valiosas sobre o comportamento e os padrões dos objetos.

Comentários