TRACE · v0.2

La mayoría de los rastreadores se quedan en el “dónde”. Este sigue adelante.

El seguimiento en el mundo real nunca es continuo. Un vehículo pasa por detrás de un edificio, una persona sale del alcance de la cámara. Casi todos los sistemas tratan eso como el final de la traza. TRACE no: mantiene una traza como una probabilidad de que algo siga ahí y no como un sí o un no, así que la traza se desvanece a lo largo del hueco en vez de terminar en él, y se puede retomar al otro lado.

Nada en el núcleo sabe qué está siguiendo. Cámaras, barcos, palés, animales y jugadores son el mismo problema con otro perfil. Las cifras de MOT17 y MOT20 de abajo son la precisión de seguimiento de múltiples objetos (MOTA), el único número que usa el campo para decir lo bien que lo hizo un rastreador.

LenguajeC++23
MOT17 MOTA53.0%
MOT20 MOTA62.5%
Cajas puntuadas1.47M
Último envíohace poco
Qué significa el nombre
TSeguimiento — dónde está cada cosa, y con cuánta certeza lo sabemos
RReidentificación — la misma cosa, después de haberla perdido
AAsociación — qué avistamiento pertenece a qué traza
CConvergencia — quién está a punto de encontrarse con quién
EEventos — comportamiento que merece la atención de alguien
En lenguaje llano

Qué es esto, en un minuto

El problema

Los sensores se dejan cosas. Una cámara no capta a todo el que pasa por delante, un barco puede apagar su transpondedor, un pasillo puede no tener cámara. Casi todos los rastreadores leen “no visto” como “no está”, así que cuando la cosa reaparece se registra como algo nuevo. Dónde ha estado, con quién se ha cruzado, si esto es normal en ella — ya no se puede responder a nada de eso.

La solución

TRACE guarda junto a cada traza un número de lo probable que es que la cosa siga ahí. Un avistamiento perdido baja ese número y ensancha la zona en la que podría estar; no borra nada. La traza sigue por inercia sobre la predicción, con su incertidumbre creciendo honestamente, y cuando algo vuelve a aparecer el motor decide si es la misma. Las dos demostraciones de aquí te dejan forzar eso hasta que se equivoca en la decisión.

Para quién es

Cualquiera que siga cosas a través de más de un sensor, con huecos entre ellos: una instalación cuyas cámaras no cubren todos los pasillos, o la vigilancia marítima donde un buque puede apagar su transpondedor a mitad de travesía. El núcleo no sabe qué está siguiendo — cámaras, barcos, palés, animales y jugadores son el mismo problema con otro perfil. Recibe detecciones; producirlas es trabajo de otro.

Un hueco en la cobertura no es lo mismo que una ausencia. El resto de esta página es la ingeniería: el motor mismo funcionando en tu navegador sobre dos escenarios, las cifras de los benchmarks, lo que cuesta por traza y una lista llana de lo que no hace.
El problema

Una traza que se borra en el primer fotograma perdido nunca fue una traza

Los sensores se dejan cosas. Una cámara tiene una probabilidad de detección, no una garantía; un barco puede apagar su transpondedor; un pasillo puede no tener cámara alguna. En cuanto cae la cobertura, un rastreador que iguala “no visto” con “no está” pierde la identidad, y cuando la entidad reaparece recibe una nueva. Toda pregunta posterior — por dónde ha pasado, con quién se ha encontrado, si esto es normal en él — queda ahora sin respuesta.

TRACE separa dos cosas que la mayoría de los rastreadores confunde. Cada traza lleva r, la probabilidad de que exista siquiera, mantenida aparte de dónde está. Un barrido perdido baja r y ensancha la estimación de posición; no borra nada. La traza sigue por inercia, y su incertidumbre crece honestamente mientras lo hace.

Eso es lo que te están enseñando las dos demostraciones de abajo. El círculo discontinuo es el motor diciendo está en algún punto de aquí dentro y cada segundo estoy menos seguro — que es algo útil que te digan, y lo que una traza borrada no te puede decir.

Existencia

Bernoulli, no booleano

Un rastreador de mezcla multi-Bernoulli de Poisson (PMBM) sobre un filtro de 320 partículas. La existencia es una probabilidad que decae con las detecciones perdidas y se recupera con evidencia, así que una oclusión cuesta confianza y no identidad.

Posibilidad

Una segunda opinión sobre la evidencia

Junto a la probabilidad corre una existencia posibilística que sigue la calidad de la evidencia en lugar de su cantidad. Cuando las dos divergen, muchas detecciones débiles se han blanqueado en falsa certeza.

El motor en sí

Un parque de cámaras, con pasillos que nadie vigila

Un laberinto es un sustituto barato de un parque de cámaras real, y te da todas las propiedades que hacen difícil el seguimiento multicámara: las paredes fuerzan rutas no lineales, cada panel de color es una cámara, así que cruzar un límite es un traspaso de verdad, y los paneles rayados están desactivados — pasillos ciegos donde el motor tiene que mantener la identidad sin nada en absoluto y recogerla de nuevo al otro lado.

trace::Engine — WebAssembly

cargando…
Verdad — sujeto Verdad — otros Traza, a la vista Traza, por inercia a ciegas Cámara apagada

Puntuado contra la verdad

Detección
—
De lo que dieron las cámaras
—
Error medio
—
Cambios de identidad
—
Trazas fantasma
—
Mediana por barrido
—

Este barrido

Detección hasta ahora
—
Error hasta ahora
—

Eventos lanzados —

Próximo encuentro previsto —

De lo que dieron las cámaras es el denominador honesto: ningún rastreador puede informar de una entidad que ningún sensor detectó, así que una tasa de detección en bruto mezcla los fallos del rastreador con los del parque. Por encima del 100% significa que el motor mantuvo entidades a lo largo de barridos en los que nada las vio. Apaga las cámaras y míralo subir.

trace::Engine de libtrace_core.a, la misma biblioteca que enlazan las herramientas nativas — —. La ejecución entera se calcula de una vez y se reproduce, así que la animación no es la velocidad del motor; el tiempo mediano de barrido que hay al lado sí lo es.
Cómo funciona

Cinco etapas, y un informe

T · A

Seguimiento y asociación

Un rastreador PMBM con existencia Bernoulli sobre un filtro de Ornstein–Uhlenbeck mixto de 320 partículas — la velocidad sigue un proceso OU cuyo régimen (a pie, en vehículo, parado) es a su vez una cadena de Markov, que es la parte “mixta”. Muestreo de Gibbs para la asignación uno a uno a lo largo de 14 pasadas, y después una fusión de duplicados. La asociación se ejecuta por sensor, porque la exclusividad es un hecho del sensor y no del mundo — dos cámaras solapadas que informan ambas de una persona son corroboración, no dos personas. Imponerla globalmente costaba 2,08 trazas fantasma por barrido; por sensor son 0,08.

R

Reidentificación por rutina

Una traza latente se readquiere a través de su patrón de vida — una mezcla gaussiana por entidad sobre hora, x e y. Los descriptores de apariencia están soportados y deliberadamente desactivados en los benchmarks públicos, porque allí un descriptor oráculo perfecto no mueve la puntuación en absoluto: el 88% de la penalización son detecciones perdidas, que la apariencia no puede tocar.

C

Tres predictores de convergencia, apilados

La intercepción geométrica es exacta para dos entidades que caminan una hacia la otra e inútil si alguna maniobra. La extrapolación de la tasa de acercamiento resuelve una ruta curva. La predicción cruzada por patrón de vida es la única que puede dispararse mientras ambas partes siguen paradas. Fallan en circunstancias distintas, así que las tres se ejecutan y gana la más segura.

E

Ocho comportamientos, intercambiables en caliente

BRUSH_PASS, SDR_PATTERN, DEAD_DROP, PARALLEL_ROUTE, MODE_TRANSITION, LOITER, COVER_STOP, CHOKEPOINT. La puntuación de amenaza fusiona ocho dimensiones de evidencia mediante un Beta–Monte-Carlo, y el informe lleva el desglose en vez del número único.

El motor en sí

Un barco apaga su transpondedor

Cobertura por sistema de identificación automática (AIS) por satélite sobre una cuenca oceánica. Cinco buques en tránsito; uno de ellos apaga su transpondedor a mitad de travesía y vuelve a aparecer más tarde. Nada lo reporta mientras tanto — sin sensor, sin detección, sin evidencia de ningún tipo.

Mira lo que hace el motor con eso. En el primer barrido perdido la estimación de posición salta de unos cientos de metros a unos doce kilómetros y la traza sigue solo por predicción. Unos barridos después se retira a una reserva de trazas latentes en vez de borrarse, y cuando el buque reaparece el motor tiene que decidir si esto es algo nuevo o algo que ya conoce.

Alarga el apagón y esa decisión le sale mal. Cinco barridos de silencio y la identidad sobrevive; pasados unos diez no lo hace, y el buque vuelve como una traza nueva. Ese es el resultado honesto y vale más que una demostración ajustada para ganar siempre — la razón está debajo de los controles.

dark-vessel — WebAssembly

cargando…
Sospechoso, informando Sospechoso, a oscuras Otro tráfico La traza del propio sospechoso Otras trazas

El sospechoso, ahora mismo

Estado del motor para él
—

En toda la travesía

Tras reaparecer
—
Máxima anchura por inercia
—
Hueco hasta recuperarlo
—
Detección hasta ahora
—

Por qué falla. La reidentificación aquí funciona por patrón de vida — una mezcla por entidad sobre hora y posición, que pregunta si este avistamiento nuevo encaja con algo cuya rutina ya conoce el motor. Un buque en un único tránsito recto no tiene rutina. Se le ha visto ir en una dirección, una vez. Así que pasados unos pocos barridos lo único que queda es la predicción de movimiento, y a doce nudos con barridos horarios esa incertidumbre desborda cualquier cosa útil en menos de un día.

El mismo mecanismo es decisivo allí donde sí es posible aprender una rutina, que es lo que muestra el laberinto de arriba. Una limitación con una causa declarada vale más que una capacidad sin ella, y esta está en la propia lista del repositorio.

El mismo escenario dark-vessel que trace_sim ejecuta de forma nativa, con el mismo perfil, sensor y cuenca.
Pruebas

Reproducido contra detecciones reales, no solo contra su propio simulador

Las secuencias de MOTChallenge — detecciones reales de detectores reales sobre vídeo real — son las únicas cifras de aquí que no produjo el propio simulador de TRACE.

BenchmarkCajasMOTARecuperación del techo del detector
MOT17 train, 21 secuencias336,89153.0%108.2%
MOT20 train, 4 secuencias, 62–226 personas/fotograma1,134,61462.5%114.7%
Solo cifras de la partición train. Estas se reproducen y se puntúan localmente. No se ha enviado nada al servidor de evaluación de MOTChallenge, que es lo que exigiría una cifra comparable a la del ranking público. El techo es lo que puntuaría un rastreador perfecto limitándose a repetir cada detección que se le entregó; superarlo es todo el trabajo, y se consigue siguiendo por inercia a través de los fotogramas que el detector perdió.
Coste

Efectivamente lineal en el tamaño de la multitud

Trazasms/barrido (mediana)µs por traza
101.7135
12026.6152
27072.1159
400127.5159

Un núcleo de procesador, compilación Release, extensiones vectoriales avanzadas (AVX-512). El coste crece como unos n1.17 y el seguimiento por sí solo se mantiene plano en 135–159 µs por traza desde diez trazas hasta cuatrocientas — léelo como “la constante importa y el exponente no”.

Era n1.82 hasta que el detector de convergencia dejó de reconstruir la previsión de patrón de vida de cada traza una vez por pareja. Eso ganó un factor de veinte en la constante y no un exponente mejor — la puerta de índice espacial añadida con ello tenía un radio más ancho que la escena, así que devolvía todas las parejas y no hacía nada. Acotar cada pareja por sus propias dos velocidades llevó ese detector del 56% del motor al 44% y el exponente a casi lineal.

Con 400 trazas simultáneas eso son unos 8 barridos por segundo en un núcleo de procesador: bien para un parque de cámaras a 1 Hz, no para 25 fps sin repartir entre varios trabajadores. La página lo dice porque lo dice el benchmark.

Limitaciones honestas

Lo que no hace

Sin detector, y sin modelo de re-ID

TRACE consume detecciones. Producirlas es trabajo de otro.

La estimación de velocidad tiene un suelo

Necesita velocidad × constancia de rumbo muy por encima del ruido de posición. Por debajo de una razón de unos 5 no es una estimación, y seguir por inercia solo es tan bueno como ella. Un objetivo genuinamente sinuoso visto por un sensor grueso no tiene velocidad medible — una restricción de modelado más que un defecto, pero que hay que contrastar con un perfil antes de afirmar nada sobre la inercia.

La disponibilidad de los sensores se infiere, no se sabe

Un hueco de cobertura se adivina a partir de si algo llegó a informar siquiera. Un despliegue real sabe qué cámaras están caídas y ahora mismo no tiene forma de decirlo.

Sin registro de auditoría, control de acceso ni política de retención

Varias de las cosas a las que se puede apuntar esto son capacidades de vigilancia masiva. Cualquiera que lo despliegue contra personas necesita ese andamiaje construido a su alrededor, y deliberadamente no se proporciona por defecto.

La vía CUDA es andamiaje

src/cuda/kernels.cu existe y nada en el motor lo llama. Los kernels nunca se han ejecutado. Trátalo como una rama sin terminar y no como un backend — el repositorio dice lo mismo.

Código disponible

La Licencia Pública General Affero de GNU, con una licencia comercial al lado

AGPL-3.0+, y los mismos términos que todo lo demás aquí: léelo, ejecútalo, compruébalo. Si la AGPL no encaja con lo que quieres construir, hay una licencia comercial por tramos.