新しいバージョン (名前変更):
古いバージョン:
GitHub でスターを付けてください。それは私たちに大きなモチベーションを与えます。
Samelii は、高度な追跡システムの構築に役立つ Python バインディングを備えた Rust フレームワークです。 Samerii を使用すると、高効率の並列 SORT、DeepSORT、およびその他の高度な単一オブザーバー (例: Cam) またはマルチオブザーバー追跡エンジンを開発できます。
Samerii の主な目的は、高度なメモリ内複数オブジェクト追跡エンジンを構築する手段を提供することです。
このフレームワークは、さまざまな種類の追跡および類似性検索エンジンの構築に役立ちます。最も単純なものは、ベクトルの特徴を保持し、新しいベクトルをデータベースに保存されているベクトルと比較できるようにするものです。より洗練されたエンジンは、ライフサイクル中に収集された同じ機能の一連の観察であるトラック上で動作します。このようなシステムは、観察者が曖昧な観察結果や変化する観察結果を受け取るビデオ処理システムやその他のシステムでよく使用されます。
Similari はカスタム トラッカーを構築するためのフレームワークですが、エンドユーザー機能として特定のアルゴリズムを提供します。
バウンディング ボックス カルマン フィルターは、シーンに軸を合わせて配置された長方形のバウンディング ボックスを予測し、方向付けされた (回転された) バウンディング ボックスもサポートします。
2D ポイント カルマン フィルター。2D ポイントの動きを予測します。
2D ポイント ベクトル カルマン フィルター。独立した 2D ポイントの動きのベクトルを予測します (キーポイント トラッカーで使用されます)。
バウンディング ボックス クリッピング。これにより、軸に揃えられ方向付けされた (回転された) バウンディング ボックスの交差領域を計算できます。
非最大抑制 (NMS) - シーンと同軸の長方形の境界ボックスをフィルター処理し、方向性のある境界ボックスをサポートします。
SORT 追跡アルゴリズム (軸合わせおよび指向ボックスがサポートされています) - IoU およびマハラノビス距離がサポートされています。
バッチ SORT 追跡アルゴリズム (軸揃えおよび指向ボックスがサポートされています) - IoU およびマハラノビス距離がサポートされています。バッチ トラッカーを使用すると、複数のシーンを単一のバッチでトラッカーに渡し、それらを戻すことができます。プラットフォームがバッチ処理 (Nvidia DeepStream や Intel DL Streamer など) をサポートしている場合、バッチ トラッカーを使用するとより有益です。
VisualSORT トラッキング- DeepSORT に似たアルゴリズム (軸合わせおよび方向付けされたボックスがサポートされています) - IoU およびマハラノビス距離は位置追跡にサポートされ、ユークリッド距離、コサイン距離は特徴ベクトルの視覚的な追跡に使用されます。
Batch VisualSORT - バッチ化された VisualSORT フレーバー。
Samerii を使用すると、さまざまな追跡エンジンと類似性エンジンを構築できますが、場合によっては、より適切に適合する競合ツールも存在します。このセクションでは、それが適用できる場所と、どのような代替手段が存在するかについて説明します。
Similari は、単一の特徴ベクトルではなく、特定のフィーチャクラスの複数の観測値によってオブジェクトが記述される追跡タスクに最適です。また、それらの動作は動的です。新しいものを追加するのと同じくらい頻繁に、インデックスからそれらを削除したり、変更したりすることができます。これは非常に重要な点です。成長するオブジェクト空間や静的なオブジェクト空間を扱うツールよりも効率が低くなります。
Fit : 部屋全体で人物を追跡します。人物の ReID、年齢/性別、顔の特徴が追跡中に複数回収集され、トラックを結合したり、トラックの最後に集計結果を提供したりするために使用されます。
適合しない: 盗作データベース。単一のドキュメントが多数 (または 1 つだけ) の定数 ReID ベクトルで記述されている場合、ドキュメントは追加されますが、削除されません。タスクは、チェックされたドキュメントに最も類似した上位 X 個のドキュメントを見つけることです。
タスクがNot fitのように見える場合は、Similari を使用できますが、おそらくHNSW
またはNMS
実装を探しているでしょう。
HNSW ラスト - リンク
HNSW C/Python - リンク
NMSLib - リンク
類似オブジェクトは次の機能をサポートしています。
ライフサイクルの追跡- オブジェクトはそのライフサイクル (トラック) によって表され、出現、進化、消滅します。オブジェクトは、その存続期間中、その動作特性 (属性および特徴の観察) に従って進化します。
観測- Samelii は、オブジェクトがその特徴 (均一ベクトル) とカスタム観測属性 (GPS やスクリーン ボックスの位置など) を複数回収集する観測エンティティによって観測されることを前提としています。これらの特徴は、浮動小数点数と観測属性のベクトルによって表現されます。観測が行われると、収集された特徴でトラックが更新されます。今後の観測結果は、インデックス内の類似したトラックを見つけてマージするために使用されます。
トラック属性- 任意の属性は、フィーチャの観測以外の追加のトラック プロパティを記述します。野生のオブジェクトを比較する場合、属性の追跡は重要な部分です。オブジェクトに互換性がない場合、 dogs
とcats
の相互比較を禁止するanimal_type
などの属性の性質が存在する可能性があるためです。属性のもう 1 つの一般的な用途は、オブジェクトの空間的または時間的特性です。たとえば、同時に離れた場所にあるオブジェクトは比較できません。 Samelii の属性は動的であり、フィーチャ観測が追加されるたびに、またオブジェクトがマージされるときに進化します。これらは、距離の計算と互換性の推測 (互換性のないオブジェクトをスキップすることで計算スペースを削減します) の両方で使用されます。
Samelii を使用して大規模なインデックスを検索する場合は、オブジェクト属性を考慮してルックアップ スペースを分割することを検討してください。 2 つのトラックの属性に互換性がない場合、距離の計算はスキップされます。
シミラーリは速いです。通常、Python や NumPy で構築されたトラッカーよりも高速です。
視覚的特徴計算をパフォーマンス良く実行するために、フレームワークは高速 SIMD 計算用のライブラリである UV を使用します。
並列計算は、インデックス シャーディングと専用のスレッド ワーカー プールに基づく並列計算を使用して実装されます。
ベクトル演算のパフォーマンスは、ビルドに定義された最適化レベルに大きく依存します。低い最適化レベルまたはデフォルトの最適化レベルでは、Rust は f32 ベクトル化を使用しない可能性があるため、ベンチマークを実行するときは、適切な最適化レベルが設定されていることを考慮してください。
AVX、AVX2 などのすべての CPU 機能を有効にするにはRUSTFLAGS="-C target-cpu=native"
を使用します。これは紫外線に対して有益です。
あるいは、ビルド手順を.cargo/config
に追加することもできます。
[build] rustflags = "-C target-cpu=native"
数値のベンチマークを見てみましょう。
いくつかのベンチマークの数値をここに示します: ベンチマーク
次の方法で独自のベンチマークを実行できます。
rustup default nightly cargo bench
Apple Silicon 上でコードをビルドするには、 ~/.cargo/config
に次の行を追加する必要がある場合があります。
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
Python インターフェイスは、Similari のすぐに使用できる関数とクラスを公開します。現時点では、Python インターフェースは以下を提供します。
軸に揃えて配向した (回転した) ボックス予測用のカルマン フィルター。
2D 点動き予測用のカルマン フィルター。
2D ポイント ベクトル カルマン フィルター。独立した 2D ポイントの動きのベクトルを予測します (キーポイント トラッカーで使用)。
NMS (非最大抑制);
サザーランド・ホッジマン クリッピング、方向付けされた (回転された) ボックスの交差領域。
IoU とマハラノビス メトリックを使用した SORT。
IoU とマハラノビス メトリックを使用した BatchSORT。
VisualSORT - 視覚特徴のためのユークリッド/コサイン メトリクスと位置追跡のための IoU/マハラノビス メトリクスを備えた DeepSORT のようなトラッカー (VisualSort)。
BatchVisualSORT - バッチ化された VisualSORT フレーバー。
Python API のクラスと関数については、Python のドキュメントと提供されている小さな例で調べることができます。
トラッカーのパフォーマンスとメトリクスを簡単に評価するために使用できる MOTChallenge 評価キットも提供されています。
PyPi パッケージは幅広いプラットフォームに準拠するように構築されているため、プラットフォーム用にローカルで構築するパッケージほど高速ではない可能性があることに注意してください (次のセクションを参照)。
プラットフォーム:
Linux: X86_64、ARM64、ARMv7;
Windows: X86_64;
MacOS: X86_64、ARM64。
pip3 install similari-trackers-rs
Docker でホイールを構築し、ホスト システムにインストールする場合は、次の例に示すように、結果として得られたパッケージをホスト システムにコピーします。
他の Rust ライブラリを使用する場合は、ベースの Rust コンテナ (および 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 は今でも非常に頻繁に使用されています。これを使用してSimilariを構築する方法は次のとおりです。
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
最新の Python 環境を使用している場合は、ベースの Python コンテナーを使用してビルドできます。
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
注: 次のようなpip3
エラーが発生する場合:
ERROR: similari-trackers-rs-0.26.4-cp38-cp38-manylinux_2_28_x86_64.whl is not a supported wheel on this platform.
これは、ホスト システムの Python バージョンが、ホイールの構築に使用されたイメージ内のバージョンと一致しないことを意味します。
最新の Rust ツールキットをインストールします。
カール --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env 錆びたアップデート
build-essential ツールをインストールしますapt install build-essential -y
。
Python3 (>= 3.8) と開発ファイル ( python3-dev
) をインストールします。
Maturin をインストールします。
pip3 install --upgrade maturin~=0.15
VENV にはありません。 Python モジュールをビルドします。
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
VENVで。 Python モジュールをビルドします。
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
使用例は Python にあります。
Sameli トラッカーおよび従来のトラッカー用の MOT Challenge Docker イメージはここにあります。オールインワンの Docker イメージを簡単に構築して、トラッカーを試すことができます。
特定の問題を解決するためにシミラーリをどのように使用できるかについての記事を集めました。
IoU オブジェクト トラッカーの例。
Re-ID オブジェクト トラッカーの例。
SORT オブジェクト トラッカーの例。
Python SORT オブジェクト トラッカーの例。
Python の回転 SORT オブジェクト トラッカーの例。
複数のオブジェクトの追跡に高性能の追跡システムが必要な理由。
リポジトリ内のサンプルを見てください。
simple.rs - シンプルな使い方のアイデア。
track_merging.rs - カメラ内トラックマージのアイデア。
incremental_track_build.rs - 非常にシンプルな機能ベースのトラッカー。
simple_sort_iou_tracker.rs - SORT トラッカー (カルマン フィルター、IoU 付き)。
simple_sort_iou_tracker_owned.rs - 指向性 (回転) SORT トラッカー (カルマン フィルター、IoU あり)。
simple_sort_maha_tracker.rs - SORT トラッカー (カルマン フィルター、マハラノビス付き)。
simple_sort_maha_tracker_owned.rs - 指向性 SORT トラッカー (カルマン フィルター、マハラノビスを使用)。
middleware_sort_tracker.rs - SORT トラッカー (カルマン フィルター、ミドルウェア実装付き)。