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

YOLO multi-object tracking with trajectory paths

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

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

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

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


Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀

Реальные применения

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

Обзор функций

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

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

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

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

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

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

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

Чтобы запустить трекер на видеопотоках, используй обученную модель для обнаружения (Detect), сегментации (Segment) или оценки позы (Pose), например YOLO26n, YOLO26n-seg или YOLO26n-pose. Ты можешь обучать собственные модели локально или на облачных GPU через Ultralytics Platform.

Пример
from ultralytics import YOLO

# Load an official or custom model
model = YOLO("yolo26n.pt")  # Load an official Detect model
model = YOLO("yolo26n-seg.pt")  # Load an official Segment model
model = YOLO("yolo26n-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

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

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

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

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

Пример
from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)

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

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("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")

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

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

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

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

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

Если оценка уверенности обнаружения падает ниже track_high_thresh, трекер не будет обновлять этот объект, что приведет к отсутствию активных треков.

ПараметрДопустимые значения или диапазоныОписание
tracker_typebotsort, bytetrackУказывает тип трекера. Варианты: botsort или bytetrack.
track_high_thresh0.0-1.0Порог, используемый для первой ассоциации во время отслеживания. Влияет на то, насколько уверенно обнаружение сопоставляется с существующим треком.
track_low_thresh0.0-1.0Порог для второй ассоциации во время отслеживания. Используется, когда первая ассоциация не удалась, с более мягкими критериями.
new_track_thresh0.0-1.0Порог для инициализации нового трека, если обнаружение не соответствует ни одному существующему треку. Управляет тем, когда считается, что появился новый объект.
track_buffer>=0Буфер, используемый для указания количества кадров, в течение которых потерянные треки должны сохраняться до удаления. Большее значение означает большую устойчивость к перекрытиям.
match_thresh0.0-1.0Порог для сопоставления треков. Более высокие значения делают сопоставление более мягким.
fuse_scoreTrue, FalseОпределяет, нужно ли объединять оценки уверенности с расстояниями IoU перед сопоставлением. Помогает сбалансировать пространственную информацию и информацию об уверенности при ассоциации.
gmc_methodorb, sift, ecc, sparseOptFlow, NoneМетод, используемый для компенсации глобального движения. Помогает учитывать движение камеры для улучшения отслеживания.
proximity_thresh0.0-1.0Минимальный IoU, необходимый для валидного совпадения с ReID (повторная идентификация). Обеспечивает пространственную близость перед использованием признаков внешнего вида.
appearance_thresh0.0-1.0Минимальное сходство внешнего вида, необходимое для ReID. Задает, насколько визуально похожими должны быть два обнаружения, чтобы быть связанными.
with_reidTrue, FalseУказывает, использовать ли ReID. Включает сопоставление на основе внешнего вида для лучшего отслеживания при перекрытиях. Поддерживается только BoTSORT.
modelauto, yolo26[nsmlx]-cls.ptУказывает используемую модель. По умолчанию auto, которая использует встроенные функции, если детектор — YOLO, в противном случае использует yolo26n-cls.pt.

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

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

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

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

Экспорт модели ReID в TensorRT
from torch import nn

from ultralytics import YOLO

# Load the classification model
model = YOLO("yolo26n-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



Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡

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

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

Потоковый цикл с отслеживанием
import cv2

from ultralytics import YOLO

# Load the YOLO26 model
model = YOLO("yolo26n.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 YOLO26 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("YOLO26 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 YOLO26 построение этих графиков происходит бесшовно и эффективно.

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

Построение графиков треков по нескольким видеокадрам
from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Load the YOLO26 model
model = YOLO("yolo26n.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 YOLO26 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("YOLO26 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 мы используем модуль threading, чтобы запускать несколько экземпляров трекера одновременно. Каждый поток отвечает за запуск трекера на одном видеофайле, и все потоки работают параллельно в фоновом режиме.

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

В этом примере используются две разные модели: yolo26n.pt и yolo26n-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 = ["yolo26n.pt", "yolo26n-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 YOLO26 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 🙏!

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

Что такое многоцелевое отслеживание и как Ultralytics YOLO его поддерживает?

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

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

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

Пример
from ultralytics import YOLO

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

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

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

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

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-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 YOLO26 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("yolo26n.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("YOLO26 Tracking", annotated_frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

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

Комментарии