Отслеживание нескольких объектов с Ultralytics YOLO#
Отслеживание объектов в видеоаналитике — важная задача: она не только определяет местоположение и класс объектов в кадре, но и сохраняет уникальный ID каждого обнаруженного объекта по мере развития видео. Области применения безграничны — от видеонаблюдения и безопасности до спортивной аналитики в реальном времени.
Смотри анонс ещё не выпущенной версии YOLO27, чтобы узнать о планах по поддержке отслеживания.
Начиная с 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-SORT | botsort.yaml | Линейная модель Калмана | Необязательно (with_reid) | Настраиваемый параметр (gmc_method) | Буфер треков + повторная привязка ReID |
| ByteTrack | bytetrack.yaml | Линейная модель Калмана | Нет | Нет | Двухэтапное восстановление при низкой уверенности |
| OC-SORT | ocsort.yaml | Модель Калмана с учётом наблюдений | Нет | Нет | Повторный расчёт ORU, OCM, OCR на основе последнего наблюдения |
| Deep OC-SORT | deepocsort.yaml | Модель Калмана с учётом наблюдений | Необязательно (with_reid) | Настраиваемый параметр (gmc_method) | OC-SORT + адаптивная EMA признаков внешнего вида (необязательно) |
| FastTracker | fasttrack.yaml | Линейная модель Калмана + откат | Нет | Нет | Откат модели Калмана + увеличение bbox при перекрытии |
| TrackTrack | tracktrack.yaml | Линейная модель Калмана (NSA) | Необязательно (with_reid) | Настраиваемый параметр (gmc_method) | Итеративное сопоставление по нескольким признакам + TAI |
Какой трекер выбрать?#
Используй эту схему, чтобы выбрать вариант для начала; tracktrack.yaml используется, если не передан tracker:
- Нужен максимально быстрый и простой базовый вариант? → ByteTrack (без ReID и компенсации движения камеры, с минимальными накладными расходами).
- Видео снято с рук, с дрона или движущейся камеры? → BoT-SORT (добавляет компенсацию движения камеры и необязательный ReID).
- Нелинейное движение (спорт, танцы, резкие повороты) и ReID не нужен? → OC-SORT (коррекция с учётом наблюдений без затрат на анализ внешнего вида).
- Переполненные сцены с движущейся камерой, где главная проблема — подмена ID? → Deep OC-SORT или TrackTrack (оба поддерживают необязательное сопоставление по внешнему виду; TrackTrack также использует сопоставление по нескольким признакам и подавляет дублирующиеся ID).
- Частые частичные перекрытия в реальном времени, а ресурсов на 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_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Указывает тип трекера. |
track_high_thresh | 0.0-1.0 | Порог для первого сопоставления. Определяет, насколько уверенно детекция сопоставляется с существующим треком. |
track_low_thresh | 0.0-1.0 | Нижняя граница для детекций с низкой уверенностью, используемых при восстановлении треков. OC-SORT и Deep OC-SORT используют их только при use_byte: True; TrackTrack включает их в пул сопоставления со штрафом. |
new_track_thresh | 0.0-1.0 | Порог для инициализации нового трека, если детекция не соответствует ни одному существующему треку. |
track_buffer | >=0 | Количество кадров, в течение которых потерянные треки остаются активными до удаления. Чем выше значение, тем лучше алгоритм переносит перекрытия. |
match_thresh | 0.0-1.0 | Порог сопоставления треков. Чем выше значение, тем менее строгим становится сопоставление. |
fuse_score | True, False | Нужно ли объединять оценки уверенности с расстояниями IoU перед сопоставлением. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Метод компенсации глобального движения. Помогает учитывать движение камеры. |
proximity_thresh | 0.0-1.0 | Минимальный IoU, необходимый для корректного сопоставления ReID. Обеспечивает близость объектов в пространстве перед использованием признаков внешнего вида. |
appearance_thresh | 0.0-1.0 | Минимальное нормализованное сходство внешнего вида, необходимое для ReID. |
with_reid | True, 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.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
Сейчас доступны только энкодеры ONNX ReID для ветви трекера, отвечающей за внешний вид. Режимы ReID train, val и predict, а также специальные сценарии экспорта 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_method | sparseOptFlow, orb, sift, ecc, none | Бэкенд компенсации движения камеры. По умолчанию используется sparseOptFlow. Значение none отключает CMC. |
with_reid | True, False | Включить сопоставление по внешнему виду. По умолчанию отключено. |
model | Путь к auto или совместимой модели ReID | auto использует встроенные признаки YOLO, если они доступны; в качестве пользовательских моделей можно указать чекпойнты .pt или совместимые экспортированные модели. |
proximity_thresh | 0.0-1.0 | Минимальный IoU, при котором учитываются признаки внешнего вида. |
appearance_thresh | 0.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. Чем больше значение, тем сильнее сглаживание. |
inertia | 0.0-1.0 | Вес стоимости согласованности скорости. Чем выше значение, тем сильнее штраф за резкие изменения направления. |
use_byte | True, 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_reid | True, False | Включить сопоставление по внешнему виду. По умолчанию отключено. |
model | Путь к auto или совместимой модели ReID | auto использует встроенные признаки YOLO, если они доступны; в качестве пользовательских моделей можно указать чекпойнты .pt или совместимые экспортированные модели. |
proximity_thresh | 0.0-1.0 | Минимальный IoU, при котором учитываются признаки внешнего вида. |
appearance_thresh | 0.0-1.0 | Минимальное нормализованное сходство внешнего вида, необходимое для сопоставления ReID. |
alpha_fixed_emb | 0.0-1.0 | Базовый коэффициент EMA для обновления эмбеддингов треков. Чем выше значение, тем дольше сохраняется старый эмбеддинг. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Метод компенсации глобального движения. |
delta_t | >=1 | Временное окно (в кадрах) для вычисления направления скорости в OCM (унаследовано от OC-SORT). |
inertia | 0.0-1.0 | Вес стоимости согласованности скорости (унаследован от OC-SORT). |
use_byte | True, 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_occ | 0.0-1.0 | Множитель скорости во время окклюзии. При меньших значениях трек «замедляется» во время окклюзии. |
active_occ_to_lost_thresh | >=1 | Максимальное количество последовательных кадров с окклюзией, после которого активный трек переводится в потерянные. |
occ_cover_thresh | 0.0-1.0 | Доля площади трека, перекрытая другим активным треком, необходимая для фиксации окклюзии. |
occ_reappear_window | >=0 | Количество кадров, в течение которых недавно окклюдированный потерянный трек остаётся приоритетным для повторного обнаружения. |
init_iou_suppress | 0.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_weight | 0.0-1.0 | Вес расстояния HMIoU при включённом ReID; в противном случае HMIoU используется напрямую. |
reid_weight | 0.0-1.0 | Вес косинусного расстояния ReID при включённом ReID; в противном случае параметр игнорируется. |
conf_weight | 0.0-1.0 | Вес расстояния проекции уверенности. |
angle_weight | 0.0-1.0 | Вес расстояния по углу угла. |
penalty_p | 0.0-1.0 | Штраф к стоимости для детекций с низкой уверенностью. |
penalty_q | 0.0-1.0 | Штраф к стоимости для детекций, восстановленных с помощью вторичного NMS. |
reduce_step | 0.0-1.0 | Ослабление порога сопоставления на каждой итерации. |
tai_thr | 0.0-1.0 | Порог IoU для NMS при инициализации с учётом треков. |
min_track_len | >=0 | Минимальная длина истории, необходимая для подтверждения нового трека. |
lost_match_thr | 0.0-1.0 | Более мягкий порог стоимости для ослабленного прохода повторной привязки потерянных треков; 0 отключает его. |
with_reid | True, False | Включить сопоставление по внешнему виду на основе косинусного ReID (используются встроенные признаки YOLO). По умолчанию отключено. |
model | Путь к auto или совместимой модели ReID | auto использует встроенные признаки YOLO, если они доступны; в качестве пользовательских моделей можно указать чекпойнты .pt или совместимые экспортированные модели. |
gmc_method | sparseOptFlow, 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".
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()Этот скрипт построит линии треков, показывающие траектории движения отслеживаемых объектов с течением времени, и поможет получить ценную информацию об их поведении и закономерностях.