Многообъектное отслеживание с помощью Ultralytics YOLO#
Отслеживание объектов в области видеоаналитики — это критически важная задача, которая не только определяет местоположение и класс объектов в кадре, но и сохраняет уникальный ID для каждого обнаруженного объекта по мере развития видео. Сферы применения безграничны — от наблюдения и безопасности до анализа спортивных событий в реальном времени.
Начиная с Ultralytics YOLO v8.4.63, доступны новые алгоритмы трекинга: OC-SORT, Deep OC-SORT, FastTracker и TrackTrack. Эти трекеры улучшают производительность многообъектного трекинга и согласованность ID.
Почему стоит выбрать Ultralytics YOLO для отслеживания объектов?#
Результат работы трекеров Ultralytics совместим со стандартным обнаружением объектов, но дополнен идентификаторами объектов. Это упрощает отслеживание объектов в видеопотоках и выполнение последующей аналитики. Вот почему тебе стоит использовать Ultralytics YOLO для задач трекинга объектов:
- Эффективность: обрабатывай видеопотоки в реальном времени без ущерба для точности.
- Гибкость: Поддерживает несколько алгоритмов и конфигураций отслеживания.
- Простота использования: Простой Python API и CLI опции для быстрой интеграции и развертывания.
- Кастомизируемость: Легко использовать с дообученными моделями YOLO, что позволяет интегрировать их в узкоспециализированные приложения.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Применение в реальных условиях#
| Транспорт | Ритейл | Аквакультура |
|---|---|---|
| Отслеживание транспортных средств | Отслеживание людей | Отслеживание рыб |
Быстрый старт#
Запусти трекинг на видео с трекером 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 или 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) | Да (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 |
Какой трекер мне использовать?#
Используй эту схему, чтобы выбрать точку отсчета:
- Нужен самый быстрый и простой бейзлайн? → 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
# 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, трекер не будет обновлять этот объект, что приведет к отсутствию активных треков.
| Параметр | Допустимые значения или диапазоны | Описание |
|---|---|---|
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, … для использования пользовательского энкодера. |
Аргументы для конкретных трекеров#
Каждый алгоритм предоставляет дополнительные настройки в дополнение к общим параметрам. Описания и советы по настройке см. в разделах для каждого трекера ниже или обратись непосредственно к конфигурационным файлам:
Включение повторной идентификации (ReID)#
ReID по умолчанию отключен для минимизации накладных расходов. Включи его, установив with_reid: True в файле конфигурации трекера.
Опции модели ReID:
model: auto— использует встроенные признаки детектора YOLO, добавляя минимальные накладные расходы. Идеально, когда тебе нужен некоторый ReID без значительного снижения производительности. Возвращается кyolo26n-cls.pt, если детектор не предоставляет совместимые признаки.- Экспортированная модель ReID — укажи
model:на экспортированный файл (.torchscript,.onnx,.engine,.openvinoи т. д.) для получения более различимых эмбеддингов ценой дополнительного прямого прохода на каждый кроп. Энкодер загружается черезAutoBackend, поэтому любой формат экспорта, поддерживаемый Ultralytics, работает без изменения кода.
Готовые к использованию энкодеры 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 (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 в конфигурации трекера.
Подробности о трекерах#
Разверни разделы ниже, чтобы узнать о проектировании, конкретных параметрах и советах по настройке для каждого трекера.
BoT-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+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) — это легковесный базовый алгоритм. Он использует линейный фильтр Калмана + IoU с двуэтапной ассоциацией:
- Этап 1: сопоставление детекций с высокой уверенностью с активными треками.
- Этап 2: повторная попытка сопоставления оставшихся треков с детекциями с низкой уверенностью для восстановления после кратковременного частичного перекрытия.
Модель не имеет модели внешнего вида и компенсации движения камеры.
Лучший выбор для: статических или почти статических камер, где основная нагрузка приходится на детектор, и тебе требуется минимальная нагрузка от трекера.
Аргументы, специфичные для ByteTrack: отсутствуют, помимо общих аргументов трекера.
Советы по настройке:
- Шумный детектор: уменьши
track_low_thresh, чтобы у второго этапа было больше кандидатов. - Детектор с высокой полнотой (high-recall): увеличь
track_high_thresh, чтобы уменьшить фрагментацию ID. - Частое мерцание ID: увеличь
track_buffer, чтобы недолго пропущенные треки сохранялись.
OC-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 было больше потерянных треков для повторного связывания.
Deep 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). |
Советы по настройке:
- Смена идентификаторов в толпе: увеличь
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_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 только при необходимости: это увеличивает затраты на инференс; для коротких перекрытий обычно достаточно стандартной стоимости по нескольким признакам.
Примеры на 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 для идентификации и отслеживания различных объектов. Сохраняя центральные точки обнаруженных ограничивающих рамок (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(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 мы используем модуль Python threading для одновременного запуска нескольких экземпляров трекера. Каждый поток отвечает за запуск трекера для одного видеофайла, и все потоки выполняются одновременно в фоновом режиме.
Чтобы каждый поток получал правильные параметры (видеофайл, используемую модель и индекс файла), мы определяем функцию 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()Этот пример можно легко расширить для обработки большего количества видеофайлов и моделей путем создания большего числа потоков и применения той же методологии.
Добавляй новые трекеры#
У тебя есть опыт в многообъектном трекинге, и ты успешно реализовал или адаптировал алгоритм трекинга с помощью Ultralytics YOLO? Мы приглашаем тебя внести свой вклад в наш раздел трекеров в ultralytics/cfg/trackers! Твои реальные приложения и решения могут оказаться бесценными для пользователей, работающих над задачами трекинга.
Внося вклад в этот раздел, ты помогаешь расширить спектр решений по отслеживанию, доступных в рамках Ultralytics YOLO, добавляя еще один уровень функциональности и полезности для сообщества.
Чтобы начать внесение вклада, ознакомься с нашим Руководством по участию для получения подробных инструкций по отправке Pull Request (PR) 🛠️. Мы с нетерпением ждем твоих предложений!
Давай вместе улучшим возможности отслеживания экосистемы Ultralytics YOLO 🙏!
FAQ#
Что такое многообъектное отслеживание и как Ultralytics YOLO его поддерживает?#
Многообъектный трекинг в видеоаналитике включает как обнаружение объектов, так и сохранение уникального ID для каждого обнаруженного объекта на разных кадрах видео. Ultralytics YOLO поддерживает это, обеспечивая трекинг в реальном времени наряду с идентификаторами объектов, что облегчает такие задачи, как охранное видеонаблюдение и спортивная аналитика. Система использует такие трекеры, как BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker и TrackTrack, которые можно настраивать с помощью файлов YAML.
Могу ли я сохранить трекер внутри файла модели YOLO?#
Нет. Стандартные файлы Ultralytics .pt хранят веса модели YOLO, в то время как трекер создается во время инференса с помощью model.track(). ID треков зависят от состояния трекера на последовательных кадрах, поэтому одно отдельное изображение может возвращать результаты обнаружения, такие как боксы, классы и уверенность, но само по себе оно не может создавать полезные постоянные ID трекинга.
Для развертывания упакуй детектор и трекер вместе в своем приложении и вызывай model.track() покадрово с помощью persist=True, когда кадры поступают из одного видеопотока. Используй отдельные экземпляры модели или трекера для несвязанных потоков, чтобы состояние не переносилось между видео.
Как настроить пользовательский трекер для 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")Как я могу запустить отслеживание объектов на нескольких видеопотоках одновременно?#
Для одновременного запуска трекинга объектов на нескольких видеопотоках ты можешь использовать модуль Python threading. Каждый поток будет обрабатывать отдельный видеопоток. Вот пример того, как это настроить:
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()Каковы реальные применения многообъектного отслеживания с помощью Ultralytics YOLO?#
Многообъектное отслеживание с помощью Ultralytics YOLO имеет множество применений, включая:
- Транспорт: отслеживание транспортных средств для управления дорожным движением и автономного вождения.
- Розничная торговля: отслеживание людей для внутримагазинной аналитики и безопасности.
- Аквакультура: отслеживание рыб для мониторинга водной среды.
- Спортивная аналитика: отслеживание игроков и оборудования для анализа производительности.
- Системы безопасности: мониторинг подозрительной активности и создание охранных сигнализаций.
Эти приложения выигрывают от способности 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:
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()Этот скрипт построит линии отслеживания, показывающие пути движения отслеживаемых объектов с течением времени, предоставляя ценную информацию о поведении и закономерностях объектов.