Ultralytics YOLO27:
Get Started

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

YOLO multi-object tracking with trajectory paths

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

Смотри анонс ещё не выпущенной версии 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 соответствуют стандартной детекции объектов, но дополнены ID объектов. Благодаря этому удобно отслеживать объекты в видеопотоках и выполнять дальнейшую аналитику. Вот почему стоит рассмотреть Ultralytics YOLO для отслеживания объектов:

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


Смотри: Как настроить трекинг нескольких объектов с Ultralytics YOLO26 | BoT-SORT и ByteTrack | VisionAI 🚀

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

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

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

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

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Трекер по умолчанию (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)

# Переключение на 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.

Пример
from ultralytics import YOLO

# Загрузка официальной или собственной модели
model = YOLO("yolo26n.pt")  # Загрузка официальной модели Detect
model = YOLO("yolo26n-seg.pt")  # Загрузка официальной модели Segment
model = YOLO("yolo26n-pose.pt")  # Загрузка официальной модели Pose
model = YOLO("path/to/best.pt")  # Загрузка собственной обученной модели

# Отслеживание с помощью модели
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # Отслеживание с трекером по умолчанию
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # с 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. Переполненные сцены с движущейся камерой, где главная проблема — подмена 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

# Настрой параметры отслеживания и запусти трекер
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

# Загрузи модель и запусти трекер с собственным файлом конфигурации
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.
modelПуть к auto или совместимой модели ReIDМодель ReID. auto использует признаки встроенной магистральной сети 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
Модельразмер
(пиксели)
параметры
(млн)
FLOPs
(млрд)
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

# Загрузи модель классификации
model = YOLO("yolo26n-cls.pt")

# Добавь слой усредняющего пулинга
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

# Экспортируй в TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)

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

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

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



Смотри: Какой трекер объектов лучше? | Скорость, FPS и стабильность ID | Ultralytics YOLO26 📊

BoT-SORT#

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

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

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

Аргументы BoT-SORT:

ПараметрДопустимые значения или диапазоныОписание
gmc_methodsparseOptFlow, orb, sift, ecc, noneБэкенд компенсации движения камеры. По умолчанию используется sparseOptFlow. Значение none отключает CMC.
with_reidTrue, FalseВключить сопоставление по внешнему виду. По умолчанию отключено.
modelПуть к auto или совместимой модели 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 используется предсказанный фильтром Калмана ориентированный bbox, поскольку история последних наблюдений с ориентацией не сохраняется.

Deep OC-SORT#

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

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

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

Аргументы Deep OC-SORT:

ПараметрДопустимые значения или диапазоныОписание
with_reidTrue, FalseВключить сопоставление по внешнему виду. По умолчанию отключено.
modelПуть к auto или совместимой модели 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 увеличивается во время перекрытия.
  • Подавление 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; в противном случае 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). По умолчанию отключено.
modelПуть к auto или совместимой модели ReIDauto использует встроенные признаки YOLO, если они доступны; в качестве пользовательских моделей можно указать чекпойнты .pt или совместимые экспортированные модели.
gmc_methodsparseOptFlow, orb, sift, ecc, noneМетод компенсации глобального движения.

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

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

Для моделей сегментации и позы TrackTrack пропускает восстановление детекций с ослабленным NMS, чтобы маски и ключевые точки оставались согласованными с детекциями.

Примеры на Python#



Смотри: Как создать интерактивный трекинг объектов с Ultralytics YOLO | Нажми, чтобы обрезать и показать ⚡

Цикл с сохранением треков#

Вот скрипт на 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

# Загружаем модель YOLO26
model = YOLO("yolo26n.pt")

# Открыть видеофайл
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Перебрать кадры видео
while cap.isOpened():
    # Считать кадр из видео
    success, frame = cap.read()

    if success:
        # Запускаем отслеживание YOLO26 на кадре, сохраняя треки между кадрами
        # и используя бэкенд трекера BoT-SORT
        results = model.track(frame, persist=True, tracker="botsort.yaml")

        # Визуализировать результаты на кадре
        annotated_frame = results[0].plot()

        # Показать кадр с аннотациями
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # Прервать цикл, если нажата клавиша 'q'
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Прервать цикл, если видео закончилось
        break

# Освободить объект видеозахвата и закрыть окно отображения
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

# Загружаем модель YOLO26
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:
        # Запускаем отслеживание YOLO26 на кадре, сохраняя треки между кадрами
        result = model.track(frame, persist=True)[0]

        # Получаем рамки и ID треков
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Визуализируем результат на кадре
            frame = result.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)))  # Центральная точка x, y
                if len(track) > 30:  # Храним 30 треков на протяжении 30 кадров
                    track.pop(0)

                # Рисуем линии треков
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Показать кадр с аннотациями
        cv2.imshow("YOLO26 Tracking", frame)

        # Прервать цикл, если нажата клавиша 'q'
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Прервать цикл, если видео закончилось
        break

# Освободить объект видеозахвата и закрыть окно отображения
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

# Задаём имена моделей и источники видео
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # Локальное видео, 0 — веб-камера

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

# Создаём и запускаем потоки трекеров с помощью цикла for
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()

# Ждём завершения всех потоков трекеров
for thread in tracker_threads:
    thread.join()

# Выполняем очистку и закрываем окна
cv2.destroyAllWindows()

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

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

Ты хорошо разбираешься в многоквартирном отслеживании объектов и успешно реализовал или адаптировал алгоритм отслеживания с Ultralytics YOLO? Приглашаем внести вклад в раздел трекеров в 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
    
    # Задаём имена моделей и источники видео
    MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
    SOURCES = ["path/to/video.mp4", "0"]  # Локальное видео, 0 — веб-камера
    
    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
    
    # Создаём и запускаем потоки трекеров с помощью цикла for
    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()
    
    # Ждём завершения всех потоков трекеров
    for thread in tracker_threads:
        thread.join()
    
    # Выполняем очистку и закрываем окна
    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()

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

Комментарии