Skip to content

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

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

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

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

Результаты работы трекеров Ultralytics соответствуют стандартному обнаружению объектов, но имеют дополнительную ценность в виде идентификаторов объектов. Это позволяет легко отслеживать объекты в видеопотоке и проводить последующую аналитику. Вот почему вам следует рассмотреть возможность использования 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.

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

Информация о пороге отслеживания

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

Чтобы запустить трекер на видеопотоках, используйте обученную модель 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 (повторная идентификация). Обеспечивает пространственную близость перед использованием внешних признаков.
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 Аргумент сообщает трекеру, что текущее изображение или кадр является следующим в последовательности и что в текущем изображении следует ожидать треки с предыдущего изображения.

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

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.id is not None:
            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's 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 поддерживает его?

Многообъектное отслеживание в видеоаналитике предполагает как идентификацию объектов, так и сохранение уникального идентификатора для каждого обнаруженного объекта во всех видеокадрах. Ultralytics YOLO поддерживает эту задачу, обеспечивая отслеживание в реальном времени вместе с идентификаторами объектов, что облегчает такие задачи, как наблюдение за безопасностью и спортивная аналитика. Система использует такие трекеры, как 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's 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 год назад ✏️ Обновлено 15 дней назад

Комментарии

OSZAR »