Многообъектное отслеживание с помощью Ultralytics YOLO
Отслеживание объектов в видеоаналитике — это критически важная задача, которая не только определяет местоположение и класс объектов в кадре, но и сохраняет уникальный 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_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, 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:
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()Этот скрипт построит линии отслеживания, показывающие траектории движения отслеживаемых объектов во времени, предоставляя ценную информацию о поведении и закономерностях объектов.