Skip to content

Отслеживание нескольких объектов с помощью Ultralytics YOLO

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

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

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

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

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



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

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

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

Краткий обзор функций

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

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

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

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

  • BoT-SORT - Используйте botsort.yaml чтобы включить этот трекер.
  • ByteTrack - Используйте bytetrack.yaml чтобы включить этот трекер.

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

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

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

Пример

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"

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

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

Аргументы отслеживания

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

Пример

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

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

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

Подробное описание каждого параметра см. в разделе Аргументы трекера.

Аргументы трекера

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

В следующей таблице представлено описание каждого параметра:

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

Если оценка достоверности объекта будет низкой, то есть ниже track_high_thresh, то никакие треки не будут успешно возвращены и обновлены.

Параметр Допустимые значения или диапазоны Описание
tracker_type botsort, bytetrack Указывает тип трекера. Возможные варианты: botsort или bytetrack.
track_high_thresh 0.0-1.0 Порог для первой ассоциации во время отслеживания. Влияет на то, насколько уверенно обнаружение сопоставляется с существующим треком.
track_low_thresh 0.0-1.0 Порог для второй ассоциации во время отслеживания. Используется, когда первая ассоциация не удалась, с более мягкими критериями.
new_track_thresh 0.0-1.0 Порог для инициализации нового трека, если обнаружение не соответствует ни одному из существующих треков. Контролирует, когда считается, что появился новый объект.
track_buffer >=0 Буфер, используемый для указания количества кадров, в течение которых потерянные треки должны оставаться активными до удаления. Более высокое значение означает большую устойчивость к окклюзии.
match_thresh 0.0-1.0 Порог для сопоставления треков. Более высокие значения делают сопоставление более мягким.
fuse_score True, False Определяет, следует ли объединять оценки достоверности с расстояниями IoU перед сопоставлением. Помогает сбалансировать пространственную информацию и информацию о достоверности при сопоставлении.
gmc_method orb, sift, ecc, sparseOptFlow, None Метод, используемый для глобальной компенсации движения. Помогает учитывать движение камеры для улучшения отслеживания.
proximity_thresh 0.0-1.0 Минимальный IoU, необходимый для допустимого соответствия с ReID (Re-identification). Обеспечивает пространственную близость перед использованием визуальных признаков.
appearance_thresh 0.0-1.0 Минимальное сходство внешнего вида, необходимое для ReID. Устанавливает, насколько визуально похожими должны быть два обнаружения, чтобы быть связанными.
with_reid True, False Указывает, следует ли использовать ReID. Включает сопоставление на основе внешнего вида для лучшего отслеживания при окклюзиях. Поддерживается только BoTSORT.
model auto, yolo11[nsmlx]-cls.pt Указывает модель для использования. По умолчанию используется auto, который использует собственные функции, если детектор является YOLO, в противном случае использует yolo11n-cls.pt.

Включение повторной идентификации (ReID)

По умолчанию ReID отключен, чтобы минимизировать накладные расходы на производительность. Включить его просто—просто установите with_reid: True в конфигурация трекераВы также можете настроить model используется для ReID, что позволяет вам варьировать точность и скорость в зависимости от вашего варианта использования:

  • Встроенные функции (model: auto): Это использует функции непосредственно из детектора YOLO для ReID, добавляя минимальные накладные расходы. Это идеально подходит, когда вам нужен некоторый уровень ReID без значительного влияния на производительность. Если детектор не поддерживает собственные функции, он автоматически переключается на использование yolo11n-cls.pt.
  • Модели классификации YOLO: Вы можете явно установить модель классификации (например. yolo11n-cls.pt) для извлечения признаков ReID. Это обеспечивает более дискриминативные вложения, но вносит дополнительную задержку из-за дополнительного этапа инференса.

Для повышения производительности, особенно при использовании отдельной модели классификации для ReID, вы можете экспортировать ее в более быстрый бэкенд, например TensorRT:

Экспорт модели ReID в TensorRT

from torch import nn

from ultralytics import YOLO

# Load the classification model
model = YOLO("yolo11n-cls.pt")

# Add average pooling layer
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

# Export to TensorRT
model.export(format="engine", half=True, dynamic=True, batch=32)

После экспорта вы можете указать путь к модели TensorRT в вашей конфигурации трекера, и она будет использоваться для ReID во время отслеживания.

Примеры на python

Цикл сохранения треков

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

Потоковая передача в цикле for с отслеживанием

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

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

Отображение треков во времени

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

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

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

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
        result = model.track(frame, persist=True)[0]

        # Get the boxes and track IDs
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Visualize the result on the frame
            frame = result.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 30 tracks for 30 frames
                    track.pop(0)

                # Draw the tracking lines
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Display the annotated frame
        cv2.imshow("YOLO11 Tracking", 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 threading для одновременного запуска нескольких экземпляров трекера. Каждый поток отвечает за запуск трекера на одном видеофайле, и все потоки работают одновременно в фоновом режиме.

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

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

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

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

Многопоточная реализация отслеживания

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

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

Добавление новых трекеров

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

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

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

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

Часто задаваемые вопросы

Что такое отслеживание нескольких объектов и как Ultralytics YOLO это поддерживает?

Отслеживание нескольких объектов в видеоаналитике включает в себя как идентификацию объектов, так и поддержание уникального ID для каждого обнаруженного объекта в видеокадрах. Ultralytics YOLO поддерживает это, обеспечивая отслеживание в реальном времени вместе с ID объектов, что облегчает такие задачи, как охранное наблюдение и спортивная аналитика. Система использует трекеры, такие как BoT-SORT и ByteTrack, которые можно настроить с помощью YAML-файлов.

Как настроить пользовательский трекер для Ultralytics YOLO?

Вы можете настроить пользовательский трекер, скопировав существующий файл конфигурации трекера (например, custom_tracker.yaml) из каталога конфигурации трекеров Ultralytics и изменив параметры по мере необходимости, за исключением tracker_type. Используйте этот файл в вашей модели отслеживания следующим образом:

Пример

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'

Как я могу запустить отслеживание объектов на нескольких видеопотоках одновременно?

Чтобы запустить отслеживание объектов на нескольких видеопотоках одновременно, вы можете использовать модуль python threading . Каждый поток будет обрабатывать отдельный видеопоток. Вот пример того, как вы можете это настроить:

Многопоточное отслеживание

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

Каковы реальные применения отслеживания нескольких объектов с помощью Ultralytics YOLO?

Отслеживание нескольких объектов с помощью Ultralytics YOLO имеет множество применений, в том числе:

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

Эти приложения выигрывают от способности Ultralytics YOLO обрабатывать видео с высокой частотой кадров в реальном времени с исключительной точностью.

Как я могу визуализировать траектории объектов на нескольких видеокадрах с помощью Ultralytics YOLO?

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

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

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

Этот скрипт построит линии отслеживания, показывающие траектории движения отслеживаемых объектов во времени, предоставляя ценную информацию о поведении и закономерностях объектов.



📅 Создано 1 год назад ✏️ Обновлено 2 месяца назад

Комментарии