ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

BoxMOT eval 模式实战指南:MOT 风格数据集上的追踪指标评测、后处理与对比验证

BoxMOT eval 模式实战指南:MOT 风格数据集上的追踪指标评测、后处理与对比验证 BoxMOT eval 模式实战指南MOT 风格数据集上的追踪指标评测、后处理与对比验证【免费下载链接】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/boxmotboxmot eval是 BoxMOT 内置的追踪性能评估入口它直接读取实验配置生成的检测与嵌入缓存驱动指定 tracker 完成逐序列回放再用仓库内置in-repo的 MOT 指标实现计算 HOTA、MOTA、IDF1 等完整评测报告。本文面向需要复现实验、对比不同 tracker、接入公开检测或验证后处理效果的开发者读完你将掌握 eval 的 CLI 与 Python 双入口、实验配置与数据集配置的选择规则、卡尔曼滤波噪声调优、TrackEval 独立对比以及 gsi/gbrc/gta 后处理链路的完整用法并能对照源码理解指标计算与输出产物的来龙去脉。eval 是什么用一行命令获得完整 MOT 评测eval模式的核心目标是对 MOT 风格的追踪运行结果进行打分。与track模式实时跑视频不同eval走的是缓存回放路径它复用generate阶段产出的检测dets与 ReID 嵌入embs缓存只运行 tracker 的逐帧更新逻辑随后对生成的 MOT 结果文件做指标计算。默认评测由仓库内置实现完成不需要安装外部指标包。该实现在 boxmot/engine/eval/motmetrics.py 中模块文档明确说明它镜像 BoxMOT 的 MOTChallenge 报告契约为 AABB 与 OBB 追踪结果文件提供 HOTA、CLEAR、Identity 和 Count 四类汇总并且刻意自包含self-contained使评估不依赖外部指标包安装。一次标准评估同时输出三类核心指标HOTA—— 综合追踪质量整体精度与关联精度的几何平均MOTA—— CLEAR 风格的综合质量漏检、误检与 ID 切换的加权IDF1—— 身份一致性完整的指标族还包括关联质量AssA/AssRe、身份切换IDSW、身份转移诊断IDt/IDa/IDm、身份数量IDs/GT_IDs等。默认的终端汇总保持紧凑IDt、IDa、IDm这些诊断值会出现在返回的指标字典和 CI JSON 输出中。两种入口CLI 与 Python 门面CLI 方式boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --verbosePython 方式from boxmot import BoxMOT boxmot BoxMOT(detectoryolov8n, reidlmbn_n_duke, trackerboosttrack) metrics boxmot.val(experimentmot17-ablation-yolox-lmbn) print(metrics)Python 入口是BoxMOT.val(...)定义在 boxmot/api/pipeline.py。它负责把探测器、ReID 模型、tracker 与实验配置组装成评估参数然后调用 boxmot/engine/eval/evaluator.py 中的run_eval完成完整流水线最后返回一个ValidationResult对象封装在boxmot.engine.workflows.results中其中既包含原始指标字典、汇总摘要也包含实验目录、计时统计与可选的 TrackEval 参考结果。从源码看val(...)默认使用tracking_backendthread执行缓存回放并始终挂载EvalWorkflowReporter渲染进度面板。实验配置与数据集配置--experiment 与 --dataset 二选一当探测器与 ReID 模型需要由 CLI 选项或运行时默认值决定、而不是由实验配置固定时可以使用免模型model-free的数据集配置boxmot eval --dataset mot17 --split ablation --tracker boosttrack--dataset与--experiment是互斥的CLI 中通过_require_eval_input强制二选一同时传入会直接抛出UsageError见 boxmot/engine/cli.py。两者的定位差异在于--experiment选择一个实验 ID 或 YAML 文件例如mot17-ablation-yolox-lmbn或boxmot/configs/experiments/mot17/ablation-yolox-lmbn.yaml由配置一次性固定数据集、检测器、ReID 与检测来源。当必须通过配置锁死 detector、ReID 与 detection-source 选择时实验是可复现的选项。--dataset接受数据集 ID 或 YAML 文件例如mot17或boxmot/configs/datasets/mot17.yaml探测器与 ReID 模型则来自 CLI 选项或运行时默认值--split可覆盖数据集划分train/val/test/ablation。一个典型的实验配置文件结构如下boxmot/configs/experiments/mot17/ablation-yolox-lmbn.yamlid: mot17-ablation-yolox-lmbn dataset: ref: mot17 split: ablation detections: source: model # 使用模型检测 model: ref: yolox-x-mot17 checkpoint: ablation reid: ref: lmbn-n-duke evaluation: class_map: pedestrian: person # 类别重映射MOT 的 pedestrian 映射为 personevaluation.class_map会参与apply_class_remap流程评估前根据检测器配置把 GT 类别 ID 重映射到与检测输出一致的空间并提取 distractor干扰类别ID 用于后续指标计算见 boxmot/engine/eval/evaluator.py。典型工作流generate 预计算 eval 复用缓存对于需要反复对比的实验推荐先generate再evalboxmot generate --experiment mot17-ablation-yolox-lmbn boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack这样eval直接复用预计算的检测与嵌入跳过耗时的模型推理。缓存布局遵循统一约定项目/dets_n_embs/dataset/split/detector-or-public-producer/ dets/sequence.npy embs/...检测缓存位于dets/下嵌入缓存位于embs/下并且进一步按 Python/C 生产者、模型格式与运行时、ReID 工件指纹、预处理策略与 crop-schema 版本分区见 docs/guides/experiments.md 的缓存布局说明。需要后续命令复用同一份缓存时应保持实验、划分、检测生产者、ReID 权重、后端与预处理覆盖一致。值得注意的是大多数缓存回放运行不读取图片——只有需要相机运动补偿CMC输入的 tracker 才会在回放时加载帧boxmot/engine/eval/replay.py 中通过needs_images hasattr(tracker_obj, cmc) and tracker_obj.cmc is not None判断。如果序列目录里没有真实帧文件且没有嵌入可用回放会为检测补充空嵌入张量以保证 tracker 仍能推进状态。公开检测Public detectionsMOT 系列的公开检测如 FRCNN、SDP、DPM可以直接选用对应实验boxmot eval --experiment mot17-ablation-frcnn-lmbn --tracker boosttrack boxmot eval --experiment mot17-ablation-sdp-lmbn --tracker boosttrack boxmot eval --experiment mot17-ablation-dpm-lmbn --tracker boosttrack所选的实验会在中央工件配置中指明公开检测来源例如 boxmot/configs/experiments/mot17/ablation-frcnn-lmbn.yamldetections: source: public name: frcnn与之对应的兼容选项--detection-source只接受public或private两个取值见 boxmot/engine/cli.pypublic读取序列目录下det/det.txtprivate运行配置的检测器模型。不过当具体公开生产者FRCNN/SDP/DPM对结果有影响时使用来源特定的实验 ID 才是可复现的做法因为--detection-source无法精确区分三者。公开检测缓存会被解析到检测缓存树的对应位置其 ReID 嵌入会被自动生成。关于公开检测的解析细节可参考 Experiment Workflows。卡尔曼滤波噪声调优--tune-kf 与 adaptive_kf离线调优--tune-kf对基于卡尔曼滤波运动模型的 tracker可以在追踪前用缓存的检测与 GT 逐序列估计过程噪声与测量噪声Q/R 矩阵boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --tune-kf该选项要求缓存检测与 GT 可用。在run_eval中--tune-kf会调用 boxmot/motion/kalman_filters/calibration.py 的run_kf_tuning并依据 tracker 类型选择参数化方式tracker_kf_type对xywh/xyah/xysr类滤波器估计std_weight_position与std_weight_velocity并写入BaseKalmanFilter的类级默认值对xyhr类则构造全局 逐类的 Q/R 噪声注册表见 boxmot/engine/eval/replay.py 的_apply_kf_tuning_to_runtime。tune模式下该参数只估计一次并供所有 trial 复用boxmot tune --experiment mot17-ablation-yolox-lmbn --tracker botsort --tune-kf --n-trials 20在线自适应adaptive_kf--tune-kf需要 GT而真实部署场景往往没有 GT。此时boosttrack与occluboost暴露了adaptive_kf这一tracker 配置项不是 CLI 标志通过 Mehra (1970) 方法在线估计噪声。Python 门面可以直接覆盖它from boxmot import BoxMOT boxmot BoxMOT( detectoryolov8n, reidlmbn_n_duke, trackerboosttrack, tracker_kwargs{adaptive_kf: True}, ) metrics boxmot.val(experimentmot17-ablation-yolox-lmbn)在回放路径中adaptive_kf通过 CLI 参数传入并在运行时把tracker_runtime.tracker.adaptive_kf置为True见 boxmot/engine/eval/replay.py。与 TrackEval 独立对比安装可选的 TrackEval 参考实现后可以请求一次独立对比uv sync --extra yolo --extra trackeval boxmot eval --experiment mot17-ablation-yolox-lmbn \ --tracker boosttrack \ --compare-trackeval报告会先展示 BoxMOT 内置指标随后附加Δ vs TrackEval差值行。TrackEval 读取生成的 MOT 文件并运行它自己的 MOTChallenge 预处理包括 distractor 移除。该对比目前支持 AABB 的 MOT15、MOT16、MOT17 与 MOT20 基准。从源码看run_trackeval_reference会校验评测框类型必须为aabbOBB 会直接报错要求标准 MOTChallenge 序列/GT 布局并通过_resolve_trackeval_benchmark从配置或参数中正则匹配MOT15/16/17/20基准名见 boxmot/engine/eval/evaluator.py。对比结果会作为reference_raw与reference_nameTrackEval一并封装进ValidationResult。后处理管道gsi / gbrc / gtaeval可以在打分前对 MOT 结果文件应用可选后处理多个步骤用逗号串联并按顺序执行# 单步GSI boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --postprocessing gsi # 链式GSI 先运行GTA 读取 GSI 的输出 boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --postprocessing gsi,gta可用步骤步骤说明gsiGaussian-smoothed interpolation —— 线性插值补洞再用高斯过程平滑轨迹gbrcGradient-boosting reconnection —— 基于GradientBoostingRegressor的 ML 插值与平滑gtaGlobal tracklet association —— 跨全序列的离线 split-and-connect依赖缓存的 ReID 嵌入支持的步骤集合由 boxmot/postprocessing/registry.py 统一暴露supported_postprocessors()返回(gsi, gbrc, gta)未知步骤在回放阶段会被直接拒绝ValueError。警告链式步骤原地覆盖链式串联多个步骤时每个步骤都会读取实验目录下的 MOT 结果文件、转换并写回同一目录。第二个步骤操作的是第一个步骤的输出而非原始 tracker 输出。实现细节上链式解析发生在 boxmot/engine/eval/replay.py 的run_generate_mot_results按逗号拆分为步骤列表逐步骤调用create_postprocessor(...).run(mot_results_folderexp_dir, ...)。其中gta比较特殊它需要从dets_n_embs缓存树解析出检测目录与嵌入目录若无 ReID 嵌入例如非 ReID tracker会被跳过并给出提示——因此想使用--postprocessing gta应搭配 ReID tracker如 botsort、deepocsort。gta还会触发 tracker 的在线 flushflush_gta把补洞条目追加进 MOT 输出。原生 C 回放使用--tracker-backend cpp让缓存回放阶段跑在原生 tracker 实现上boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker bytetrack --tracker-backend cpp boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker ocsort --tracker-backend cpp原生回放当前支持botsort、bytetrack、ocsort、occluboost与sfsort。实现选择通过独立的--tracker-backend选项完成tracker 名称不接受:cpp后缀。CLI 还提供兼容别名--tracking-backend cppprocess/thread/cpp三选一见 boxmot/engine/cli.py。当--tracking-backend cpp与--tracker-backend python冲突时会被直接拒绝。C 回放同样复用检测缓存而嵌入缓存的生产者身份取决于实际生成向量的 Python/C 实现而非消费它的 tracker 算法。编译与 ReID 相关说明参见 Native C Integration。此外docs/guides/experiments.md 规定若要发布某个原生实现的 README 基准值必须与对应 Python 值保持同实验、同置信度阈值、同划分、同缓存生产者与同指标聚合方式且 HOTA/MOTA/IDF1 差异须在 0.25 个百分点以内。主要输出与指标解读一次eval运行产出的内容组合基准指标combined benchmark metrics如HOTA、MOTA、IDF1逐序列汇总per-sequence summaries可选的运行计时汇总--show-timingMOT 风格的 tracker 输出文件每序列一个seq.txt复用的缓存路径与运行目录中的评估工件关于评测执行模型从 boxmot/engine/eval/motmetrics.py 可以看到指标计算会把相互独立的序列分派到独立 worker 进程worker 数为序列数与逻辑 CPU 数减二两者中的较小值且至少为 1该数量独立于--n-threads单序列场景在调用进程中直接评估结果保持确定性的序列顺序。若序列无输出行回放会创建空占位文件以保证评估不中断boxmot/engine/eval/replay.py。核心指标速查详见 Evaluation and PostprocessingHOTA整体追踪质量MOTACLEAR 风格汇总质量IDF1身份一致性AssA/AssRe关联质量 / 关联召回IDSWGT 身份切换到 tracker ID 的次数IDttracker ID 转移到另一 GT 身份的次数IDa切换到此前未匹配 tracker ID 的次数IDm转移到此前未匹配 GT 身份的次数IDs/GT_IDstracker 与 GT 身份数量HOTA 在实现中基于 19 个 alpha 阈值np.arange(0.05, 0.99, 0.05)见HOTA_ALPHA_VALUES逐阈值计算DetA/AssA后取均值HOTA sqrt(DetA * AssA)CLEAR 组按 0.5 匹配阈值统计 TP/FN/FP 与 IDSW 后推导 MOTA/MOTPIdentity 组通过最大权匹配求解 IDTP/IDFP/IDFN 再计算 IDF1。除 AABB 外同一套实现还支持 OBB13 列角点格式评估OBB 下会额外输出cls_comb_cls_av、cls_comb_det_av以及HUMAN/VEHICLE/BIKE超类汇总。eval还在流程末尾main中基于HOTA、MOTA、IDF1三项绘制雷达图并保存到实验目录boxmot/engine/eval/evaluator.py便于快速横向比较不同 tracker。常用命令速查# 标准评估实验配置驱动 boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack # 免模型数据集配置 boxmot eval --dataset mot17 --split ablation --tracker boosttrack # 带后处理链 boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --postprocessing gsi,gta # KF 噪声调优 boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --tune-kf # 公开检测FRCNN boxmot eval --experiment mot17-ablation-frcnn-lmbn --tracker boosttrack # 原生 C 回放 boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker bytetrack --tracker-backend cpp # 与 TrackEval 独立对比 boxmot eval --experiment mot17-ablation-yolox-lmbn --tracker boosttrack --compare-trackevaleval子命令完整参数由 Click 定义在 boxmot/engine/cli.py可通过boxmot eval --help查看。常用参数包括--conf最低置信度默认读检测器配置、--iouNMS IoU 阈值、--device如0、0,1,2,3或cpu、--n-threads解码与缓存追踪的 CPU worker 预算、--split覆盖数据集划分、--detection-sourcepublic/private、--postprocessingnone/gsi/gbrc/gta逗号串联按序应用、--tune-kf、--compare-trackeval、--tracker-backendpython/cpp以及--show-timing等。延伸阅读Evaluation and Postprocessing指标定义、检测来源、KF 调优与后处理的完整指南Experiment Workflows缓存复用、MMOT 实验 ID 与回放图像加载行为Experiment Configs实验配置的编写规范Native C Integration原生 tracker 回放的构建要求与 ReID 说明【免费下载链接】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),仅供参考
返回列表