Salta para o conteúdo

Seguimento de vários objectos com Ultralytics YOLO

Exemplos de rastreio de vários objectos

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 da imagem, 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 desportiva em tempo real.

Porquê escolher Ultralytics YOLO para o seguimento de objectos?

The output from Ultralytics trackers is consistent with standard object detection but has the added value of object IDs. This makes it easy to track objects in video streams and perform subsequent analytics. Here's why you should consider using Ultralytics YOLO for your object tracking needs:

  • Efficiency: Process video streams in real-time without compromising accuracy.
  • 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.



Observa: Object Detection and Tracking with Ultralytics YOLO.

Aplicações no mundo real

Transporte Retalho Aquacultura
Seguimento de veículos Seguimento de pessoas Seguimento de peixes
Seguimento de veículos Seguimento de pessoas Seguimento de peixes

Visão geral das características

Ultralytics YOLO alarga as suas funcionalidades de deteção de objectos para proporcionar um seguimento de objectos robusto e versátil:

  • Rastreamento em tempo real: Localiza objectos sem problemas em vídeos de alta taxa de fotogramas.
  • Suporte a vários rastreadores: Escolhe entre uma variedade de algoritmos de rastreamento estabelecidos.
  • Configurações personalizáveis do rastreador: Adapta 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 botsort.yaml para ativar este localizador.
  • ByteTrack - Utiliza bytetrack.yaml para ativar este localizador.

O localizador predefinido é o BoT-SORT.

Seguimento

Informações sobre o limiar do rastreador

Se o índice de confiança do objeto for baixo, ou seja, inferior a track_high_threshnão serão devolvidas e actualizadas quaisquer faixas com êxito.

To run the tracker on video streams, use a trained Detect, Segment or Pose model such as YOLO11n, YOLO11n-seg and 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_threshnão serão devolvidas e actualizadas quaisquer faixas com êxito.

Argumentos de rastreio

A configuração de rastreio partilha propriedades com o modo Prever, tais como conf, ioue show. Para mais configurações, consulta a Prevê página do modelo.

Exemplo

from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show

Seleção do Tracker

Ultralytics também permite que uses um ficheiro de configuração do tracker modificado. Para fazer isso, basta fazer uma cópia de um arquivo de configuração do rastreador (por exemplo, custom_tracker.yaml) de ultralytics/cfg/trackers e modifica todas as configurações (exceto a tracker_type) de acordo com as tuas necessidades.

Exemplo

from ultralytics import YOLO

# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

Para uma lista completa de argumentos de rastreamento, consulta a página ultralytics/cfg/trackers.

Python Exemplos

Loop de pistas persistentes

Here is a Python script using OpenCV (cv2) and YOLO11 to run object tracking on video frames. This script still assumes you have already installed the necessary packages (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 laço 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()

Nota a mudança de model(frame) para model.track(frame)que permite o rastreamento de objetos em vez da simples deteção. Este script modificado executa o rastreador em cada frame 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

Visualizing object tracks over consecutive frames can provide valuable insights into the movement patterns and behavior of detected objects within a video. With Ultralytics YOLO11, plotting these tracks is a seamless and efficient process.

In the following example, we demonstrate how to utilize YOLO11's tracking capabilities to plot the movement of detected objects across multiple video frames. This script involves opening a video file, reading it frame by frame, and utilizing the YOLO model to identify and track various objects. By retaining the center points of the detected bounding boxes and connecting them, we can draw lines that represent the paths followed by the tracked objects.

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. Isso é particularmente útil ao lidar com várias entradas de vídeo, como de várias câmeras de vigilância, onde o processamento simultâneo pode aumentar muito a eficiência e o desempenho.

No script Python fornecido, utilizamos o 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 correctos (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.ptCada um deles segue os objectos de um 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 estas threads serão fechadas assim que o programa principal terminar. Em seguida, iniciamos as threads com start() e utiliza join() para 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 laço 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.

Contribui com novos rastreadores

És especialista em rastreio de múltiplos objectos e implementaste ou adaptaste com sucesso um algoritmo de rastreio com Ultralytics YOLO ? Convidamos-te a contribuir para a nossa secção Trackers em ultralytics/cfg/trackers! As tuas aplicações e soluções do mundo real podem ser valiosas para os utilizadores que trabalham em tarefas de localização.

Ao contribuíres para esta secção, ajudas a expandir o âmbito das soluções de rastreio disponíveis na estrutura 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 obteres instruções completas sobre como submeter um Pull Request (PR) 🛠️. Estamos entusiasmados por ver o que trazes para a mesa!

Juntos, vamos melhorar as capacidades de rastreio do ecossistema Ultralytics YOLO 🙏!

FAQ

O que é o Seguimento de Vários Objectos e como é que o Ultralytics YOLO o suporta?

O rastreamento 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. Ultralytics YOLO suporta isto fornecendo rastreamento em tempo real juntamente com IDs de objectos, facilitando tarefas como vigilância de segurança e análise de desportos. O sistema utiliza rastreadores como o BoT-SORT e o ByteTrack, que podem ser configurados através de ficheiros YAML.

Como é que configuro um localizador personalizado para Ultralytics YOLO ?

Podes 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 modifica os parâmetros conforme necessário, exceto no caso do tracker_type. Utiliza este ficheiro no teu modelo de seguimento da seguinte forma:

Exemplo

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

Como é que posso executar o seguimento de objectos em vários fluxos de vídeo em simultâneo?

Para executar o rastreio de objectos em vários fluxos de vídeo em simultâneo, podes utilizar a função Python threading módulo. Cada thread irá lidar com um fluxo de vídeo separado. Aqui está um exemplo de como podes 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: Rastreio 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 as trajectórias dos objectos em vários fotogramas de vídeo, podes utilizar as funcionalidades de seguimento do modelo YOLO juntamente com o OpenCV para desenhar as trajectórias 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ça as linhas de rastreio mostrando os caminhos de movimento dos objectos rastreados ao longo do tempo.


📅 Created 11 months ago ✏️ Updated 12 days ago

Comentários