Большинство трекеров останавливается на “где”. Этот идёт дальше.
Слежение в реальном мире никогда не бывает непрерывным. Машина заходит за здание, человек выходит из поля зрения камеры. Большинство систем считают это концом трека. TRACE — нет: он держит трек как вероятность того, что объект всё ещё там, а не как «да» или «нет», поэтому трек гаснет сквозь разрыв, а не обрывается на нём, и его можно подхватить с другой стороны.
Ядро не знает, за чем оно следит. Камеры, корабли, паллеты, животные и игроки — одна и та же задача с разным профилем. Цифры MOT17 и MOT20 ниже — это точность слежения за множеством объектов (MOTA), то единственное число, которым в этой области измеряют, насколько хорошо отработал трекер.
Что это такое за минуту
Датчики пропускают. Камера ловит не каждого, кто проходит мимо, корабль может выключить транспондер, в коридоре камеры может не быть вовсе. Большинство трекеров читают “не увиден” как “его нет”, поэтому когда объект появляется снова, его записывают как новый. Где он был, с кем встречался, нормально ли это для него — ни на один из этих вопросов уже не ответить.
TRACE держит при каждом треке число: насколько вероятно, что объект всё ещё там. Пропущенное наблюдение снижает это число и расширяет область, где объект может быть; оно ничего не удаляет. Трек идёт по инерции на предсказании, его неопределённость честно растёт, а когда что-то появляется снова, движок решает, тот ли это самый. Обе демонстрации здесь позволяют давить на это, пока решение не станет неверным.
Всем, кто ведёт объекты через несколько датчиков с разрывами между ними: площадка, чьи камеры покрывают не каждый коридор, или морской мониторинг, где судно может выключить транспондер посреди рейса. Ядро не знает, за чем оно следит — камеры, корабли, паллеты, животные и игроки — одна и та же задача с разным профилем. На вход идут детекции; получать их — чужая работа.
Трек, который удаляют на первом же пропущенном кадре, никогда не был треком
Датчики пропускают. У камеры есть вероятность обнаружения, а не гарантия; судно может выключить транспондер; в коридоре камеры может не быть вовсе. Как только покрытие проседает, трекер, приравнивающий “не видно” к “нет на месте”, теряет идентичность, а когда сущность появляется снова, она получает новую. Любой следующий вопрос — где это было, с кем встречалось, нормально ли это для него — остаётся без ответа.
TRACE разделяет две вещи, которые большинство трекеров смешивает. Каждый трек несёт r, вероятность того, что он вообще существует, — отдельно от того, где он находится. Пропущенный скан снижает r и расширяет оценку положения; он ничего не удаляет. Трек идёт по счислению, и его неопределённость при этом честно растёт.
Именно это и показывают обе демонстрации ниже. Пунктирный круг — это движок, который говорит: оно где-то здесь, и с каждой секундой я уверен всё меньше — полезно, когда такое говорят, и как раз этого удалённый трек сказать не может.
Bernoulli, а не булево значение
Трекер на пуассоновской мульти-бернуллиевой смеси (PMBM) поверх фильтра на 320 частиц. Существование — это вероятность, которая убывает на пропусках и восстанавливается на свидетельствах, поэтому перекрытие стоит уверенности, а не личности.
Второе мнение о свидетельствах
Рядом с вероятностью работает поссибилистическая оценка существования, которая следит за качеством свидетельств, а не за их количеством. Когда эти две оценки расходятся, значит, множество слабых детекций отмыли в ложную уверенность.
Парк камер с коридорами, которые никто не смотрит
Лабиринт — дешёвая замена настоящему парку камер, и он даёт все свойства, из-за которых сопровождение несколькими камерами трудно: стены заставляют идти нелинейными маршрутами, каждая цветная панель — это одна камера, так что пересечение границы оказывается настоящей передачей, а заштрихованные панели выключены — слепые коридоры, где движку приходится удерживать идентичность вообще ни на чём и снова подхватывать её на другом конце.
trace::Engine — WebAssembly
загрузка…Сверено с истиной
Текущий скан
Поднято событий —
Следующая прогнозируемая встреча —
От того, что дали камеры — это честный знаменатель: ни один трекер не может сообщить о сущности, которую не обнаружил ни один датчик, поэтому сырая доля обнаружения смешивает промахи трекера с промахами самого парка камер. Выше 100% означает, что движок удержал сущности в сканах, где их никто не видел. Выключите камеры и смотрите, как она растёт.
trace::Engine из libtrace_core.a, та же библиотека, с которой линкуются нативные инструменты — —. Весь прогон считается сразу и потом проигрывается, так что анимация — не скорость движка; скорость — это медианное время скана рядом с ней.
Пять этапов и один отчёт
Отслеживание и сопоставление
Трекер PMBM с существованием по Bernoulli поверх смешанного фильтра Ornstein–Uhlenbeck из 320 частиц — скорость следует процессу OU, режим которого (пешком, в машине, на месте) сам является цепью Маркова, и это как раз “смешанная” часть. Сэмплирование Gibbs для назначения один к одному за 14 проходов, затем слияние дубликатов. Сопоставление идёт по каждому датчику, потому что исключительность — это свойство датчика, а не мира — две перекрывающиеся камеры, сообщающие об одном человеке, дают подтверждение, а не двух человек. Глобальное требование исключительности обошлось в 2,08 ложного трека за скан; по датчикам — 0,08.
Повторное опознание по распорядку
Спящий трек восстанавливается по распорядку жизни — смеси гауссиан по часу, x и y для каждой сущности. Дескрипторы внешнего вида поддерживаются и намеренно выключены на публичных бенчмарках, потому что идеальный оракульный дескриптор там не меняет оценку вовсе: 88% штрафа — это пропущенные детекции, до которых внешнему виду не дотянуться.
Три предсказателя сближения в стопке
Геометрический перехват точен для двух сущностей, идущих навстречу друг другу, и бесполезен, если хоть одна маневрирует. Экстраполяция скорости сближения справляется с кривым маршрутом. Перекрёстное предсказание по распорядку жизни — единственное, которое может сработать, пока обе стороны ещё стоят на месте. Они отказывают в разных обстоятельствах, поэтому работают все три, а побеждает самый уверенный.
Восемь моделей поведения, заменяемых на ходу
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,891 | 53.0% | 108.2% |
| MOT20 train, 4 последовательности, 62–226 человек на кадр | 1,134,614 | 62.5% | 114.7% |
Практически линейно по размеру толпы
| Треки | Медианные мс/скан | µs на трек |
|---|---|---|
| 10 | 1.7 | 135 |
| 120 | 26.6 | 152 |
| 270 | 72.1 | 159 |
| 400 | 127.5 | 159 |
Одно процессорное ядро, сборка 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 не подходит под то, что вы хотите построить, есть многоуровневая коммерческая лицензия.