- 人工智能
- 计算机视觉
- 深度学习
- 模型评测
【免费下载链接】mmdetection
OpenMMLab Detection Toolbox and Benchmark
本文面向需要在 MMDetection 中配置与调优多目标跟踪(MOT)任务的开发者,系统讲解该仓库以 Python 文件为核心的模块化、可继承配置系统,覆盖跟踪任务完整配置的各字段语义、--cfg-options命令行覆写技巧、configs/_base_组件继承机制、配置文件命名规范,以及跟踪任务特有的TrackDataSample数据结构与UniformRefFrameSample关键帧采样管线,并给出 SORT、DeepSORT、ByteTrack 等真实可运行的配置示例。读完本文,你将能够独立阅读、修改、继承并调试任何 MOT 配置文件。
一、配置系统的总体设计
MMDetection(OpenMMLab Detection Toolbox)采用Python 文件作为配置系统,所有已提供的配置文件都位于仓库的 configs 目录下,例如 configs/sort、configs/deepsort、configs/bytetrack 等。配置系统被设计为模块化 + 继承化:
- 模块化:将数据集、模型、训练策略等拆分为独立文件,可自由组合;
- 继承化:通过
_base_字段继承其他配置文件,避免重复编写,极大方便实验对比。
如果你想查看某个配置被解析并合并后的完整最终形态,可以运行:
python tools/misc/print_config.py /PATH/TO/CONFIG例如:
python tools/misc/print_config.py configs/bytetrack/bytetrack_yolox_x_8xb4-80e_crowdhuman-mot17halftrain_test-mot17halfval.py该脚本定义于 tools/misc/print_config.py,它会用mmengine.config.Config.fromfile读取配置、展开${key}变量引用(replace_cfg_vals)、并根据环境变量更新data_root(update_data_root),最终打印继承合并后的完整配置。它还支持--save-path将完整配置另存为.py、.json或.yml文件,便于追溯与分享实验记录。
二、完整配置的字段构成
一个完整的跟踪任务配置文件通常包含以下主要字段,理解它们的语义是上手的第一步:
| 字段 | 作用 | 跟踪任务中的典型取值 |
|---|---|---|
model | 模型整体配置,包含data_preprocessor、detector、reid、tracker(内含motion运动模型)等子模块,以及train_cfg、test_cfg | type='DeepSORT'/type='ByteTrack'/type='SORT' |
train_dataloader | 训练数据加载配置,包含batch_size、num_workers、sampler、dataset、persistent_workers等 | sampler=dict(type='TrackImgSampler') |
val_dataloader | 验证数据加载配置,与训练类似 | 与测试共用,见下 |
test_dataloader | 测试数据加载配置 | test_dataloader = val_dataloader |
val_evaluator | 验证评估器 | type='MOTChallengeMetric', metric=['HOTA', 'CLEAR', 'Identity'] |
test_evaluator | 测试评估器,通常与验证评估器一致 | 同上 |
train_cfg | 训练循环配置 | type='EpochBasedTrainLoop',如 ByteTrack 的 80 epoch 训练 |
val_cfg | 验证循环配置 | type='ValLoop' |
test_cfg | 测试循环配置 | type='TestLoop' |
default_hooks | 默认钩子:计时、日志、参数调度、检查点、随机种子、可视化 | visualization=dict(type='TrackVisualizationHook', draw=False) |
vis_backends | 可视化后端 | 默认type='LocalVisBackend' |
visualizer | 可视化器 | MOT 任务使用type='TrackLocalVisualizer' |
param_scheduler | 参数调度器,通常设置学习率策略 | CosineAnnealingLR+QuadraticWarmupLR等 |
optim_wrapper | 优化器封装:优化器类型、学习率、梯度裁剪等 | dict(type='OptimWrapper', optimizer=dict(type='SGD', lr=0.02, ...)) |
load_from | 预训练权重加载路径 | 检测器或 ReID 模型的预训练 checkpoint |
resume | 布尔值,为True时从load_from指定的 checkpoint 恢复训练到对应迭代/轮次 | 断点续训时使用 |
2.1 以 SORT 配置为例解读字段
以 configs/sort/sort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py 为例,其_base_继承自三个基础文件:
_base_ = [ '../_base_/models/faster-rcnn_r50_fpn.py', '../_base_/datasets/mot_challenge.py', '../_base_/default_runtime.py' ]随后它把继承来的检测器提取出来改造为跟踪任务的检测器:
detector = _base_.model detector.pop('data_preprocessor') detector.rpn_head.bbox_coder.update(dict(clip_border=False)) detector.roi_head.bbox_head.update(dict(num_classes=1)) # MOT 只有 pedestrian 一类 detector['init_cfg'] = dict( type='Pretrained', checkpoint='https://download.openmmlab.com/mmtracking/mot/' 'faster_rcnn/faster-rcnn_r50_fpn_4e_mot17-half-64ee2ed4.pth') del _base_.model然后组装最终的跟踪模型,其中tracker.motion使用卡尔曼滤波:
model = dict( type='DeepSORT', data_preprocessor=dict( type='TrackDataPreprocessor', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], bgr_to_rgb=True, rgb_to_bgr=False, pad_size_divisor=32), detector=detector, tracker=dict( type='SORTTracker', motion=dict(type='KalmanFilter', center_only=False), obj_score_thr=0.5, match_iou_thr=0.5, reid=None))注意model.data_preprocessor使用的是跟踪任务专属的 TrackDataPreprocessor(定义于 track_data_preprocessor.py),它在检测预处理的基础上支持视频帧批量处理;train_dataloader = None、train_cfg = None表示该 SORT 配置只做推理评测、不训练。
2.2 MOT Challenge 数据集与评估器配置
跟踪任务的数据集与评估器基础配置在 configs/base/datasets/mot_challenge.py:
dataset_type = 'MOTChallengeDataset' data_root = 'data/MOT17/' img_scale = (1088, 1088) val_evaluator = dict( type='MOTChallengeMetric', metric=['HOTA', 'CLEAR', 'Identity']) test_evaluator = val_evaluatorMOTChallengeMetric的实现位于 mmdet/evaluation/metrics/mot_challenge_metric.py,其allowed_metrics = ['HOTA', 'CLEAR', 'Identity'],默认前缀为motchallenge-metric,即 MOT Challenge 官方的三组指标。它继承自BaseVideoMetric,能够对视频级预测进行统一评测。
三、通过脚本参数就地修改配置
当使用 tools/train.py 训练或 tools/test_tracking.py 评测跟踪模型时,都可以通过--cfg-options参数就地修改配置而无需改动配置文件本身。跟踪任务的测试脚本还额外提供了--detector、--reid参数,可分别指定检测器与 ReID 模型的 checkpoint。下面分类说明--cfg-options的三种用法。
3.1 更新 dict 链中的配置键
按照原始配置中dict键的层级顺序即可定位目标键。例如,将模型主干中所有 BN 模块设置为训练模式:
python tools/test_tracking.py \ configs/deepsort/deepsort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py \ --checkpoint /path/to/checkpoint.pth \ --cfg-options model.detector.backbone.norm_eval=False该命令会沿model -> detector -> backbone -> norm_eval的键路径定位并改写配置值。
3.2 更新配置列表中的关键字
某些配置的dict关键字以列表形式组织,例如测试数据管线test_dataloader.dataset.pipeline是一个列表:
[dict(type='LoadImageFromFile'), ...]如果想将测试管线中的首元素LoadImageFromFile换成LoadImageFromWebcam(摄像头实况推理),使用下标索引定位:
--cfg-options test_dataloader.dataset.pipeline.0.type=LoadImageFromWebcam这里.0即列表第一个元素的下标,type是其待修改字段。
3.3 更新列表/元组的值
被修改的目标本身可能是列表或元组,例如修改data_preprocessor的均值:
--cfg-options model.data_preprocessor.mean=[0,0,0]注意:
--cfg-options的取值中不允许出现空格,否则命令行解析会出错;如需复杂结构(如嵌套列表),应使用引号包裹并按 MMEngine 的 DictAction 规则书写。
关于--cfg-options的完整解析规则(包括列表/元组/嵌套值的写法),详见 MMEngine 官方配置文档中关于“命令行覆写”的章节,本仓库的 tools/test_tracking.py 与 tools/misc/print_config.py 均使用DictAction实现相同语义。
四、配置文件结构与继承机制
4.1 三种基础组件类型
configs/base目录下有三类基础组件,可用它们灵活拼装各种跟踪方法(如 SORT、DeepSORT、ByteTrack):
- datasets:数据集与数据管线,如 mot_challenge.py;
- models:模型结构,如 faster-rcnn_r50_fpn.py;
- default_runtime.py:默认运行时配置,位于 configs/base/default_runtime.py。
由_base_中组件组合而成的配置称为基元配置(primitive config)。工程实践上有两条约定:
- 同一文件夹下建议只保留一个基元配置文件,其余文件均从基元继承;
- 继承层级最大为 3,避免链条过深难以排查。
4.2 继承已有方法 vs 新建方法
如果是在既有方法(如 Faster R-CNN)基础上做修改,应优先继承:先通过_base_指定继承源,再覆写必要字段。例如 ByteTrack 直接继承 YOLOX 的 COCO 配置 configs/yolox/yolox_x_8xb8-300e_coco.py:
_base_ = ['../yolox/yolox_x_8xb8-300e_coco.py'](见 configs/bytetrack/bytetrack_yolox_x_8xb4-80e_crowdhuman-mot17halftrain_test-mot17halfval.py)。如果新方法与任何现有方法都不共享结构,则在configs下新建一个method_name文件夹,从_base_的三类组件组装。
4.3 忽略基元中的某些字段:_delete_=True
继承时若想丢弃基元配置中的某个字段,可将其值设为_delete_=True。典型场景是 ByteTrack 配置完全重写训练数据管线:
train_dataloader = dict( _delete_=True, # 丢弃基元中的 train_dataloader batch_size=batch_size, sampler=dict(type='DefaultSampler', shuffle=True), ...)在 configs/bytetrack/bytetrack_yolox_x_8xb4-80e_crowdhuman-mot17halftrain_test-mot17halfval.py 中,train_dataloader、val_dataloader、val_evaluator、default_hooks.checkpoint等多个字段都使用了_delete_=True来彻底替换继承内容。关于_delete_的完整语义(合并规则、嵌套行为),参见 MMEngine 配置文档中的“继承与合并”章节。
五、配置命名风格
MMDetection 采用如下命名规范,贡献者应遵循:
{method}_{module}_{train_cfg}_{train_data}_{test_data}各段含义如下:
{method}:方法名,例如sort、deepsort、bytetrack;{module}:方法的基本模块,例如faster-rcnn_r50_fpn、yolox_x;{train_cfg}:训练配置,通常包含批量大小与迭代次数,例如8xb2-4e(8 卡、batch 2、4 epoch)、8xb4-80e;{train_data}:训练数据集,例如mot17halftrain、crowdhuman;{test_data}:测试数据集,例如test-mot17halfval。
以实际文件 configs/sort/sort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py 为例:方法为 SORT,检测器为 Faster R-CNN R50 + FPN,训练配置为 8 卡 × batch 2、4 epoch,在 MOT17 half-train 上训练、在 MOT17 half-val 上测试。该命名规则使文件名本身就是一份可读的“实验说明书”。
六、跟踪数据结构与数据管线深入
MMDetection 跟踪任务以视频为单位组织数据集,并使用TrackDataSample描述数据信息,这是与常规检测(逐帧DetDataSample)最本质的区别。
6.1 TrackDataSample:多帧检测样本的包装器
TrackDataSample的实现位于 mmdet/structures/track_data_sample.py。它本质上可视为多个DetDataSample的包装器:
- 核心属性
video_data_samples:一个由DetDataSample组成的列表,列表中的每个元素对应视频中的一帧;通过下标即可取出某一帧的gt_instances、pred_instances等; - 元信息(metainfo)与检测不同:每个键对应的值是一个列表,列表元素依次对应各帧的信息;
- 额外携带两个关键索引元信息:
key_frames_inds(关键帧索引)与ref_frames_inds(参考帧索引),用于剪辑(clip)训练; - 提供便捷方法
get_key_frames()、get_ref_frames()分别取回关键帧与参考帧样本; - 实现了
__len__、__getitem__以及to()、cpu()、cuda()、npu()、detach()、clone()等类张量方法,便于设备迁移与深拷贝。
该文件的 docstring 中附有完整可运行示例:构造两帧DetDataSample(含不同 shape 的gt_instances.bbox),装配成TrackDataSample后打印结构、取关键帧/参考帧、按帧索引取样本,并演示to('cuda')等操作。
6.2 UniformRefFrameSample:关键帧 + 参考帧采样
基于视频组织,MMDetection 提供了UniformRefFrameSample变换(定义于 mmdet/datasets/transforms/frame_sampling.py),用于均匀采样关键帧与参考帧,再配合TransformBroadcaster完成剪辑训练。其构造参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
num_ref_imgs | 1 | 要采样的参考帧数量 |
frame_range | 10 | 关键帧周围可采样的帧范围;传int时等价于[-frame_range, frame_range],传list时须为长度 2 且满足左端 ≤ 0、右端 ≥ 0 |
filter_key_img | True | 采样参考帧时是否过滤掉关键帧本身 |
collect_video_keys | ['video_id', 'video_length'] | 需要从视频级信息复制到帧级信息的键 |
采样算法(sampling_frames)的关键逻辑:
- 计算合法帧区间:
left = max(0, key_frame_id + frame_range[0])、right = min(key_frame_id + frame_range[1], video_length - 1); - 在合法区间内(默认剔除关键帧后)用
random.sample无放回抽取num_ref_imgs个参考帧;若合法帧不足,则将候选帧重复扩展后再采样; - 输出
sampled_frames_ids(关键帧 + 参考帧,排序)与key_frame_flags(标记各帧是否关键帧)。
在 configs/base/datasets/mot_challenge.py 的训练管线中,它作为第一步被调用:
train_pipeline = [ dict( type='UniformRefFrameSample', num_ref_imgs=1, frame_range=10, filter_key_img=True), dict( type='TransformBroadcaster', share_random_params=True, transforms=[ dict(type='LoadImageFromFile', backend_args=backend_args), dict(type='LoadTrackAnnotations'), dict( type='RandomResize', scale=img_scale, ratio_range=(0.8, 1.2), keep_ratio=True, clip_object_border=False), dict(type='PhotoMetricDistortion') ]), ... dict(type='PackTrackInputs') ]TransformBroadcaster负责将其中定义的变换广播到采样出的所有帧上;share_random_params=True表示各帧共享同一随机参数(如同一缩放),保证剪辑内帧间空间一致性;第二个TransformBroadcaster(RandomCrop)特意设置share_random_params=False,注释表明其目的是让不同帧裁剪位置不同,增加时序多样性。最后一个TransformBroadcaster的RandomFlip又回到共享参数模式。
6.3 视频级测试与图像级测试两种模式
得益于基于视频的数据组织,整个视频可以直接作为整体输入进行测试,逻辑更简洁直观。测试管线同样使用TransformBroadcaster包装逐帧变换,最后以PackTrackInputs打包(见 mot_challenge.py 的test_pipeline)。
但如果 GPU 显存无法容纳整段视频,MMDetection 也提供基于图像(image-based)的测试方法。两种方式的切换点在dataloader的sampler字段:
# 方式一:image-based(逐帧采样,显存友好) sampler=dict(type='TrackImgSampler') # 方式二:video-based(整段视频输入,更简洁直观) # sampler=dict(type='DefaultSampler', shuffle=False, round_up=False)TrackImgSampler的实现位于 mmdet/datasets/samplers/track_img_sampler.py。当前仓库的跟踪配置(SORT、DeepSORT、ByteTrack、QDTrack)默认采用 image-based 采样,同时在注释中保留 video-based 的切换方式,configs/qdtrack 的 README 也明确说明支持这两种评测/测试途径。
七、可视化与运行时配置
跟踪任务的可视化链路同样有专属组件:
visualizer:使用type='TrackLocalVisualizer',其实现位于 mmdet/visualization/local_visualizer.py,负责在视频帧上绘制检测框、轨迹与 ID;default_hooks.visualization:使用type='TrackVisualizationHook'(实现于 mmdet/engine/hooks/visualization_hook.py),draw=False表示训练/验证阶段不实际绘制图像,仅保留可视化能力;vis_backends:默认[dict(type='LocalVisBackend')],将可视化结果保存到本地。
典型配置片段(摘自 configs/deepsort/deepsort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py):
default_hooks = dict( logger=dict(type='LoggerHook', interval=1), visualization=dict(type='TrackVisualizationHook', draw=False)) vis_backends = [dict(type='LocalVisBackend')] visualizer = dict( type='TrackLocalVisualizer', vis_backends=vis_backends, name='visualizer') custom_hooks = [ # 每个 epoch 结束时同步 BN 的 running_mean / running_var 等模型缓冲区 dict(type='SyncBuffersHook') ]ByteTrack 配置中还叠加了YOLOXModeSwitchHook、SyncNormHook、EMAHook(指数滑动平均)等自定义钩子,以及三段式学习率调度(前 1 epoch 二次方 warmup → 余弦退火 → 最后 10 epoch 固定学习率),是学习复杂运行时配置的绝佳范例(configs/bytetrack/bytetrack_yolox_x_8xb4-80e_crowdhuman-mot17halftrain_test-mot17halfval.py)。
八、当前已知限制与后续规划
根据文档的“要做的事”部分,当前仓库在跟踪任务上存在两个已知限制:
- 部分算法不支持视频级测试:
StrongSORT、Mask2Former等算法对 GPU 显存要求较高,暂不支持基于视频的整体输入测试,未来会优化显存占用问题; - 不支持混合数据联合训练:暂时无法将基于视频的数据集(如
MOT Challenge)与基于图像的数据集(如用于QDTrack的Crowdhuman)进行联合训练,未来会优化此问题。
了解这些限制有助于在选型与实验设计阶段规避踩坑:例如训练含视频语义的任务时,优先选择支持视频级测试且对显存友好的方案。
九、实战速查:从零配置一个跟踪实验
最后给出配置与运行跟踪任务的最小流程:
- 选择基元:从 configs/base/datasets/mot_challenge.py、configs/base/models/faster-rcnn_r50_fpn.py、configs/base/default_runtime.py 出发;
- 继承并改造:在
configs/下新建方法文件夹,通过_base_继承,按上文 2.1 的方式提取检测器、替换data_preprocessor为TrackDataPreprocessor、装配tracker(含KalmanFilter运动模型)与可选的reid模块;DeepSORT 的 ReID 分支配置可参考 deepsort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py,其中reid使用mmpretrain.ResNet主干 +LinearReIDHead(分类损失 + Triplet 损失,输出 128 维特征); - 校验配置:用
python tools/misc/print_config.py <你的配置>查看合并后的完整配置; - 运行:
- 训练:tools/train.py;
- 测试/评测:tools/test_tracking.py,可用
--detector、--reid分别指定检测与重识别 checkpoint; - 临时调参:一律通过
--cfg-options完成,保持配置文件干净可复现。
配置是 MMDetection 跟踪任务的“入口语言”。掌握字段语义、继承规则、覆写技巧与视频级数据管线之后,无论是复现 SORT/DeepSORT/ByteTrack 等基线,还是设计新的跟踪算法,你都能在配置层高效完成实验编排。
- 人工智能
- 计算机视觉
- 深度学习
- 模型评测
【免费下载链接】mmdetection
OpenMMLab Detection Toolbox and Benchmark
相关推荐
Obsidian插件本地化革命:如何用智能翻译引擎打造完美中文工作空间
Obsidian插件本地化革命:如何用智能翻译引擎打造完美中文工作空间 还在为Obsidian插件的英文界面而困扰吗?想象一下,打开你最喜爱的笔记工具,所有插件
AI 应用开发工具大模型MMDetection 跟踪可视化实战指南:TrackVisualizationHook 与 TrackLocalVisualizer 的配置、原理与验证
MMDetection 跟踪可视化实战指南:TrackVisualizationHook 与 TrackLocalVisualizer 的配置、原理与验证 导读
人工智能计算机视觉深度学习模型评测Langfuse 仓库 turbo.json 配置实战:从任务管线到 Package 配置的完整指南
Langfuse 仓库 turbo.json 配置实战:从任务管线到 Package 配置的完整指南 本文以 Langfuse 开源仓库(AI 工程平台,覆盖
人工智能LLMOps可观测性AI 评测LLM 网关后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考