YOLO Vision 2026:

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

YOLO multi-object tracking with trajectory paths

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

🚀 Новые трекеры: OC-SORT, Deep OC-SORT, FastTracker, TrackTrack

Начиная с Ultralytics YOLO v8.4.63, доступны новые алгоритмы трекинга: OC-SORT, Deep OC-SORT, FastTracker и TrackTrack. Эти трекеры улучшают производительность многообъектного трекинга и согласованность ID.

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

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

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


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

Применение в реальных условиях#

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

Быстрый старт#

Запусти трекинг на видео с трекером BoT-SORT по умолчанию. Переключись на другой трекер, изменив аргумент tracker.

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Default tracker (BoT-SORT)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)

# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")

Чтобы запустить трекер на видеопотоках, используй обученную модель Detect, Segment, Pose или OBB, такую как YOLO26n, YOLO26n-seg, YOLO26n-pose или YOLO26n-obb. Ты можешь обучать пользовательские модели локально или с помощью облачного обучения на платформе 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

Поддерживаемые трекеры#

Ultralytics YOLO поставляется с шестью встроенными трекерами. Включи один из них, передав его файл конфигурации YAML в аргумент tracker.

ТрекерФайл конфигурацииМодель движенияВнешний вид / ReIDКомпенсация движения камерыОбработка перекрытий
BoT-SORTbotsort.yamlЛинейный фильтр КалманаНеобязательно (with_reid)Да (sparseOptFlow / ECC)Буфер трека + перепривязка ReID
ByteTrackbytetrack.yamlЛинейный фильтр КалманаНетНетДвухэтапное восстановление с низкой уверенностью
OC-SORTocsort.yamlНаблюдательно-центрированный фильтр КалманаНетНетORU, OCM, OCR повторное обновление с последнего наблюдения
Deep OC-SORTdeepocsort.yamlНаблюдательно-центрированный фильтр КалманаНеобязательно (with_reid)Необязательно (gmc_method)OC-SORT + адаптивное EMA внешнего вида
FastTrackerfasttrack.yamlЛинейный фильтр Калмана + откатНетНетОткат Калмана + увеличение bbox при перекрытии
TrackTracktracktrack.yamlЛинейный фильтр Калмана (NSA)Опционально (откат HMIoU)Да (sparseOptFlow / ECC)Итеративная многофакторная ассоциация + TAI

Какой трекер мне использовать?#

Используй эту схему, чтобы выбрать точку отсчета:

  1. Нужен самый быстрый и простой бейзлайн?ByteTrack (без ReID, без компенсации движения камеры, минимальные накладные расходы).
  2. Ручная съемка, дрон или кадры с движущейся камеры?BoT-SORT (по умолчанию; добавляет компенсацию движения камеры и опциональный ReID).
  3. Нелинейное движение (спорт, танцы, резкие повороты) и без ReID?OC-SORT (наблюдательно-центрированные корректировки без затрат на анализ внешнего вида).
  4. Многолюдные сцены с движущейся камерой, где основная проблема — замена ID?Deep OC-SORT или TrackTrack (оба добавляют адаптивное слияние внешнего вида; TrackTrack также добавляет многофакторную ассоциацию и подавление дубликатов ID).
  5. Частые частичные перекрытия в реальном времени, нет бюджета на ReID?FastTracker (вариант ByteTrack с учетом перекрытий и откатом Калмана).

Переключение трекеров#

Передай имя файла конфигурации трекера в tracker=. Весь остальной код остается прежним.

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")

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

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

Конфигурация трекинга разделяет свойства с режимом 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, ocsort, deepocsort, fasttrack, tracktrackУказывает тип трекера.
track_high_thresh0.0-1.0Порог для первой ассоциации. Влияет на то, насколько уверенно обнаружение сопоставляется с существующим треком.
track_low_thresh0.0-1.0Порог для второй ассоциации по детекциям с низкой уверенностью. Для OC-SORT и Deep OC-SORT это применимо только тогда, когда use_byte: True.
new_track_thresh0.0-1.0Порог для инициализации нового трека, если обнаружение не соответствует существующим трекам.
track_buffer>=0Количество кадров, в течение которых потерянные треки остаются активными перед удалением. Более высокое значение означает большую терпимость к перекрытиям.
match_thresh0.0-1.0Порог для сопоставления треков. Более высокие значения делают сопоставление более мягким.
fuse_scoreTrue, FalseСледует ли объединять оценки уверенности с расстояниями IoU перед сопоставлением.
gmc_methodsparseOptFlow, orb, sift, ecc, noneМетод глобальной компенсации движения. Помогает учесть движение камеры.
proximity_thresh0.0-1.0Минимальный IoU, необходимый для валидного соответствия ReID. Обеспечивает пространственную близость перед использованием признаков внешнего вида.
appearance_thresh0.0-1.0Минимальное сходство внешнего вида, необходимое для ReID.
with_reidTrue, FalseВключи сопоставление на основе внешнего вида для улучшения отслеживания в условиях перекрытий. Поддерживается BoT-SORT, Deep OC-SORT и TrackTrack.
modelauto или путь к экспортированному файлуМодель ReID. auto использует встроенные признаки бэкбона YOLO, если они доступны; в противном случае происходит возврат к yolo26n-cls.pt. Передай файл .torchscript, .onnx, .engine, .openvino, … для использования пользовательского энкодера.

Аргументы для конкретных трекеров#

Каждый алгоритм предоставляет дополнительные настройки в дополнение к общим параметрам. Описания и советы по настройке см. в разделах для каждого трекера ниже или обратись непосредственно к конфигурационным файлам:

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

ReID по умолчанию отключен для минимизации накладных расходов. Включи его, установив with_reid: True в файле конфигурации трекера.

Опции модели ReID:

  • model: auto — использует встроенные признаки детектора YOLO, добавляя минимальные накладные расходы. Идеально, когда тебе нужен некоторый ReID без значительного снижения производительности. Возвращается к yolo26n-cls.pt, если детектор не предоставляет совместимые признаки.
  • Экспортированная модель ReID — укажи model: на экспортированный файл (.torchscript, .onnx, .engine, .openvino и т. д.) для получения более различимых эмбеддингов ценой дополнительного прямого прохода на каждый кроп. Энкодер загружается через AutoBackend, поэтому любой формат экспорта, поддерживаемый Ultralytics, работает без изменения кода.

Готовые к использованию энкодеры ONNX опубликованы для каждого размера модели. Установи model: в одно из этих имен, и файл загрузится автоматически при первом запуске трекера (так же, как загружаются веса YOLO) — не требуется никаких шагов ручного экспорта или скачивания:

# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder
Модельразмер
(пиксели)
параметры
(М)
FLOPs
(B)
YOLO26n-reid.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
ReID предназначен только для отслеживания

В настоящее время доступны только энкодеры ONNX ReID для ветки внешнего вида трекера. Режимы ReID train, val и predict, а также специализированные рецепты экспорта 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", quantize=16, dynamic=True, batch=32)

После экспорта укажи путь к модели TensorRT в конфигурации трекера.

Подробности о трекерах#

Разверни разделы ниже, чтобы узнать о проектировании, конкретных параметрах и советах по настройке для каждого трекера.

BoT-SORT#

BoT-SORT (Aharon et al., 2022) является трекером по умолчанию. Он расширяет ByteTrack компенсацией движения камеры и опциональным ReID:

  • Компенсация движения камеры (CMC): аффинное преобразование, оцениваемое для каждого кадра (по умолчанию используется разреженный оптический поток; также доступны ORB / ECC), применяется к состояниям Калмана перед сопоставлением по IoU.
  • Опциональный ReID: эмбеддинги внешнего вида могут быть объединены в матрицу стоимости. По умолчанию отключено; включи с помощью with_reid: True.

Лучший выбор для: трекинга общего назначения, особенно с движущихся камер. Добавляй ReID только в тех случаях, когда похожие друг на друга объекты вызывают путаницу идентификаторов (ID swaps).

Специфические аргументы BoT-SORT:

ПараметрДопустимые значения или диапазоныОписание
gmc_methodsparseOptFlow, orb, sift, ecc, noneБэкэнд компенсации движения камеры. sparseOptFlow используется по умолчанию. none отключает CMC.
with_reidTrue, FalseВключение сопоставления на основе внешнего вида. По умолчанию выключено.
modelauto или путь к модели ReIDМодель ReID. auto использует встроенные признаки YOLO, если они доступны; в противном случае передай путь .torchscript / .onnx / .engine.
proximity_thresh0.0-1.0Минимальный IoU перед тем, как признаки внешнего вида будут приняты во внимание.
appearance_thresh0.0-1.0Минимальное косинусное сходство, необходимое для совпадения ReID. Увеличь значение, чтобы уменьшить путаницу ID.

Советы по настройке:

  • Статическая камера: установи gmc_method: none, чтобы сэкономить несколько мс на кадр.
  • Сильное движение камеры: оставь sparseOptFlow; ecc точнее, но медленнее.
  • Похожие толпы: включи with_reid: True и увеличь appearance_thresh (например, 0.85+).

ByteTrack#

ByteTrack (Zhang et al., ECCV 2022) — это легковесный базовый алгоритм. Он использует линейный фильтр Калмана + IoU с двуэтапной ассоциацией:

  • Этап 1: сопоставление детекций с высокой уверенностью с активными треками.
  • Этап 2: повторная попытка сопоставления оставшихся треков с детекциями с низкой уверенностью для восстановления после кратковременного частичного перекрытия.

Модель не имеет модели внешнего вида и компенсации движения камеры.

Лучший выбор для: статических или почти статических камер, где основная нагрузка приходится на детектор, и тебе требуется минимальная нагрузка от трекера.

Аргументы, специфичные для ByteTrack: отсутствуют, помимо общих аргументов трекера.

Советы по настройке:

  • Шумный детектор: уменьши track_low_thresh, чтобы у второго этапа было больше кандидатов.
  • Детектор с высокой полнотой (high-recall): увеличь track_high_thresh, чтобы уменьшить фрагментацию ID.
  • Частое мерцание ID: увеличь track_buffer, чтобы недолго пропущенные треки сохранялись.

OC-SORT#

OC-SORT (Cao et al., CVPR 2023) — это ориентированное на наблюдения расширение SORT. Оно сохраняет легковесный дизайн SORT (без признаков внешнего вида) и добавляет три коррекции:

  • Повторное обновление, ориентированное на наблюдение (ORU): воспроизводит виртуальную траекторию между последним наблюдением и текущей детекцией, повторно запуская обновление Калмана для исправления дрейфа скорости.
  • Импульс, ориентированный на наблюдение (OCM): штрафует детекции, движущиеся в неправильном направлении, с помощью члена согласованности скорости.
  • Восстановление, ориентированное на наблюдение (OCR): повторно проверяет несопоставленные детекции по отношению к недавно потерянным трекам, используя их последнее наблюдение, а не предсказанное состояние.

Лучший выбор для: нелинейного движения без затрат на модель ReID.

Специфические аргументы OC-SORT:

ПараметрДопустимые значения или диапазоныОписание
delta_t>=1Временное окно (кадры) для вычисления направления скорости в OCM. Большие значения обеспечивают более плавный результат.
inertia0.0-1.0Вес стоимости согласованности скорости. Более высокие значения штрафуют резкие изменения направления.
use_byteTrue, FalseВключи второй проход сопоставления в стиле ByteTrack по детекциям с низкой уверенностью.

Советы по настройке:

  • Нелинейное движение: увеличь inertia (например, 0.3-0.4).
  • Разреженные детекции: включи use_byte: True.
  • Длинные окклюзии: увеличь track_buffer, чтобы у OCR было больше потерянных треков для повторного связывания.

Deep OC-SORT#

Deep OC-SORT дополняет OC-SORT информацией о внешнем виде и компенсацией движения камеры:

  • Адаптивное объединение внешнего вида: эмбеддинги детекций объединяются в матрицу стоимости с весом, модулируемым уверенностью детекции и перекрытием.
  • Динамический EMA внешнего вида: эмбеддинги треков обновляются с помощью EMA, коэффициент сглаживания которого адаптируется к уверенности детекции.
  • Компенсация движения камеры: состояния Калмана искажаются от кадра к кадру через разреженный оптический поток, ORB или ECC.

Лучший выбор для: сцен в толпе или с движущейся камерой, где часты случаи смены ID между визуально разными, но пространственно близкими объектами.

Специфические аргументы Deep OC-SORT:

ПараметрДопустимые значения или диапазоныОписание
with_reidTrue, FalseВключение сопоставления на основе внешнего вида. По умолчанию выключено.
modelauto, экспортированный файл модели ReIDМодель ReID. auto повторно использует встроенные признаки YOLO; в противном случае передай экспортированный файл (.torchscript, .onnx, .engine, …).
proximity_thresh0.0-1.0Минимальный IoU перед тем, как признаки внешнего вида будут приняты во внимание.
appearance_thresh0.0-1.0Минимальное косинусное сходство, необходимое для совпадения ReID.
alpha_fixed_emb0.0-1.0Базовый фактор EMA для обновлений эмбеддинга трека. Более высокие значения дольше сохраняют старый эмбеддинг.
gmc_methodsparseOptFlow, orb, sift, ecc, noneМетод глобальной компенсации движения.
delta_t>=1Временное окно (кадры) для вычисления направления скорости в OCM (унаследовано от OC-SORT).
inertia0.0-1.0Вес стоимости согласованности скорости (унаследовано от OC-SORT).
use_byteTrue, FalseВключи второй проход сопоставления в стиле ByteTrack по детекциям с низкой уверенностью (унаследовано от OC-SORT).

Советы по настройке:

  • Смена идентификаторов в толпе: увеличь appearance_thresh (например, 0.92-0.95) и уменьши alpha_fixed_emb, чтобы эмбеддинги адаптировались медленнее.
  • Движущаяся камера: установи gmc_method: sparseOptFlow (в Deep OC-SORT по умолчанию используется none).
  • Меньшая задержка: оставь with_reid: False (по умолчанию) только для движения + CMC; включай ReID только тогда, когда смена ID преобладает среди ошибок.

FastTracker#

FastTracker — это вариант ByteTrack с учетом окклюзий без модели внешнего вида:

  • Обнаружение окклюзии: помечает треки как окклюзированные, когда покрытие другими активными треками превышает occ_cover_thresh.
  • Откат Калмана при перекрытии: откатывает состояние Калмана к кадру до начала перекрытия, используя историю кольцевого буфера.
  • Демпфирование движения и расширение поиска: скорость демпфируется, а предсказанный bbox увеличивается во время перекрытия.
  • Подавление Init-IoU: предотвращает появление новых треков поверх активных.

Лучший выбор для: конвейеров обнаружения в реальном времени с частым наложением целей (толпы, очереди, спорт).

Специфические аргументы FastTracker:

ПараметрДопустимые значения или диапазоныОписание
reset_velocity_offset_occ>=0Количество кадров истории для восстановления скорости Калмана при начале перекрытия.
reset_pos_offset_occ>=0Количество кадров истории для восстановления позиции Калмана при начале перекрытия.
enlarge_bbox_occ>=1.0Масштабирование высоты, применяемое к предсказанному bbox во время перекрытия (ширина масштабируется через соотношение сторон XYAH).
dampen_motion_occ0.0-1.0Множитель скорости во время перекрытия. Меньшие значения заставляют трек "замедляться" во время перекрытия.
active_occ_to_lost_thresh>=1Максимальное количество последовательных кадров перекрытия, прежде чем активный трек будет переведен в статус потерянного.
occ_cover_thresh0.0-1.0Доля площади трека, покрытая другим активным треком, для объявления перекрытия.
occ_reappear_window>=0Количество кадров, в течение которых недавно перекрытый потерянный трек остается предпочтительно доступным для повторного обнаружения.
init_iou_suppress0.0-1.0Подавляет инициализацию нового трека, если его IoU с любым активным треком превышает это значение. Установи в 1.0, чтобы отключить.

Советы по настройке:

  • Частичные окклюзии: уменьши occ_cover_thresh (например, 0.5-0.6).
  • Дублирование ID вокруг пересечений: уменьши init_iou_suppress (например, 0.5).
  • Длинные окклюзии: увеличь occ_reappear_window и track_buffer одновременно.
  • Быстро движущиеся цели: увеличь dampen_motion_occ (ближе к 1.0) и уменьши enlarge_bbox_occ.

TrackTrack#

TrackTrack (Shim et al., CVPR 2025) анализирует ситуацию с перспективы каждого трека с помощью многосигнальной итеративной ассоциации:

  • Ассоциация на основе перспективы трека (TPA): объединяет HMIoU, косинусное расстояние ReID, расстояние проекции уверенности и расстояние угла поворота углов. Назначение решается итеративно с использованием порога ослабления.
  • Инициализация с учетом трека (TAI): подавляет создание дубликатов до того, как будет создан новый ID.

Лучшее решение для: переполненных сцен с частыми перекрытиями, где дублирующиеся ID являются проблемой.

Аргументы, специфичные для TrackTrack:

ПараметрДопустимые значения или диапазоныОписание
iou_weight0.0-1.0Вес расстояния HMIoU в матрице затрат по нескольким признакам.
reid_weight0.0-1.0Вес косинусного расстояния ReID. Если ReID отключен, возвращается к HMIoU.
conf_weight0.0-1.0Вес расстояния проекции уверенности.
angle_weight0.0-1.0Вес расстояния угла поворота углов.
penalty_p0.0-1.0Штраф по затратам для обнаружений с низкой уверенностью.
penalty_q0.0-1.0Штраф по затратам для обнаружений, восстановленных вторичным NMS.
reduce_step0.0-1.0Ослабление порога совпадения на каждой итерации.
tai_thr0.0-1.0Порог IoU для NMS инициализации с учетом трека.
min_track_len>=0Минимальное количество успешных обновлений перед подтверждением нового трека.
lost_match_thr0.0-1.0Более свободный порог стоимости для расслабленного прохода повторного связывания потерянных треков; 0 отключает его.
with_reidTrue, FalseВключи сопоставление внешнего вида через косинус-ReID (использует встроенные функции YOLO). По умолчанию выключено.
modelauto, файл ReIDМодель ReID; auto использует встроенные признаки YOLO, в противном случае — экспортированный файл ReID.
gmc_methodsparseOptFlow, orb, sift, ecc, noneМетод глобальной компенсации движения.

Советы по настройке:

  • Многолюдные пешеходные зоны: уменьши tai_thr (например, 0.45), чтобы подавить больше дублирующихся появлений; увеличь track_buffer для более длительных окклюзий.
  • Быстрое движение камеры: оставь gmc_method: sparseOptFlow включенным.
  • Маленькие/быстрые объекты: немного увеличь angle_weight и уменьши min_track_len.
  • Включай 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 сообщает трекеру, что текущее изображение или кадр является следующим в последовательности и что нужно ожидать треки с предыдущего изображения в текущем.

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

Используй persist=True только при передаче последовательных кадров из одного видеопотока в model.track(). Это позволяет трекеру повторно использовать состояние из предыдущих кадров и поддерживать согласованные ID треков с течением времени. Не используй persist=True для несвязанных изображений или другого потока, так как состояние предыдущего трека может переноситься.

Ты также можешь выбрать бэкенд трекера, передав файл конфигурации трекера, такой как tracker="botsort.yaml", tracker="bytetrack.yaml" или tracker="tracktrack.yaml".

Потоковый цикл for с отслеживанием
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
        # and using the BoT-SORT tracker backend
        results = model.track(frame, persist=True, tracker="botsort.yaml")

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

Построение графиков треков по нескольким кадрам видео
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(list)

# 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 мы используем модуль 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? Мы приглашаем тебя внести свой вклад в наш раздел трекеров в ultralytics/cfg/trackers! Твои реальные приложения и решения могут оказаться бесценными для пользователей, работающих над задачами трекинга.

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

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

Давай вместе улучшим возможности отслеживания экосистемы Ultralytics YOLO 🙏!

FAQ#

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

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

Могу ли я сохранить трекер внутри файла модели YOLO?#

Нет. Стандартные файлы Ultralytics .pt хранят веса модели YOLO, в то время как трекер создается во время инференса с помощью model.track(). ID треков зависят от состояния трекера на последовательных кадрах, поэтому одно отдельное изображение может возвращать результаты обнаружения, такие как боксы, классы и уверенность, но само по себе оно не может создавать полезные постоянные ID трекинга.

Для развертывания упакуй детектор и трекер вместе в своем приложении и вызывай model.track() покадрово с помощью persist=True, когда кадры поступают из одного видеопотока. Используй отдельные экземпляры модели или трекера для несвязанных потоков, чтобы состояние не переносилось между видео.

Как настроить пользовательский трекер для 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")

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

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

Многопоточное отслеживание
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(list)

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

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

Комментарии