Отслеживание нескольких объектов с помощью Ultralytics YOLO#
Отслеживание объектов в сфере видеоаналитики — важная задача, которая не только определяет расположение и класс объектов в кадре, но и сохраняет уникальный идентификатор каждого обнаруженного объекта по мере развития видео. Возможности применения безграничны — от наблюдения и обеспечения безопасности до спортивной аналитики в реальном времени.
Ознакомься с предпросмотром невыпущенной версии YOLO27 для получения информации о запланированной поддержке трекинга.
Начиная с 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-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 (коррекции с ориентацией на наблюдения без затрат на анализ внешнего вида).
- Переполненные сцены с движущейся камерой, где главная проблема — подмена идентификаторов? → Deep OC-SORT или TrackTrack (оба поддерживают необязательное сопоставление по внешнему виду; TrackTrack также добавляет сопоставление по нескольким признакам и подавление дублирующихся идентификаторов).
- Частые частичные перекрытия в реальном времени при отсутствии ресурсов на 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_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 использует встроенные признаки 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.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
# 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_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 использует ориентированный бокс, предсказанный Калманом, поскольку история последних ориентированных наблюдений не сохраняется.
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 увеличивается во время окклюзии.
- Подавление инициализации по IoU: предотвращает создание новых треков поверх активных треков.
Лучше всего подходит для: конвейеров обнаружения в реальном времени без ReID с частыми перекрытиями объектов (толпы, очереди, спортивные сцены).
Аргументы, специфичные для 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 и др., 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 только при необходимости: он увеличивает вычислительные затраты на инференс; для коротких перекрытий обычно достаточно стандартной стоимости на основе нескольких признаков.
С моделями 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".
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")Чтобы одновременно запускать отслеживание объектов в нескольких видеопотоках, можно использовать модуль
threadingPython. Каждый поток будет обрабатывать отдельный видеопоток. Вот пример настройки:Многопоточное отслеживание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()Этот скрипт построит линии отслеживания, показывающие траектории движения отслеживаемых объектов во времени и позволяющие получить ценную информацию об их поведении и закономерностях.