ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MMSegmentation 模型部署实战:基于 mmdeploy 的模型转换、SDK 推理与多后端适配指南

MMSegmentation 模型部署实战:基于 mmdeploy 的模型转换、SDK 推理与多后端适配指南 MMSegmentation 模型部署实战基于 mmdeploy 的模型转换、SDK 推理与多后端适配指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentationMMSegmentation简称mmseg是 OpenMMLab 项目中的开源语义分割工具箱本文聚焦其官方部署教程docs/zh_cn/user_guides/5_deployment.md所讲解的完整部署链路从 mmdeploy 环境安装、一键模型转换、部署产物结构解析到后端推理与 SDK 推理两种落地方式。读完本文你将掌握如何把一个 mmseg 预训练分割模型转换为 ONNX Runtime / TensorRT 等后端模型并在 CPU/GPU 设备上完成端到端推理同时理解各算法在部署层面的后端支持矩阵与静态/动态输入约束。部署总体流程概览mmseg 模型的部署并不依赖 PyTorch 运行时直接推理而是通过 OpenMMLab 部署工具箱 mmdeploy 将训练好的模型一键式转换为推理引擎可加载的后端模型ONNX Runtime、TensorRT、ncnn、OpenVINO 等。整体流程分为四步安装安装 mmseg 与 mmdeploy 及目标推理引擎模型转换使用 mmdeploy 的tools/deploy.py将 PyTorch 权重转换为后端模型模型规范理解转换产物推理引擎文件 meta 信息的目录结构模型推理通过 mmdeploy Python API后端推理或 mmdeploy SDKmmdeploy_runtime加载模型完成分割推理。其中tools/deploy.py、后端配置文件与 SDK 均属于 mmdeploy 仓库本文只介绍其与 mmseg 模型的对接方式mmseg 侧对应的训练/测试配置则可在当前仓库的 configs 目录中找到。第一步环境安装安装 mmsegmmseg 是部署流程中被转换的模型提供方需先完成其安装具体步骤以 mmsegmentation 官方安装指南为准。安装完成后建议使用mim工具从模型库下载预训练权重见下文模型转换示例。安装 mmdeploymmdeploy 提供三种安装方式按适用场景由简到繁方式一安装预编译包直接安装 mmdeploy 官方发布的预编译安装包最快适合大多数平台用户具体命令参考 mmdeploy 官方安装概述文档。方式二一键式脚本安装适用于Ubuntu 18.04 及以上版本的平台。mmdeploy 提供一键构建脚本可同时安装 mmdeploy 及配套的推理引擎。例如以下命令安装 mmdeploy 及 ONNX Runtimegit clone --recursive -b main https://github.com/open-mmlab/mmdeploy.git cd mmdeploy python3 tools/scripts/build_ubuntu_x64_ort.py $(nproc) export PYTHONPATH$(pwd)/build/lib:$PYTHONPATH export LD_LIBRARY_PATH$(pwd)/../mmdeploy-dep/onnxruntime-linux-x64-1.8.1/lib/:$LD_LIBRARY_PATH关于两条export环境变量原文档特别说明将$(pwd)/build/lib加入PYTHONPATH是为了加载 mmdeploy SDK 的 Python 包mmdeploy_runtime其用法在本文SDK 模型推理一节中详述在使用 ONNX Runtime 推理后端模型时需要加载自定义算子库因此必须把 ONNX Runtime 库路径加入LD_LIBRARY_PATH。方式三源码安装当预编译包与一键脚本均不满足需求如非 Ubuntu 平台、需要定制算子或指定推理引擎版本时参考 mmdeploy 的源码安装文档自行编译 mmdeploy 及所需推理引擎。第二步模型转换以 UNet 为例mmdeploy 提供tools/deploy.py将 mmseg 模型一键转换为推理后端模型。以下示例演示如何把unet模型转换为 ONNX Runtime 模型动态 shapecd mmdeploy # 从 mmseg 模型库下载 unet 模型 mim download mmsegmentation --config unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024 --dest . # 将 mmseg 模型转换为 onnxruntime 模型动态 shape python tools/deploy.py \ configs/mmseg/segmentation_onnxruntime_dynamic.py \ unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py \ fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_20211210_145204-6860854e.pth \ demo/resources/cityscapes.png \ --work-dir mmdeploy_models/mmseg/ort \ --device cpu \ --show \ --dump-info该命令的各部分含义如下参数含义configs/mmseg/segmentation_onnxruntime_dynamic.pymmdeploy 的部署配置文件决定后端、精度、输入 shape 策略unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.pymmseg 的模型配置文件fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes_*.pth下载得到的预训练权重文件demo/resources/cityscapes.png用于验证转换结果的示例图片--work-dir转换产物输出目录--device cpu转换与校验所用设备转 TensorRT 时必须为cuda--show展示转换后模型的推理结果--dump-info导出 SDK 推理所需的 meta 信息deploy.json等其中示例中的 mmseg 模型配置文件对应当前仓库的 configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py它继承自 configs/base/models/fcn_unet_s5-d16.py 与 Cityscapes 数据集等基础配置将解码头num_classes设为 19Cityscapes 语义类别数并声明test_cfgdict(modewhole)。部署配置文件的命名模式转换成功与否关键之一在于选用正确的部署配置文件。mmdeploy 项目内置了各后端的分割部署配置文件位于 mmdeploy 仓库configs/mmseg目录命名模式为segmentation_{backend}-{precision}_{static | dynamic}_{shape}.py各占位符含义{backend}推理后端名称如onnxruntime、tensorrt、pplnn、ncnn、openvino、coreml等{precision}推理精度如fp16、int8不填表示默认的fp32{static | dynamic}输入 shape 策略static为静态 shapedynamic为动态 shape{shape}模型输入的 shape 或 shape 范围。因此上例中的segmentation_onnxruntime_dynamic.py表示ONNX Runtime 后端 默认 fp32 精度 动态输入 shape。若想把unet转为 TensorRT-FP16 模型只需换用segmentation_tensorrt-fp16_dynamic-512x1024-2048x2048.py这类配置文件即可。当转换 TensorRT 模型时--device 必须设置为 cuda。第三步理解转换产物mmdeploy SDK model在使用转换后的模型进行推理前有必要先弄清楚转换结果的结构。产物存放在--work-dir指定的路径下以上述mmdeploy_models/mmseg/ort为例mmdeploy_models/mmseg/ort ├── deploy.json ├── detail.json ├── end2end.onnx └── pipeline.json各文件的作用end2end.onnx推理引擎文件可直接用 ONNX Runtime 加载推理*.jsondeploy.json、detail.json、pipeline.jsonmmdeploy SDK 推理所需的 meta 信息描述了输入预处理、输出后处理、模型结构等元数据。整个文件夹被定义为mmdeploy SDK model。换言之mmdeploy SDK model 既包括推理引擎也包括推理所需的 meta 信息——这正是后续后端模型推理与SDK 模型推理两种方式能共用一个转换产物目录的原因。第四步模型推理后端模型推理后端模型推理指在 Python 环境中直接加载转换出的推理引擎文件如end2end.onnx以 mmdeploy 的 task processor 封装执行推理适合需要深度定制前后处理或与 mmengine 生态集成的场景from mmdeploy.apis.utils import build_task_processor from mmdeploy.utils import get_input_shape, load_config import torch deploy_cfg configs/mmseg/segmentation_onnxruntime_dynamic.py model_cfg ./unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py device cpu backend_model [./mmdeploy_models/mmseg/ort/end2end.onnx] image ./demo/resources/cityscapes.png # 读取 deploy_cfg 与 model_cfg deploy_cfg, model_cfg load_config(deploy_cfg, model_cfg) # 构建 task processor 与后端模型 task_processor build_task_processor(model_cfg, deploy_cfg, device) model task_processor.build_backend_model(backend_model) # 处理输入图片 input_shape get_input_shape(deploy_cfg) model_inputs, _ task_processor.create_input(image, input_shape) # 执行模型推理 with torch.no_grad(): result model.test_step(model_inputs) # 可视化结果 task_processor.visualize( imageimage, modelmodel, resultresult[0], window_namevisualize, output_file./output_segmentation.png)推理结果result中包含了与 mmseg 训练/测试一致的pred_sem_seg与seg_logits结构。若希望在 mmseg 生态内直接完成配置 → 加载权重 → 推理的对照实验可参考 mmseg/apis/inference.py 提供的init_model、inference_model、show_result_pyplot等接口用于纯 PyTorch 环境不依赖 mmdeploy。SDK 模型推理如果希望脱离 Python 训练生态、以更轻量的方式部署可使用 mmdeploy SDK 的mmdeploy_runtime包直接加载mmdeploy SDK model目录完成推理from mmdeploy_runtime import Segmentor import cv2 import numpy as np img cv2.imread(./demo/resources/cityscapes.png) # 创建分割器实例 segmentor Segmentor(model_path./mmdeploy_models/mmseg/ort, device_namecpu, device_id0) # 执行推理 seg segmentor(img) # 可视化推理结果 ## 随机生成一个 256x3 的调色板 palette np.random.randint(0, 256, size(256, 3)) color_seg np.zeros((seg.shape[0], seg.shape[1], 3), dtypenp.uint8) for label, color in enumerate(palette): color_seg[seg label, :] color # 转换为 BGR color_seg color_seg[..., ::-1] img img * 0.5 color_seg * 0.5 img img.astype(np.uint8) cv2.imwrite(output_segmentation.png, img)要点说明Segmentor的model_path直接指向转换产物目录即整个 mmdeploy SDK model而非单个end2end.onnx因为 SDK 需要同时读取*.json中的 meta 信息device_name与device_id指定推理设备如cpu或cuda推理返回的seg为逐像素的类别标签图需自行用调色板着色后再叠加显示。除了 Python APImmdeploy SDK 还提供 C、C、C#、Java 等多种语言接口可参考 mmdeploy 仓库demo目录下的各语言示例将分割推理嵌入服务端、移动端或桌面应用。模型支持列表mmseg 各算法在 mmdeploy 不同推理后端上的支持情况如下表Y 表示支持N 表示不支持? 表示未明确验证带 * 的模型仅支持静态输入详见下文注意事项ModelTorchScriptOnnxRuntimeTensorRTncnnPPLNNOpenVinoFCNYYYYYYPSPNet*YYYYYYDeepLabV3YYYYYYDeepLabV3YYYYYYFast-SCNN*YYYNYYUNetYYYYYYANN*YYYNNNAPCNetYYYYNNBiSeNetV1YYYYNYBiSeNetV2YYYYNYCGNetYYYYNYDMNet?YNNNNDNLNet?YYYNYEMANetYYYNNYEncNetYYYNNYERFNetYYYYNYFastFCNYYYYNYGCNetYYYNNNICNet*YYYNNYISANet*NYYNNYNonLocal Net?YYYNYOCRNetYYYYNYPointRend*YYYNNNSemantic FPNYYYYNYSTDCYYYYNYUPerNet*NYYNNNDANet?YYNNYSegmenter*NYYYNYSegFormer*?YYNNYSETR?YNNNYCCNet?NNNNNPSANet?NNNNNDPT?NNNNN从上表可见ONNX Runtime 是目前覆盖面最广的通用后端适合作为部署方案的默认选型TensorRT 在 GPU 推理场景覆盖也很全面而 ncnn / PPLNN / OpenVINO 则面向移动端、多核 CPU 等特定硬件平台。部署注意事项结合原文档说明与 mmseg 源码实现部署时有以下几点必须注意1. 所有 mmseg 模型仅支持 whole 推理模式。mmseg 在测试/推理阶段通过test_cfg的mode字段区分两种推理策略见 mmseg/models/segmentors/encoder_decoder.py 中inference()的分支逻辑modewhole整图一次前向调用whole_inference()encoder_decoder.pymodeslide滑动窗口 重叠拼接调用slide_inference()encoder_decoder.py用于超大图省显存推理。mmdeploy 仅保证whole模式即test_cfgdict(modewhole)的转换支持。例如 Cityscapes 上的 UNet 配置 configs/unet/unet-s5-d16_fcn_4xb4-160k_cityscapes-512x1024.py 就显式声明了test_cfgdict(modewhole)而基础模板 configs/base/models/fcn_unet_s5-d16.py 中默认的test_cfgdict(modeslide, crop_size256, stride170)仅用于 PyTorch 原生测试场景。2. PSPNet、Fast-SCNN 仅支持静态输入 shape。原因在于这两类模型包含nn.AdaptiveAvgPool2dPSPNet 的 PPM 金字塔池化模块见 mmseg/models/decode_heads/psp_head.py而多数推理框架的AdaptiveAvgPool2d算子不支持动态输入因此转换时必须使用静态 shape 的部署配置文件。3. 仅支持静态 shape 的模型应使用静态 shape 的部署配置文件。例如 TensorRT 后端应使用configs/mmseg/segmentation_tensorrt_static-1024x2048.py而非*_dynamic-*.py否则转换或推理阶段可能因算子限制而失败。4. 需要输出概率特征图时的配置方法。若希望部署模型直接输出分割概率特征图而非 argmax 后的类别索引只需在部署配置中加入codebase_config dict(with_argmaxFalse)即可模型将保留逐像素的 logits 输出便于在应用侧自行做 softmax、阈值化或后处理融合。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表