BoxMOT 多目标追踪教程:5 分钟跑通,10 种追踪器按场景选型
【免费下载链接】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
BoxMOT 是一个插件式多目标追踪框架:任意能输出边界框的分割、目标检测或姿态估计模型,接上它就能给画面里的每个目标分配稳定 ID。本文带你从安装、首次追踪,到追踪器选型、评估与调参,一次走通。
两个绕不开的多目标追踪痛点
多目标追踪落地时有两件事最耗时间。第一,追踪算法和检测模型是两摊代码:换一个检测器,关联、卡尔曼、外观特征那套逻辑要么重写要么重调。第二,想对比 ByteTrack 和 BoT-SORT 谁更合适,就得把两套仓库各自克隆、各自配环境。BoxMOT 的解法是把检测器、ReID 编码器、追踪器拆成互不绑定的组件:追踪器统一接收同一份检测输入,换算法只需改一个类名或一个命令行参数。十种追踪器实现都在 boxmot/trackers/,一次接入、任意切换。
🚀 BoxMOT 安装与首次追踪
环境要求 Python 3.10 至 3.13。
pip install boxmot # 安装 BoxMOT 及依赖装完先跑这条命令,几秒后就能看到带 ID 的追踪画面:
# 用摄像头实时追踪:yolo26n 检测 + lmbn_n_duke 外观 + occluboost 追踪 boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source 0 --save --show--source接受四种写法,分别对应网络摄像头、图片、视频、目录:
boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source 0 # 摄像头 boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source img.jpg # 单张图片 boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source vid.mp4 # 视频文件 boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source path/ # 图片目录--show实时预览,--save把结果视频写到 runs 目录;--device可在cpu、mps、cuda:0之间切换。下面是 MOT17 测试帧上多目标追踪的画面效果:
📊 按场景挑选追踪器:MOT17 基准测试对照
这张表回答一个问题:十种追踪器,我该怎么选。以下数据来自 README.md 的 MOT17 消融基准(官方消融检测器),分数越高越好:
| 追踪器 | 状态 | HOTA↑ | MOTA↑ | IDF1↑ |
|---|---|---|---|---|
| occluboost | ✅ | 71.10 | 78.50 | 85.28 |
| botsort | ✅ | 69.68 | 78.23 | 82.33 |
| boosttrack | ✅ | 69.25 | 75.91 | 83.20 |
| strongsort | ✅ | 68.05 | 76.19 | 80.76 |
| deepocsort | ✅ | 67.95 | 75.83 | 80.54 |
| bytetrack | ✅ | 67.68 | 78.04 | 79.16 |
| hybridsort | ✅ | 67.31 | 74.09 | 78.87 |
| ocsort | ✅ | 66.44 | 74.55 | 77.90 |
| sfsort | ✅ | 62.65 | 76.87 | 69.18 |
选型先分清两种性能模式。纯运动类(bytetrack、ocsort)只靠位置和速度关联,CPU 上帧率最高,适合目标很少交叉遮挡的实时场景。运动+外观类(botsort、occluboost、strongsort、deepocsort、boosttrack、hybridsort、sfsort)会额外给每个目标拍一张"身份照"——外观嵌入描述目标长什么样,目标被挡住或短暂丢失后仍能靠长相找回正确 ID,代价是每帧多一次 ReID 推理。追求极限帧率选 bytetrack;精度优先(尤其 IDF1 身份一致性)选 occluboost;平衡项看 botsort,它的 IDF1 达 82.33,也是评估命令的默认示例。
🧰 五个子命令逐个拆解
boxmot --help列出的能力很多,日常最常用的五个如下。
# track:对任意源(摄像头/图片/视频/目录)跑检测+追踪 boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source 0 --save --show输出带 ID 框的实时画面或视频。
# eval:在 MOT17 消融集上评估"检测器+ReID+追踪器"组合的 HOTA/MOTA/IDF1 boxmot eval --dataset mot17 --split ablation --detector yolox-x-mot17 --reid lmbn-n-duke --tracker botsort首次运行会自动物化检测结果与外观嵌入,之后换追踪器直接复用(详见进阶部分)。
# materialize:一次性生成不可变的检测+嵌入构建,供 eval/tune 反复复用 boxmot materialize --experiment mot17/ablation-yolox-lmbn.yaml --data-root datasets/mot --device mps检测只算一次,后续对比任意追踪器都不用重跑检测器。
# tune:用进化式搜索在 MOT17 上自动调追踪器超参数 boxmot tune --dataset mot17 --split ablation --detector yolox-x-mot17 --reid lmbn-n-duke --tracker botsort --n-trials 9最优超参数集写回 boxmot/configs/trackers/ 对应的配置。
# export:把 ReID 模型导出为部署格式 boxmot export --weights osnet_x0_25_msmt17.pt --include onnx --include engine --device cuda:0 --dynamic支持 TorchScript、ONNX、OpenVINO、TensorRT、Core ML、TFLite 等格式。
两个高频参数:
- ReID 模型选择:
--reid决定外观特征来源,osnet_x0_25_msmt17轻量、适合实时;lmbn_n_duke精度更高,是 MOT17 基准的默认搭配。可选模型见 boxmot/configs/reid/。 - 类别过滤:默认追踪全部 COCO 类别,
--classes只保留你要的索引:
# 只追踪 COCO 第 16(猫)、17(狗)两类 boxmot track --detector yolov8s --tracker botsort --source 0 --classes 16,17🐍 Python 集成:检测器接追踪器的最小闭环
在代码里,BoxMOT 的追踪器直接吃标准检测数组(x1, y1, x2, y2, 置信度, 类别 ID),无需中间适配层:
import numpy as np from boxmot import OccluBoost # OccluBoost 为开箱即用的默认追踪器(含外观) tracker = OccluBoost() dets = np.array([[100, 200, 300, 400, 0.9, 0]]) # x1,y1,x2,y2,score,class frame = np.zeros((480, 640, 3), dtype=np.uint8) # BGR 图像 tracks = tracker.update(dets, frame) print(tracks[:, 4].astype(int)) # 每个目标的轨迹 ID想换其他算法,只需换掉导入的类:BoxMOT 包根导出了BoostTrack、BotSort、ByteTrack、DeepOcSort、HybridSort、MafHda、OccluBoost、OcSort、SFSORT、StrongSort、EagerMot,接口保持一致。
⚙️ 进阶玩法:评估管线、调参、导出
本地评估管线。评估的核心是"检测只算一次"。boxmot eval首次运行会把检测结果和 ReID 嵌入物化下来;之后换追踪器、甚至换 ReID 模型,检测推理都会跳过、直接复用已有构建,跨 CPU/MPS/CUDA 同样可复用。跑完想再打磨轨迹,加后处理参数:
# 评估后先做 tracklet 关联,再做高斯平滑插值补洞 boxmot eval --dataset mot17 --split ablation --detector yolox-x-mot17 --reid lmbn-n-duke --tracker botsort \ --postprocessing gta --postprocessing gsi--postprocessing gsi用高斯平滑插值把轨迹断点补成平滑轨迹,--postprocessing gta先把碎片轨迹重新关联再接 GSI;处理后指标取新结果,原始结果保留在输出目录的raw/下。
一条命令完成调参。boxmot tune用进化式搜索自动试追踪器超参数:每个试验重放同一份不可变构建,结果按指标排序,最优参数组合写回追踪器配置,下一轮直接用默认配置就是调过的版本。
ReID 模型多格式导出。同一份外观权重,部署到哪就导到哪:ONNX 给跨框架推理,OpenVINO 给 Intel 硬件,TensorRT 给 GPU 极致吞吐,TorchScript/Core ML/TFLite 各有对应场景。--dynamic允许动态输入,批量导出时可用--batch-size指定批大小。
📚 上手资源:示例笔记本与文档
三个官方 notebook 演示"现成 torchvision 模型 + BoxMOT"的完整写法:
- examples/det/torchvision_boxmot.ipynb:边界框检测接追踪
- examples/pose/torchvision_boxmot.ipynb:姿态估计接追踪
- examples/seg/torchvision_boxmot.ipynb:分割接追踪
更多入口:官方文档(完整指南与 API 参考)、安装指南、追踪器总览、评估与后处理指南,以及项目 README。
写在最后
BoxMOT 把多目标追踪从"每个算法一套环境"变成了"一个接口换参数":检测、ReID、追踪器各自可插拔,评估与调参共享同一份检测结果。先跑通一条boxmot track,再用 MOT17 基准对照表做选型,剩下的交给tune和eval。核心链接:README.md · docs/
【免费下载链接】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),仅供参考