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 de desportos 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. Isso facilita o rastreamento de objetos em fluxos de vídeo e a realização de análises subsequentes. Eis porque deves considerar a utilização do Ultralytics YOLO para as tuas necessidades de seguimento de objectos:

  • Efici√™ncia: Processa 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.



Observa: Deteção e seguimento de objectos com Ultralytics YOLOv8 .

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

Para executar o rastreador em fluxos de vídeo, usa um modelo treinado de Detetar, Segmentar ou Pose, como YOLOv8n, YOLOv8n-seg e YOLOv8n-pose.

Exemplo

from ultralytics import YOLO

# Load an official or custom model
model = YOLO('yolov8n.pt')  # Load an official Detect model
model = YOLO('yolov8n-seg.pt')  # Load an official Segment model
model = YOLO('yolov8n-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(source="https://youtu.be/LNwODJXcvt4", show=True)  # Tracking with default tracker
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # Tracking with ByteTrack tracker
# Perform tracking with various models using the command line interface
yolo track model=yolov8n.pt source="https://youtu.be/LNwODJXcvt4"  # Official Detect model
yolo track model=yolov8n-seg.pt source="https://youtu.be/LNwODJXcvt4"  # Official Segment model
yolo track model=yolov8n-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 rastreamento está disponível para todos os modelos Detect, Segment e Pose executados em vídeos ou fontes de streaming.

Configuração

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('yolov8n.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=yolov8n.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('yolov8n.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=yolov8n.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

Aqui tens um script Python que utiliza o OpenCV (cv2) e YOLOv8 para executar o rastreio de objectos em fotogramas de vídeo. Este script ainda assume que já instalaste 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 laço com rastreio

import cv2
from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO('yolov8n.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 YOLOv8 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("YOLOv8 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

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 o Ultralytics YOLOv8 , tra√ßar estes trajectos √© um processo simples e eficiente.

No exemplo a seguir, demonstramos como utilizar os recursos de rastreamento do YOLOv8 para traçar o movimento de objetos detectados em vários quadros de vídeo. Este script envolve a abertura de um arquivo de vídeo, a leitura quadro a quadro e a utilização do modelo YOLO para identificar e rastrear vários objetos. Mantendo os pontos centrais das caixas delimitadoras detectadas e conectando-os, podemos desenhar linhas que representam os caminhos seguidos pelos objetos rastreados.

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 YOLOv8 model
model = YOLO('yolov8n.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 YOLOv8 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("YOLOv8 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: yolov8n.pt e yolov8n-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 fazer com que a thread principal espere at√© que ambas as threads de rastreamento 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


def run_tracker_in_thread(filename, model, file_index):
    """
    Runs a video file or webcam stream concurrently with the YOLOv8 model using threading.

    This function captures video frames from a given file or camera source and utilizes the YOLOv8 model for object
    tracking. The function runs in its own thread for concurrent processing.

    Args:
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
        model (obj): The YOLOv8 model object.
        file_index (int): An index to uniquely identify the file being processed, used for display purposes.

    Note:
        Press 'q' to quit the video display window.
    """
    video = cv2.VideoCapture(filename)  # Read the video file

    while True:
        ret, frame = video.read()  # Read the video frames

        # Exit the loop if no more frames in either video
        if not ret:
            break

        # Track objects in frames if available
        results = model.track(frame, persist=True)
        res_plotted = results[0].plot()
        cv2.imshow(f"Tracking_Stream_{file_index}", res_plotted)

        key = cv2.waitKey(1)
        if key == ord('q'):
            break

    # Release video sources
    video.release()


# Load the models
model1 = YOLO('yolov8n.pt')
model2 = YOLO('yolov8n-seg.pt')

# Define the video files for the trackers
video_file1 = "path/to/video1.mp4"  # Path to video file, 0 for webcam
video_file2 = 0  # Path to video file, 0 for webcam, 1 for external camera

# Create the tracker threads
tracker_thread1 = threading.Thread(target=run_tracker_in_thread, args=(video_file1, model1, 1), daemon=True)
tracker_thread2 = threading.Thread(target=run_tracker_in_thread, args=(video_file2, model2, 2), daemon=True)

# Start the tracker threads
tracker_thread1.start()
tracker_thread2.start()

# Wait for the tracker threads to finish
tracker_thread1.join()
tracker_thread2.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 trackers

√Č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 ūüôŹ!



Criado em 2023-11-12, Atualizado em 2024-02-03
Autores: glenn-jocher (10)

Coment√°rios