MOTA 75% на датасете MOT17 выглядит шикарно на бумаге. Берете этот проверенный конфиг, раскатываете в реальном супермаркете с потолочными RTSP-камерами на 15 FPS, и ваши ID switches улетают с допустимых двухсот до четырех тысяч за час. Трекинг сломан. Аналитика трафика мертва.
«Но ведь tracking-by-detection давно решенная задача, берем YOLO, прикручиваем ByteTrack и в прод!» — скажет типичный разработчик, перечитавший туториалов. Нет. Не решенная. Трекинг объектов в видеопотоке: ByteTrack, BoT-SORT и почему ID скачут — это не тема для легковесного скрипта на коленке. Это суровая инженерия для ритейла и систем безопасности, где люди постоянно перекрывают друг друга.
Скептик возразит: зачем усложнять пайплайн, если старый добрый SORT с фильтром Калмана и венгерским алгоритмом по пересечению площадей отлично справляется? Потому что SORT работает, только пока объекты идут строго по прямой, а фреймрейт стабильно держится на уровне тридцати кадров в секунду.
Посмотрите на реальный магазин. Человек идет вдоль стеллажа и резко останавливается взять товар. Его скорость падает до нуля. Фильтр Калмана, ожидающий линейного движения, проецирует будущий бокс на полметра вперед. Когда покупатель снова начинает движение, его реальная детекция и предсказание фильтра просто не пересекаются в пространстве. Пересечение равно нулю. Венгерский алгоритм разводит руками. Трек разорван.
Добавьте сюда низкую частоту кадров. Службы безопасности не гоняют по сети несжатое видео при шестидесяти кадрах. Это всегда жесткая компрессия и 10-15 FPS. За десятую долю секунды между кадрами быстрый объект смещается так, что пересечение прямоугольников исчезает.
«Тогда берем DeepSORT! Там же эмбеддинги, они всё склеят!» — злорадно парирует оппонент.
Берем. И получаем падение пропускной способности системы втрое. DeepSORT прогоняет кроп каждого найденного бокса через тяжелую Re-ID нейросеть для извлечения визуальных признаков. Десять человек в кадре — десять дополнительных прогонов условного OSNet или ResNet поверх работы детектора. Вы скажете, что батчинг спасет ситуацию. Батчинг действительно повышает пропускную способность, но он неизбежно растит latency. Для реалтайм-системы безопасности, где счет идет на миллисекунды, это смерти подобно. На edge-устройствах вы просто задыхаетесь от нехватки ресурсов, а стоимость обработки каждого кадра улетает в космос.
Здесь на сцену выходит ByteTrack. Это потрясающая в своей простоте алгоритмическая идея: не выкидывать детекции с низким порогом уверенности, которые обычно отсекаются алгоритмом NMS. Система вытаскивает их со дна и пытается сматчить с уже существующими активными треками.
def match_bytetrack(tracks, detections):
# Уверенные детекции матчатся первыми
high_det = [d for d in detections if d.score > 0.6]
matches_a, un_tracks, _ = match_iou(tracks, high_det, iou_thresh=0.2)
# Спасаем потерянные треки детекциями с низким скором
low_det = [d for d in detections if 0.1 < d.score <= 0.6]
matches_b, _, _ = match_iou(un_tracks, low_det, iou_thresh=0.5)
return matches_a + matches_bЭто работает исключительно быстро. Почему? Потому что это снова чистая геометрия и координаты. Никаких медленных эмбеддингов.
Но почему тогда айдишники скачут как ненормальные? Откуда берутся эти фантомные покупатели в аналитике? Окклюзии и банальное дрожание рамок от детектора. Если человек скрылся за массивной колонной на три секунды, фильтр состояний теряет актуальное предсказание. Для ByteTrack без модуля Re-ID этот человек после выхода из-за препятствия — абсолютно чистый лист. Система выдает новый ID.
Когда мы в Morana Labs катили аналитику сложных траекторий для крупного торгового центра, мы поначалу поверили агрессивным порогам ByteTrack. В плотной толпе у эскалатора система начала плодить фрагментированные треки с такой скоростью, что счетчик уникальных посетителей выкручивался на тысячи. Пришлось выкинуть розовые очки и переписывать логику ассоциации.
Трекинг объектов в видеопотоке: BoT-SORT и цена за метрики
«Значит, всё-таки возвращаемся к тяжелым моделям экстракции признаков?» — вздыхает скептик. Да, но теперь с умом.
BoT-SORT объединяет лучшие практики индустрии: компенсацию движения камеры, прокачанный алгоритм Калмана и опциональный Re-ID модуль. Если камера на столбе дрожит от ветра, глобальная компенсация движения спасает IoU-матчинг, корректируя смещение всего фона. Если злоумышленник зашел за припаркованное авто, эмбеддинги позволяют склеить разорванный трек на выходе.
Но это всегда честный трейд-офф. Включаете Re-ID модель — неминуемо режете FPS. Пытаетесь затюнить пороги косинусного расстояния под конкретную сцену — тратите долгие дни на подбор гиперпараметров под меняющееся освещение и углы обзора. На плотной толпе, где люди перекрыты на восемьдесят процентов, поплывет даже мощный BoT-SORT. Алгоритм просто не соберет достаточно полезных фичей для сравнения: эмбеддинг красной куртки ничем не поможет, если в кадре торчит только плечо или голова. Сличать не с чем. Срабатывает порог отсечения, и мы снова получаем разрыв.
«Но на демо-роликах на GitHub всё трекается монолитно!» — это последний аргумент защиты.
Демо-ролики рендерят для инвесторов и сбора звездочек в репозиториях. Вы должны верить только метрикам. Показатель MOTA продемонстрирует вам общую температуру по палате. Эта метрика суммирует ложные срабатывания, пропуски и переключения идентификаторов, а затем делит на общее число объектов. Проблема в том, что MOTA в основном отражает качество самого детектора. У вас может быть роскошный показатель под восемьдесят процентов, при этом система сгенерирует десятки коротких, оборванных треков на одного человека, идущего по коридору.
Для ритейл-аналитики, где критически важен полный путь клиента от двери до кассовой зоны, всегда смотрите на IDF1. Эта метрика вычисляет гармоническое среднее между точностью и полнотой идентификации. Она замеряет, какую долю времени трекер правильно и непрерывно присваивал один и тот же идентификатор истинному объекту. Если IDF1 падает ниже шестидесяти процентов — вы не трекаете толпу, вы просто генерируете случайные числа в базе данных.
Стройте пайплайн от задачи. Измеряйте жестко. На глаз всё всегда выглядит приемлемо, ровно до тех пор, пока бизнес не попытается принять финансовое решение на основе этих галлюцинирующих цифр.