TRACE · v0.2

A maioria dos rastreadores para em “onde”. Este continua.

No mundo real, o rastreamento nunca é contínuo. Um veículo passa atrás de um prédio, uma pessoa sai do alcance da câmera. A maioria dos sistemas trata isso como o fim da trajetória. O TRACE não: ele mantém a trajetória como uma probabilidade de que algo ainda esteja ali, e não como um sim ou não, então a trajetória se desvanece ao longo do intervalo em vez de terminar nele, e pode ser retomada do outro lado.

Nada no núcleo sabe o que está rastreando. Câmeras, navios, paletes, animais e jogadores são o mesmo problema com um perfil diferente. Os números de MOT17 e MOT20 abaixo são a Acurácia de Rastreamento de Múltiplos Objetos (MOTA), o número único que a área usa para dizer o quão bem um rastreador se saiu.

LinguagemC++23
MOT17 MOTA53.0%
MOT20 MOTA62.5%
Caixas avaliadas1.47M
Último enviohá pouco
O que o nome quer dizer
TRastreamento — onde cada coisa está, e o quanto temos certeza
RReidentificação — a mesma coisa, depois de perdida
AAssociação — qual avistamento pertence a qual trajetória
CConvergência — quem está prestes a encontrar quem
EEventos — comportamento que merece a atenção de alguém
Em português claro

O que isto é, em um minuto

O problema

Sensores deixam passar coisas. Uma câmera não pega todo mundo que passa por ela, um navio pode desligar seu transponder, um corredor pode não ter câmera nenhuma. A maioria dos rastreadores lê “não visto” como “não está ali”, então, quando a coisa reaparece, ela é registrada como algo novo. Por onde andou, com quem se encontrou, isso é normal para ela — nenhuma dessas perguntas tem mais resposta.

A solução

O TRACE guarda, para cada trajetória, um número de quão provável é que a coisa ainda esteja ali. Um avistamento perdido baixa esse número e alarga a área em que ela pode estar; não apaga nada. A trajetória segue por inércia na predição, com a incerteza crescendo honestamente, e quando algo aparece de novo o motor decide se é a mesma. As duas demonstrações aqui deixam você forçar isso até ele errar a decisão.

Para quem é

Quem acompanha coisas por mais de um sensor, com intervalos entre eles: um local cujas câmeras não cobrem todos os corredores, ou monitoramento marítimo em que uma embarcação pode desligar o transponder no meio da viagem. O núcleo não sabe o que está rastreando — câmeras, navios, paletes, animais e jogadores são o mesmo problema com um perfil diferente. Ele recebe detecções; produzi-las é trabalho de outra pessoa.

Um vão na cobertura não é a mesma coisa que uma ausência. O resto desta página é a engenharia: o próprio motor rodando no seu navegador em dois cenários, os números de benchmark, quanto custa por trajetória, e uma lista simples do que ele não faz.
O problema

Uma trajetória apagada no primeiro quadro perdido nunca foi uma trajetória

Sensores deixam passar coisas. Uma câmera tem uma probabilidade de detecção, não uma garantia; um navio pode desligar seu transponder; um corredor pode não ter câmera nenhuma. No momento em que a cobertura cai, um rastreador que iguala “não visto” a “não está lá” perde a identidade, e quando a entidade reaparece ela ganha uma nova. Toda pergunta seguinte — por onde isto andou, com quem se encontrou, isto é normal para ele — fica agora sem resposta.

O TRACE separa duas coisas que a maioria dos rastreadores confunde. Toda trajetória carrega r, a probabilidade de que ela sequer exista, mantida separada de onde ela está. Uma varredura perdida reduz r e alarga a estimativa de posição; não apaga nada. A trajetória segue por inércia, e sua incerteza cresce honestamente enquanto isso.

É isso que as duas demonstrações abaixo estão mostrando. O círculo tracejado é o motor dizendo ele está em algum lugar aqui dentro e eu estou menos certo a cada segundo — o que é uma coisa útil de se ouvir, e é o que uma trajetória apagada não pode lhe dizer.

Existência

Bernoulli, não booleano

Um rastreador de Mistura Poisson Multi-Bernoulli (PMBM) sobre um filtro de 320 partículas. A existência é uma probabilidade que decai a cada falha de detecção e se recupera com evidência, então uma oclusão custa confiança, não identidade.

Possibilidade

Uma segunda opinião sobre a evidência

Ao lado da probabilidade roda uma existência possibilística que acompanha a qualidade da evidência, e não sua quantidade. Quando as duas divergem, muitas detecções fracas foram lavadas em falsa certeza.

O próprio motor

Um parque de câmeras, com corredores que ninguém observa

Um labirinto é um substituto barato para um parque de câmeras real, e dá a você todas as propriedades que tornam difícil o rastreamento multicâmera: paredes forçam rotas não lineares, cada painel colorido é uma câmera, então cruzar uma fronteira é uma transferência de verdade, e os painéis hachurados estão desligados — corredores cegos onde o motor tem de manter a identidade sem nada e retomá-la do outro lado.

trace::Engine — WebAssembly

carregando…
Verdade — sujeito Verdade — outros Trajetória, sendo vista Trajetória, em inércia às cegas Câmera desligada

Avaliado contra a verdade

Detecção
—
Do que as câmeras deram
—
Erro médio
—
Trocas de identidade
—
Trajetórias fantasma
—
Varredura mediana
—

Esta varredura

Detecção até agora
—
Erro até agora
—

Eventos emitidos —

Próximo encontro previsto —

Do que as câmeras deram é o denominador honesto: nenhum rastreador consegue reportar uma entidade que nenhum sensor detectou, então uma taxa bruta de detecção mistura as falhas do rastreador com as do parque. Acima de 100% significa que o motor manteve entidades através de varreduras em que nada as viu. Desligue as câmeras e veja esse número subir.

trace::Engine vindo de libtrace_core.a, a mesma biblioteca à qual as ferramentas nativas se ligam — —. A execução inteira é computada de uma vez e reproduzida, então a animação não é a velocidade do motor; o tempo mediano de varredura ao lado dela é.
Como funciona

Cinco estágios, e um relatório

T · A

Rastreamento e associação

Um rastreador PMBM com existência Bernoulli sobre um filtro Ornstein–Uhlenbeck misto de 320 partículas — a velocidade segue um processo OU cujo regime (a pé, em um veículo, parado) é ele mesmo uma cadeia de Markov, e é isso que o “misto” quer dizer. Amostragem de Gibbs para atribuição um-para-um ao longo de 14 passagens, depois uma fusão de duplicatas. A associação roda por sensor, porque a exclusividade é um fato sobre um sensor e não sobre o mundo — duas câmeras sobrepostas reportando uma mesma pessoa são corroboração, não duas pessoas. Impô-la globalmente custou 2,08 trajetórias fantasma por varredura; por sensor são 0,08.

R

Reidentificação por rotina

Uma trajetória dormente é readquirida pelo seu padrão de vida — uma mistura gaussiana por entidade sobre hora, x e y. Descritores de aparência são suportados e estão deliberadamente desligados nos benchmarks públicos, porque ali um descritor oráculo perfeito não move a pontuação em nada: 88% da penalidade são detecções perdidas, nas quais a aparência não toca.

C

Três preditores de convergência, empilhados

A intercepção geométrica é exata para duas entidades caminhando uma na direção da outra e inútil se qualquer uma delas manobrar. A extrapolação da taxa de aproximação lida com uma rota curva. A previsão cruzada por padrão de vida é a única que pode disparar enquanto as duas partes ainda estão paradas. Elas falham em circunstâncias diferentes, então as três rodam e a mais confiante vence.

E

Oito comportamentos, trocáveis a quente

BRUSH_PASS, SDR_PATTERN, DEAD_DROP, PARALLEL_ROUTE, MODE_TRANSITION, LOITER, COVER_STOP, CHOKEPOINT. A pontuação de ameaça funde oito dimensões de evidência através de um Beta–Monte-Carlo, e o relatório traz a decomposição em vez do número único.

O próprio motor

Um navio desliga seu transponder

Cobertura do Sistema de Identificação Automática (AIS) por satélite sobre uma bacia oceânica. Cinco embarcações estão em trânsito; uma delas desliga o transponder no meio da viagem e volta mais tarde. Nada a reporta nesse meio-tempo — nenhum sensor, nenhuma detecção, nenhuma evidência de tipo algum.

Veja o que o motor faz com isso. Na primeira varredura perdida, a estimativa de posição salta de algumas centenas de metros para cerca de doze quilômetros e a trajetória segue por inércia, só com predição. Algumas varreduras depois ela é recolhida para um conjunto dormente em vez de apagada, e quando a embarcação reaparece o motor tem de decidir se isto é algo novo ou algo que ele já conhece.

Arraste o apagão para durar mais e ele erra essa decisão. Cinco varreduras de silêncio e a identidade sobrevive; passando de cerca de dez, ela não sobrevive, e a embarcação volta como uma trajetória nova. Esse é o resultado honesto e vale mais do que uma demonstração ajustada para sempre vencer — o motivo está abaixo dos controles.

dark-vessel — WebAssembly

carregando…
Suspeito, reportando Suspeito, em silêncio Outro tráfego A trajetória do próprio suspeito Outras trajetórias

O suspeito, agora

Estado do motor para ele
—

Ao longo de toda a viagem

Depois de reaparecer
—
Maior amplitude em inércia
—
Intervalo até voltar
—
Detecção até agora
—

Por que quebra. A reidentificação aqui funciona por padrão de vida — uma mistura por entidade sobre hora e posição, perguntando se este novo avistamento encaixa em algo cuja rotina o motor já conhece. Uma embarcação em um único trânsito em linha reta não tem rotina. Foi vista indo para um lado, uma vez. Então, passadas algumas varreduras, só resta a predição de movimento, e a doze nós com varreduras de hora em hora essa incerteza supera qualquer coisa útil dentro de um dia.

O mesmo mecanismo é decisivo onde aprender uma rotina é possível, que é o que o labirinto acima está mostrando. Uma limitação com causa declarada vale mais do que uma capacidade sem nenhuma, e esta está na própria lista do repositório.

O mesmo cenário dark-vessel que o trace_sim roda nativamente, com o mesmo perfil, sensor e bacia.
Evidência

Reproduzido contra detecções reais, não só contra seu próprio simulador

As sequências do MOTChallenge — detecções reais de detectores reais sobre vídeo real — são os únicos números aqui que o próprio simulador do TRACE não produziu.

BenchmarkCaixasMOTARecuperação do teto do detector
MOT17 treino, 21 sequências336,89153.0%108.2%
MOT20 treino, 4 sequências, 62–226 pessoas/quadro1,134,61462.5%114.7%
Apenas números da divisão de treino. Estes são reproduzidos e pontuados localmente. Nada foi submetido ao servidor de avaliação do MOTChallenge, que é o que um número comparável ao ranking público exigiria. O teto é o que um rastreador perfeito pontuaria apenas repetindo cada detecção que recebeu; superá-lo é o trabalho inteiro, e isso é feito seguindo por inércia pelos quadros que o detector perdeu.
Custo

Efetivamente linear no tamanho da multidão

TrajetóriasMediana ms/varreduraµs por trajetória
101.7135
12026.6152
27072.1159
400127.5159

Um núcleo de processador, build Release, Extensões Vetoriais Avançadas (AVX-512). O custo cresce como cerca de n1.17 e o rastreamento sozinho fica plano em 135–159 µs por trajetória, de dez trajetórias a quatrocentas — leia isso como “a constante importa e o expoente não”.

Era n1.82 até o detector de convergência parar de reconstruir a previsão de padrão de vida de cada trajetória uma vez por par. Isso comprou um fator de vinte na constante e não um expoente melhor — o filtro de índice espacial adicionado junto tinha um raio mais largo que a cena, então devolvia todos os pares e não fazia nada. Limitar cada par pelas suas próprias duas velocidades levou esse detector de 56% do motor para 44% e o expoente para quase linear.

Com 400 trajetórias simultâneas isso dá cerca de 8 varreduras por segundo em um núcleo de processador: suficiente para um parque de câmeras de 1 Hz, não para 25 fps sem particionar entre workers. A página diz isso porque o benchmark diz isso.

Limitações honestas

O que ele não faz

Sem detector, e sem modelo de re-ID

O TRACE consome detecções. Produzi-las é trabalho de outra pessoa.

A estimativa de velocidade tem um piso

Ela precisa de velocidade × manutenção de rumo bem acima do ruído de posição. Abaixo de uma razão de cerca de 5 não é uma estimativa, e a inércia é só tão boa quanto ela. Um alvo genuinamente sinuoso visto por um sensor grosseiro não tem velocidade mensurável — uma restrição de modelagem, não um defeito, mas algo contra o qual conferir um perfil antes de afirmar qualquer coisa sobre inércia.

A disponibilidade do sensor é inferida, não conhecida

Uma lacuna de cobertura é adivinhada a partir do fato de algo ter reportado ou não. Uma implantação real sabe quais câmeras estão fora do ar e atualmente não tem como dizer isso.

Sem registro de auditoria, controle de acesso ou política de retenção

Várias das coisas para as quais isto pode ser apontado são capacidades de vigilância em massa. Quem o implantar contra pessoas precisa desse andaime construído em volta, e ele deliberadamente não vem como padrão.

O caminho CUDA é andaime

src/cuda/kernels.cu existe e nada no motor o chama. Os kernels nunca rodaram. Trate-o como um ramo inacabado, não como um backend — o repositório diz o mesmo.

Código disponível

A Licença Pública Geral Affero do GNU, com uma licença comercial ao lado

AGPL-3.0+, e os mesmos termos de todo o resto aqui: leia, rode, confira. Se a AGPL não servir para o que você quer construir, há uma licença comercial em faixas.