Neuere Versionen (umbenannt):
Ältere Versionen:
Starn Sie uns auf GitHub – das motiviert uns sehr!
Similari ist ein Rust-Framework mit Python-Bindungen, das beim Aufbau anspruchsvoller Tracking-Systeme hilft. Mit Similari kann man hocheffiziente parallelisierte SORT-, DeepSORT- und andere hochentwickelte Single-Observer- (z. B. Cam) oder Multi-Observer-Tracking-Engines entwickeln.
Der Hauptzweck von Similari besteht darin, Mittel zum Aufbau anspruchsvoller In-Memory-Engines zur Verfolgung mehrerer Objekte bereitzustellen.
Das Framework hilft beim Aufbau verschiedener Arten von Tracking- und Ähnlichkeitssuchmaschinen – die einfachste, die Vektormerkmale enthält und den Vergleich neuer Vektoren mit denen in der Datenbank ermöglicht. Anspruchsvollere Motoren arbeiten über Gleise – eine Reihe von Beobachtungen für dasselbe Merkmal, die während des Lebenszyklus gesammelt werden. Solche Systeme werden häufig in der Videoverarbeitung oder anderen Systemen eingesetzt, bei denen der Beobachter unscharfe oder sich ändernde Beobachtungsergebnisse erhält.
Similari ist ein Framework zum Erstellen benutzerdefinierter Tracker, stellt jedoch bestimmte Algorithmen als Endbenutzerfunktion bereit:
Der Begrenzungsrahmen-Kalman-Filter , der rechteckige Begrenzungsrahmen vorhersagt, die an der Achse der Szene ausgerichtet sind, unterstützt auch die ausgerichteten (gedrehten) Begrenzungsrahmen.
2D-Punkt-Kalman-Filter , der 2D-Punktbewegungen vorhersagt.
2D-Punktvektor-Kalman-Filter , der den Vektor unabhängiger 2D-Punktbewegungen vorhersagt (wird im Keypoint Tracker verwendet).
Begrenzungsrahmen-Clipping , das die Berechnung des Schnittbereichs für achsenausgerichtete und orientierte (gedrehte) Begrenzungsrahmen ermöglicht.
Non-Maximum Suppression (NMS) – filtert rechteckige Begrenzungsrahmen koaxial zur Szene und unterstützt die ausgerichteten Begrenzungsrahmen.
SORT-Tracking- Algorithmus (achsenausgerichtete und orientierte Boxen werden unterstützt) – IoU- und Mahalanobis-Abstände werden unterstützt.
Batch-SORT-Verfolgungsalgorithmus (achsenausgerichtete und orientierte Boxen werden unterstützt) – IoU- und Mahalanobis-Abstände werden unterstützt. Der Batch-Tracker ermöglicht es, mehrere Szenen in einem einzigen Batch an den Tracker zu übergeben und sie dann zurückzubekommen. Wenn die Plattform Batching unterstützt (wie Nvidia DeepStream oder Intel DL Streamer), ist die Verwendung des Batch-Trackers vorteilhafter.
VisualSORT-Tracking – ein DeepSORT-ähnlicher Algorithmus (achsenausgerichtete und orientierte Boxen werden unterstützt) – IoU- und Mahalanobis-Abstände werden für die Positionsverfolgung unterstützt, euklidische und Kosinus-Abstände werden für die visuelle Verfolgung auf Merkmalsvektoren verwendet.
Batch VisualSORT – Batch-VisualSORT-Variante;
Obwohl Similari den Aufbau verschiedener Tracking- und Ähnlichkeits-Engines ermöglicht, gibt es konkurrierende Tools, die manchmal besser passen. In diesem Abschnitt wird erläutert, wo es anwendbar ist und welche Alternativen es gibt.
Similari eignet sich am besten für Tracking-Aufgaben, bei denen Objekte durch mehrere Beobachtungen für eine bestimmte Merkmalsklasse und nicht durch einen einzelnen Merkmalsvektor beschrieben werden. Außerdem ist ihr Verhalten dynamisch – Sie entfernen sie aus dem Index oder ändern sie so oft, wie Sie neue hinzufügen. Dies ist ein sehr wichtiger Punkt – es ist weniger effizient als Tools, die mit wachsenden oder statischen Objekträumen arbeiten.
Fit : Verfolgen Sie die Person im ganzen Raum: Personen-ReID, Alter/Geschlecht und Gesichtsmerkmale werden während der Verfolgung mehrfach erfasst und zum Zusammenführen von Tracks oder zum Bereitstellen aggregierter Ergebnisse am Ende des Tracks verwendet;
Nicht geeignet : Plagiatsdatenbank. Wenn ein einzelnes Dokument durch eine Reihe (oder nur einen) konstanten ReID-Vektoren beschrieben wird, werden Dokumente hinzugefügt, aber nicht entfernt. Die Aufgabe besteht darin, die Top-X-Dokumente zu finden, die einem überprüften Dokument am ähnlichsten sind.
Wenn Ihre Aufgabe wie „Not fit“ aussieht, können Sie Similari verwenden, Sie suchen aber wahrscheinlich nach HNSW
oder NMS
Implementierungen:
HNSW Rust – Link
HNSW C/Python – Link
NMSLib – Link
Similari-Objekte unterstützen folgende Funktionen:
Lebenszyklus verfolgen – das Objekt wird durch seinen Lebenszyklus (Spur) dargestellt – es erscheint, entwickelt sich und verschwindet. Während seiner Lebensdauer entwickelt sich ein Objekt entsprechend seinen Verhaltenseigenschaften (Attribute und Merkmalsbeobachtungen).
Beobachtungen – Similari geht davon aus, dass ein Objekt von einer Beobachtereinheit beobachtet wird, die seine Merkmale (einheitliche Vektoren) und benutzerdefinierten Beobachtungsattribute (wie GPS oder Position des Bildschirmkastens) mehrmals erfasst. Diese Merkmale werden durch Vektoren von Gleitkommazahlen und Beobachtungsattributen dargestellt. Wenn die Beobachtung stattgefunden hat, wird der Track mit den gesammelten Features aktualisiert. Zukünftige Beobachtungen werden genutzt, um ähnliche Titel im Index zu finden und zusammenzuführen.
Spurattribute – Beliebige Attribute beschreiben neben Feature-Beobachtungen weitere Spureigenschaften. Das Verfolgen von Attributen ist ein entscheidender Teil, wenn Sie Objekte in freier Wildbahn vergleichen, da es bei inkompatiblen Objekten möglicherweise eine Attributdisposition gibt, z. B. animal_type
, die es Ihnen verbietet, dogs
und cats
miteinander zu vergleichen. Eine weitere beliebte Verwendung von Attributen ist eine räumliche oder zeitliche Eigenschaft eines Objekts, z. B. können Objekte, die sich gleichzeitig an weit entfernten Orten befinden, nicht verglichen werden. Attribute in Similari sind dynamisch und entwickeln sich bei jeder Hinzufügung von Merkmalsbeobachtungen und beim Zusammenführen von Objekten weiter. Sie werden sowohl bei Entfernungsberechnungen als auch bei Kompatibilitätsschätzungen verwendet (wodurch der Rechenraum durch das Überspringen inkompatibler Objekte verringert wird).
Wenn Sie Similari für die Suche in einem großen Index verwenden möchten, sollten Sie Objektattribute in Betracht ziehen, um den Suchraum aufzuteilen. Wenn die Attribute der beiden Tracks nicht kompatibel sind, werden ihre Entfernungsberechnungen übersprungen.
Das Similari ist schnell. Es ist normalerweise schneller als Tracker, die mit Python und NumPy erstellt wurden.
Um visuelle Merkmalsberechnungen performant ausführen zu können, nutzt das Framework Ultraviolett – die Bibliothek für schnelle SIMD-Berechnungen.
Parallele Berechnungen werden mit Index-Sharding und parallelen Berechnungen basierend auf einem dedizierten Thread-Worker-Pool implementiert.
Die Leistung von Vektoroperationen hängt stark von der für den Build definierten Optimierungsstufe ab. Auf niedrigen oder standardmäßigen Optimierungsstufen verwendet Rust möglicherweise keine f32-Vektorisierung. Achten Sie daher beim Ausführen von Benchmarks darauf, dass die richtigen Optimierungsstufen konfiguriert sind.
Verwenden Sie RUSTFLAGS="-C target-cpu=native"
um alle CPU-Funktionen wie AVX, AVX2 usw. zu aktivieren. Dies ist vorteilhaft für Ultraviolett.
Alternativ können Sie Build-Anweisungen zu .cargo/config
hinzufügen:
[build] rustflags = "-C target-cpu=native"
Werfen Sie einen Blick auf Benchmarks für Zahlen.
Einige Benchmark-Zahlen werden hier vorgestellt: Benchmarks
Sie können Ihre eigenen Benchmarks durchführen, indem Sie:
rustup default nightly cargo bench
Möglicherweise müssen Sie die folgenden Zeilen in Ihre ~/.cargo/config
einfügen, um den Code auf Apple Silicone zu erstellen:
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
Die Python-Schnittstelle stellt gebrauchsfertige Funktionen und Klassen von Similari bereit. Derzeit bietet die Python-Schnittstelle Folgendes:
der Kalman-Filter für die Vorhersage achsenausgerichteter und orientierter (gedrehter) Kästchen;
der Kalman-Filter für die Vorhersage der 2D-Punktbewegung;
der 2D-Punktvektor-Kalman-Filter, der den Vektor unabhängiger 2D-Punktbewegungen vorhersagt (wird im Keypoint Tracker verwendet);
NMS (nicht maximale Unterdrückung);
das Sutherland-Hodgman-Clipping, Schnittbereich für ausgerichtete (gedrehte) Boxen;
SORTIEREN mit IoU und Mahalanobis-Metrik;
BatchSORT mit IoU und Mahalanobis-Metrik;
VisualSORT – DeepSORT-ähnlicher Tracker mit Euklidischer/Cosinus-Metrik für visuelle Merkmale und IoU/Mahalanobis-Metrik für die Positionsverfolgung (VisualSort).
BatchVisualSORT – Batch-VisualSORT-Variante;
Python-API-Klassen und -Funktionen können in der Python-Dokumentation und in kleinen Beispielen untersucht werden.
Es gibt auch das MOTChallenge-Evaluierungskit, mit dem Sie die Leistung und Metriken von Trackern einfach bewerten können.
Bitte beachten Sie, dass das PyPi-Paket für eine Vielzahl von Plattformen konzipiert ist und daher möglicherweise nicht so schnell ist wie das Paket, das Sie lokal für Ihre Plattform erstellen (siehe die folgenden Abschnitte).
Plattformen:
Linux: X86_64, ARM64, ARMv7;
Windows: X86_64;
MacOS: X86_64, ARM64.
pip3 install similari-trackers-rs
Sie können das Rad im Docker erstellen und wenn Sie es im Hostsystem installieren möchten, kopieren Sie das resultierende Paket auf das Hostsystem, wie in den folgenden Beispielen gezeigt.
Wenn Sie andere Rust-Bibliotheken verwenden, kann es von Vorteil sein, mit dem Basis-Rust-Container (und Python 3.8) zu erstellen:
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 wird immer noch sehr häufig verwendet. So erstellen Sie Similari damit:
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
Wenn Sie die neueste Python-Umgebung verwenden, können Sie mit dem Basis-Python-Container erstellen:
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
HINWEIS : Wenn Sie den pip3
Fehler wie folgt erhalten:
ERROR: similari-trackers-rs-0.26.4-cp38-cp38-manylinux_2_28_x86_64.whl is not a supported wheel on this platform.
Dies bedeutet, dass die Python-Version im Hostsystem nicht mit der Version im Image übereinstimmt, das zum Erstellen des Rads verwendet wurde.
Installieren Sie das aktuelle Rust-Toolkit:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env Rustup-Update
Installieren Sie die Build-Essential-Tools apt install build-essential -y
.
Installieren Sie Python3 (>= 3.8) und die Entwicklungsdateien ( python3-dev
).
Maturin installieren:
pip3 install --upgrade maturin~=0.15
Nicht in VENV . Erstellen Sie das Python-Modul:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
In VENV . Erstellen Sie das Python-Modul:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
Anwendungsbeispiele finden Sie unter Python.
Das MOT Challenge Docker-Image für Similari-Tracker und herkömmliche Tracker finden Sie hier. Sie können ganz einfach ein All-in-One-Docker-Image erstellen und unsere Tracker ausprobieren.
Gesammelte Artikel darüber, wie die Similari zur Lösung spezifischer Probleme eingesetzt werden können.
Beispiel für einen IoU-Objekt-Tracker;
Beispiel für einen Re-ID-Objekt-Tracker;
Beispiel für einen SORT-Objekt-Tracker;
Beispiel für einen Python SORT-Objekt-Tracker;
Beispiel für einen Python Rotated SORT-Objekt-Tracker;
Warum Sie ein leistungsstarkes Trackingsystem für die Verfolgung mehrerer Objekte benötigen.
Schauen Sie sich die Beispiele im Repo an:
simple.rs – eine Idee der einfachen Nutzung.
track_merging.rs – eine Idee der Intra-Cam-Track-Zusammenführung.
incremental_track_build.rs – sehr einfacher funktionsbasierter Tracker.
simple_sort_iou_tracker.rs – SORT-Tracker (mit Kalman-Filter, IoU).
simple_sort_iou_tracker_oriented.rs – Orientierter (gedrehter) SORT-Tracker (mit Kalman-Filter, IoU).
simple_sort_maha_tracker.rs – SORT-Tracker (mit Kalman-Filter, Mahalanobis).
simple_sort_maha_tracker_oriented.rs – Orientierter SORT-Tracker (mit Kalman-Filter, Mahalanobis).
middleware_sort_tracker.rs – SORT-Tracker (mit Kalman-Filter, Middleware-Implementierung).