TRACE · v0.2

Большинство трекеров останавливается на “где”. Этот идёт дальше.

Слежение в реальном мире никогда не бывает непрерывным. Машина заходит за здание, человек выходит из поля зрения камеры. Большинство систем считают это концом трека. TRACE — нет: он держит трек как вероятность того, что объект всё ещё там, а не как «да» или «нет», поэтому трек гаснет сквозь разрыв, а не обрывается на нём, и его можно подхватить с другой стороны.

Ядро не знает, за чем оно следит. Камеры, корабли, паллеты, животные и игроки — одна и та же задача с разным профилем. Цифры MOT17 и MOT20 ниже — это точность слежения за множеством объектов (MOTA), то единственное число, которым в этой области измеряют, насколько хорошо отработал трекер.

ЯзыкC++23
MOT17 MOTA53.0%
MOT20 MOTA62.5%
Оценено рамок1.47M
Последняя отправканедавно
Что значит название
TTracking — отслеживание: где находится каждый объект и насколько мы в этом уверены
RRe-identification — повторное опознание: тот же объект после того, как он был потерян
AAssociation — сопоставление: какое наблюдение относится к какому треку
CConvergence — сближение: кто с кем вот-вот встретится
EEvents — события: поведение, которое стоит чьего-то внимания
Простыми словами

Что это такое за минуту

Проблема

Датчики пропускают. Камера ловит не каждого, кто проходит мимо, корабль может выключить транспондер, в коридоре камеры может не быть вовсе. Большинство трекеров читают “не увиден” как “его нет”, поэтому когда объект появляется снова, его записывают как новый. Где он был, с кем встречался, нормально ли это для него — ни на один из этих вопросов уже не ответить.

Решение

TRACE держит при каждом треке число: насколько вероятно, что объект всё ещё там. Пропущенное наблюдение снижает это число и расширяет область, где объект может быть; оно ничего не удаляет. Трек идёт по инерции на предсказании, его неопределённость честно растёт, а когда что-то появляется снова, движок решает, тот ли это самый. Обе демонстрации здесь позволяют давить на это, пока решение не станет неверным.

Кому это нужно

Всем, кто ведёт объекты через несколько датчиков с разрывами между ними: площадка, чьи камеры покрывают не каждый коридор, или морской мониторинг, где судно может выключить транспондер посреди рейса. Ядро не знает, за чем оно следит — камеры, корабли, паллеты, животные и игроки — одна и та же задача с разным профилем. На вход идут детекции; получать их — чужая работа.

Разрыв в покрытии — это не отсутствие. Дальше на этой странице — инженерия: сам движок, работающий в вашем браузере на двух сценариях, цифры бенчмарков, во что обходится один трек, и простой список того, чего он не делает.
Проблема

Трек, который удаляют на первом же пропущенном кадре, никогда не был треком

Датчики пропускают. У камеры есть вероятность обнаружения, а не гарантия; судно может выключить транспондер; в коридоре камеры может не быть вовсе. Как только покрытие проседает, трекер, приравнивающий “не видно” к “нет на месте”, теряет идентичность, а когда сущность появляется снова, она получает новую. Любой следующий вопрос — где это было, с кем встречалось, нормально ли это для него — остаётся без ответа.

TRACE разделяет две вещи, которые большинство трекеров смешивает. Каждый трек несёт r, вероятность того, что он вообще существует, — отдельно от того, где он находится. Пропущенный скан снижает r и расширяет оценку положения; он ничего не удаляет. Трек идёт по счислению, и его неопределённость при этом честно растёт.

Именно это и показывают обе демонстрации ниже. Пунктирный круг — это движок, который говорит: оно где-то здесь, и с каждой секундой я уверен всё меньше — полезно, когда такое говорят, и как раз этого удалённый трек сказать не может.

Существование

Bernoulli, а не булево значение

Трекер на пуассоновской мульти-бернуллиевой смеси (PMBM) поверх фильтра на 320 частиц. Существование — это вероятность, которая убывает на пропусках и восстанавливается на свидетельствах, поэтому перекрытие стоит уверенности, а не личности.

Возможность

Второе мнение о свидетельствах

Рядом с вероятностью работает поссибилистическая оценка существования, которая следит за качеством свидетельств, а не за их количеством. Когда эти две оценки расходятся, значит, множество слабых детекций отмыли в ложную уверенность.

Сам движок

Парк камер с коридорами, которые никто не смотрит

Лабиринт — дешёвая замена настоящему парку камер, и он даёт все свойства, из-за которых сопровождение несколькими камерами трудно: стены заставляют идти нелинейными маршрутами, каждая цветная панель — это одна камера, так что пересечение границы оказывается настоящей передачей, а заштрихованные панели выключены — слепые коридоры, где движку приходится удерживать идентичность вообще ни на чём и снова подхватывать её на другом конце.

trace::Engine — WebAssembly

загрузка…
Истина — объект наблюдения Истина — остальные Трек, объект виден Трек, счисление вслепую Камера выключена

Сверено с истиной

Обнаружение
—
От того, что дали камеры
—
Средняя ошибка
—
Смены идентичности
—
Ложные треки
—
Медианный скан
—

Текущий скан

Обнаружение с начала
—
Ошибка с начала
—

Поднято событий —

Следующая прогнозируемая встреча —

От того, что дали камеры — это честный знаменатель: ни один трекер не может сообщить о сущности, которую не обнаружил ни один датчик, поэтому сырая доля обнаружения смешивает промахи трекера с промахами самого парка камер. Выше 100% означает, что движок удержал сущности в сканах, где их никто не видел. Выключите камеры и смотрите, как она растёт.

trace::Engine из libtrace_core.a, та же библиотека, с которой линкуются нативные инструменты — —. Весь прогон считается сразу и потом проигрывается, так что анимация — не скорость движка; скорость — это медианное время скана рядом с ней.
Как это работает

Пять этапов и один отчёт

T · A

Отслеживание и сопоставление

Трекер PMBM с существованием по Bernoulli поверх смешанного фильтра Ornstein–Uhlenbeck из 320 частиц — скорость следует процессу OU, режим которого (пешком, в машине, на месте) сам является цепью Маркова, и это как раз “смешанная” часть. Сэмплирование Gibbs для назначения один к одному за 14 проходов, затем слияние дубликатов. Сопоставление идёт по каждому датчику, потому что исключительность — это свойство датчика, а не мира — две перекрывающиеся камеры, сообщающие об одном человеке, дают подтверждение, а не двух человек. Глобальное требование исключительности обошлось в 2,08 ложного трека за скан; по датчикам — 0,08.

R

Повторное опознание по распорядку

Спящий трек восстанавливается по распорядку жизни — смеси гауссиан по часу, x и y для каждой сущности. Дескрипторы внешнего вида поддерживаются и намеренно выключены на публичных бенчмарках, потому что идеальный оракульный дескриптор там не меняет оценку вовсе: 88% штрафа — это пропущенные детекции, до которых внешнему виду не дотянуться.

C

Три предсказателя сближения в стопке

Геометрический перехват точен для двух сущностей, идущих навстречу друг другу, и бесполезен, если хоть одна маневрирует. Экстраполяция скорости сближения справляется с кривым маршрутом. Перекрёстное предсказание по распорядку жизни — единственное, которое может сработать, пока обе стороны ещё стоят на месте. Они отказывают в разных обстоятельствах, поэтому работают все три, а побеждает самый уверенный.

E

Восемь моделей поведения, заменяемых на ходу

BRUSH_PASS, SDR_PATTERN, DEAD_DROP, PARALLEL_ROUTE, MODE_TRANSITION, LOITER, COVER_STOP, CHOKEPOINT. Оценка угрозы сводит восемь измерений свидетельств через Beta–Monte-Carlo, и отчёт несёт разбивку, а не одно число.

Сам движок

Судно выключает транспондер

Покрытие спутниковой автоматической идентификационной системы (AIS) над океанским бассейном. Пять судов в пути; одно из них выключает транспондер посреди рейса и включается позже. Между этим о нём не сообщает ничто — ни датчик, ни детекция, ни свидетельство любого рода.

Посмотрите, что движок с этим делает. На первом же пропущенном скане оценка положения прыгает с нескольких сотен метров примерно до двенадцати километров, и трек идёт на одном прогнозе. Через несколько сканов он уходит в пул спящих, а не удаляется, и когда судно снова появляется, движку приходится решать, новое это или то, что он уже знает.

Растяните молчание подольше — и решение окажется неверным. Пять сканов молчания — идентичность выживает; после примерно десяти — уже нет, и судно возвращается новым треком. Это честный результат, и он стоит больше, чем демонстрация, подогнанная под вечную победу — причина написана под элементами управления.

dark-vessel — WebAssembly

загрузка…
Подозреваемый, передаёт Подозреваемый, замолчал Прочие суда Собственный трек подозреваемого Прочие треки

Подозреваемый прямо сейчас

Состояние в движке
—

За весь рейс

После возвращения
—
Максимум при счислении
—
Перерыв до возвращения
—
Обнаружение с начала
—

Почему это ломается. Повторное опознание здесь работает по распорядку жизни — смеси по часу и положению для каждой сущности, которая спрашивает, ложится ли новое наблюдение на то, чей распорядок движок уже знает. У судна в одном прямом переходе распорядка нет. Его видели идущим в одну сторону, один раз. Поэтому после нескольких сканов остаётся только прогноз движения, а при двенадцати узлах и ежечасных сканах эта неопределённость за сутки перерастает всё полезное.

Тот же механизм оказывается решающим там, где распорядок и есть то, что можно выучить, — именно это показывает лабиринт выше. Ограничение с названной причиной стоит больше, чем возможность без причины, и это ограничение есть в собственном списке репозитория.

Тот же сценарий dark-vessel нативно запускает trace_sim с тем же профилем, датчиком и бассейном.
Признаки

Переигран на настоящих детекциях, а не только на собственном симуляторе

Последовательности MOTChallenge — настоящие детекции настоящих детекторов на настоящем видео — это единственные цифры здесь, которые не произвёл собственный симулятор TRACE.

БенчмаркРамкиMOTAДоля от потолка детектора
MOT17 train, 21 последовательность336,89153.0%108.2%
MOT20 train, 4 последовательности, 62–226 человек на кадр1,134,61462.5%114.7%
Только цифры по обучающей выборке. Они переиграны и оценены локально. Ничего не отправлялось на сервер оценки MOTChallenge, а именно это нужно для цифры, сравнимой с публичной таблицей лидеров. Потолок — это то, что набрал бы идеальный трекер, просто повторяя каждую поданную ему детекцию; превзойти его — и есть вся работа, и делается это счислением через кадры, которые детектор пропустил.
Стоимость

Практически линейно по размеру толпы

ТрекиМедианные мс/сканµs на трек
101.7135
12026.6152
27072.1159
400127.5159

Одно процессорное ядро, сборка Release, продвинутые векторные расширения (AVX-512). Стоимость растёт примерно как n1.17 — само отслеживание при этом держится ровно на 135–159 µs на трек от десяти треков до четырёхсот, и читать это надо как “важна константа, а показатель степени — нет”.

Было n1.82 до тех пор, пока детектор сближения не перестал перестраивать прогноз распорядка жизни каждого трека по одному разу на пару. Это дало двадцатикратный выигрыш в константе и не дало лучшего показателя степени — у добавленного вместе с ним отсечения по пространственному индексу радиус был шире сцены, поэтому оно возвращало все пары и не делало ничего. Ограничение каждой пары её собственными двумя скоростями увело этот детектор с 56% движка до 44%, а показатель степени — почти к линейному.

На 400 одновременных треках это примерно 8 сканов в секунду на одном процессорном ядре: нормально для парка камер с 1 Гц, но не для 25 кадров/с без разбиения по рабочим процессам. На странице так написано, потому что так говорит бенчмарк.

Честные ограничения

Чего он не делает

Ни детектора, ни модели re-ID

TRACE потребляет детекции. Производить их — чужая работа.

У оценки скорости есть нижний порог

Нужно, чтобы скорость × удержание курса были заметно выше шума положения. Ниже отношения примерно 5 это уже не оценка, а счисление не лучше неё. У по-настоящему извилистой цели, которую видит грубый датчик, измеримой скорости нет — это ограничение модели, а не дефект, но его стоит сверить с профилем, прежде чем что-то заявлять про счисление.

Доступность датчика выводится, а не известна

Провал в покрытии угадывается по тому, сообщил ли хоть кто-нибудь хоть что-то. Настоящее развёртывание знает, какие камеры не работают, и сейчас у него нет способа об этом сообщить.

Ни журнала аудита, ни контроля доступа, ни политики хранения

Часть того, на что это можно направить, — возможности массовой слежки. Тому, кто разворачивает это против людей, нужно построить вокруг него такую обвязку, и по умолчанию она намеренно не поставляется.

Путь CUDA — это заготовка

src/cuda/kernels.cu существует, и ничто в движке его не вызывает. Эти ядра ни разу не запускались. Считайте это незаконченной веткой, а не бэкендом — репозиторий говорит то же самое.

Исходный код доступен

GNU Affero General Public License, и рядом с ней коммерческая лицензия

AGPL-3.0+, и условия те же, что и у всего остального здесь: читайте, запускайте, проверяйте. Если AGPL не подходит под то, что вы хотите построить, есть многоуровневая коммерческая лицензия.