Link to this sectionМногообъектное отслеживание с помощью Ultralytics YOLO#
Отслеживание объектов в области видеоаналитики — это критически важная задача, которая не только определяет местоположение и класс объектов в кадре, но и сохраняет уникальный ID для каждого обнаруженного объекта по мере развития видео. Сферы применения безграничны — от наблюдения и безопасности до анализа спортивных событий в реальном времени.
Link to this sectionПочему стоит выбрать Ultralytics YOLO для отслеживания объектов?#
Результат работы трекеров Ultralytics соответствует стандартному обнаружению объектов, но имеет дополнительную ценность в виде ID объектов. Это упрощает отслеживание объектов в видеопотоках и выполнение последующей аналитики. Вот почему тебе стоит рассмотреть использование Ultralytics YOLO для своих задач по отслеживанию:
- Эффективность: Обрабатывай видеопотоки в реальном времени без ущерба для точности.
- Гибкость: Поддерживает несколько алгоритмов и конфигураций отслеживания.
- Простота использования: Простой Python API и CLI опции для быстрой интеграции и развертывания.
- Кастомизируемость: Легко использовать с дообученными моделями YOLO, что позволяет интегрировать их в узкоспециализированные приложения.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Link to this sectionПрименение в реальных условиях#
| Транспорт | Ритейл | Аквакультура |
|---|---|---|
| Отслеживание транспортных средств | Отслеживание людей | Отслеживание рыб |
Link to this sectionБыстрый старт#
Запусти отслеживание на видео с помощью трекера BoT-SORT по умолчанию. Переключись на другой трекер, изменив аргумент tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (BoT-SORT)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")Чтобы запустить трекер на видеопотоках, используй обученную модель Detect, Segment или Pose, такую как YOLO26n, YOLO26n-seg или YOLO26n-pose. Ты можешь обучать собственные модели локально или на облачных GPU через Ultralytics Platform.
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom-trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrackКак видно из примера использования выше, отслеживание доступно для всех моделей Detect, Segment и Pose, запущенных на видео или стриминговых источниках.
Link to this sectionПоддерживаемые трекеры#
Ultralytics YOLO поставляется с шестью встроенными трекерами. Активируй один из них, передав его YAML-файл конфигурации в аргумент tracker.
| Трекер | Файл конфигурации | Модель движения | Внешний вид / ReID | Компенсация движения камеры | Обработка перекрытий |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Линейный фильтр Калмана | Опционально (with_reid) | Да (sparseOptFlow / ECC) | Буфер трека + перепривязка 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) | Опционально (откат HMIoU) | Да (sparseOptFlow / ECC) | Итеративная многофакторная ассоциация + TAI |
Link to this sectionКакой трекер мне использовать?#
Используй эту схему, чтобы выбрать точку отсчета:
- Нужен самый быстрый и простой бейзлайн? → ByteTrack (без ReID, без компенсации движения камеры, минимальные накладные расходы).
- Ручная съемка, дрон или кадры с движущейся камеры? → BoT-SORT (по умолчанию; добавляет компенсацию движения камеры и опциональный ReID).
- Нелинейное движение (спорт, танцы, резкие повороты) и без ReID? → OC-SORT (наблюдательно-центрированные корректировки без затрат на анализ внешнего вида).
- Многолюдные сцены с движущейся камерой, где основная проблема — замена ID? → Deep OC-SORT или TrackTrack (оба добавляют адаптивное слияние внешнего вида; TrackTrack также добавляет многофакторную ассоциацию и подавление дубликатов ID).
- Частые частичные перекрытия в реальном времени, нет бюджета на ReID? → FastTracker (вариант ByteTrack с учетом перекрытий и откатом Калмана).
Link to this sectionПереключение трекеров#
Передай имя файла конфигурации трекера в tracker=. Весь остальной код остается прежним.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")Link to this sectionКонфигурация#
Link to this sectionАргументы отслеживания#
Конфигурация отслеживания разделяет свойства с режимом Predict, такими как conf, iou и show. Для дальнейших конфигураций обратись к странице модели Predict.
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)Link to this sectionПользовательская конфигурация трекера#
Ultralytics также позволяет использовать измененный файл конфигурации трекера. Для этого просто сделай копию файла конфигурации трекера (например, custom_tracker.yaml) из ultralytics/cfg/trackers и измени любые конфигурации (кроме tracker_type) по мере необходимости.
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Link to this sectionОбщие аргументы трекера#
Следующие параметры являются общими для большинства YAML-файлов трекеров; не каждый параметр присутствует в каждой конфигурации:
Если оценка уверенности обнаружения падает ниже track_high_thresh, трекер не будет обновлять этот объект, что приведет к отсутствию активных треков.
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
tracker_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. |
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. auto использует нативные признаки бэкенда YOLO, если они доступны; в противном случае возвращается к yolo26n-cls.pt. Передай файл .torchscript, .onnx, .engine, .openvino, … для использования кастомного энкодера. |
Link to this sectionАргументы для конкретных трекеров#
Каждый алгоритм предоставляет дополнительные настройки в дополнение к общим параметрам. Описания и советы по настройке см. в разделах для каждого трекера ниже или обратись непосредственно к конфигурационным файлам:
Link to this sectionВключение повторной идентификации (ReID)#
ReID по умолчанию отключен для минимизации нагрузки. Включи его, установив with_reid: True в конфигурационном файле трекера.
Опции модели ReID:
model: auto— использует нативные возможности детектора YOLO с минимальной нагрузкой. Идеально, если тебе нужен ReID без существенного снижения производительности. Если детектор не поддерживает совместимые функции, система переключится наyolo26n-cls.pt.- Экспортированная модель ReID — укажи в параметре
model:путь к экспортированному файлу (.torchscript,.onnx,.engine,.openvinoи т.д.) для получения более точных эмбеддингов ценой выполнения дополнительного прохода для каждого кропа. Энкодер загружается черезAutoBackend, поэтому любой формат экспорта, поддерживаемый Ultralytics, будет работать без внесения изменений в код.
Для повышения производительности при использовании отдельной модели классификации экспортируй её в более быстрый бэкенд, например, TensorRT:
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo26n-cls.pt")
# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool
# Export to TensorRT
model.export(format="engine", half=True, dynamic=True, batch=32)После экспорта укажи путь к модели TensorRT в конфигурации трекера.
Link to this sectionПодробности о трекерах#
Разверни разделы ниже, чтобы узнать о проектировании, конкретных параметрах и советах по настройке для каждого трекера.
Link to this sectionBoT-SORT#
BoT-SORT (Aharon et al., 2022) — это трекер по умолчанию. Он расширяет ByteTrack за счет компенсации движения камеры и опционального ReID:
- Компенсация движения камеры (CMC): аффинное преобразование, оцениваемое для каждого кадра (по умолчанию используется разреженный оптический поток; также доступны ORB / ECC), применяется к состояниям Калмана перед сопоставлением по IoU.
- Опциональный ReID: эмбеддинги внешнего вида могут быть объединены в матрицу стоимости. По умолчанию отключено; включи с помощью
with_reid: True.
Лучший выбор для: трекинга общего назначения, особенно с движущихся камер. Добавляй ReID только в тех случаях, когда похожие друг на друга объекты вызывают путаницу идентификаторов (ID swaps).
Специфические аргументы BoT-SORT:
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Бэкенд для компенсации движения камеры. sparseOptFlow используется по умолчанию. none отключает CMC. |
with_reid | True, False | Включение сопоставления на основе внешнего вида. По умолчанию выключено. |
model | auto или путь к модели ReID | Модель ReID. auto использует нативные функции YOLO, если они доступны; в противном случае передай путь к файлу .torchscript / .onnx / .engine. |
proximity_thresh | 0.0-1.0 | Минимальный IoU перед тем, как признаки внешнего вида будут приняты во внимание. |
appearance_thresh | 0.0-1.0 | Минимальное косинусное сходство, необходимое для совпадения ReID. Увеличь значение, чтобы уменьшить путаницу ID. |
Советы по настройке:
- Статическая камера: установи
gmc_method: none, чтобы сэкономить несколько мс/кадр. - Интенсивное движение камеры: оставь
sparseOptFlow;eccточнее, но работает медленнее. - Похожие группы людей: включи
with_reid: Trueи увеличьappearance_thresh(например,0.85+).
Link to this sectionByteTrack#
ByteTrack (Zhang et al., ECCV 2022) — это облегченная базовая модель. Она использует линейный фильтр Калмана + IoU с двухэтапным сопоставлением:
- Этап 1: сопоставление детекций с высокой уверенностью с активными треками.
- Этап 2: повторная попытка сопоставления оставшихся треков с детекциями с низкой уверенностью для восстановления после кратковременного частичного перекрытия.
Модель не имеет модели внешнего вида и компенсации движения камеры.
Лучший выбор для: статических или почти статических камер, где основная нагрузка приходится на детектор, и тебе требуется минимальная нагрузка от трекера.
Специфические аргументы ByteTrack: Нет, кроме общих аргументов трекера.
Советы по настройке:
- Зашумленный детектор: уменьши
track_low_thresh, чтобы у второго этапа было больше кандидатов. - Детектор с высоким recall: увеличь
track_high_thresh, чтобы уменьшить фрагментацию ID. - Частое мерцание ID: увеличь
track_buffer, чтобы кратковременно потерянные треки сохранялись.
Link to this sectionOC-SORT#
OC-SORT (Cao et al., CVPR 2023) — это ориентированное на наблюдение расширение SORT. Оно сохраняет облегченную конструкцию SORT (без признаков внешнего вида) и добавляет три коррекции:
- Повторное обновление, ориентированное на наблюдение (ORU): воспроизводит виртуальную траекторию между последним наблюдением и текущей детекцией, повторно запуская обновление Калмана для исправления дрейфа скорости.
- Импульс, ориентированный на наблюдение (OCM): штрафует детекции, движущиеся в неправильном направлении, с помощью члена согласованности скорости.
- Восстановление, ориентированное на наблюдение (OCR): повторно проверяет несопоставленные детекции по отношению к недавно потерянным трекам, используя их последнее наблюдение, а не предсказанное состояние.
Лучший выбор для: нелинейного движения без затрат на модель ReID.
Специфические аргументы OC-SORT:
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
delta_t | >=1 | Временное окно (кадры) для вычисления направления скорости в OCM. Большие значения обеспечивают более плавный результат. |
inertia | 0.0-1.0 | Вес стоимости согласованности скорости. Более высокие значения штрафуют резкие изменения направления. |
use_byte | True, False | Включи второй проход сопоставления в стиле ByteTrack по детекциям с низкой уверенностью. |
Советы по настройке:
- Нелинейное движение: увеличь
inertia(например,0.3-0.4). - Редкие детекции: включи
use_byte: True. - Длительные перекрытия: увеличь
track_buffer, чтобы у OCR было больше потерянных треков для повторной привязки.
Link to this sectionDeep OC-SORT#
Deep OC-SORT дополняет OC-SORT информацией о внешнем виде и компенсацией движения камеры:
- Адаптивное объединение внешнего вида: эмбеддинги детекций объединяются в матрицу стоимости с весом, модулируемым уверенностью детекции и перекрытием.
- Динамический EMA внешнего вида: эмбеддинги треков обновляются с помощью EMA, коэффициент сглаживания которого адаптируется к уверенности детекции.
- Компенсация движения камеры: состояния Калмана искажаются от кадра к кадру через разреженный оптический поток, ORB или ECC.
Лучший выбор для: сцен в толпе или с движущейся камерой, где часты случаи смены ID между визуально разными, но пространственно близкими объектами.
Специфические аргументы Deep OC-SORT:
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
with_reid | True, False | Включение сопоставления на основе внешнего вида. По умолчанию выключено. |
model | auto, файл экспортированной модели ReID | Модель ReID. auto повторно использует нативные функции YOLO; в противном случае передай экспортированный файл (.torchscript, .onnx, .engine, …). |
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 преобладает среди ошибок.
Link to this sectionFastTracker#
FastTracker — это вариант ByteTrack с поддержкой перекрытий без модели внешнего вида:
- Детекция перекрытия: помечает треки как перекрытые, когда степень покрытия другими активными треками превышает
occ_cover_thresh. - Откат Калмана при перекрытии: откатывает состояние Калмана к кадру до начала перекрытия, используя историю кольцевого буфера.
- Демпфирование движения и расширение поиска: скорость демпфируется, а предсказанный bbox увеличивается во время перекрытия.
- Подавление Init-IoU: предотвращает появление новых треков поверх активных.
Лучший выбор для: конвейеров обнаружения в реальном времени с частым наложением целей (толпы, очереди, спорт).
Специфические аргументы FastTracker:
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
reset_velocity_offset_occ | >=0 | Количество кадров истории для восстановления скорости Калмана при начале перекрытия. |
reset_pos_offset_occ | >=0 | Количество кадров истории для восстановления позиции Калмана при начале перекрытия. |
enlarge_bbox_occ | >=1.0 | Масштабирование высоты, применяемое к предсказанному bbox во время перекрытия (ширина масштабируется через соотношение сторон XYAH). |
dampen_motion_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.
Link to this sectionTrackTrack#
TrackTrack (Shim et al., CVPR 2025) анализирует ситуацию с точки зрения каждого трека с использованием итеративной ассоциации по нескольким признакам:
- Ассоциация на основе перспективы трека (TPA): объединяет HMIoU, косинусное расстояние ReID, расстояние проекции уверенности и расстояние угла поворота углов. Назначение решается итеративно с использованием порога ослабления.
- Инициализация с учетом трека (TAI): подавляет создание дубликатов до того, как будет создан новый ID.
Лучшее решение для: переполненных сцен с частыми перекрытиями, где дублирующиеся ID являются проблемой.
Аргументы, специфичные для TrackTrack:
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
iou_weight | 0.0-1.0 | Вес расстояния HMIoU в матрице затрат по нескольким признакам. |
reid_weight | 0.0-1.0 | Вес косинусного расстояния ReID. Если ReID отключен, возвращается к HMIoU. |
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 | Модель ReID; auto использует встроенные функции YOLO, в противном случае используется экспортированный файл ReID. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Метод глобальной компенсации движения. |
Советы по настройке:
- Переполненные пешеходами сцены: уменьши
tai_thr(например,0.45), чтобы подавить больше дублирующихся появлений; увеличьtrack_bufferдля более длительных перекрытий. - Быстрое движение камеры: оставь
gmc_method: sparseOptFlowвключенным. - Маленькие/быстрые объекты: немного увеличь
angle_weightи уменьшиmin_track_len. - Включай ReID только при необходимости: это увеличивает затраты на инференс; для коротких перекрытий обычно достаточно стандартной стоимости по нескольким признакам.
Link to this sectionПримеры на Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Link to this sectionЦикл сохранения треков#
Вот скрипт на Python, использующий OpenCV (cv2) и YOLO26 для запуска отслеживания объектов на кадрах видео. Этот скрипт предполагает, что необходимые пакеты (opencv-python и ultralytics) уже установлены. Аргумент persist=True сообщает трекеру, что текущее изображение или кадр является следующим в последовательности, и что нужно ожидать треки из предыдущего изображения на текущем.
import cv2
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()Пожалуйста, обрати внимание на изменение с model(frame) на model.track(frame), что включает отслеживание объектов вместо простого обнаружения. Этот измененный скрипт запустит трекер на каждом кадре видео, визуализирует результаты и отобразит их в окне. Выход из цикла возможен нажатием клавиши 'q'.
Link to this sectionПостроение графиков треков с течением времени#
Визуализация треков объектов на последовательных кадрах может дать ценную информацию о моделях движения и поведении обнаруженных объектов внутри видео. С Ultralytics YOLO26 построение этих треков — это плавный и эффективный процесс.
В следующем примере мы демонстрируем, как использовать возможности отслеживания YOLO26 для построения движения обнаруженных объектов по нескольким кадрам видео. Этот скрипт включает открытие файла видео, чтение его кадр за кадром и использование модели YOLO для идентификации и отслеживания различных объектов. Сохраняя центральные точки обнаруженных ограничивающих рамок (BBox) и соединяя их, мы можем рисовать линии, представляющие пути, по которым следовали отслеживаемые объекты.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(lambda: [])
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
result = model.track(frame, persist=True)[0]
# Get the boxes and track IDs
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualize the result on the frame
frame = result.plot()
# Plot the tracks
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # x, y center point
if len(track) > 30: # retain 30 tracks for 30 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()Link to this sectionМногопоточное отслеживание#
Многопоточное отслеживание предоставляет возможность запускать отслеживание объектов на нескольких видеопотоках одновременно. Это особенно полезно при обработке нескольких видеовходов, таких как потоки с нескольких камер наблюдения, где параллельная обработка может значительно повысить эффективность и производительность.
В предоставленном скрипте на Python мы используем модуль threading языка Python для одновременного запуска нескольких экземпляров трекера. Каждый поток отвечает за запуск трекера на одном файле видео, и все потоки работают одновременно в фоновом режиме.
Чтобы гарантировать, что каждый поток получает правильные параметры (файл видео, используемая модель и индекс файла), мы определяем функцию run_tracker_in_thread, которая принимает эти параметры и содержит основной цикл отслеживания. Эта функция считывает видео кадр за кадром, запускает трекер и отображает результаты.
В этом примере используются две разные модели: yolo26n.pt и yolo26n-seg.pt, каждая из которых отслеживает объекты в разном видеофайле. Видеофайлы указаны в SOURCES.
Параметр daemon=True в threading.Thread означает, что эти потоки будут закрыты, как только основная программа завершится. Затем мы запускаем потоки с помощью start() и используем join(), чтобы основной поток ждал, пока оба потока трекера не завершат работу.
Наконец, после того как все потоки завершили свою задачу, окна с результатами закрываются с помощью cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO26 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()Этот пример можно легко расширить для обработки большего количества видеофайлов и моделей путем создания большего числа потоков и применения той же методологии.
Link to this sectionДобавляй новые трекеры#
Ты разбираешься в многообъектном отслеживании и успешно реализовал или адаптировал алгоритм отслеживания с помощью Ultralytics YOLO? Приглашаем тебя внести вклад в наш раздел Trackers в ultralytics/cfg/trackers! Твои реальные приложения и решения могут быть бесценны для пользователей, работающих над задачами отслеживания.
Внося вклад в этот раздел, ты помогаешь расширить спектр решений по отслеживанию, доступных в рамках Ultralytics YOLO, добавляя еще один уровень функциональности и полезности для сообщества.
Чтобы начать свой вклад, ознакомься с нашим руководством по внесению вкладов для получения подробных инструкций по отправке Pull Request (PR) 🛠️. Мы с нетерпением ждем того, что ты предложишь!
Давай вместе улучшим возможности отслеживания экосистемы Ultralytics YOLO 🙏!
Link to this sectionFAQ#
Link to this sectionЧто такое многообъектное отслеживание и как Ultralytics YOLO его поддерживает?#
Многообъектное отслеживание в видеоаналитике включает как идентификацию объектов, так и поддержку уникального ID для каждого обнаруженного объекта на протяжении кадров видео. Ultralytics YOLO поддерживает это, предоставляя отслеживание в реальном времени вместе с ID объектов, способствуя таким задачам, как охрана и спортивная аналитика. Система использует трекеры, такие как BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker и TrackTrack, которые можно настроить с помощью файлов YAML.
Link to this sectionКак настроить пользовательский трекер для Ultralytics YOLO?#
Ты можешь настроить пользовательский трекер, скопировав существующий файл конфигурации трекера (например, custom_tracker.yaml) из директории конфигураций трекеров Ultralytics и изменив параметры по мере необходимости, за исключением tracker_type. Используй этот файл в своей модели отслеживания следующим образом:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Link to this sectionКак я могу запустить отслеживание объектов на нескольких видеопотоках одновременно?#
Для запуска отслеживания объектов на нескольких видеопотоках одновременно ты можешь использовать модуль threading языка Python. Каждый поток будет обрабатывать отдельный видеопоток. Вот пример того, как ты можешь это настроить:
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO26 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()Link to this sectionКаковы реальные применения многообъектного отслеживания с помощью Ultralytics YOLO?#
Многообъектное отслеживание с помощью Ultralytics YOLO имеет множество применений, включая:
- Транспорт: отслеживание транспортных средств для управления дорожным движением и автономного вождения.
- Розничная торговля: отслеживание людей для внутримагазинной аналитики и безопасности.
- Аквакультура: отслеживание рыб для мониторинга водной среды.
- Спортивная аналитика: отслеживание игроков и оборудования для анализа производительности.
- Системы безопасности: мониторинг подозрительной активности и создание сигналов тревоги.
Эти приложения выигрывают от способности Ultralytics YOLO обрабатывать видео с высокой частотой кадров в реальном времени с исключительной точностью.
Link to this sectionКак я могу визуализировать треки объектов по нескольким кадрам видео с помощью Ultralytics YOLO?#
Чтобы визуализировать треки объектов по нескольким кадрам видео, ты можешь использовать функции отслеживания модели YOLO вместе с OpenCV для отрисовки путей обнаруженных объектов. Вот пример скрипта, который демонстрирует это:
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.track(frame, persist=True)
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
annotated_frame = results[0].plot()
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y)))
if len(track) > 30:
track.pop(0)
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
cv2.imshow("YOLO26 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()Этот скрипт построит линии отслеживания, показывающие пути движения отслеживаемых объектов с течением времени, предоставляя ценную информацию о поведении и закономерностях объектов.