La plupart des systèmes de suivi s’arrêtent à “où”. Celui-ci continue.
Le suivi dans le monde réel n’est jamais continu. Un véhicule passe derrière un bâtiment, une personne sort du champ de la caméra. La plupart des systèmes traitent ça comme la fin de la piste. Pas TRACE : il tient une piste comme une probabilité que quelque chose soit encore là, plutôt que comme un oui ou un non, si bien que la piste s’estompe pendant le trou au lieu de s’y arrêter, et peut être reprise de l’autre côté.
Rien dans le cœur ne sait ce qu’il suit. Caméras, navires, palettes, animaux et joueurs sont le même problème avec un profil différent. Les chiffres MOT17 et MOT20 ci-dessous sont la précision de suivi multi-objets (MOTA), le chiffre unique que le domaine emploie pour dire si un système de suivi s’est bien débrouillé.
Ce que c’est, en une minute
Les capteurs ratent des choses. Une caméra n’attrape pas tous ceux qui passent devant elle, un navire peut couper son transpondeur, un couloir peut n’avoir aucune caméra du tout. La plupart des systèmes de suivi lisent “pas vu” comme “pas là”, donc quand la chose réapparaît, elle est consignée comme quelque chose de nouveau. Où est-elle passée, qui a-t-elle rencontré, est-ce normal pour elle — plus rien de tout cela ne peut recevoir de réponse.
TRACE garde pour chaque piste un nombre disant à quel point il est probable que la chose soit encore là. Une observation manquée abaisse ce nombre et élargit la zone où elle pourrait se trouver ; elle n’efface rien. La piste continue sur la prédiction, son incertitude grandissant honnêtement, et quand quelque chose réapparaît, le moteur décide si c’est le même. Les deux démonstrations ici vous laissent pousser jusqu’à ce qu’il se trompe de décision.
Quiconque suit des choses à travers plus d’un capteur, avec des trous entre eux : un site dont les caméras ne couvrent pas tous les couloirs, ou une surveillance maritime où un navire peut couper son transpondeur en pleine traversée. Le cœur ne sait pas ce qu’il suit — caméras, navires, palettes, animaux et joueurs sont le même problème avec un profil différent. Il prend des détections en entrée ; les produire est le travail de quelqu’un d’autre.
Une piste supprimée à la première image manquée n’a jamais été une piste
Les capteurs ratent des choses. Une caméra a une probabilité de détection, pas une garantie ; un navire peut couper son transpondeur ; un couloir peut n’avoir aucune caméra du tout. Dès que la couverture tombe, un système de suivi qui confond “pas vu” et “pas là” perd l’identité, et quand l’entité réapparaît elle en reçoit une nouvelle. Toute question en aval — où est-elle passée, qui a-t-elle rencontré, est-ce normal pour elle — est désormais sans réponse.
TRACE sépare deux choses que la plupart des systèmes de suivi confondent. Chaque piste porte r, la probabilité qu’elle existe tout court, tenue à l’écart de sa position. Un balayage manqué abaisse r et élargit l’estimation de position ; il ne supprime rien. La piste se poursuit par extrapolation, et son incertitude croît honnêtement pendant ce temps.
C’est ce que les deux démonstrations ci-dessous vous montrent. Le cercle en pointillés, c’est le moteur qui dit il est quelque part là-dedans et j’en suis moins sûr de seconde en seconde — ce qui est une chose utile à s’entendre dire, et ce qu’une piste supprimée ne peut pas vous dire.
Bernoulli, pas booléen
Un système de suivi à mélange de Poisson multi-Bernoulli (PMBM) au-dessus d’un filtre à 320 particules. L’existence est une probabilité qui décroît avec les détections manquées et se rétablit sur preuve, si bien qu’une occlusion coûte de la confiance plutôt que l’identité.
Un second avis sur les preuves
À côté de la probabilité tourne une existence possibiliste qui suit la qualité des preuves plutôt que leur quantité. Quand les deux divergent, c’est que beaucoup de détections faibles ont été blanchies en fausse certitude.
Un parc de caméras, avec des couloirs que personne ne regarde
Un labyrinthe est un substitut bon marché à un vrai parc de caméras, et il vous donne toutes les propriétés qui rendent le suivi multi-caméras difficile : les murs imposent des trajets non linéaires, chaque panneau coloré est une caméra, donc franchir une frontière est un vrai transfert, et les panneaux hachurés sont désactivés — des couloirs aveugles où le moteur doit tenir l’identité sur rien du tout et la reprendre de l’autre côté.
trace::Engine — WebAssembly
chargement…Évalué face à la vérité terrain
Ce balayage
Événements déclenchés —
Prochaine rencontre prévue —
De ce que les caméras ont donné est le dénominateur honnête : aucun système de suivi ne peut rapporter une entité qu’aucun capteur n’a détectée, donc un taux de détection brut mélange les échecs du système de suivi et ceux du parc. Au-dessus de 100 %, cela veut dire que le moteur a tenu des entités à travers des balayages où rien ne les voyait. Éteignez les caméras et regardez-le grimper.
trace::Engine issu de libtrace_core.a, la même bibliothèque que lient les outils natifs — —. L’exécution entière est calculée d’un coup puis rejouée, donc l’animation n’est pas la vitesse du moteur ; le temps de balayage médian à côté, si.
Cinq étapes, et un rapport
Trajectographie et association
Un système de suivi PMBM avec existence de Bernoulli au-dessus d’un filtre d’Ornstein–Uhlenbeck mixte à 320 particules — la vitesse suit un processus OU dont le régime (à pied, en véhicule, à l’arrêt) est lui-même une chaîne de Markov, et c’est ce que veut dire le “mixte”. Échantillonnage de Gibbs pour l’affectation un-à-un sur 14 passes, puis une fusion des doublons. L’association tourne par capteur, parce que l’exclusivité est un fait qui concerne un capteur et non le monde — deux caméras qui se recouvrent et rapportent toutes deux une seule personne, c’est une corroboration, pas deux personnes. L’imposer globalement coûtait 2,08 fausses pistes par balayage ; par capteur, c’est 0,08.
Réidentification par la routine
Une piste dormante est réacquise grâce à ses habitudes de vie — un mélange gaussien par entité sur l’heure, x et y. Les descripteurs d’apparence sont pris en charge et délibérément désactivés sur les benchmarks publics, parce qu’un descripteur oracle parfait n’y déplace pas du tout le score : 88 % de la pénalité, ce sont des détections manquées, auxquelles l’apparence ne peut rien.
Trois prédicteurs de convergence, empilés
L’interception géométrique est exacte pour deux entités qui marchent l’une vers l’autre et inutile si l’une manœuvre. L’extrapolation du taux de rapprochement gère un trajet courbe. La prédiction croisée par habitudes de vie est la seule qui puisse se déclencher pendant que les deux parties sont encore immobiles. Elles échouent dans des circonstances différentes, donc les trois tournent et la plus confiante l’emporte.
Huit comportements, interchangeables à chaud
BRUSH_PASS, SDR_PATTERN, DEAD_DROP,
PARALLEL_ROUTE, MODE_TRANSITION, LOITER,
COVER_STOP, CHOKEPOINT. Le score de menace fusionne huit dimensions de preuve par un Beta–Monte-Carlo, et le rapport porte le détail plutôt que le chiffre unique.
Un navire coupe son transpondeur
Couverture du système d’identification automatique (AIS) par satellite sur un bassin océanique. Cinq navires sont en transit ; l’un d’eux coupe son transpondeur en pleine traversée et revient plus tard. Rien ne le signale entre-temps — aucun capteur, aucune détection, aucune preuve d’aucune sorte.
Regardez ce que le moteur en fait. Au premier balayage manqué, l’estimation de position passe de quelques centaines de mètres à environ douze kilomètres et la piste se poursuit sur la seule prédiction. Quelques balayages plus tard, elle est mise au repos dans un réservoir de pistes dormantes plutôt que supprimée, et quand le navire refait surface, le moteur doit décider s’il s’agit de quelque chose de nouveau ou de quelque chose qu’il connaît déjà.
Allongez la période de silence et il se trompe sur cette décision. Cinq balayages de silence et l’identité survit ; au-delà d’une dizaine, non, et le navire revient comme une nouvelle piste. C’est le résultat honnête et il vaut plus qu’une démonstration réglée pour gagner à tous les coups — la raison est sous les commandes.
dark-vessel — WebAssembly
chargement…Le suspect, à l’instant
Sur toute la traversée
Pourquoi cela échoue. La réidentification fonctionne ici par habitudes de vie — un mélange par entité sur l’heure et la position, qui demande si cette nouvelle observation correspond à quelque chose dont le moteur connaît déjà la routine. Un navire sur un seul transit rectiligne n’a pas de routine. Il a été vu allant dans un sens, une fois. Donc au-delà de quelques balayages, il ne reste que la prédiction de mouvement, et à douze nœuds avec des balayages horaires, cette incertitude dépasse tout ce qui est utile en moins d’un jour.
Le même mécanisme est décisif là où une routine à apprendre est bel et bien présente, ce que montre le labyrinthe ci-dessus. Une limite dont la cause est énoncée vaut plus qu’une capacité qui n’en a aucune, et celle-ci figure dans la propre liste du dépôt.
dark-vessel que trace_sim exécute nativement, avec le même profil, le même capteur et le même bassin.
Rejoué face à de vraies détections, pas seulement face à son propre simulateur
Les séquences MOTChallenge — de vraies détections, produites par de vrais détecteurs sur de vraies vidéos — sont les seuls chiffres ici que le propre simulateur de TRACE n’a pas produits.
| Benchmark | Boîtes | MOTA | Récupération du plafond du détecteur |
|---|---|---|---|
| MOT17 train, 21 séquences | 336,891 | 53.0% | 108.2% |
| MOT20 train, 4 séquences, 62–226 personnes/image | 1,134,614 | 62.5% | 114.7% |
Pratiquement linéaire en taille de foule
| Pistes | Médiane ms/balayage | µs par piste |
|---|---|---|
| 10 | 1.7 | 135 |
| 120 | 26.6 | 152 |
| 270 | 72.1 | 159 |
| 400 | 127.5 | 159 |
Un cœur de processeur, build Release, Advanced Vector Extensions (AVX-512). Le coût croît en gros comme n1.17 et le suivi seul reste plat à 135–159 µs par piste, de dix pistes à quatre cents — à lire comme “la constante compte et l’exposant non”.
C’était n1.82 jusqu’à ce que le détecteur de convergence cesse de reconstruire la prévision d’habitudes de vie de chaque piste une fois par paire. Cela a rapporté un facteur vingt sur la constante et pas un meilleur exposant — le filtre d’index spatial ajouté au passage avait un rayon plus large que la scène, donc il renvoyait toutes les paires et ne faisait rien. Borner chaque paire par ses deux propres vitesses a fait passer ce détecteur de 56 % du moteur à 44 % et l’exposant à quasi linéaire.
À 400 pistes simultanées, cela fait environ 8 balayages par seconde sur un cœur de processeur : bien pour un parc de caméras à 1 Hz, pas pour 25 fps sans partitionner entre plusieurs workers. La page le dit parce que le benchmark le dit.
Ce qu’il ne fait pas
Pas de détecteur, et pas de modèle de réidentification
TRACE consomme des détections. Les produire est le travail de quelqu’un d’autre.
Une estimation de vitesse a un plancher
Il lui faut un produit vitesse × maintien de cap bien au-dessus du bruit de position. En dessous d’un rapport d’environ 5, ce n’est pas une estimation, et l’extrapolation ne vaut que ce que vaut cette estimation. Une cible vraiment sinueuse vue par un capteur grossier n’a pas de vitesse mesurable — une contrainte de modélisation plutôt qu’un défaut, mais une chose à vérifier sur un profil avant d’affirmer quoi que ce soit sur l’extrapolation.
La disponibilité des capteurs est déduite, pas connue
Un trou de couverture est deviné à partir du seul fait que quelque chose ait été rapporté ou non. Un déploiement réel sait quelles caméras sont en panne et n’a actuellement aucun moyen de le dire.
Pas de journalisation d’audit, de contrôle d’accès ni de politique de rétention
Plusieurs des choses vers lesquelles on peut braquer ceci sont des capacités de surveillance de masse. Quiconque le déploie contre des personnes doit construire cet échafaudage autour, et il n’est délibérément pas fourni par défaut.
Le chemin CUDA est un échafaudage
src/cuda/kernels.cu existe et rien dans le moteur ne l’appelle. Les noyaux n’ont jamais tourné. Traitez-le comme une branche inachevée plutôt que comme un backend — le dépôt dit la même chose.
La licence publique générale GNU Affero, avec une licence commerciale à côté
AGPL-3.0+, et les mêmes conditions que tout le reste ici : lisez-le, faites-le tourner, vérifiez-le. Si l’AGPL ne convient pas à ce que vous voulez construire, il existe une licence commerciale par paliers.