Ultralytics YOLO27:

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

YOLO multi-object tracking with trajectory paths

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

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

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

Начиная с ultralytics 8.4.63, OC-SORT, Deep OC-SORT, FastTracker и TrackTrack доступны наряду с BoT-SORT и ByteTrack.

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

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

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


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

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

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

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

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

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Default tracker (TrackTrack)
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)Настраивается (gmc_method)Буфер треков + повторная привязка 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)Необязательно (with_reid)Настраивается (gmc_method)Итеративное сопоставление по нескольким признакам + TAI

Какой трекер выбрать?#

Используй эту схему, чтобы выбрать отправную точку; tracktrack.yaml используется, если не передать tracker:

  1. Нужен самый быстрый и простой базовый вариант?ByteTrack (без ReID, без компенсации движения камеры, минимальные накладные расходы).
  2. Видео снято с рук, дрона или движущейся камеры?BoT-SORT (добавляет компенсацию движения камеры и необязательный ReID).
  3. Нелинейное движение (спорт, танцы, резкие повороты) и отсутствие ReID?OC-SORT (коррекции с ориентацией на наблюдения без затрат на анализ внешнего вида).
  4. Переполненные сцены с движущейся камерой, где главная проблема — подмена идентификаторов?Deep OC-SORT или TrackTrack (оба поддерживают необязательное сопоставление по внешнему виду; TrackTrack также добавляет сопоставление по нескольким признакам и подавление дублирующихся идентификаторов).
  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 или выше проходят на первый этап сопоставления. Обнаружения со значениями от track_low_thresh до track_high_thresh могут восстановить существующие треки, если выбранный трекер поддерживает сопоставление объектов с низкой уверенностью, но не создают новые треки. Обнаружения со значением track_low_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; TrackTrack включает их в пул сопоставления со штрафом.
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Модель ReID. auto использует встроенные признаки backbone YOLO, если они доступны; в противном случае переключается на yolo26n-cls.pt. Пользовательский энкодер может быть чекпойнтом .pt или экспортированной моделью, например .torchscript, .onnx, .engine или каталогом модели OpenVINO.

Аргументы, специфичные для трекера#

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

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

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

Варианты моделей ReID:

  • model: auto — Использует встроенные признаки детектора YOLO, добавляя минимальные накладные расходы. Идеальный вариант, если нужен ReID с небольшим снижением производительности. Переключается на yolo26n-cls.pt, если детектор не предоставляет совместимые признаки.
  • Пользовательская модель ReID — Укажи в model: чекпойнт .pt или совместимую экспортированную модель эмбеддингов, например .torchscript, .onnx, .engine или каталог модели OpenVINO. Экспортированные модели загружаются через AutoBackend и должны напрямую выдавать тензор эмбеддингов.

Готовые к использованию 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
Модельразмер
(пиксели)
параметры
(M)
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 в конфигурации трекера.

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

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



Watch: Which Object Tracker Performs Better? | Speed, FPS & ID Stability | Ultralytics YOLO26 📊

BoT-SORT#

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

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

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

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

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

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

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

ByteTrack#

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

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

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

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

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

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

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

OC-SORT#

OC-SORT (Cao и др., 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 мог повторно связать больше потерянных треков.

В моделях OBB OCR использует ориентированный бокс, предсказанный Калманом, поскольку история последних ориентированных наблюдений не сохраняется.

Deep OC-SORT#

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

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

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

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

ПараметрДопустимые значения или диапазоныОписание
with_reidTrue, FalseВключить сопоставление на основе внешнего вида. По умолчанию отключено.
modelauto или путь к совместимой модели ReIDauto использует встроенные признаки YOLO, если они доступны; пользовательские модели могут быть чекпойнтами .pt или совместимыми экспортами.
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 являются основной причиной ошибок.

FastTracker#

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

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

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

Аргументы, специфичные для 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 и др., CVPR 2025) — трекер по умолчанию. Он анализирует ситуацию с точки зрения каждого трека и использует итеративное сопоставление по нескольким признакам:

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

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

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

ПараметрДопустимые значения или диапазоныОписание
iou_weight0.0-1.0Вес расстояния HMIoU при включённом ReID; в противном случае HMIoU используется напрямую.
reid_weight0.0-1.0Вес косинусного расстояния ReID при включённом ReID; в противном случае оно игнорируется.
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 или путь к совместимой модели ReIDauto использует встроенные признаки YOLO, если они доступны; пользовательские модели могут быть чекпойнтами .pt или совместимыми экспортами.
gmc_methodsparseOptFlow, orb, sift, ecc, noneМетод глобальной компенсации движения.

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

  • Скопление пешеходов: уменьши tai_thr (например, до 0.45), чтобы подавить больше дубликатов при создании треков; увеличь track_buffer для более длительных перекрытий.
  • Быстрое движение камеры: оставь gmc_method: sparseOptFlow включённым.
  • Маленькие/быстрые объекты: немного увеличь angle_weight и уменьши min_track_len.
  • Включай ReID только при необходимости: он увеличивает вычислительные затраты на инференс; для коротких перекрытий обычно достаточно стандартной стоимости на основе нескольких признаков.

С моделями Segment и Pose TrackTrack пропускает восстановление детекций с ослабленным NMS, поэтому маски и ключевые точки остаются согласованными со своими детекциями.

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

Построение треков на нескольких кадрах видео
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 используется модуль 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): Model checkpoint name or path loaded inside the thread.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass

# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.join()

# Clean up and close windows
cv2.destroyAllWindows()

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

Добавление новых трекеров#

Ты хорошо разбираешься в отслеживании нескольких объектов и успешно реализовал или адаптировал алгоритм отслеживания с помощью Ultralytics YOLO? Приглашаем тебя внести вклад в раздел Trackers в ultralytics/cfg/trackers! Твои решения и реальные варианты применения могут оказаться бесценными для пользователей, работающих над задачами отслеживания.

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

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

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

Часто задаваемые вопросы#

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

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

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

  • Ты можешь настроить пользовательский трекер, скопировав существующий файл конфигурации трекера (например, custom_tracker.yaml) из каталога конфигураций трекеров Ultralytics и изменив необходимые параметры, кроме tracker_type. Используй этот файл в своей модели отслеживания следующим образом:

    Пример
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
  • Чтобы одновременно запускать отслеживание объектов в нескольких видеопотоках, можно использовать модуль threading Python. Каждый поток будет обрабатывать отдельный видеопоток. Вот пример настройки:

    Многопоточное отслеживание
    import threading
    
    import cv2
    
    from ultralytics import YOLO
    
    # Define model names and video sources
    MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
    SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam
    
    def run_tracker_in_thread(model_name, filename):
        """Run YOLO tracker in its own thread for concurrent processing.
    
        Args:
            model_name (str): Model checkpoint name or path loaded inside the thread.
            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 обрабатывать видео с высокой частотой кадров в реальном времени и исключительной точностью.

  • Чтобы визуализировать треки объектов на нескольких кадрах видео, можно использовать функции отслеживания модели 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:
            result = model.track(frame, persist=True)[0]
            annotated_frame = result.plot()
            if result.boxes and result.boxes.is_track:
                boxes = result.boxes.xywh.cpu()
                track_ids = result.boxes.id.int().cpu().tolist()
                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()

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

Комментарии