Mademewhole 2026-02-04 11:49 采纳率: 33.3%
浏览 3

mmdetection导出实例分割模型的onnx文件无法运行

在下位机使用sdk目录运行onnx文件报错,opset的版本跟onnxruntime的版本都降级或升级过都报错


 C:\Users\24674\Desktop\mmdet\M2F>python object_detection.py cpu "C:\Users\24674\Desktop\mmdet\M2F" "C:\Users\24674\Desktop\mmdet\data\103181_jpg.rf.949ad7d0e123562ac10abb4488dc07bf.jpg"
loading mmdeploy_ort_net.dll ...
[2026-02-04 11:40:51.612] [mmdeploy] [info] [model.cpp:35] [DirectoryModel] Load model: "C:\Users\24674\Desktop\mmdet\M2F"
[2026-02-04 11:40:51.888] [mmdeploy] [error] [ort_net.cpp:205] unhandled exception when creating ORTNet: Failed to load model with error: D:\a\_work\1\s\onnxruntime\core\graph\model.cc:111 onnxruntime::Model::Model Unknown model file format version.

[2026-02-04 11:40:51.888] [mmdeploy] [error] [net_module.cpp:54] Failed to create Net backend: onnxruntime, config: {
  "context": {
    "device": "<any>",
    "model": "<any>",
    "stream": "<any>"
  },
  "input": [
    "prep_output"
  ],
  "input_map": {
    "img": "input"
  },
  "is_batched": true,
  "module": "Net",
  "name": "mask2former",
  "output": [
    "infer_output"
  ],
  "output_map": {},
  "type": "Task"
}
[2026-02-04 11:40:51.890] [mmdeploy] [error] [task.cpp:99] error parsing config: {
  "context": {
    "device": "<any>",
    "model": "<any>",
    "stream": "<any>"
  },
  "input": [
    "prep_output"
  ],
  "input_map": {
    "img": "input"
  },
  "is_batched": true,
  "module": "Net",
  "name": "mask2former",
  "output": [
    "infer_output"
  ],
  "output_map": {},
  "type": "Task"
}
  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-02-04 11:50
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的问题是关于 MMdetection 导出的 ONNX 模型在下位机运行时出现错误,具体错误信息为:

    D:\a\_work\1\s\onnxruntime\core\graph\model.cc:111 onnxruntime::Model::Model Unknown model file format version.
    

    这表明 ONNX 文件的版本与当前使用的 ONNX Runtime 不兼容,或者模型导出过程中存在一些配置问题。


    ✅ 问题分析

    1. ONNX 格式版本不兼容

    • ONNX 的版本(opset)可能高于或低于你使用的 ONNX Runtime 版本。
    • 如果你尝试通过降级或升级 ONNX Runtime 来解决,但仍然报错,说明 ONNX 文件本身可能有格式问题

    2. 模型导出配置错误

    • 在使用 mmdetection 导出 ONNX 模型时,可能没有正确设置输出节点、输入形状等关键参数。
    • 例如:是否指定了正确的 --input-shape--output-names 等参数?

    3. mmdeploy 配置文件问题

    • 错误日志中显示了 config 解析失败,可能是配置文件中某些字段不匹配,如 input_map, output_map, is_batched 等。

    🔧 解决方案

    ✅ 第一步:确保 ONNX 模型导出正确

    1. 使用 MMdetection 正确导出 ONNX

    python tools/export_onnx.py \
        configs/mask2former/mask2former_r50_fpn_8x2_50e_coco.py \
        checkpoints/your_model.pth \
        --output-file mask2former.onnx \
        --input-shape 1 3 512 512 \
        --dynamic-axis input:0,1,2,3 \
        --show \
        --verify
    

    注意:

    • 替换 configs/mask2former/mask2former_r50_fpn_8x2_50e_coco.py 为你实际使用的配置文件路径。
    • --input-shape 应根据你的实际输入图像尺寸进行调整(如 512x512)。
    • --dynamic-axis 是为了支持动态 batch size。

    2. 验证导出的 ONNX 是否有效

    可以使用以下命令验证 ONNX 文件是否能被 ONNX Runtime 加载:

    import onnx
    model = onnx.load("mask2former.onnx")
    print(model.opset_import)
    

    如果输出如下,说明 opset 版本过高或过低:

    [OpSetProto(name='', version=19), OpSetProto(name='com.microsoft', version=1)]
    

    ✅ 第二步:适配 ONNX Runtime 版本

    1. 安装兼容的 ONNX Runtime 版本

    假设你发现 ONNX 文件使用的是 opset 19,而你目前的 ONNX Runtime 只支持到 opset 17,那么你可以:

    pip uninstall onnxruntime
    pip install onnxruntime==1.16.0
    

    建议安装与 ONNX 文件 opset 版本一致的 ONNX Runtime。


    ✅ 第三步:检查 mmdeploy 配置文件

    1. 修改配置文件(如 config.jsonconfig.yaml

    确保 input_mapoutput_map 正确映射了 ONNX 模型的输入和输出节点。

    示例配置文件(config.json):

    {
      "type": "Task",
      "name": "mask2former",
      "module": "Net",
      "input": ["input"],
      "input_map": {
        "img": "input"
      },
      "output": ["pred_masks", "pred_logits"],
      "output_map": {
        "pred_masks": "masks",
        "pred_logits": "logits"
      },
      "is_batched": true,
      "context": {
        "device": "cpu",
        "model": "mask2former.onnx"
      }
    }
    

    注意:

    • inputoutput 必须与 ONNX 模型的输入/输出节点名称完全一致。
    • 如果不确定输出节点名称,可以通过 onnx.helper.print_tensor_info("mask2former.onnx") 查看。

    ✅ 第四步:重新部署模型并测试

    1. 使用 mmdeploy 进行推理

    确保你已正确安装 mmdeploy 并配置好环境:

    pip install mmdeploy
    

    然后执行推理脚本:

    python tools/test.py \
        configs/mmdeploy/mask2former/onnxruntime_cpu.py \
        mask2former.onnx \
        --img "C:\Users\24674\Desktop\mmdet\data\103181_jpg.rf.949ad7d0e123562ac10abb4488dc07bf.jpg"
    

    🧠 总结

    | 问题 | 解决方案 | |------|----------| | ONNX 版本与 ONNX Runtime 不兼容 | 降级/升级 ONNX Runtime 以匹配 ONNX 文件的 opset 版本 | | 模型导出配置错误 | 使用 --input-shape--dynamic-axis 正确导出 ONNX | | mmdeploy 配置文件错误 | 确保 input_mapoutput_map 与 ONNX 输入/输出节点一致 | | ONNX 文件无法加载 | 使用 onnx.load() 验证 ONNX 文件是否有效 |


    💡 建议

    • 推荐使用较新的 ONNX Runtime(如 1.16+),它对新 opset 的支持更好。
    • 保持 MMdetection 和 mmdeploy 的版本一致性,避免因版本差异导致模型不可用。
    • 在导出 ONNX 时开启 --verify 参数,确保模型导出无误。

    如果你愿意提供具体的配置文件内容或导出命令,我可以进一步帮助你排查问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月4日