BoxMOT 多目标追踪教程:5 分钟跑通,10 种追踪器按场景选型
2026/9/20 20:50:23 网站建设 项目流程

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可在cpumpscuda:0之间切换。下面是 MOT17 测试帧上多目标追踪的画面效果:

📊 按场景挑选追踪器:MOT17 基准测试对照

这张表回答一个问题:十种追踪器,我该怎么选。以下数据来自 README.md 的 MOT17 消融基准(官方消融检测器),分数越高越好:

追踪器状态HOTA↑MOTA↑IDF1↑
occluboost71.1078.5085.28
botsort69.6878.2382.33
boosttrack69.2575.9183.20
strongsort68.0576.1980.76
deepocsort67.9575.8380.54
bytetrack67.6878.0479.16
hybridsort67.3174.0978.87
ocsort66.4474.5577.90
sfsort62.6576.8769.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 包根导出了BoostTrackBotSortByteTrackDeepOcSortHybridSortMafHdaOccluBoostOcSortSFSORTStrongSortEagerMot,接口保持一致。

⚙️ 进阶玩法:评估管线、调参、导出

本地评估管线。评估的核心是"检测只算一次"。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 基准对照表做选型,剩下的交给tuneeval。核心链接: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询