新版本(已重命名):
旧版本:
在 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 锈更新
安装 build-essential 工具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 跟踪器(带有卡尔曼滤波器,中间件实现)。