- 人工智能
- 计算机视觉
- 深度学习
- 模型评测
【免费下载链接】mmdetection
OpenMMLab Detection Toolbox and Benchmark
导读
本文基于 MMDetection 官方用户指南中的模型部署章节,系统讲解如何借助 OpenMMLab 生态的 MMDeploy 工具链,将 MMDetection 训练好的检测模型(以 Faster R-CNN 为例)转换为 ONNX 等后端推理模型,并完成后端推理与 SDK 推理的全流程。读完本文,你将掌握部署配置文件的命名与选择规则、转换后模型目录的结构规范、Python 侧后端推理与 SDK 推理两种方式的完整代码范式,并了解仓库内自带的 TorchServe 部署工具链作为补充方案。
部署前置环境:MMDetection 与 MMDeploy 的安装
模型部署建立在完整可用的训练与推理环境之上,因此第一步是安装 MMDetection。根据仓库的安装文档,推荐使用 MIM 安装 MMEngine 与 MMCV 基础依赖:
pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0"随后安装 MMDetection 本身。若需要开发调试,建议从源码安装(可编辑模式),这样对代码的任何本地修改都会生效而无需重新安装:
git clone https://github.com/open-mmlab/mmdetection.git cd mmdetection pip install -v -e .也可以将 mmdet 作为第三方包直接安装:mim install mmdet。
安装完 MMDetection 后,还需要安装部署工具链 MMDeploy。MMDeploy 是 OpenMMLab 的部署仓库,负责包括 MMPretrain、MMDetection 等在内的各算法库的部署工作。特别需要注意:如果安装的是 MMDeploy 的预编译包,那么也需要通过git clone下载 MMDeploy 源码,因为它包含了部署时要用到的各后端配置文件(本文后续的模型转换环节会直接引用这些配置文件)。
前提假设:以下所有操作默认 mmdetection 与 mmdeploy 两个代码库位于同级目录,且当前工作目录为 mmdetection 根目录。
模型转换:从 PyTorch 到 ONNX
转换核心流程
转换的本质是把 PyTorch 模型的计算图导出为后端可执行的中间表示(如 ONNX),同时把数据预处理、后处理等信息抽取出来,供 MMDeploy SDK 推理使用。以 Faster R-CNN 模型为例,该配置文件本身极其精简,仅由四份基础配置拼接而成:
_base_ = [ '../_base_/models/faster-rcnn_r50_fpn.py', '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ]模型结构细节(ResNet-50 骨干 + FPN 颈部 + RPN 与 RoI Head)均继承自 faster-rcnn_r50_fpn.py。准备好模型配置文件与对应的 checkpoint 后,即可用如下 Python 代码完成转换:
from mmdeploy.apis import torch2onnx from mmdeploy.backend.sdk.export_info import export2SDK img = 'demo/demo.jpg' work_dir = 'mmdeploy_models/mmdet/onnx' save_file = 'end2end.onnx' deploy_cfg = '../mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py' model_cfg = 'configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py' model_checkpoint = 'faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' device = 'cpu' # 1. convert model to onnx torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, model_checkpoint, device) # 2. extract pipeline info for inference by MMDeploy SDK export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device)其中各参数含义如下:
| 参数 | 说明 |
|---|---|
img | 用于导出的示例图像,其 shape 决定或验证模型的输入 shape(结合 deploy_cfg 中 shape 设置) |
work_dir | 转换产物输出目录,即后续的 SDK model 目录 |
save_file | 推理引擎文件名,ONNX 场景下为end2end.onnx |
deploy_cfg | MMDeploy 部署配置文件,决定后端、精度与 shape 策略 |
model_cfg | MMDetection 模型配置文件 |
model_checkpoint | 训练产出的权重文件路径 |
device | 转换执行设备,cpu或cuda |
第一步torch2onnx完成模型到 ONNX 的图导出;第二步export2SDK负责抽取图像预处理、结果后处理(如 NMS 阈值等)的 pipeline 信息并写入work_dir,供 SDK 推理阶段还原出与训练/测试一致的完整推理管线。
部署配置文件的命名规范与选择要领
转换的关键之一是使用正确的部署配置文件。MMDeploy 中内置了各后端的部署配置文件,存放于 mmdeploy 仓库的configs/mmdet目录下,文件命名遵循如下模式:
{task}/{task}_{backend}-{precision}_{static | dynamic}_{shape}.py各字段的含义与选择要点:
- {task}(任务类型):MMDetection 的任务有两类——物体检测(detection)与实例分割(instance-seg)。
RetinaNet、Faster R-CNN、DETR等属于检测任务;Mask R-CNN、SOLO等属于实例分割任务。务必使用detection/detection_*.py转换检测模型、使用instance-seg/instance-seg_*.py转换实例分割模型,混用会导致图结构与模型输出不匹配。 - {backend}(推理后端):onnxruntime、tensorrt、pplnn、ncnn、openvino、coreml 等。后端决定了最终导出文件的格式(
.onnx、.engine、.ncnn等)以及可用的算子集合。 - {precision}(推理精度):如 fp16、int8;不填表示 fp32。
- {static | dynamic}(shape 策略):动态 shape 允许推理时输入任意尺寸图像,静态 shape 则要求输入与导出时一致,通常带来更高的执行效率。
- {shape}(输入 shape):模型输入的 shape 或 shape 范围,如
320x320-1344x1344。
例如,要把 Faster R-CNN 转换为 TensorRT-FP16 模型,改用detection_tensorrt-fp16_dynamic-320x320-1344x1344.py即可。注意:转换 TensorRT 模型时,--device必须设置为"cuda",因为 TensorRT 的图优化与推理均依赖 GPU 环境。
模型规范:理解 mmdeploy SDK model 的目录结构
在使用转换后的模型进行推理之前,有必要了解转换产物的组织结构。所有产物存放在--work-dir指定的路径下,上例中mmdeploy_models/mmdet/onnx目录的结构为:
mmdeploy_models/mmdet/onnx ├── deploy.json ├── detail.json ├── end2end.onnx └── pipeline.json各文件的角色:
- end2end.onnx:推理引擎文件,可直接用 ONNX Runtime 加载并执行前向计算。
- deploy.json / detail.json / pipeline.json:MMDeploy SDK 推理所需的 meta 信息,记录了模型输入/输出张量的名称与 shape、图像预处理的归一化参数、类别数量、后处理(NMS)配置等。
整个文件夹被统一定义为mmdeploy SDK model。也就是说,一个 SDK model 既包含推理引擎,也包含推理 meta 信息——前者负责张量计算,后者负责让上层应用知道"如何喂数据、如何读结果"。后续推理时只需要把这个目录路径传给 SDK 即可,无需再单独指定 deploy_cfg 与 model_cfg。
模型推理
后端模型推理:直接驱动推理引擎
后端模型推理指的是绕过 SDK,直接加载end2end.onnx这样的推理引擎文件执行前向。以 ONNX Runtime 后端为例,完整推理代码如下:
from mmdeploy.apis.utils import build_task_processor from mmdeploy.utils import get_input_shape, load_config import torch deploy_cfg = '../mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py' model_cfg = 'configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py' device = 'cpu' backend_model = ['mmdeploy_models/mmdet/onnx/end2end.onnx'] image = 'demo/demo.jpg' # read deploy_cfg and model_cfg deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) # build task and backend model task_processor = build_task_processor(model_cfg, deploy_cfg, device) model = task_processor.build_backend_model(backend_model) # process input image input_shape = get_input_shape(deploy_cfg) model_inputs, _ = task_processor.create_input(image, input_shape) # do model inference with torch.no_grad(): result = model.test_step(model_inputs) # visualize results task_processor.visualize( image=image, model=model, result=result[0], window_name='visualize', output_file='output_detection.png')这段代码的关键步骤是:load_config加载部署配置与模型配置;build_task_processor根据两者构建出与具体任务(检测/分割)匹配的任务处理器;task_processor.create_input按get_input_shape得到的输入 shape 对图像完成缩放、归一化等预处理,产出模型输入张量;model.test_step执行推理;最后visualize把检测框绘制到原图上保存为output_detection.png。整个流程复用了 MMDetection 的测试管线逻辑,因此后端模型的输入输出语义与 PyTorch 原模型保持一致。
SDK 模型推理:跨语言的生产级推理接口
如果希望把模型交付给上层应用使用(如服务端、桌面端程序),更推荐使用 MMDeploy SDK 推理。SDK 推理直接以整个 mmdeploy SDK model 目录为输入,Python 接口的示例代码如下:
from mmdeploy_python import Detector import cv2 img = cv2.imread('demo/demo.jpg') # create a detector detector = Detector(model_path='mmdeploy_models/mmdet/onnx', device_name='cpu', device_id=0) # perform inference bboxes, labels, masks = detector(img) # visualize inference result indices = [i for i in range(len(bboxes))] for index, bbox, label_id in zip(indices, bboxes, labels): [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4] if score < 0.3: continue cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0)) cv2.imwrite('output_detection.png', img)示例中Detector的model_path直接指向 SDK model 目录,device_name指定 cpu 或 cuda,device_id指定设备序号;推理返回三部分结果:bboxes(检测框坐标与置信度)、labels(类别 id)、masks(实例分割掩码,纯检测模型下为空)。可视化时通过置信度阈值(如 0.3)过滤低分框再绘制。
除了 Python API,MMDeploy SDK 还提供了 C、C++、C#、Java 等多语言接口,可以满足不同技术栈的集成需求——这一能力得益于 SDK model 中 json meta 信息与推理引擎的分离设计。
模型支持列表
MMDeploy 对 MMDetection 各模型的部署支持情况(哪些任务、哪些后端、哪些算子被支持)以官方文档为准,可查阅 MMDeploy 针对 MMDetection 的部署支持文档,其中包含逐模型的"模型-任务"划分、支持的后端矩阵与已量化的精度档位。总体而言,检测类模型(Faster R-CNN、RetinaNet、DETR 等)与实例分割类模型(Mask R-CNN、SOLO 等)是两条主要的支持线,配置选择时应严格对齐本文"配置文件命名规范"一节中的任务字段。
补充方案:仓库内置的 TorchServe 部署工具链
除 MMDeploy 之外,MMDetection 仓库自身还提供了基于 TorchServe 的模型服务化工具,位于 tools/deployment 目录,包含三个脚本:
- mmdet2torchserve.py:将 MMDetection 模型(配置文件 + checkpoint)打包为 TorchServe 的
.mar归档文件; - mmdet_handler.py:自定义的 TorchServe handler,负责请求预处理、模型推理与结果后处理;
- test_torchserver.py:向已启动的 TorchServe 服务发送推理请求的客户端脚本。
转换命令如下:
python tools/deployment/mmdet2torchserve.py \ ${CONFIG_FILE} ${CHECKPOINT_FILE} \ --output-folder ${OUTPUT_FOLDER} \ --model-name ${MODEL_NAME} \ --model-version ${MODEL_VERSION} \ --force从源码看,mmdet2torchserve会把模型配置 dump 为config.py放入归档,并将 mmdet_handler.py 注册为该模型的服务 handler(见 mmdet2torchserve.py)。handler 在initialize阶段通过init_detector加载配置与权重(底层实现在 mmdet/apis/inference.py),inference阶段调用inference_detector完成检测,postprocess阶段按阈值(默认 0.5)过滤结果并输出类别名、边界框与置信度。这为不需要跨框架转换、直接复用 PyTorch 推理图的场景提供了一条更轻量的服务化路径。
此外,仓库自带的 demo/image_demo.py 基于DetInferencer提供了开箱即用的推理可视化能力,可用于部署前的模型正确性验证,例如:
python demo/image_demo.py demo/demo.jpg \ configs/rtmdet/rtmdet_s_8xb32-300e_coco.py \ --weights rtmdet_s_8xb32-300e_coco_20220905_161602-387a891e.pth总结
本文完整梳理了 MMDetection 模型部署的主链路:安装 MMDetection 与 MMDeploy → 依据{task}/{task}_{backend}-{precision}_{static|dynamic}_{shape}.py命名规范选择部署配置 → 通过torch2onnx与export2SDK完成模型转换并产出包含引擎与 meta 信息的 mmdeploy SDK model → 分别以后端推理与 SDK 推理两种方式执行预测与可视化。无论你是要把模型接入 ONNX Runtime/TensorRT 等推理引擎,还是要通过 SDK 的多语言接口交付给生产应用,都可以直接复用文中的代码范式;同时,仓库内置的 TorchServe 工具链(tools/deployment)为纯 PyTorch 服务化场景提供了补充选择。实际使用时,请以当前安装的 MMDeploy 版本及其对 MMDetection 的支持列表为准。
- 人工智能
- 计算机视觉
- 深度学习
- 模型评测
【免费下载链接】mmdetection
OpenMMLab Detection Toolbox and Benchmark
相关推荐
MMDetection 模型部署全流程指南:基于 MMDeploy 的 ONNX/TensorRT 转换、SDK 推理与 TorchServe 服务化
MMDetection 模型部署全流程指南:基于 MMDeploy 的 ONNX/TensorRT 转换、SDK 推理与 TorchServe 服务化 本文以
人工智能计算机视觉深度学习模型评测MMSegmentation 模型部署实战:基于 mmdeploy 的模型转换、SDK 推理与多后端适配指南
MMSegmentation 模型部署实战:基于 mmdeploy 的模型转换、SDK 推理与多后端适配指南 MMSegmentation(简称 mmseg )
人工智能深度学习计算机视觉MMSegmentation 模型部署实战指南:基于 mmdeploy 的 ONNX Runtime 与 TensorRT 全流程
MMSegmentation 模型部署实战指南:基于 mmdeploy 的 ONNX Runtime 与 TensorRT 全流程 本篇技术指南以 MMSegm
人工智能深度学习计算机视觉
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考