MMDetection 多目标跟踪推理实战:使用 mot_demo.py 推理视频与图像序列

MMDetection 多目标跟踪推理实战:使用 mot_demo.py 推理视频与图像序列 MMDetection 多目标跟踪推理实战使用 mot_demo.py 推理视频与图像序列【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetectionMMDetection 在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.pyif osp.isdir(args.inputs): imgs sorted( filter(lambda x: x.endswith(IMG_EXTENSIONS), os.listdir(args.inputs)), keylambda 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, fpsfps, fourccmp4v)合成 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_locationcpu) ... if detector is not None: assert not (checkpoint and detector), \ Error: checkpoint and detector checkpoint cannot both exist load_checkpoint(model.detector, detector, map_locationcpu) if reid is not None: assert not (checkpoint and reid), \ Error: checkpoint and reid checkpoint cannot both exist load_checkpoint(model.reid, reid, map_locationcpu)可以看到--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配置为typeDeepSORT内部包含detectordetector与trackerdict(typeSORTTracker, ...)。其中检测器通过init_cfg dict(typePretrained, checkpointhttps://.../faster-rcnn_r50_fpn_4e_mot17-half-64ee2ed4.pth)在配置层面预置了官方预训练权重地址tracker中还设置了obj_score_thr0.5、match_iou_thr0.5等关联参数——这正是文档示例 1 中「只传--detector不传--checkpoint」的原因SORT/DeepSORT 的检测器权重需要单独指定而 ReID 分支权重则通过--reid传入。四、实战示例原文档给出了两类算法的典型调用方式下面完整保留并结合仓库配置补充说明。示例 1SORT 系列使用--detector不指定--checkpointpython 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}。示例 2QDTrack 等端到端算法使用--checkpointpython 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与MOTChallengeMetricHOTA/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.py1. 加载输入并定义输出如前所述目录输入按文件名数字排序视频输入通过mmcv.VideoReader读取若输出为 mp4则先创建临时目录存放逐帧图结束后再合成为视频。2. 构建模型与可视化器init_default_scope(mmdet) model init_track_model( args.config, args.checkpoint, args.detector, args.reid, deviceargs.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_idi, video_lenlen(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_thrargs.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.mdMOT17/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/.pngSORT 系列用--detector/--reid拆分加载权重其余端到端算法用--checkpoint加载二者不可混用。【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考