尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MMDetection 标准数据集模型推理实战指南:Inferencer 高层接口、演示脚本与多模态推理全解析

MMDetection 标准数据集模型推理实战指南:Inferencer 高层接口、演示脚本与多模态推理全解析 人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载MMDetection 提供了大量预训练检测模型推理Inference即使用训练好的模型在图像上检测目标。本文以 docs/zh_cn/user_guides/inference.md 为骨架系统讲解配置文件 checkpoint的模型组织方式、统一推理器DetInferencer的三行代码用法与完整参数表以及图片/摄像头/视频/大图切片/多模态 GLIP 五类演示脚本的实战命令并结合 mmdet/apis/det_inferencer.py、mmdet/apis/inference.py 等源码揭示其底层工作流帮助读者快速上手并深入理解 MMDetection 的推理体系。一、推理的基本概念模型 配置文件 checkpoint在 MMDetection 中一个模型被定义为一个配置文件Config与一组被存储在 checkpoint 文件内的模型参数的集合配置文件描述模型结构backbone、neck、head、数据预处理、测试流水线等。以 RTMDet 为例可查看 configs/rtmdet/rtmdet_l_8xb32-300e_coco.py其中model字段依次定义了typeRTMDet的检测器、CSPNeXt骨干网络、CSPNeXtPAFPN颈部、RTMDetSepBNHead检测头以及test_cfg如nms_pre30000、score_thr0.001、iou_threshold0.65、max_per_img300。配置文件的完整语法参见 配置文件详解。checkpoint 文件训练得到的模型权重.pth通常还内嵌meta信息如dataset_meta类别名、配置字符串等。目前可用的预训练模型全集可在 Model Zoo 中查看。官方建议新手从RTMDet系列开始尝试其配置位于 configs/rtmdet对应的预训练 checkpointrtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth建议下载到本地checkpoints文件夹内后续所有示例均以此为前提mkdir -p checkpoints # 将 rtmdet_l_8xb32-300e_coco 的权重下载到 checkpoints 目录二、推理的高层编程接口Inferencer 推理器在 OpenMMLab 体系中所有推理操作被统一收敛到推理器Inferencer中。推理器被设计为简洁易用的 API在不同 OpenMMLab 库检测、分割、OCR 等中具有高度一致的接口。MMDetection 的检测推理器实现位于 mmdet/apis/det_inferencer.pyDetInferencer类继承自 MMEngine 的BaseInferencer。下文演示样例均可在 demo/inference_demo.ipynb 中直接运行尝试。2.1 基础用法三行代码完成推理使用DetInferencer仅需 3 行代码即可获得推理结果from mmdet.apis import DetInferencer # 初始化模型 inferencer DetInferencer(rtmdet_tiny_8xb32-300e_coco) # 推理示例图片 inferencer(demo/demo.jpg, showTrue)可视化结果将显示在一个新窗口中仓库中的 demo/demo.jpg 即为示例输入图。注意无 GUI 环境如果你在无图形界面的服务器上或通过禁用 X11 转发的 SSH 隧道运行以上命令showTrue将不起作用。此时仍可通过设置out_dir参数将可视化结果保存到文件中详见下文储存结果小节。2.2 初始化每个推理器必须使用一个模型进行初始化初始化时可手动选择推理设备。模型初始化使用 MMDetection 预训练模型只需把模型名称传给参数model权重会自动从 OpenMMLab 模型库下载并加载inferencer DetInferencer(modelrtmdet_tiny_8xb32-300e_coco)如需列出所有可用模型名称MMDetection 提供了一条非常便捷的方法models是模型名称列表会被自动打印# models 是一个模型名称列表它们将自动打印 models DetInferencer.list_models(mmdet)你也可以通过将权重的路径或 URL 传给weights让推理器加载自定义权重inferencer DetInferencer(modelrtmdet_tiny_8xb32-300e_coco, weightspath/to/rtmdet.pth)加载自定义配置与权重把配置文件的路径传给model把权重路径传给weightsinferencer DetInferencer(modelpath/to/rtmdet_config.py, weightspath/to/rtmdet.pth)仅传权重利用权重内嵌配置默认情况下MMEngine 在训练时会自动将配置文件转储到权重文件中。如果你持有在 MMEngine 上训练的权重也可只传weights而不指定model# 若无法在权重中找到配置文件则会引发错误。 # 目前 MMDetection 模型库中只有 ddq-detr-4scale_r50 的权重可以这样加载。 inferencer DetInferencer(weightshttps://download.openmmlab.com/mmdetection/v3.0/ddq/ddq-detr-4scale_r50_8xb2-12e_coco/ddq-detr-4scale_r50_8xb2-12e_coco_20230809_170711-42528127.pth)从源码看这一能力对应 det_inferencer.py 中_load_weights_to_model的实现当 checkpoint 的meta中存在dataset_meta时mmdet 3.x会将其键统一转为小写后写入model.dataset_meta若是旧版CLASSES字段则做兼容处理若都没有则回退使用 COCO 类别并给出警告。只传配置不传权重会产生一个随机初始化的模型推理结果没有意义仅用于结构验证。推理设备每个推理器实例与一个设备绑定。默认情况下最佳设备由 MMEngine 自动决定也可通过device参数显式指定。例如在 GPU 1 上创建推理器inferencer DetInferencer(modelrtmdet_tiny_8xb32-300e_coco, devicecuda:1)在 CPU 上创建推理器inferencer DetInferencer(modelrtmdet_tiny_8xb32-300e_coco, devicecpu)device参数支持torch.device允许的所有字符串形式如cuda:0、cpu等。需要说明的是若使用 CPU 推理涉及RoIPool的模型如部分二阶段检测器目前不被支持相关断言可在 mmdet/apis/inference.py 的inference_detector中看到。2.3 推理推理器初始化后直接传入原始数据即可返回值中即为推理结果。输入格式inputs支持以下任意一种格式str图像的路径 / URLinferencer(demo/demo.jpg)array图像的 numpy 数组注意应为 BGR 格式import mmcv array mmcv.imread(demo/demo.jpg) inferencer(array)list基本类型的列表列表中的每个元素将被单独处理也允许混合类型inferencer([img_1.jpg, img_2.jpg]) # 列表内混合类型也是允许的 inferencer([img_1.jpg, array])str目录的路径目录中的所有图像都将被处理inferencer(path/to/your_imgs/)从源码看目录输入的处理位于_inputs_to_list方法det_inferencer.py当输入为字符串且后端支持isdir判断时会通过list_dir_or_file以IMG_EXTENSIONS.jpg、.jpeg、.png、.ppm、.bmp、.pgm、.tif、.tiff、.webp为后缀过滤出全部图片文件。输出格式默认情况下每个推理器以字典格式返回预测结果visualization包含可视化后的预测结果图。默认情况下为空列表除非设置return_visTrue。predictions以 json 可序列化格式返回的预测结果。{ predictions : [ # 每个实例都对应于一个输入图像 { labels: [...], # 整数列表长度为 (N, ) scores: [...], # 浮点列表长度为 (N, ) bboxes: [...], # 2d 列表形状为 (N, 4)格式为 [min_x, min_y, max_x, max_y] }, ... ], visualization : [ array(..., dtypeuint8), ] }该 json 化结构由pred2dict方法det_inferencer.py生成它从DetDataSample中抽取pred_instances的labels、scores、bboxes若存在masks则通过encode_mask_results编码为 COCO RLE 格式对于全景分割输出pred_panoptic_seg则会生成panoptic_seg或panoptic_seg_path字段。若想获取模型的原始输出可设置return_datasamplesTrue此时原始 DataSample即DetDataSample将存储在predictions中。储存结果除了从返回值中获取预测结果还可以通过out_dir与no_save_pred/no_save_vis参数将预测结果和可视化结果导出到文件inferencer(demo/demo.jpg, out_diroutputs/, no_save_predFalse)结果目录结构如下outputs ├── preds │ └── demo.json └── vis └── demo.jpg批量推理可以通过batch_size参数自定义批量推理的批大小默认批大小为 1。批数据的切分由preprocess/_get_chunk_data实现det_inferencer.py每个 chunk 通过collate_fn组批后送入forward因此批量推理与单张推理的返回结构完全一致。2.4 API 参数详解以下是推理器详尽的参数列表与源码__init__与__call__签名一一对应可对照 det_inferencer.py 与 det_inferencer.py 验证。DetInferencer.init()参数类型默认值描述modelstr , 可选None配置文件的路径或 metafile 中定义的模型名称。例如可以是 rtmdet-s 或 rtmdet_s_8xb32-300e_coco 或 configs/rtmdet/rtmdet_s_8xb32-300e_coco.py。如果未指定模型用户必须提供 MMEngine 保存的包含配置字符串的 weights。weightsstr, 可选None模型权重文件的路径。如果未指定且model是 metafile 中的模型名称权重将从 metafile 中加载。devicestr, 可选None推理使用的设备接受torch.device允许的所有字符串。例如cuda:0 或 cpu。如果为 None将自动使用可用设备。 默认为 None。scopestr, 可选mmdet模型的域名。palettestrnone用于可视化的配色。优先顺序为 palette - config - checkpoint。show_progressboolTrue控制是否在推理过程中显示进度条。DetInferencer.call()参数类型默认值描述inputsstr/list/tuple/np.array必需它可以是一个图片/文件夹的路径一个 numpy 数组或者是一个包含图片路径或 numpy 数组的列表/元组batch_sizeint1推理的批大小。return_visboolFalse是否返回可视化结果。showboolFalse是否在弹出窗口中显示可视化结果。wait_timefloat0弹窗展示可视化结果的时间间隔。no_save_visboolFalse是否将可视化结果保存到out_dir。默认为保存。draw_predboolTrue是否绘制预测的边界框。pred_score_thrfloat0.3显示预测框的最低置信度。return_datasamplesboolFalse是否将结果作为DetDataSample返回。 如果为 False则结果将被打包到一个 dict 中。print_resultboolFalse是否将推理结果打印到控制台。no_save_predboolTrue是否将推理结果保存到out_dir。默认为不保存。out_dirstr结果的输出目录。textsstr/list[str]可选None文本提示词。stuff_textsstr/list[str]可选None物体文本提示词。custom_entitiesboolFalse是否使用自定义实体。只用于 GLIP 算法。**kwargs传递给preprocess、forward、visualize和postprocess的其他关键字参数。kwargs 中的每个关键字都应在相应的preprocess_kwargs、forward_kwargs、visualize_kwargs和postprocess_kwargs中。其中visualize_kwargs与postprocess_kwargs在源码中分别定义为{return_vis, show, wait_time, draw_pred, pred_score_thr, img_out_dir, no_save_vis}与{print_result, pred_out_dir, return_datasamples, no_save_pred}det_inferencer.py__call__会通过_dispatch_kwargs将多余参数分发给对应阶段。2.5 底层工作流从源码看一次推理发生了什么DetInferencer的__call__将一次推理拆分为四个可自定义的阶段det_inferencer.pypreprocess对输入做_inputs_to_list归一化并依据test_dataloader.dataset.pipeline构建测试流水线_init_pipeline会将LoadImageFromFile替换为mmdet.InferencerLoader并剔除推理用不到的img_id元数据键然后按batch_size切分为批数据forward将批数据送入model.test_step得到DetDataSample列表visualize通过visualizer.add_datasample绘制预测框draw_pred、pred_score_thr在此生效支持show弹窗、out_dir/vis存图、return_vis返回图像数组numpy 数组输入时会以00000000.jpg递增编号命名postprocess将DetDataSample转为 json 可序列化字典pred2dict支持print_result打印、out_dir/preds存 json以及return_datasamples返回原始数据样本。此外DetInferencer.__init__还会调用revert_sync_batchnorm将 SyncBN 还原为普通 BN以支持单卡/CPU 推理。三、演示脚本样例除推理器外MMDetection 还提供了四个基于高层编程接口实现的演示脚本demo 目录源码覆盖图片、摄像头、视频、大图切片等场景适合在命令行下快速验证模型效果。3.1 图片样例image_demo.py在单张图片上进行推理的脚本参数格式python demo/image_demo.py \ ${IMAGE_FILE} \ ${CONFIG_FILE} \ [--weights ${WEIGHTS}] \ [--device ${GPU_ID}] \ [--pred-score-thr ${SCORE_THR}]运行样例python demo/image_demo.py demo/demo.jpg \ configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \ --weights checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \ --device cpu补充说明均可在 demo/image_demo.py 的parse_args中验证第二个位置参数实际是model可以是配置文件路径、metafile 中的模型名或.pth权重文件若以.pth结尾脚本会自动将其转给--weights并把model置空因此示例中也可以直接python demo/image_demo.py demo/demo.jpg rtmdet-s。--pred-score-thr默认 0.3--palette可选coco、voc、citys、random、none--no-save-vis/--no-save-pred可关闭结果保存同时指定两者时out_dir会被置空。结果默认保存到outputs/目录--out-dir可改并打印保存路径。3.2 摄像头样例webcam_demo.py使用摄像头实时图像的推理脚本python demo/webcam_demo.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ [--device ${GPU_ID}] \ [--camera-id ${CAMERA-ID}] \ [--score-thr ${SCORE_THR}]运行样例python demo/webcam_demo.py \ configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \ checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth从 demo/webcam_demo.py 源码看--camera-id默认 0即cv2.VideoCapture(0)--score-thr默认 0.5按下Esc、q或Q键退出循环。3.3 视频样例video_demo.py在视频上进行推理的脚本python demo/video_demo.py \ ${VIDEO_FILE} \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ [--device ${GPU_ID}] \ [--score-thr ${SCORE_THR}] \ [--out ${OUT_FILE}] \ [--show] \ [--wait-time ${WAIT_TIME}]运行样例python demo/video_demo.py demo/demo.mp4 \ configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \ checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \ --out result.mp4实现要点demo/video_demo.py脚本要求--out与--show至少指定其一使用mmcv.VideoReader逐帧读取将流水线首步替换为mmdet.LoadImageFromNDArray后逐帧调用inference_detector并通过cv2.VideoWriter(mp4v)写出。视频样例显卡加速版本video_gpuaccel_demo.py使用显卡NVIDIA硬解码加速的视频推理脚本python demo/video_gpuaccel_demo.py \ ${VIDEO_FILE} \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ [--device ${GPU_ID}] \ [--score-thr ${SCORE_THR}] \ [--nvdecode] \ [--out ${OUT_FILE}] \ [--show] \ [--wait-time ${WAIT_TIME}]运行样例--nvdecode开启 GPU 解码python demo/video_gpuaccel_demo.py demo/demo.mp4 \ configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \ checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \ --nvdecode --out result.mp43.4 大图切片推理样例large_image_demo.py面向卫星遥感等超大尺寸图像如 demo/large_image.jpg的切片推理脚本思路是切块推理 → 坐标平移 → NMS 合并python demo/large_image_demo.py \ ${IMG_PATH} \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ --device ${GPU_ID} \ --show \ --tta \ --score-thr ${SCORE_THR} \ --patch-size ${PATCH_SIZE} \ --patch-overlap-ratio ${PATCH_OVERLAP_RATIO} \ --merge-iou-thr ${MERGE_IOU_THR} \ --merge-nms-type ${MERGE_NMS_TYPE} \ --batch-size ${BATCH_SIZE} \ --debug \ --save-patch运行样例无 TTA 与带 TTA 两种方式# inference without tta wget -P checkpoint https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth python demo/large_image_demo.py \ demo/large_image.jpg \ configs/faster_rcnn/faster-rcnn_r101_fpn_2x_coco.py \ checkpoint/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth # inference with tta wget -P checkpoint https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth python demo/large_image_demo.py \ demo/large_image.jpg \ configs/retinanet/retinanet_r50_fpn_1x_coco.py \ checkpoint/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth --tta关键参数默认值与实现细节demo/large_image_demo.py依赖sahi库pip install -U sahi通过slice_image按--patch-size默认 640切块块间重叠比例--patch-overlap-ratio默认 0.25--batch-size默认 1控制每轮送入模型的切片数量合并阶段使用merge_results_by_nms实现于 mmdet/utils/large_image.py其中shift_predictions先把各切片的 bbox/mask 按左上角偏移平移回原图坐标系支持 4 点水平框与 5 参数旋转框再做 NMS--merge-iou-thr默认 0.25、--merge-nms-type默认nms--tta需要配置中包含tta_model与tta_pipeline字段如 configs/rtmdet/rtmdet_tta.py脚本会据此包装模型并替换测试流水线--debug会导出合并前各切片结果、绘制切片网格的调试图配合--save-patch可把每个切片的检测结果单独保存到{name}_patch目录。四、多模态算法的推理与验证以 GLIP 为例随着多模态视觉算法的发展MMDetection 也完成了对这类算法的支持。本节以 GLIP 算法和模型为例演示多模态 demo 与 eval 脚本的用法。此外MMDetection 在 projects 下提供了 gradio_demo 项目可参照其 文档 在本地快速体验 MMDetection 中支持的各类图片输入任务如开放词汇检测、指代分割等。4.1 模型准备安装多模态依赖# if source pip install -r requirements/multimodal.txt # if wheel mim install mmdet[multimodal]MMDetection 已集成 GLIP 算法与模型可直接下载其权重使用cd mmdetection wget https://download.openmmlab.com/mmdetection/v3.0/glip/glip_tiny_a_mmdet-b3654169.pth4.2 推理演示文本提示驱动的开放词汇检测下载完成后即可用demo/image_demo.py完成多模态推理注意此时第二个参数直接传权重文件脚本会自动识别并转交给--weightspython demo/image_demo.py demo/demo.jpg glip_tiny_a_mmdet-b3654169.pth --texts bench识别多个类别使用xx. xx的格式在--texts字段后声明目标类型python demo/image_demo.py demo/demo.jpg glip_tiny_a_mmdet-b3654169.pth --texts bench. car整句输入--texts字段支持输入一个自然语言句子python demo/image_demo.py demo/demo.jpg glip_tiny_a_mmdet-b3654169.pth --texts There are a lot of cars here.关于--texts的更多用法可查阅 demo/image_demo.py 的 docstring 与参数解析逻辑输入$: coco、$: voc、$: cityscapes、$: lvis等格式时会基于数据集类别名自动构造提示词通过get_classes从 mmdet/evaluation/functional/class_names.py 读取类别表--custom-entities-c用于自定义实体名称要求输入格式为cls_name1 . cls_name2 . cls_name3 .--chunked-size-s在类别数非常大时可截断为多次预测脚本会将其写入model.test_cfg.chunked_size对 Grounding DINO 还提供--tokens-positive-p参数用于指定输入文本中用户感兴趣的区间-1表示无感兴趣区域None表示忽略该参数二维数组表示起止位置。4.3 验证演示精度复现与 benchmarkMMDetection 集成后的 GLIP 算法对比官方版本没有精度损失benchmark 如下Modelofficial mAPmmdet mAPglip_A_Swin_T_O365.yaml42.943.0glip_Swin_T_O365.yaml44.944.9glip_Swin_L.yaml51.451.3用户可使用tools/test.py脚本对模型精度进行验证# 1 gpu python tools/test.py configs/glip/glip_atss_swin-t_fpn_dyhead_pretrain_obj365.py glip_tiny_a_mmdet-b3654169.pth # 8 GPU ./tools/dist_test.sh configs/glip/glip_atss_swin-t_fpn_dyhead_pretrain_obj365.py glip_tiny_a_mmdet-b3654169.pth 8说明当前仓库 configs/glip 下提供的是带变体后缀的对应配置例如glip_atss_swin-t_a_fpn_dyhead_pretrain_obj365.py、glip_atss_swin-t_b_fpn_dyhead_pretrain_obj365.py、glip_atss_swin-t_c_fpn_dyhead_pretrain_obj365.py与上表glip_A_Swin_T_O365.yaml等一一对应替换为仓库内实际存在的配置文件路径即可复现验证。tools/test.py的完整参数说明参见 测试与验证指南。五、延伸阅读推理器内部使用的DetDataSample数据结构数据结构详解配置文件完整语法配置文件详解模型评估与tools/test.py用法测试与验证指南全部预训练模型清单Model Zoo多模态交互式体验projects/gradio_demo/README.md赞分享人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载相关推荐MMPose 3D 手部姿态估计 Demo 实战指南从 top-down 脚本到 Inferencer 统一推理接口MMPose 3D 手部姿态估计 Demo 实战指南从 top down 脚本到 Inferencer 统一推理接口 导读 本文是 MMPose 仓库中 de计算机视觉人工智能深度学习MMPose 模型推理指南使用 Inferencer 统一接口与 Python API 运行姿态估计MMPose 模型推理指南使用 Inferencer 统一接口与 Python API 运行姿态估计 本篇技术指南以 OpenMMLab 姿态估计工具箱 MM计算机视觉人工智能深度学习使用 MMDetection 现有模型进行推理DetInferencer 高级 API 与五个 Demo 脚本实战指南使用 MMDetection 现有模型进行推理DetInferencer 高级 API 与五个 Demo 脚本实战指南 本篇技术指南以 docs/en/use人工智能计算机视觉深度学习模型评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表