Перейти к содержимому

Слежение за несколькими объектами с помощью Ultralytics YOLO

Примеры отслеживания нескольких объектов

Отслеживание объектов в сфере видеоаналитики - важнейшая задача, которая позволяет не только определять местоположение и класс объектов в кадре, но и сохранять уникальный идентификатор каждого обнаруженного объекта по мере продвижения видео. Сферы применения этой технологии безграничны - от видеонаблюдения и безопасности до спортивной аналитики в реальном времени.

Почему стоит выбрать Ultralytics YOLO для отслеживания объектов?

Результаты работы трекеров Ultralytics соответствуют стандартному обнаружению объектов, но имеют дополнительную ценность - идентификаторы объектов. Это позволяет легко отслеживать объекты в видеопотоке и проводить последующую аналитику. Вот почему ты должен рассмотреть возможность использования Ultralytics YOLO для своих нужд по отслеживанию объектов:

  • Эффективность: Обрабатывай видеопотоки в режиме реального времени без ущерба для точности.
  • Гибкость: Поддерживает множество алгоритмов и конфигураций отслеживания.
  • Простота использования: простой API Python и опции CLI для быстрой интеграции и развертывания.
  • Настраиваемость: Простота использования пользовательских обученных моделей YOLO позволяет интегрировать их в приложения, ориентированные на конкретную область.



Смотри: Обнаружение и отслеживание объектов с помощью Ultralytics YOLOv8 .

Применение в реальном мире

Транспорт Розничная торговля Аквакультура
Слежение за автомобилем Отслеживание людей Отслеживание рыбы
Слежение за автомобилем Отслеживание людей Отслеживание рыбы

Особенности с первого взгляда

Ultralytics YOLO Расширяет функции обнаружения объектов, чтобы обеспечить надежное и универсальное отслеживание объектов:

  • Отслеживание в реальном времени: Беспрепятственно отслеживай объекты в видео с высокой частотой кадров.
  • Поддержка нескольких трекеров: Выбирай из множества установленных алгоритмов отслеживания.
  • Настраиваемые конфигурации трекера: Подстраивай алгоритм трекинга под конкретные требования, регулируя различные параметры.

Доступные трекеры

Ultralytics YOLO поддерживает следующие алгоритмы отслеживания. Их можно включить, передав соответствующий конфигурационный файл YAML, например tracker=tracker_type.yaml:

  • BoT-SORT - Польза botsort.yaml чтобы включить этот трекер.
  • ByteTrack - Польза bytetrack.yaml чтобы включить этот трекер.

Трекер по умолчанию - BoT-SORT.

Отслеживание

Информация о пороге трекера

Если показатель доверия к объекту будет низким, то есть меньше, чем track_high_threshТогда ни один трек не будет успешно возвращен и обновлен.

Чтобы запустить трекер на видеопотоке, используй обученную модель Detect, Segment или Pose, например YOLOv8n, YOLOv8n-seg и YOLOv8n-pose.

Пример

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("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=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"

Как видно из приведенного выше использования, отслеживание доступно для всех моделей Detect, Segment и Pose, запущенных на видео или потоковых источниках.

Конфигурация

Информация о пороге трекера

Если показатель доверия к объекту будет низким, то есть меньше, чем track_high_threshТогда ни один трек не будет успешно возвращен и обновлен.

Отслеживание аргументов

Конфигурация отслеживания имеет общие свойства с режимом Predict, такие как conf, iou, и show. О дальнейших конфигурациях читай в Предсказывай Страница модели.

Пример

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

Выбор трекера

Ultralytics также позволяет использовать модифицированный файл конфигурации трекера. Для этого просто создай копию конфигурационного файла трекера (например, custom_tracker.yaml) от ultralytics/cfg/trackers и изменяй любые конфигурации (кроме tracker_type) в соответствии с твоими потребностями.

Пример

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'

Полный список аргументов для трекинга ты найдешь на странице ultralytics/cfg/trackers.

Python Примеры

Петля с постоянными треками

Вот скрипт Python , использующий OpenCV (cv2) и YOLOv8 для запуска отслеживания объектов на видеокадрах. Этот скрипт по-прежнему предполагает, что ты уже установил необходимые пакеты (opencv-python и ultralytics). На сайте persist=True Аргумент сообщает трекеру, что текущее изображение или кадр является следующим в последовательности и что в текущем изображении следует ожидать треки с предыдущего изображения.

Потоковый фор-луп с трекингом

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()

Обратите внимание на изменение model(frame) на model.track(frame), который позволяет отслеживать объекты вместо простого обнаружения. Этот модифицированный скрипт будет запускать трекер на каждом кадре видео, визуализировать результаты и отображать их в окне. Выйти из цикла можно, нажав 'q'.

Построение треков во времени

Визуализация треков объектов на последовательных кадрах может дать ценные сведения о характере движения и поведении обнаруженных объектов на видео. С помощью Ultralytics YOLOv8 построение таких треков станет простым и эффективным процессом.

В следующем примере мы покажем, как использовать возможности модели YOLOv8 для построения графика движения обнаруженных объектов по нескольким кадрам видео. В этом сценарии нужно открыть видеофайл, прочитать его кадр за кадром и использовать модель YOLO для идентификации и отслеживания различных объектов. Сохраняя центральные точки обнаруженных границ и соединяя их, мы можем рисовать линии, которые представляют собой пути, пройденные отслеживаемыми объектами.

Построение треков по нескольким видеокадрам

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()

Многопоточный трекинг

Многопоточный трекинг дает возможность запускать отслеживание объектов на нескольких видеопотоках одновременно. Это особенно полезно при работе с несколькими видеовходами, например, с нескольких камер наблюдения, когда одновременная обработка может значительно повысить эффективность и производительность.

В предоставленном скрипте Python мы используем Python's threading модуль для одновременного запуска нескольких экземпляров трекера. Каждый поток отвечает за запуск трекера на одном видеофайле, и все потоки работают одновременно в фоновом режиме.

Чтобы каждый поток получал правильные параметры (видеофайл, используемую модель и индекс файла), мы определяем функцию run_tracker_in_thread которая принимает эти параметры и содержит основной цикл отслеживания. Эта функция считывает видео кадр за кадром, запускает трекер и выводит результаты на экран.

В этом примере используются две разные модели: yolov8n.pt и yolov8n-seg.ptКаждый из них отслеживает объекты в разных видеофайлах. Видеофайлы указываются в video_file1 и video_file2.

The daemon=True параметр в threading.Thread означает, что эти потоки будут закрыты, как только завершится основная программа. Затем мы запускаем потоки с помощью start() и используй join() чтобы заставить главный поток ждать, пока оба потока трекера не завершат работу.

Наконец, после того как все потоки выполнили свою задачу, окна, отображающие результаты, закрываются с помощью cv2.destroyAllWindows().

Потоковый фор-луп с трекингом

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()

Этот пример можно легко расширить для работы с большим количеством видеофайлов и моделей, создав больше потоков и применив ту же методику.

Вносите новые трекеры

Ты хорошо разбираешься в многообъектном трекинге и успешно реализовал или адаптировал алгоритм трекинга с помощью Ultralytics YOLO ? Мы приглашаем тебя внести свой вклад в наш раздел "Трекеры" в ultralytics/cfg/trackers! Твои реальные приложения и решения могут оказаться бесценными для пользователей, работающих над задачами трекинга.

Внося свой вклад в этот раздел, ты помогаешь расширить спектр решений для отслеживания, доступных в рамках Ultralytics YOLO , добавляя еще один уровень функциональности и полезности для сообщества.

Чтобы инициировать свой вклад, обратись к нашему руководству по контрибьютингу, где даны исчерпывающие инструкции по отправке Pull Request (PR) 🛠️. Нам не терпится увидеть, что ты привнесёшь в игру!

Вместе давайте расширим возможности отслеживания экосистемы Ultralytics YOLO 🙏!



Created 2023-11-12, Updated 2024-06-10
Authors: glenn-jocher (15), IvorZhu331 (1), Burhan-Q (1)

Комментарии