新版本(已重新命名):
舊版:
在 GitHub 上為我們加註星標——這極大地激勵了我們!
Sameki 是一個帶有 Python 綁定的 Rust 框架,可協助建立複雜的追蹤系統。使用Simiki,我們可以開發高效的平行SORT、DeepSORT 和其他複雜的單觀察者(例如Cam)或多觀察者追蹤引擎。
Sameli 的主要目的是提供建構複雜的記憶體中多個物件追蹤引擎的方法。
該框架有助於建立各種類型的追蹤和相似性搜尋引擎 - 最簡單的一種,它保存向量特徵並允許將新向量與資料庫中保存的向量進行比較。更複雜的引擎在軌道上運行——在生命週期中收集的對同一特徵的一系列觀察。此類系統通常用於視訊處理或觀察者收到模糊或變化的觀察結果的其他系統。
Sameki 是一個建立自訂追蹤器的框架,但它提供了某些演算法作為最終用戶功能:
邊界框卡爾曼濾波器,可預測與場景軸對齊的矩形邊界框,也支援定向(旋轉)邊界框。
2D 點卡爾曼濾波器,預測 2D 點運動。
2D 點向量卡爾曼濾波器,預測獨立 2D 點運動的向量(在關鍵點追蹤器中使用)。
邊界框裁剪,允許計算軸對齊和定向(旋轉)邊界框的交叉面積。
非極大值抑制 (NMS) - 過濾與場景同軸的矩形邊界框,並支援定向邊界框。
SORT 追蹤演算法(支援軸對齊和定向框)- 支援 IoU 和 Mahalanobis 距離。
批次排序追蹤演算法(支援軸對齊和定向框)- 支援 IoU 和 Mahalanobis 距離。批量追蹤器允許在單一批次中將多個場景傳遞給追蹤器並取回它們。如果平台支援批次追蹤器(例如 Nvidia DeepStream 或 Intel DL Streamer),則使用批次追蹤器會更有利。
VisualSORT 追蹤- 類似 DeepSORT 的演算法(支援軸對齊和定向框) - 支援 IoU 和 Mahalanobis 距離進行位置跟踪,歐氏距離、餘弦距離用於特徵向量的視覺追蹤。
Batch VisualSORT - 批次 VisualSORT 風格;
儘管 Sameli 允許建立各種追蹤和相似性引擎,但有些競爭工具有時可能更適合。本節將解釋它的適用範圍以及有哪些替代方案。
相似性最適合追蹤任務,其中物件是透過對某個要素類別的多個觀察來描述的,而不是單一特徵向量。此外,它們的行為是動態的 - 您可以將它們從索引中刪除或修改它們,就像添加新的一樣頻繁。這是非常重要的一點 - 它比處理成長或靜態物件空間的工具效率低。
Fit :追蹤整個房間的人:在追蹤過程中多次收集人員 ReID、年齡/性別和臉部特徵,並用於合併追蹤或在追蹤結束時提供聚合結果;
不適合:抄襲資料庫,當單一文件由多個(或僅一個)常數 ReID 向量描述時,文件會被新增但不會被刪除。任務是找到與已檢查的前 X 個最相似的文件。
如果您的任務看起來像Not fit ,可以使用 Sameli,但您可能正在尋找HNSW
或NMS
實作:
HNSW Rust - 鏈接
HNSW C/Python - 鏈接
NMSLib - 鏈接
相似對象支援以下功能:
軌跡生命週期-物件由它的生命週期(軌跡)來表示-它出現、演化和消失。在其生命週期中,物件根據其行為屬性(屬性和特徵觀察)而演變。
觀察-Similari 假設一個物件被觀察者實體觀察,該觀察者會多次收集其特徵(均勻向量)和自訂觀察屬性(如 GPS 或螢幕框位置)。這些特徵由浮點數和觀察屬性的向量表示。當觀察發生時,軌跡會根據收集到的特徵進行更新。未來的觀察用於在索引中找到相似的軌道並將它們合併。
軌跡屬性- 任意屬性描述要素觀測之外的其他軌跡屬性。當你在野外比較物件時,追蹤屬性是至關重要的部分,因為當物件不相容時可能會有屬性處置,例如animal_type
,它禁止你在彼此之間比較dogs
和cats
。屬性的另一個流行用途是物件的空間或時間特徵,例如,無法比較同時位於遙遠位置的物件。 Sameli 中的屬性是動態的,並隨著每個特徵觀察添加和物件合併而演變。它們用於距離計算和相容性猜測(透過跳過不相容的物件來減少計算空間)。
如果您打算使用 Sameli 在大型索引中進行搜索,請考慮使用物件屬性來分割查找空間。如果兩個軌道的屬性不相容,則跳過它們的距離計算。
相似度很快。它通常比使用 Python 和 NumPy 建立的追蹤器更快。
為了運行高效能的視覺特徵運算,該框架使用 UV - 用於快速 SIMD 計算的庫。
並行計算透過索引分片和基於專用執行緒池的平行計算來實現。
向量操作效能在很大程度上取決於為建構定義的最佳化等級。在低或預設最佳化等級上,Rust 可能不會使用 f32 向量化,因此在執行基準測試時請注意配置正確的最佳化等級。
使用RUSTFLAGS="-C target-cpu=native"
啟用所有 cpu 功能,如 AVX、AVX2 等。
或者,您可以將建置指令新增至.cargo/config
:
[build] rustflags = "-C target-cpu=native"
看一下數字基準。
這裡列出了一些基準數據:基準
您可以透過以下方式執行自己的基準測試:
rustup default nightly cargo bench
您可能需要將以下行新增至~/.cargo/config
中才能在 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", ]
Python 介面公開了即用型函數和 Sameli 類別。目前,Python 介面提供:
用於軸對齊和定向(旋轉)框預測的卡爾曼濾波器;
用於 2D 點運動預測的卡爾曼濾波器;
2D 點向量卡爾曼濾波器,預測獨立 2D 點運動的向量(用於關鍵點追蹤器);
NMS(非極大值抑制);
Sutherland-Hodgman 裁切、定向(旋轉)框的交叉區域;
使用 IoU 和 Mahalanobis 度量進行排序;
使用 IoU 和 Mahalanobis 度量進行 BatchSORT;
VisualSORT - 類似 DeepSORT 的追蹤器,具有用於視覺特徵的歐幾里德/餘弦度量和用於位置追蹤的 IoU/Mahalanobis 度量(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仍然是一個非常常用的。以下是如何使用它來建構 Sameli:
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 銹更新
安裝apt install build-essential -y
。
安裝 Python3 (>= 3.8) 和開發檔案 ( python3-dev
)。
安裝成熟:
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.
類似的追蹤器和傳統追蹤器的 MOT Challenge Docker 映像在這裡。您可以輕鬆建立一體化 Docker 映像並嘗試我們的追蹤器。
關於如何使用 Sameli 解決特定問題的文章集。
IoU 物件追蹤器範例;
Re-ID 物件追蹤器範例;
SORT 物件追蹤器範例;
Python SORT 物件追蹤器範例;
Python 旋轉排序物件追蹤器範例;
為什麼您需要高效能追蹤系統來進行多物件追蹤。
查看儲存庫中的範例:
simple.rs - 簡單用法的想法。
track_merging.rs - 攝影機內軌道合併的想法。
incremental_track_build.rs - 非常簡單的基於特徵的追蹤器。
simple_sort_iou_tracker.rs - SORT 追蹤器(帶有卡爾曼濾波器,IoU)。
simple_sort_iou_tracker_oriented.rs - 定向(旋轉)SORT 追蹤器(帶有卡爾曼濾波器,IoU)。
simple_sort_maha_tracker.rs - SORT 追蹤器(帶有卡爾曼濾波器、Mahalanobis)。
simple_sort_maha_tracker_oriented.rs - 面向 SORT 追蹤器(帶有卡爾曼濾波器、Mahalanobis)。
middleware_sort_tracker.rs - SORT 追蹤器(帶有卡爾曼濾波器,中間件實作)。