Seguimento de vários objectos com Ultralytics YOLO
O rastreio de objectos no domínio da análise de vídeo é uma tarefa crítica que não só identifica a localização e a classe dos objectos dentro do fotograma, como também mantém uma ID única para cada objeto detectado à medida que o vídeo avança. As aplicações são ilimitadas - desde a vigilância e segurança até à análise de desporto em tempo real.
Porquê escolher Ultralytics YOLO para o seguimento de objectos?
A saída dos rastreadores Ultralytics é consistente com a deteção de objetos padrão, mas tem o valor agregado de IDs de objetos. Isto facilita o rastreio de objectos em fluxos de vídeo e a realização de análises subsequentes. Eis porque deve considerar a utilização do Ultralytics YOLO para as suas necessidades de seguimento de objectos:
- Eficiência: Processe fluxos de vídeo em tempo real sem comprometer a precisão.
- Flexibilidade: Suporta vários algoritmos e configurações de rastreio.
- Facilidade de utilização: API Python simples e opções CLI para uma integração e implementação rápidas.
- Personalização: Fácil de utilizar com modelos YOLO personalizados e treinados, permitindo a integração em aplicações específicas do domínio.
Ver: Deteção e seguimento de objectos com Ultralytics YOLO .
Aplicações no mundo real
Transporte | Retalho | Aquacultura |
---|---|---|
Rastreio de veículos | Seguimento de pessoas | Seguimento de peixes |
Visão geral das caraterísticas
Ultralytics YOLO alarga as suas funcionalidades de deteção de objectos para proporcionar um seguimento de objectos robusto e versátil:
- Seguimento em tempo real: Rastreie objectos sem problemas em vídeos de alta velocidade de fotogramas.
- Suporte a múltiplos rastreadores: Escolha entre uma variedade de algoritmos de rastreamento estabelecidos.
- Configurações personalizáveis do rastreador: Adapte o algoritmo de rastreamento para atender a requisitos específicos, ajustando vários parâmetros.
Rastreadores disponíveis
Ultralytics YOLO suporta os seguintes algoritmos de rastreamento. Eles podem ser ativados passando o arquivo de configuração YAML relevante, como tracker=tracker_type.yaml
:
- BoT-SORT - Utilização
botsort.yaml
para ativar este localizador. - ByteTrack - Utilização
bytetrack.yaml
para ativar este localizador.
O localizador predefinido é o BoT-SORT.
Rastreio
Informações sobre o limiar do rastreador
Se o índice de confiança do objeto for baixo, ou seja, inferior a track_high_thresh
não haverá nenhuma faixa devolvida e actualizada com êxito.
Para executar o rastreador em fluxos de vídeo, use um modelo treinado de Detetar, Segmentar ou Pose, como YOLO11n, YOLO11n-seg e YOLO11n-pose.
Exemplo
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo11n.pt") # Load an official Detect model
model = YOLO("yolo11n-seg.pt") # Load an official Segment model
model = YOLO("yolo11n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrack
# Perform tracking with various models using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4" # Official Segment model
yolo track model=yolo11n-pose.pt source="https://youtu.be/LNwODJXcvt4" # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4" # Custom trained model
# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"
Como pode ser visto na utilização acima, o rastreio está disponível para todos os modelos Detect, Segment e Pose executados em vídeos ou fontes de streaming.
Configuração
Informações sobre o limiar do rastreador
Se o índice de confiança do objeto for baixo, ou seja, inferior a track_high_thresh
não haverá nenhuma faixa devolvida e actualizada com êxito.
Argumentos de rastreio
A configuração de rastreio partilha propriedades com o modo Prever, tais como conf
, iou
e show
. Para mais configurações, consultar o Prever página do modelo.
Exemplo
Seleção de rastreadores
Ultralytics também permite usar um arquivo de configuração do rastreador modificado. Para o fazer, basta fazer uma cópia de um ficheiro de configuração do tracker (por exemplo, custom_tracker.yaml
) de ultralytics/cfg/trackers e modificar quaisquer configurações (exceto a tracker_type
) de acordo com as suas necessidades.
Exemplo
Para uma lista completa de argumentos de rastreamento, consulte a página ultralytics/cfg/trackers.
Python Exemplos
Loop de rastos persistentes
Aqui está um script Python usando OpenCV (cv2
) e YOLO11 para executar o rastreio de objectos em fotogramas de vídeo. Este script ainda assume que você já instalou os pacotes necessários (opencv-python
e ultralytics
). O persist=True
diz ao localizador que a imagem ou fotograma atual é o seguinte numa sequência e que deve esperar pistas da imagem anterior na imagem atual.
Fluxo para loop com rastreio
import cv2
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO11 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO11 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
Note-se a alteração de model(frame)
para model.track(frame)
que permite o rastreio de objectos em vez da simples deteção. Este script modificado executa o rastreador em cada fotograma do vídeo, visualiza os resultados e apresenta-os numa janela. O ciclo pode ser encerrado premindo 'q'.
Traçar traços ao longo do tempo
A visualização de trajectos de objectos em fotogramas consecutivos pode fornecer informações valiosas sobre os padrões de movimento e o comportamento dos objectos detectados num vídeo. Com Ultralytics YOLO11 , traçar estes trajectos é um processo simples e eficiente.
No exemplo seguinte, demonstramos como utilizar as capacidades de rastreio do YOLO11 para traçar o movimento de objectos detectados em vários fotogramas de vídeo. Este script envolve a abertura de um ficheiro de vídeo, a leitura quadro a quadro e a utilização do modelo YOLO para identificar e seguir vários objectos. Ao reter os pontos centrais das caixas delimitadoras detectadas e ao ligá-las, podemos desenhar linhas que representam os caminhos seguidos pelos objectos localizados.
Traçar trajectos em vários fotogramas de vídeo
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(lambda: [])
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO11 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Get the boxes and track IDs
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Plot the tracks
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # x, y center point
if len(track) > 30: # retain 90 tracks for 90 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO11 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
Rastreio multithreaded
O rastreamento multithread oferece a capacidade de executar o rastreamento de objetos em vários fluxos de vídeo simultaneamente. Isto é particularmente útil quando se lida com várias entradas de vídeo, por exemplo, de várias câmaras de vigilância, onde o processamento simultâneo pode aumentar significativamente a eficiência e o desempenho.
No script Python fornecido, utilizamos o script Python's threading
para executar várias instâncias do rastreador ao mesmo tempo. Cada thread é responsável por executar o rastreador em um arquivo de vídeo, e todos os threads são executados simultaneamente em segundo plano.
Para garantir que cada thread recebe os parâmetros corretos (o ficheiro de vídeo, o modelo a utilizar e o índice do ficheiro), definimos uma função run_tracker_in_thread
que aceita esses parâmetros e contém o loop de rastreamento principal. Esta função lê o vídeo quadro a quadro, executa o rastreador e exibe os resultados.
Neste exemplo, são utilizados dois modelos diferentes: yolo11n.pt
e yolo11n-seg.pt
cada um dos objectos de rastreio num ficheiro de vídeo diferente. Os ficheiros de vídeo são especificados em video_file1
e video_file2
.
O daemon=True
parâmetro em threading.Thread
significa que essas threads serão fechadas assim que o programa principal terminar. Em seguida, iniciamos as threads com start()
e utilizar join()
para fazer com que a thread principal espere até que ambas as threads do rastreador tenham terminado.
Finalmente, depois de todas as threads terem concluído a sua tarefa, as janelas que apresentam os resultados são fechadas utilizando cv2.destroyAllWindows()
.
Fluxo para loop com rastreio
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""
Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO11 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()
Este exemplo pode ser facilmente alargado para lidar com mais ficheiros e modelos de vídeo, criando mais threads e aplicando a mesma metodologia.
Contribuir com novos rastreadores
Tem experiência no seguimento de vários objectos e implementou ou adaptou com êxito um algoritmo de seguimento com Ultralytics YOLO ? Convidamo-lo a contribuir para a nossa secção Trackers em ultralytics/cfg/trackers! As suas aplicações e soluções do mundo real podem ser valiosas para os utilizadores que trabalham em tarefas de localização.
Ao contribuir para esta secção, está a ajudar a expandir o âmbito das soluções de rastreio disponíveis na estrutura Ultralytics YOLO , acrescentando outra camada de funcionalidade e utilidade para a comunidade.
Para iniciar a sua contribuição, consulte o nosso Guia de Contribuição para obter instruções completas sobre como enviar um Pull Request (PR) 🛠️. Estamos ansiosos para ver o que você traz para a mesa!
Juntos, vamos melhorar as capacidades de rastreio do ecossistema Ultralytics YOLO 🙏!
FAQ
O que é a localização de vários objectos e como é que o Ultralytics YOLO a suporta?
O rastreio de vários objectos na análise de vídeo envolve a identificação de objectos e a manutenção de uma ID única para cada objeto detectado em quadros de vídeo. O Ultralytics YOLO suporta isto fornecendo rastreio em tempo real juntamente com IDs de objectos, facilitando tarefas como a vigilância de segurança e a análise de desportos. O sistema utiliza localizadores como o BoT-SORT e o ByteTrack, que podem ser configurados através de ficheiros YAML.
Como configurar um rastreador personalizado para Ultralytics YOLO ?
Pode configurar um tracker personalizado copiando um ficheiro de configuração de tracker existente (por exemplo, custom_tracker.yaml
) do Ultralytics diretório de configuração do tracker e modificando os parâmetros conforme necessário, exceto para o tracker_type
. Utilize este ficheiro no seu modelo de rastreio da seguinte forma:
Exemplo
Como é que posso executar o seguimento de objectos em vários fluxos de vídeo em simultâneo?
PythonPara executar o rastreio de objectos em vários fluxos de vídeo em simultâneo, pode utilizar o threading
módulo. Cada thread tratará de um fluxo de vídeo separado. Aqui está um exemplo de como pode configurar isto:
Rastreio multithreaded
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""
Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO11 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()
Quais são as aplicações reais do seguimento de vários objectos com Ultralytics YOLO ?
O rastreio de vários objectos com Ultralytics YOLO tem inúmeras aplicações, incluindo:
- Transportes: Localização de veículos para gestão do tráfego e condução autónoma.
- Retalho: Seguimento de pessoas para análise e segurança na loja.
- Aquacultura: Seguimento de peixes para monitorização de ambientes aquáticos.
Estas aplicações beneficiam da capacidade do Ultralytics YOLO para processar vídeos de alta velocidade de fotogramas em tempo real.
Como posso visualizar rastos de objectos em vários fotogramas de vídeo com Ultralytics YOLO ?
Para visualizar trajectos de objectos em vários fotogramas de vídeo, pode utilizar as funcionalidades de seguimento do modelo YOLO juntamente com o OpenCV para desenhar os trajectos dos objectos detectados. Aqui está um script de exemplo que demonstra isso:
Traçar trajectos em vários fotogramas de vídeo
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.track(frame, persist=True)
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
annotated_frame = results[0].plot()
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y)))
if len(track) > 30:
track.pop(0)
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
cv2.imshow("YOLO11 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
Este script traçará as linhas de rastreio mostrando os caminhos de movimento dos objectos rastreados ao longo do tempo.