Meet YOLO26: next-gen vision AI.

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

YOLO multi-object tracking with trajectory paths

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

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

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

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


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

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

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

Link to this sectionБыстрый старт#

Запусти отслеживание на видео с помощью трекера 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, такую как 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Поддерживаемые трекеры#

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

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

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

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

Link to this sectionПереключение трекеров#

Передай имя файла конфигурации трекера в 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")

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_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, … для использования кастомного энкодера.

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

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

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

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

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

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

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

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

from ultralytics import YOLO

# Load the classification model
model = YOLO("yolo26n-cls.pt")

# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool

# Export to TensorRT
model.export(format="engine", half=True, dynamic=True, batch=32)

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

Link to this sectionПодробности о трекерах#

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

Link to this sectionBoT-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+).

Link to this sectionByteTrack#

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

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

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

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

Специфические аргументы ByteTrack: Нет, кроме общих аргументов трекера.

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

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

Link to this sectionOC-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 было больше потерянных треков для повторной привязки.

Link to this sectionDeep 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).

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

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

Link to this sectionFastTracker#

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.

Link to this sectionTrackTrack#

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 только при необходимости: это увеличивает затраты на инференс; для коротких перекрытий обычно достаточно стандартной стоимости по нескольким признакам.

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

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

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

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

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

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

Комментарии