MMDetection 多目标跟踪推理实战:使用 mot_demo.py 推理视频与图像序列
【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection
MMDetection 在demo/mot_demo.py中提供了面向多目标跟踪(MOT)与视频实例分割(VIS)的官方推理脚本,支持对一段mp4视频或一个包含连续帧图片的文件夹执行端到端推理,并输出可视化结果。本文以 docs/zh_cn/user_guides/tracking_interference.md 为骨架,结合仓库中demo/mot_demo.py、mmdet/apis/inference.py及configs/sort/、configs/qdtrack/等真实配置,完整讲解mot_demo.py的命令行用法、参数含义、两种权重加载方式的差异,以及脚本底层的逐帧推理流程,读完即可对 ByteTrack、OCSORT、QDTrack、DeepSORT 等跟踪模型完成开箱即用的视频推理。
一、输入与输出形式:视频文件与图像文件夹
mot_demo.py支持两种输入:
mp4视频文件:脚本内部通过mmcv.VideoReader读取,逐帧送入跟踪模型;- 连续图片文件夹:脚本会扫描目录下的图片并按其文件名排序后作为视频帧序列推理。
使用文件夹作为输入时,图片命名必须易于整理(sortable),即文件名中要包含数字信息,以便脚本能根据数字重新排列图像顺序。从源码实现看,这一排序逻辑位于 demo/mot_demo.py:
if osp.isdir(args.inputs): imgs = sorted( filter(lambda x: x.endswith(IMG_EXTENSIONS), os.listdir(args.inputs)), key=lambda x: int(x.split('.')[0])) in_video = False即先按扩展名过滤图片,再以文件名中.之前的部分解析为整数进行升序排序。因此推荐采用000001.jpg、000002.jpg、000003.jpg这类带前导零的命名方式,避免出现2.jpg排在10.jpg之后的字典序问题。目前脚本只支持读取文件名以.jpg、.jpeg、.png结尾的图片(见脚本顶部的IMG_EXTENSIONS = ('.jpg', '.jpeg', '.png'))。
输出同样支持两种形式:
- 指定
--out xx.mp4:脚本先把逐帧可视化结果写入临时目录,推理结束后通过mmcv.frames2video(out_path, args.out, fps=fps, fourcc='mp4v')合成 mp4 视频; - 指定
--out xx/(非 mp4 路径):逐帧结果以%06d.jpg命名写入该文件夹; - 二者都不指定:必须搭配
--show实时弹窗显示视频,源码中通过assert args.out or args.show强制保证结果可被观察。
二、命令格式与参数详解
mot_demo.py的完整命令格式如下:
python demo/mot_demo.py \ ${INPUTS} \ ${CONFIG_FILE} \ [--checkpoint ${CHECKPOINT_FILE}] \ [--detector ${DETECTOR_FILE}] \ [--reid ${REID_FILE}] \ [--score-thr ${SCORE_THR}] \ [--device ${DEVICE}] \ [--out ${OUTPUT}] \ [--show]其中INPUTS为输入视频或图片文件夹路径,CONFIG_FILE为跟踪模型的配置文件,两者为必填位置参数;其余均为可选参数,含义整理如下:
| 参数 | 说明 |
|---|---|
--checkpoint ${CHECKPOINT_FILE} | 可选。端到端跟踪模型(含跟踪头与 ReID 分支的完整模型)的权重文件。 |
--detector ${DETECTOR_FILE} | 可选。检测器的权重文件,SORT/DeepSORT/StrongSORT 等先检测后关联的算法需要单独加载。 |
--reid ${REID_FILE} | 可选。ReID(行人重识别)分支的权重文件,同样用于 SORT/DeepSORT/StrongSORT。 |
--score-thr ${SCORE_THR} | bboxes 的得分阈值,低于该阈值的检测框会被过滤。源码中类型为float,默认值0.0(见 demo/mot_demo.py)。 |
--device ${DEVICE} | 推理设备,可选cpu、cuda:0等。源码默认cuda:0。 |
--out ${OUTPUT} | 输出可视化结果的路径,支持 mp4 视频或文件夹两种格式。 |
--show | 是否即时显示视频。 |
此外,脚本还支持一个原文档未列出的--fps参数(见 demo/mot_demo.py),用于指定输出视频的帧率;若未显式给出且输入为视频,脚本会自动采用输入视频自身的fps;若输入为图片文件夹且需要输出视频或--show,则必须通过--fps指定帧率,否则会抛出ValueError('Please set the FPS for the output video.')。
三、两种权重加载方式:--checkpoint 与 --detector/--reid
这是使用mot_demo.py时最容易混淆的一点,原文档特别强调了两类算法的差异:
- SORT、DeepSORT、StrongSORT:这类算法将「检测」与「数据关联(含 ReID 特征提取)」拆分为独立组件,推理时需要分别加载检测器和 ReID 分支的权重,因此使用
--detector与--reid两个参数; - ByteTrack、OCSORT、QDTrack、MaskTrackRCNN、Mask2Former:这类算法以端到端(或整体封装)的方式给出完整模型权重,直接使用
--checkpoint加载即可。
这一约束在底层有严格的互斥校验。init_track_model(位于 mmdet/apis/inference.py)中依次处理三种权重来源:
if checkpoint is not None: checkpoint = load_checkpoint(model, checkpoint, map_location='cpu') ... if detector is not None: assert not (checkpoint and detector), \ 'Error: checkpoint and detector checkpoint cannot both exist' load_checkpoint(model.detector, detector, map_location='cpu') if reid is not None: assert not (checkpoint and reid), \ 'Error: checkpoint and reid checkpoint cannot both exist' load_checkpoint(model.reid, reid, map_location='cpu')可以看到:--checkpoint与--detector、--checkpoint与--reid不能同时出现,否则直接断言报错;而--detector与--reid可以同时使用(SORT 系列正是这种用法)。加载后init_track_model会把配置文件保存到model.cfg并执行model.to(device)与model.eval()。
以 configs/sort/sort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py 为例,其model配置为type='DeepSORT',内部包含detector=detector与tracker=dict(type='SORTTracker', ...)。其中检测器通过init_cfg = dict(type='Pretrained', checkpoint='https://.../faster-rcnn_r50_fpn_4e_mot17-half-64ee2ed4.pth')在配置层面预置了官方预训练权重地址,tracker中还设置了obj_score_thr=0.5、match_iou_thr=0.5等关联参数——这正是文档示例 1 中「只传--detector不传--checkpoint」的原因:SORT/DeepSORT 的检测器权重需要单独指定,而 ReID 分支权重则通过--reid传入。
四、实战示例
原文档给出了两类算法的典型调用方式,下面完整保留并结合仓库配置补充说明。
示例 1:SORT 系列,使用--detector(不指定--checkpoint)
python demo/mot_demo.py \ demo/demo_mot.mp4 \ configs/sort/sort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py \ --detector \ https://download.openmmlab.com/mmtracking/mot/faster_rcnn/faster-rcnn_r50_fpn_4e_mot17-half-64ee2ed4.pth \ --out mot.mp4说明:示例中的权重地址即上述配置文件中detector.init_cfg.checkpoint所指的官方预训练权重;若使用本地权重,将--detector后跟的 URL 替换为本地.pth路径即可。需要 ReID 分支的 DeepSORT/StrongSORT 变体还需追加--reid ${REID_FILE}。
示例 2:QDTrack 等端到端算法,使用--checkpoint
python demo/mot_demo.py \ demo/demo_mot.mp4 \ configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py \ --checkpoint https://download.openmmlab.com/mmtracking/mot/qdtrack/mot_dataset/qdtrack_faster-rcnn_r50_fpn_4e_mot17_20220315_145635-76f295ef.pth \ --out mot.mp4对应的 QDTrack 配置文件继承自 configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_4e_base.py,并在评测阶段使用CocoVideoMetric与MOTChallengeMetric(HOTA/CLEAR/Identity)评估跟踪质量。如需查看 ByteTrack、OCSORT、MaskTrackRCNN、Mask2Former 等算法的可用配置与官方权重,可分别查阅 configs/bytetrack、configs/ocsort、configs/masktrack_rcnn、configs/mask2former_vis 目录,权重下载地址通常记录在各算法配置的init_cfg或对应metafile.yml中。
五、源码级原理:从命令行到逐帧输出
理解mot_demo.py的执行链路有助于排查问题、定制推理流程。脚本主流程可分为四步(对应 demo/mot_demo.py):
1. 加载输入并定义输出
如前所述,目录输入按文件名数字排序,视频输入通过mmcv.VideoReader读取;若输出为 mp4,则先创建临时目录存放逐帧图,结束后再合成为视频。
2. 构建模型与可视化器
init_default_scope('mmdet') model = init_track_model( args.config, args.checkpoint, args.detector, args.reid, device=args.device) visualizer = VISUALIZERS.build(model.cfg.visualizer) visualizer.dataset_meta = model.dataset_metainit_default_scope('mmdet')用于将mmdet注册表设为默认作用域,保证配置中形如TrackDataPreprocessor、TrackLocalVisualizer等组件能被正确解析。可视化器直接取自配置中的visualizer字段,例如 SORT 配置中使用的TrackLocalVisualizer。
3. 逐帧调用inference_mot推理
result = inference_mot(model, img, frame_id=i, video_len=len(imgs))inference_mot(见 mmdet/apis/inference.py)将当前帧包装为dict(img=..., frame_id=..., ori_shape=..., img_id=..., ori_video_length=...),随后调用build_test_pipeline(cfg)构造测试数据流水线。这里有一个值得注意的细节:build_test_pipeline(见同文件 mmdet/apis/inference.py)会从原test_dataloader的 pipeline 中移除LoadImageFromFile与LoadTrackAnnotations,仅保留Resize变换与PackTrackInputs,因为图像已由mmcv.imread预先读入内存,且推理阶段不需要加载标注。数据经default_collate组织成 batch 后,在torch.no_grad()下执行model.test_step(data),返回TrackDataSample列表。
4. 渲染与输出
visualizer.add_datasample负责绘制跟踪框、ID 与轨迹,pred_score_thr=args.score_thr即上文提到的得分阈值过滤。每帧通过mmengine.ProgressBar显示进度,全部处理完毕后由mmcv.frames2video合成最终 mp4(帧率取--fps或输入视频原帧率)。
从模型侧看,mot_demo.py覆盖了仓库中BaseMOTModel的两类子类:一类是多目标跟踪模型(位于 mmdet/models/mot,如DeepSORT、ByteTrack、OCSORT、QDTrack、StrongSORT),一类是视频实例分割模型(位于 mmdet/models/vis,如MaskTrackRCNN、Mask2FormerVideo)。它们各自配合mmdet/models/trackers下的SORTTracker、ByteTracker、OCSORTTracker、QuasiDenseTracker、StrongSORTTracker、MaskTrackRCNNTracker等跟踪器实现帧间数据关联。
六、进阶阅读
围绕跟踪任务的完整工作流,本仓库还提供了以下配套文档,可结合使用:
- docs/zh_cn/user_guides/tracking_config.md:跟踪模型的配置文件说明,涵盖检测器、跟踪器、数据预处理器等字段;
- docs/zh_cn/user_guides/tracking_train_test_zh_cn.md:跟踪模型的训练与测试命令;
- docs/zh_cn/user_guides/tracking_dataset_prepare.md:MOT17/MOT20 等数据集的准备流程;
- docs/zh_cn/user_guides/tracking_visualization.md 与 docs/zh_cn/user_guides/tracking_analysis_tools.md:结果可视化与跟踪指标分析工具。
如需对单张图片或普通检测模型(非跟踪)做推理,可改用 demo/image_demo.py 及 docs/zh_cn/user_guides/inference.md 中的通用推理入口。
综上,mot_demo.py是 MMDetection 跟踪能力最直接的落地点:只需准备一段视频(或按数字命名的图片序列)、一份跟踪配置与对应权重,即可在cpu或cuda上完成逐帧检测、关联与可视化输出。实践中请务必牢记两点:文件夹输入要保证文件名可排序、仅支持.jpg/.jpeg/.png;SORT 系列用--detector/--reid拆分加载权重,其余端到端算法用--checkpoint加载,二者不可混用。
【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考