Link to this sectionОтслеживание нескольких объектов с помощью Ultralytics YOLO#
Отслеживание объектов в области видеоаналитики — это критически важная задача, которая не только определяет местоположение и класс объектов в кадре, но и присваивает уникальный ID каждому обнаруженному объекту по мере развития видеопотока. Применения безграничны — от видеонаблюдения и безопасности до спортивной аналитики в реальном времени.
Link to this sectionПочему стоит выбрать Ultralytics YOLO для отслеживания объектов?#
Выходные данные трекеров Ultralytics соответствуют стандартному обнаружению объектов, но имеют дополнительную ценность в виде ID объектов. Это упрощает отслеживание объектов в видеопотоках и выполнение последующей аналитики. Вот почему тебе стоит рассмотреть использование Ultralytics YOLO для своих задач по отслеживанию:
- Эффективность: обрабатывай видеопотоки в реальном времени без ущерба для точности.
- Гибкость: поддержка нескольких алгоритмов отслеживания и конфигураций.
- Простота использования: простые API на Python и опции CLI для быстрой интеграции и развертывания.
- Настраиваемость: легко использовать с пользовательскими обученными моделями YOLO, что позволяет интегрировать их в прикладные задачи конкретной области.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Link to this sectionПрикладные задачи в реальном мире#
| Транспорт | Розничная торговля | Аквакультура |
|---|---|---|
| Отслеживание транспортных средств | Отслеживание людей | Отслеживание рыбы |
Link to this sectionОбзор возможностей#
Ultralytics YOLO расширяет возможности обнаружения объектов, обеспечивая надежное и универсальное отслеживание объектов:
- Отслеживание в реальном времени: плавно отслеживай объекты в видео с высокой частотой кадров.
- Поддержка нескольких трекеров: выбирай из множества установленных алгоритмов отслеживания.
- Настраиваемые конфигурации трекера: адаптируй алгоритм отслеживания под свои конкретные требования, настраивая различные параметры.
Link to this sectionДоступные трекеры#
Ultralytics YOLO поддерживает следующие алгоритмы отслеживания. Их можно включить, передав соответствующий YAML-файл конфигурации, например tracker=tracker_type.yaml:
- BoT-SORT - используй
botsort.yamlдля включения этого трекера. - ByteTrack - используй
bytetrack.yamlдля включения этого трекера.
Трекер по умолчанию — BoT-SORT.
Link to this sectionОтслеживание#
Чтобы запустить трекер на видеопотоках, используй обученную модель для обнаружения (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, запущенных на видео или потоковых источниках.
Link to this sectionКонфигурация#
Link to this sectionАргументы отслеживания#
Конфигурация отслеживания имеет общие свойства с режимом 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)Link to this sectionВыбор трекера#
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")Обратись к разделу Аргументы трекера для подробного описания каждого параметра.
Link to this sectionАргументы трекера#
Некоторые параметры поведения отслеживания можно настроить, редактируя 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. |
Link to this sectionВключение повторной идентификации (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 во время отслеживания.
Link to this sectionПримеры на Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Link to this sectionЦикл сохранения треков#
Вот сценарий на 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'.
Link to this sectionПостроение треков во времени#
Визуализация треков объектов по последовательным кадрам может дать ценную информацию о закономерностях движения и поведении обнаруженных объектов в видео. С помощью Ultralytics YOLO26 построение этих треков — это плавный и эффективный процесс.
В следующем примере мы демонстрируем, как использовать возможности отслеживания YOLO26 для построения движения обнаруженных объектов по нескольким кадрам видео. Этот сценарий включает открытие видеофайла, чтение его кадр за кадром и использование модели YOLO для идентификации и отслеживания различных объектов. Сохраняя центральные точки обнаруженных ограничивающих рамок и соединяя их, мы можем рисовать линии, представляющие пути, пройденные отслеживаемыми объектами.
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()Link to this sectionМногопоточное отслеживание#
Многопоточное отслеживание предоставляет возможность одновременно запускать отслеживание объектов на нескольких видеопотоках. Это особенно полезно при работе с несколькими видеовходами, например, с нескольких камер наблюдения, где параллельная обработка может значительно повысить эффективность и производительность.
В предоставленном сценарии 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()Этот пример можно легко расширить для работы с большим количеством видеофайлов и моделей, создавая больше потоков и применяя ту же методологию.
Link to this sectionДобавь новые трекеры#
Ты разбираешься в многообъектном отслеживании и успешно внедрил или адаптировал алгоритм отслеживания с помощью Ultralytics YOLO? Мы приглашаем тебя внести свой вклад в наш раздел Trackers в ultralytics/cfg/trackers! Твои реальные приложения и решения могут быть очень полезны для пользователей, работающих над задачами отслеживания.
Добавляя свой вклад в этот раздел, ты помогаешь расширить спектр решений по отслеживанию, доступных в рамках платформы Ultralytics YOLO, предоставляя сообществу дополнительный функционал и возможности.
Чтобы начать работу над вкладом, ознакомься с нашим Руководством по внесению вклада, где содержатся полные инструкции по отправке Pull Request (PR) 🛠️. Мы с нетерпением ждем, что ты предложишь!
Давай вместе улучшим возможности отслеживания в экосистеме Ultralytics YOLO 🙏!
Link to this sectionЧасто задаваемые вопросы (FAQ)#
Link to this sectionЧто такое многообъектное отслеживание и как Ultralytics YOLO его поддерживает?#
Многообъектное отслеживание в видеоаналитике включает в себя идентификацию объектов и поддержание уникального ID для каждого обнаруженного объекта в кадрах видео. Ultralytics YOLO поддерживает это, обеспечивая отслеживание в реальном времени вместе с идентификаторами объектов, что упрощает выполнение таких задач, как видеонаблюдение и спортивная аналитика. Система использует такие трекеры, как BoT-SORT и ByteTrack, которые можно настроить с помощью YAML-файлов.
Link to this sectionКак настроить собственный трекер для 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")Link to this sectionКак запустить отслеживание объектов на нескольких видеопотоках одновременно?#
Чтобы запустить отслеживание объектов на нескольких видеопотоках одновременно, ты можешь использовать модуль 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()Link to this sectionКаковы реальные сценарии применения многообъектного отслеживания с Ultralytics YOLO?#
Многообъектное отслеживание с помощью Ultralytics YOLO имеет множество применений, включая:
- Транспорт: отслеживание транспортных средств для управления дорожным движением и автономного вождения.
- Розничная торговля: отслеживание людей для внутримагазинной аналитики и безопасности.
- Аквакультура: отслеживание рыб для мониторинга водной среды.
- Спортивная аналитика: отслеживание игроков и снаряжения для анализа производительности.
- Системы безопасности: мониторинг подозрительной активности и создание сигналов тревоги.
Эти приложения выигрывают от способности Ultralytics YOLO обрабатывать высокочастотные видео в реальном времени с исключительной точностью.
Link to this sectionКак визуализировать треки объектов по нескольким кадрам видео с помощью 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()Этот скрипт построит линии отслеживания, показывающие пути движения объектов с течением времени, что даст ценную информацию о поведении и закономерностях объектов.