BoxMOT:从零到可用的多目标跟踪方案,一篇就够
【免费下载链接】boxmotBoxMOT: Pluggable Python and C++ SOTA multi-object tracking modules with support for axis-aligned and oriented bounding boxes项目地址: https://gitcode.com/GitHub_Trending/bo/boxmot
做视频监控时,检测模型每帧都能给出框,但同一个人跨帧 ID 总是跳变——跟踪就是这条链路里最容易被忽略的一步。BoxMOT 就是解决这个问题的多目标跟踪组件库:任意检测器接进来,就能得到带连续编号的轨迹,ByteTrack、BotSort、StrongSORT、OccluBoost 等算法在同一接口下即插即用,还支持 OBB(旋转框)跟踪与 C++ 原生实现。
📦 项目定位:可插拔的多目标跟踪组件库
BoxMOT 是一个 Python 加 C++ 的组件库:检测器、ReID(外观特征,解决"同一人姿态衣着变了还能对上是同一个人"的问题)编码器和跟踪器各自可替换,流水线由这些组件拼装,CLI 负责评估、调参和导出。和自写跟踪的区别在于:不用自己实现卡尔曼滤波(按运动预测下一帧框位置的滤波器)加匈牙利匹配(把框和轨迹做最优分配的匹配方法)再加外观匹配的整套链路,MOT 基准评估开箱即用;和一揽子工具的区别是组件解耦,换单个算法不牵连其余部分。11 个跟踪器的配置文件集中在 trackers/,数据集说明在 datasets/。
🚀 30秒跑通多目标跟踪
源码安装先git clone https://gitcode.com/GitHub_Trending/bo/boxmot,否则直接从 PyPI 装。装完一条命令启动摄像头实时跟踪,ReID 权重首次运行自动下载:
pip install boxmot boxmot install --extra yolo boxmot track --source 0 --detector yolov8n --reid osnet_x0_25_msmt17 --tracker botsort --savePython API 同样轻量,喂入检测结果和 BGR 图像帧,返回带 ID 的轨迹:
import numpy as np from boxmot import OccluBoost tracker = OccluBoost() dets = np.array([[100, 200, 300, 400, 0.9, 0]]) frame = np.zeros((480, 640, 3), dtype=np.uint8) tracks = tracker.update(dets, frame)🎬 场景化方案:多目标跟踪的四个典型用法
摄像头低配设备实时跟踪
- 适用:长期摄像头流,只计数展示、不区分个体
- 配置:换
--tracker bytetrack,去掉--reid,指定--device cpu - 效果:ByteTrack 只依赖框几何与置信度,无外观推理,单帧开销最低,适合多路并发;源、输出、设备等参数见 track 模式文档
如果你更在意"同一个人的 ID 是否稳定",往下看。
带外观匹配的行人轨迹跟踪
- 适用:人群、货架等遮挡交叉密集、ID 切换不可接受的场景
- 配置:选 BotSort 或 StrongSORT,加
--reid osnet_x0_25_msmt17;StrongSORT 额外融合 ECC 背景对齐,更稳但更慢 - 效果:MOT17 上 BotSort 的 IDF1(身份一致性得分)82.33,高于 ByteTrack 的 79.16;代价是每帧多一次外观推理,建议放 GPU
选定跟踪器后,如果想确认"A 比 B 在同一数据上到底好多少",用 eval。
用MOT17基准对比不同跟踪器精度
- 适用:选型、复现论文等需要基数的阶段
- 配置:复用官方检测器保存的检测结果,让跟踪器成为唯一变量
boxmot eval --dataset mot17 --split ablation \ --detector yolox-x-mot17 --reid lmbn-n-duke --tracker botsort- 效果:输出 HOTA(检测加身份一致性的综合分)/MOTA/IDF1;检测构建会被缓存,换
--tracker重跑时不会重新推理检测器
OBB旋转框与C++原生部署
- 适用:车辆、无人机等有明确朝向的目标,或要求低延迟的嵌入式产品
- 配置:OBB 传 7 列检测(cx, cy, w, h, 角度, 置信度, 类别);生产环境加
--tracker-backend cpp启用原生实现 - 效果:C++ 版算法指标与 Python 路径一致,native/ 的 CMake 工程可直接嵌入无 Python 运行时的系统
⚡ 性能与调优
MOT17 ablation 基准(公开检测结果,各跟踪器同条件)上,算法间差距主要体现在 IDF1:
| 跟踪器 | 运动模型 | 外观 | HOTA | MOTA | IDF1 |
|---|---|---|---|---|---|
| OccluBoost | 框+遮挡处理 | ReID | 71.10 | 78.50 | 85.28 |
| BotSort | 框+相机运动补偿 | ReID | 69.68 | 78.23 | 82.33 |
| StrongSORT | 框+ECC对齐 | ReID必需 | 68.05 | 76.19 | 80.76 |
| DeepOcSort | 框 | ReID | 67.95 | 75.83 | 80.54 |
| ByteTrack | 框 | 无 | 67.68 | 78.04 | 79.16 |
| OcSort | 框 | 无 | 66.44 | 74.55 | 77.90 |
三条最关键的调优建议:
- 先固定检测器再调跟踪器,检测噪声影响大于匹配策略
- ID 跳变优先开 ReID,其次再调
track_buffer tune模式可自动搜索iou_threshold等阈值
🛠️ 多目标跟踪踩坑清单
track找不到检测器 → 未装 YOLO 依赖 → 执行boxmot install --extra yolo- Mac 上 ONNX ReID 卡在 CPU → ONNX 无 MPS 提供方 → 导出 Core ML 或改用 PyTorch 权重
- CUDA 可用但 ReID 仍走 CPU → 缺 onnxruntime-gpu → 检查 providers 列表
- 报
ModuleNotFoundError: boxmot→ 直接运行了脚本 → 用python -m boxmot.engine.cli - 安装失败 → Python 版本不在 3.10 至 3.13 区间
第一次运行直接执行 30 秒命令,从摄像头出图后按上表选跟踪器;链路稳定后用eval固定基线,再用tune搜索阈值。安装时的 cpu 与 cu130 两种 PyTorch 配置及各模式依赖清单,见官方文档的 installation 一节。
【免费下载链接】boxmotBoxMOT: Pluggable Python and C++ SOTA multi-object tracking modules with support for axis-aligned and oriented bounding boxes项目地址: https://gitcode.com/GitHub_Trending/bo/boxmot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考