Versions plus récentes (renommées) :
Anciennes versions :
Mettez-nous en vedette sur GitHub – cela nous motive beaucoup !
Similari est un framework Rust avec des liaisons Python qui permet de créer des systèmes de suivi sophistiqués. Avec Similari, il est possible de développer des moteurs de suivi parallélisés très efficaces SORT, DeepSORT et d'autres moteurs sophistiqués à observateur unique (par exemple Cam) ou multi-observateurs.
L'objectif principal de Similari est de fournir les moyens de créer des moteurs sophistiqués de suivi d'objets multiples en mémoire.
Le cadre permet de créer différents types de moteurs de recherche de suivi et de similarité - le plus simple contenant des caractéristiques vectorielles et permettant de comparer de nouveaux vecteurs à ceux conservés dans la base de données. Des moteurs plus sophistiqués fonctionnent sur des pistes - une série d'observations pour la même caractéristique collectées au cours du cycle de vie. De tels systèmes sont souvent utilisés dans le traitement vidéo ou dans d'autres systèmes dans lesquels l'observateur reçoit des résultats d'observation flous ou changeants.
Similari est un framework permettant de créer des trackers personnalisés, mais il fournit certains algorithmes en tant que fonctionnalité pour l'utilisateur final :
Le filtre de Kalman Bounding Box , qui prédit les cadres de délimitation rectangulaires alignés sur l'axe de la scène, prend également en charge les cadres de délimitation orientés (pivotés).
Filtre de Kalman de points 2D , qui prédit le mouvement des points 2D.
Filtre de Kalman 2D Point Vector , qui prédit le vecteur de mouvement de points 2D indépendants (utilisé dans Keypoint Tracker).
Découpage du cadre de délimitation , qui permet de calculer la zone d'intersection des cadres de délimitation alignés sur l'axe et orientés (rotés).
Suppression non maximale (NMS) : filtre les cadres de délimitation rectangulaires co-axiaux à la scène et prend en charge les cadres de délimitation orientés.
Algorithme de suivi SORT (les cases alignées et orientées sur les axes sont prises en charge) - Les distances IoU et Mahalanobis sont prises en charge.
Algorithme de suivi Batch SORT (les cases alignées et orientées sur les axes sont prises en charge) - Les distances IoU et Mahalanobis sont prises en charge. Le suivi par lots permet de transmettre plusieurs scènes au suivi en un seul lot et de les récupérer. Si la plate-forme prend en charge le traitement par lots (comme Nvidia DeepStream ou Intel DL Streamer), le suivi des lots est plus avantageux à utiliser.
Suivi VisualSORT - un algorithme de type DeepSORT (les boîtes alignées et orientées sur les axes sont prises en charge) - Les distances IoU et Mahalanobis sont prises en charge pour le suivi de position, les distances euclidiennes et cosinusoïdales sont utilisées pour le suivi visuel sur les vecteurs caractéristiques.
Batch VisualSORT - saveur VisualSORT par lots ;
Bien que Similari permette de créer divers moteurs de suivi et de similarité, il existe des outils concurrents qui peuvent parfois mieux convenir. La section expliquera où cela est applicable et quelles alternatives existent.
Similari convient mieux aux tâches de suivi dans lesquelles les objets sont décrits par plusieurs observations pour une certaine classe de caractéristiques, et non par un seul vecteur de caractéristiques. De plus, leur comportement est dynamique : vous les supprimez de l'index ou les modifiez aussi souvent que vous en ajoutez de nouveaux. C'est un point très important - il est moins efficace que les outils qui fonctionnent avec des espaces objets croissants ou statiques.
Ajustement : suivez la personne à travers la pièce : le ReID de la personne, l'âge/le sexe et les caractéristiques du visage sont collectés plusieurs fois pendant le suivi et utilisés pour fusionner les pistes ou fournir des résultats agrégés à la fin de la piste ;
Ne convient pas : base de données sur le plagiat, lorsqu'un seul document est décrit par un nombre (ou un seul) vecteurs ReID constants, les documents sont ajoutés mais pas supprimés. La tâche consiste à trouver les X documents les plus similaires à un document vérifié.
Si votre tâche ressemble à Not fit , vous pouvez utiliser Similari, mais vous recherchez probablement des implémentations HNSW
ou NMS
:
HNSW Rust - Lien
HNSW C/Python - lien
NMSLib - lien
Les objets Similari prennent en charge les fonctionnalités suivantes :
Suivre le cycle de vie - l'objet est représenté par son cycle de vie (piste) - il apparaît, évolue et disparaît. Au cours de sa vie, l'objet évolue en fonction de ses propriétés comportementales (attributs et observations de caractéristiques).
Observations - Similari suppose qu'un objet est observé par une entité d'observation qui collecte ses caractéristiques (vecteurs uniformes) et ses attributs d'observation personnalisés (comme le GPS ou la position de la boîte d'écran) plusieurs fois. Ces caractéristiques sont présentées par des vecteurs de nombres flottants et d'attributs d'observation. Lorsque l'observation a eu lieu, la trace est mise à jour avec les caractéristiques rassemblées. Les observations futures sont utilisées pour rechercher des pistes similaires dans l'index et les fusionner.
Attributs de piste - Les attributs arbitraires décrivent des propriétés de piste supplémentaires en dehors des observations de caractéristiques. Le suivi des attributs est un élément crucial lorsque vous comparez des objets dans la nature, car il peut y avoir une disposition des attributs lorsque les objets sont incompatibles, comme animal_type
qui vous interdit de comparer dogs
et cats
entre eux. Une autre utilisation courante des attributs est une caractéristique spatiale ou temporelle d'un objet, par exemple des objets situés simultanément à des endroits éloignés ne peuvent pas être comparés. Les attributs dans Similari sont dynamiques et évoluent à chaque ajout d'observation de caractéristique et lorsque des objets sont fusionnés. Ils sont utilisés à la fois dans les calculs de distance et dans les estimations de compatibilité (ce qui réduit l'espace de calcul en sautant les objets incompatibles).
Si vous envisagez d'utiliser Similari pour effectuer une recherche dans un index volumineux, tenez compte des attributs d'objet pour diviser l'espace de recherche. Si les attributs des deux pistes ne sont pas compatibles, leurs calculs de distance sont ignorés.
Le Similari est rapide. Il est généralement plus rapide que les trackers construits avec Python et NumPy.
Pour exécuter des calculs de caractéristiques visuelles performants, le framework utilise ultraviolet - la bibliothèque pour les calculs SIMD rapides.
Les calculs parallèles sont implémentés avec le partage d'index et les calculs parallèles basés sur un pool de threads de travail dédié.
Les performances des opérations vectorielles dépendent beaucoup du niveau d'optimisation défini pour la build. Aux niveaux d'optimisation faibles ou par défaut, Rust peut ne pas utiliser la vectorisation f32, donc lors de l'exécution de tests de performance, veillez à configurer les niveaux d'optimisation appropriés.
Utilisez RUSTFLAGS="-C target-cpu=native"
pour activer toutes les fonctionnalités du processeur telles que AVX, AVX2, etc. Cela est bénéfique pour l'ultraviolet.
Vous pouvez également ajouter des instructions de construction à .cargo/config
:
[build] rustflags = "-C target-cpu=native"
Jetez un œil aux références pour les chiffres.
Quelques chiffres de référence sont présentés ici : Benchmarks
Vous pouvez exécuter vos propres tests de performance en :
rustup default nightly cargo bench
Vous devrez peut-être ajouter les lignes suivantes dans votre ~/.cargo/config
pour créer le code sur Apple Silicone :
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
L'interface Python expose des fonctions et des classes de Similari prêtes à l'emploi. Pour l'instant, l'interface Python fournit :
le filtre de Kalman pour la prédiction de boîtes alignées sur des axes et orientées (rotées) ;
le filtre de Kalman pour la prédiction de mouvement de points 2D ;
le filtre de Kalman 2D Point Vector, qui prédit le vecteur de mouvement de points 2D indépendants (utilisé dans Keypoint Tracker) ;
NMS (suppression non maximale);
le découpage Sutherland-Hodgman, zone d'intersection pour les boîtes orientées (pivotées);
TRIER avec la métrique IoU et Mahalanobis ;
BatchSORT avec métrique IoU et Mahalanobis ;
VisualSORT - Tracker de type DeepSORT avec métrique euclidienne/cosinus pour les caractéristiques visuelles et métrique IoU/Mahalanobis pour le suivi de position (VisualSort).
BatchVisualSORT - saveur VisualSORT par lots ;
Les classes et fonctions de l'API Python peuvent être explorées dans la documentation Python et dans les petits exemples fournis.
Un kit d'évaluation MOTChallenge est également fourni que vous pouvez utiliser pour évaluer simplement les performances et les mesures des trackers.
Veuillez garder à l'esprit que le package PyPi est conçu pour s'adapter à un large éventail de plates-formes, il peut donc ne pas être aussi rapide que celui que vous créez localement pour votre plate-forme (voir les sections suivantes).
Plateformes :
Linux : X86_64, ARM64, ARMv7 ;
Windows : X86_64 ;
MacOS : X86_64, ARM64.
pip3 install similari-trackers-rs
Vous pouvez créer la roue dans le Docker et si vous souhaitez l'installer sur le système hôte, copiez le package résultant sur le système hôte, comme le montrent les exemples suivants.
Si vous utilisez d'autres bibliothèques Rust, vous trouverez peut-être avantageux de construire avec le conteneur Rust de base (et Python 3.8) :
docker build -t similari-trackers-rs -f docker/rust_1.67/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Python 3.8 est encore très fréquemment utilisé. Voici comment construire Similari avec :
docker build -t similari-trackers-rs -f docker/python_3.8/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Si vous utilisez l'environnement Python le plus récent, vous pouvez créer avec le conteneur Python de base :
docker build -t similari-trackers-rs -f docker/python_3.10/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
REMARQUE : Si vous obtenez l'erreur pip3
telle que :
ERROR: similari-trackers-rs-0.26.4-cp38-cp38-manylinux_2_28_x86_64.whl is not a supported wheel on this platform.
Cela signifie que la version de Python dans le système hôte ne correspond pas à celle qui se trouve dans l'image utilisée pour construire la roue.
Installez la boîte à outils Rust à jour :
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env mise à jour de rouille
Installez les outils build-essential apt install build-essential -y
.
Installez Python3 (>= 3.8) et les fichiers de développement ( python3-dev
).
Installez Maturin :
pip3 install --upgrade maturin~=0.15
Pas dans VENV . Construisez le module python :
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
Dans VENV . Construisez le module python :
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
Les exemples d'utilisation se trouvent sur python.
L’image MOT Challenge Docker pour les trackers Similari et les trackers conventionnels est ici. Vous pouvez facilement créer une image Docker tout-en-un et essayer nos trackers.
Articles rassemblés sur la manière dont Similari peut être utilisé pour résoudre des problèmes spécifiques.
Exemple de suivi d'objets IoU ;
Exemple de suivi d'objet Re-ID ;
Exemple de suivi d'objet SORT ;
Exemple de suivi d'objet Python SORT ;
Exemple de suivi d'objet Python Rotated SORT ;
Pourquoi avez-vous besoin d'un système de suivi haute performance pour le suivi de plusieurs objets.
Jetez un œil aux exemples dans le dépôt :
simple.rs - une idée d'utilisation simple.
track_merging.rs - une idée de fusion de pistes intra-cam.
incrémental_track_build.rs - tracker très simple basé sur les fonctionnalités.
simple_sort_iou_tracker.rs - Tracker SORT (avec filtre Kalman, IoU).
simple_sort_iou_tracker_oriented.rs - Tracker SORT orienté (rotation) (avec filtre de Kalman, IoU).
simple_sort_maha_tracker.rs - Tracker SORT (avec filtre Kalman, Mahalanobis).
simple_sort_maha_tracker_oriented.rs - Tracker de SORT orienté (avec filtre de Kalman, Mahalanobis).
middleware_sort_tracker.rs - Tracker SORT (avec filtre Kalman, implémentation middleware).