mmdetection导出实例分割模型的onnx文件无法运行...如何解决?

发布时间:2026/6/7 23:08:28

mmdetection导出实例分割模型的onnx文件无法运行...如何解决? 本文收录于 《全栈 Bug 调优实战版》 专栏。专栏聚焦真实项目中的各类疑难 Bug从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者还是负责复杂项目的资深工程师都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论助你稳步进阶、放大技术价值。特别说明文中问题案例来源于真实生产环境与公开技术社区并结合多位一线资深工程师与架构师的长期实践经验经过人工筛选与AI系统化智能整理后输出。文中的解决方案并非唯一“标准答案”而是兼顾可行性、可复现性与思路启发性的实践参考供你在实际项目中灵活运用与演进。欢迎订阅本专栏一次订阅后专栏内所有文章可永久免费阅读后续更新内容皆不用再次订阅持续更新中。 问题描述详细问题描述如下mmdetection导出实例分割模型的onnx文件无法运行在下位机使用sdk目录运行onnx文件报错opset的版本跟onnxruntime的版本都降级或升级过都报错C:\Users\24674\Desktop\mmdet\M2Fpython object_detection.py cpuC:\Users\24674\Desktop\mmdet\M2FC:\Users\24674\Desktop\mmdet\data\103181_jpg.rf.949ad7d0e123562ac10abb4488dc07bf.jpgloading mmdeploy_ort_net.dll...[2026-02-0411:40:51.612][mmdeploy][info][model.cpp:35][DirectoryModel]Load model:C:\Users\24674\Desktop\mmdet\M2F[2026-02-0411:40:51.888][mmdeploy][error][ort_net.cpp:205]unhandled exception when creating ORTNet:Failed to load modelwitherror:D:\a\_work\1\s\onnxruntime\core\graph\model.cc:111onnxruntime::Model::Model Unknown model file format version.[2026-02-0411: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-0411: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}全文目录 问题描述 请知悉如下方案不保证一定适配你的问题✅️问题理解先把这个报错翻译成人话为什么我说“不是先继续盯 opset”你的运行方式也说明了一个关键点✅️问题解决方案方案 A先把问题定性为“模型文件/目录结构/SDK读取目标问题”不要继续只试 opset 和 ORT 版本第一步查看 M2F 目录里到底有什么文件第二步先确认 JSON 配置里到底引用了哪个 ONNX第三步脱离 mmdeploy直接验证 ONNX 文件本体是否合法第四步根据结果快速判断根因情况 1onnx.load() 就失败情况 2onnx.load() 成功但 onnx.checker.check_model() 失败情况 3onnx.checker 通过但 InferenceSession 失败情况 4Python 原生 ORT 能正常跑但 mmdeploy SDK 失败第五步重点排查是否用了 external data但下位机漏拷文件第六步确认文件不是“空文件 / 文本文件 / 错误覆盖文件”方案 B不要随便替换 mmdeploy SDK 里的 onnxruntime 版本优先保证“导出时版本”和“运行时版本”成套一致正确做法1固定一套版本组合2不要只替换运行目录中的 ORT DLL3导出机和下位机尽量用同一套生成物方案 C把排查拆成“两层”先验证 ONNX再验证 SDK这一层一层排查的意义第 1 层ONNX 本身是否可被原生 ORT 加载第 2 层mmdeploy SDK 是否能基于目录配置正确加载方案 D重点检查导出目录是不是“手工重组过”尤其是你现在传的是目录而不是单文件典型错误场景1只拷了 .onnx没拷完整目录2只拷了 JSON没拷权重相关文件3手工改了 onnx 文件名没改 JSON4目录里同时有旧模型和新模型JSON 指向旧的5模型是多文件导出结果只保留了一个文件建议你直接做一个“最小目录核对”方案 E针对 Mask2Former不要先假设“导出了 onnx 就一定能被当前 SDK 直接跑通”你更应该做的对照实验方案 F继续只围绕 opset 和 onnxruntime 版本试错不建议✅️问题延伸一、opset、IR version、model file format 不是一回事opsetIR versionUnknown model file format version二、mmdeploy SDK 跑的是“目录模型”不是“裸 onnx”三、实例分割模型比普通目标检测更容易在导出阶段踩坑四、下位机报错不一定是“算力不够”更常见是“打包和版本链不一致”✅️问题预测预测 1你会一直误以为是 opset 不对预测 2你会把 mmdeploy SDK 环境越换越乱预测 3你会在 Mask2Former 上反复导出但其实导出目录本身就不完整预测 4即使最后原生 ORT 能跑SDK 依旧可能失败✅️小结你下一步最应该马上做的事 结语 互动说明 文末福利技术成长加速包 Who am I? 请知悉如下方案不保证一定适配你的问题如下是针对上述问题进行专业角度剖析答疑不喜勿喷仅供参考✅️问题理解你这个报错优先级最高的根因并不是“实例分割模型不能部署”也不是单纯的 opset / onnxruntime 版本高低问题而是mmdeploy SDK 在创建 ORTNet 时读取到的“模型文件”没有被 ONNX Runtime 识别为合法 ONNX 模型。日志里最关键的是这一句Failed to load modelwitherror:...onnxruntime::Model::Model Unknown model file format version.这句话的含义非常重要错误发生在“加载模型文件”阶段还没进入真正的推理执行阶段大概率不是普通算子不支持大概率不是继续换 opset 就能解决更像是文件本体、目录结构、SDK 读取目标、运行时配套出了问题先把这个报错翻译成人话ONNX Runtime 在做这件事时失败了打开某个“应该是 ONNX 模型”的文件 → 解析文件头 / protobuf / model ir → 发现格式不对所以它才会报Unknown model file format version这类报错通常更接近下面几种情况SDK 实际读取到的不是合法.onnx文件目录里配置指向错文件了你拷到下位机的模型目录不完整模型文件损坏 / 被覆盖 / 大小异常导出产生了 external data但下位机漏拷了配套文件你替换了 onnxruntime DLL但 mmdeploy SDK 和 ORT 版本并不是同一套mmdeploy SDK 读的是“目录模型”而不是你以为的某个单独 onnx为什么我说“不是先继续盯 opset”如果是普通的 opset / 算子兼容问题更常见的报错通常像这样Unsupported opset versionNo Op registered for ...Unsupported operatorOp schema mismatchFailed to find kernel for ...但你这个不是。你这个是连模型文件格式都没正确识别出来。所以当前真正的问题更像模型目录或模型文件本身出了问题而不是推理图执行阶段出问题。你的运行方式也说明了一个关键点你执行的是python object_detection.py cpuC:\Users\24674\Desktop\mmdet\M2Fxxx.jpg这里传给 SDK 的不是一个.onnx路径而是一个模型目录C:\Users\24674\Desktop\mmdet\M2F也就是说mmdeploy 的DirectoryModel会去这个目录里根据配置文件读取实际模型文件。所以你以为在跑某个.onnx但实际上 SDK 可能在读end2end.onnxpartition_0.onnx甚至某个不存在或损坏的文件或者 JSON 配置里写错的文件名这正是很多人排查失败的根因一直换 ONNX 文件版本但 SDK 实际读的不是那个文件。✅️问题解决方案方案 A先把问题定性为“模型文件/目录结构/SDK读取目标问题”不要继续只试 opset 和 ORT 版本这是最推荐的路线。✅先把“到底读了什么文件、那个文件是否合法”查清楚再谈导出版本。第一步查看M2F目录里到底有什么文件你先检查C:\Users\24674\Desktop\mmdet\M2F重点看这些文件是否存在deploy.jsonpipeline.jsondetail.json*.onnx*.data*.bin在 Windows 命令行可以直接执行dir /a C:\Users\24674\Desktop\mmdet\M2F或者 Pythonimportos model_dirrC:\Users\24674\Desktop\mmdet\M2Fforfinos.listdir(model_dir):pos.path.join(model_dir,f)print(f,os.path.getsize(p)ifos.path.isfile(p)elseDIR)第二步先确认 JSON 配置里到底引用了哪个 ONNX你一定要打开这几个文件deploy.jsonpipeline.jsondetail.json重点找这些字段modelsnetbackendonnxfileweightsuri因为 mmdeploy SDK 目录模式不是“自动挑一个 onnx 就跑”而是按配置指定的文件去读。你要确认JSON 里写的模型文件名目录里真的存在文件名大小写、后缀、路径都对没有手动改过 onnx 文件名但忘了同步 JSON没有保留旧的 pipeline/deploy 配置第三步脱离 mmdeploy直接验证 ONNX 文件本体是否合法这是最关键的一步。不要先走 SDK先直接拿 Python 检查 ONNX 文件。把下面脚本存成check_onnx.py把文件名改成目录里真正那个.onnximportosimportonnximportonnxruntimeasort model_pathrC:\Users\24674\Desktop\mmdet\M2F\end2end.onnx# 改成实际文件名print( file exists )print(os.path.exists(model_path),model_path)print( file size )print(os.path.getsize(model_path),bytes)print( onnx.load )modelonnx.load(model_path)print(onnx.load ok)print( ir / opset )print(IR version:,model.ir_version)forxinmodel.opset_import:print(domain:,x.domainifx.domainelseai.onnx,version:,x.version)print( onnx.checker )onnx.checker.check_model(model)print(onnx.checker ok)print( onnxruntime session )sessort.InferenceSession(model_path,providers[CPUExecutionProvider])print(ORT session ok)print( inputs )foriinsess.get_inputs():print(i.name,i.shape,i.type)print( outputs )foroinsess.get_outputs():print(o.name,o.shape,o.type)第四步根据结果快速判断根因情况 1onnx.load()就失败说明文件本身不是合法 ONNX文件损坏拿错文件文件被错误重命名导出不完整这时不要再看 mmdeploy SDK 了先解决导出文件本体问题。情况 2onnx.load()成功但onnx.checker.check_model()失败说明ONNX 能被读取但图结构不规范导出过程有问题模型图不完整或包含不合法节点这时重点看导出日志。情况 3onnx.checker通过但InferenceSession失败说明ONNX 文件是合法的但 ORT 不支持它的某些内容这时再去看 IR 版本 / opset / 算子 / runtime 兼容性情况 4Python 原生 ORT 能正常跑但 mmdeploy SDK 失败这几乎可以直接判断问题不在 ONNX 本体而在 mmdeploy SDK 目录结构、JSON 配置、版本配套、或 SDK 实际读取目标。第五步重点排查是否用了 external data但下位机漏拷文件Mask2Former 这类模型比较大导出 ONNX 时有可能产生model.onnxmodel.onnx.data或者其他 external data 文件。如果下位机目录里只有一个.onnx但缺少旁边的.data文件就会出各种异常。虽然这种情况更常见的报错不一定就是你这个但必须排查。你要看目录里是不是有.onnx.data是不是导出时开启了 external data你是不是只拷了.onnx没把配套文件一起拷过去第六步确认文件不是“空文件 / 文本文件 / 错误覆盖文件”这是非常常见的坑。⚠️比如导出失败后生成了一个很小的空壳文件误把 JSON 文件重命名成.onnxGit/LFS 下载下来的是 pointer 文本不是真模型拷贝中断导致文件不完整所以你一定要看文件大小。一个 Mask2Former 的 ONNX如果只有几 KB、几十 KB、几百 KB基本就不正常。可以用下面代码快速看头几个字节model_pathrC:\Users\24674\Desktop\mmdet\M2F\end2end.onnxwithopen(model_path,rb)asf:dataf.read(32)print(data)如果开头是明显文本内容例如{version https://git-lfs.github.com/spec类似 JSON 文本 / 配置文本那就说明这个文件根本不是你以为的 ONNX 模型。方案 B不要随便替换 mmdeploy SDK 里的 onnxruntime 版本优先保证“导出时版本”和“运行时版本”成套一致这个点非常关键。你说已经把opsetonnxruntime都降级和升级过但都报错。这恰恰说明你可能又踩了第二个坑mmdeploy SDK 不是“随便换个 onnxruntime.dll 就行”的。因为 mmdeploy SDK 里的mmdeploy_ort_net.dllonnxruntime.dll通常是按某一套版本构建和测试的。你如果只是手工替换ORT DLL或部分 backend DLL可能会带来新的兼容性问题甚至让原本单一问题变成多重问题。正确做法1固定一套版本组合确保下面这些版本是一套导出/部署链mmdeploymmdetectionmmcvonnxruntimeSDK 中的 dll导出配置文件2不要只替换运行目录中的 ORT DLL如果你真要换 ORT应该重新编译对应的 mmdeploy而不是只替换 DLL。3导出机和下位机尽量用同一套生成物尤其 Windows 下手工拼 runtime 环境最容易出错。方案 C把排查拆成“两层”先验证 ONNX再验证 SDK这个方案特别实用。很多人现在的问题是把两层混在一起一会儿怀疑 onnx一会儿怀疑 sdk一会儿怀疑 runtime一会儿怀疑 opset这样非常乱。你应该强制拆开这一层一层排查的意义第 1 层ONNX 本身是否可被原生 ORT 加载只要这一步失败就别继续纠结 SDK。第 2 层mmdeploy SDK 是否能基于目录配置正确加载如果原生 ORT 成功但 SDK 失败那就说明目录不完整JSON 配置有误SDK / backend / dll 配套错误方案 D重点检查导出目录是不是“手工重组过”尤其是你现在传的是目录而不是单文件这个问题在部署中非常常见。比如原始导出目录是work_dir/ deploy.json pipeline.json detail.json end2end.onnx结果你自己新建了一个M2F/ model.onnx deploy.json然后以为这就能跑。但实际上 JSON 里可能还引用的是end2end.onnx某个分段模型某个相对路径文件于是 SDK 就去读错文件了。典型错误场景1只拷了.onnx没拷完整目录2只拷了 JSON没拷权重相关文件3手工改了 onnx 文件名没改 JSON4目录里同时有旧模型和新模型JSON 指向旧的5模型是多文件导出结果只保留了一个文件建议你直接做一个“最小目录核对”把M2F目录完整列出来然后逐个核对文件名文件大小JSON 引用是否存在.data是否存在多个 onnx方案 E针对 Mask2Former不要先假设“导出了 onnx 就一定能被当前 SDK 直接跑通”这里要特别提醒一下。Mask2Former 这种实例分割模型比普通检测模型复杂很多它通常涉及transformer 结构mask 分支更复杂的输出复杂后处理更容易遇到动态 shape / 导出链路差异所以就算“导出阶段没有明显报错”也不代表生成物一定完整ONNX 一定合法SDK 一定可以直接消费你更应该做的对照实验先用同一套环境、同一个 SDK 示例程序跑一个更简单的可部署模型做对照例如普通检测模型已知可部署的 ONNX 模型如果简单模型能跑而 Mask2Former 不能跑那么说明SDK 环境本身没坏问题集中在当前导出目录或当前模型导出链这个对照非常有价值。方案 F继续只围绕 opset 和 onnxruntime 版本试错不建议这个方案明确不推荐。❌原因很简单你的当前错误更像“文件格式/目录读取错误”而不是“算子支持不够”继续这样试opset 11opset 13opset 17ORT 1.12ORT 1.14ORT 1.16很容易把环境越试越乱但问题本身没有被真正定位。✅️问题延伸一、opset、IR version、model file format不是一回事这是很多人会混掉的点。opset是算子集版本例如 Conv、Resize、Gather 这些算子用哪个定义版本。IR version是 ONNX 模型文件本身的表示版本。Unknown model file format version更偏向文件本体在读取层面就不对甚至可能还没进入正常算子兼容判断阶段。所以你不能把所有加载失败都归因于opset。二、mmdeploy SDK 跑的是“目录模型”不是“裸 onnx”这一点再强调一次。你给 SDK 的参数是目录C:\Users\24674\Desktop\mmdet\M2F所以 SDK 的实际行为是读 JSON 配置找模型文件创建 backend net加载后处理配置并不是简单地读一个xxx.onnx因此目录结构完整性比单个 onnx 文件名更重要。三、实例分割模型比普通目标检测更容易在导出阶段踩坑不是你操作一定错了而是模型本身就更复杂输出不仅有 bbox还有 mask后处理更复杂很多链路对 shape 和 metadata 更敏感所以对 Mask2Former 这种模型部署排查一定要比普通检测更细。四、下位机报错不一定是“算力不够”更常见是“打包和版本链不一致”你这个错误发生在加载模型阶段所以现在完全不应该优先怀疑CPU 性能CUDA 算力推理速度而应该优先怀疑文件本体模型目录SDK 读错文件版本链不一致✅️问题预测如果你现在不先做文件本体验证而继续只换版本后面大概率会出现这些情况预测 1你会一直误以为是 opset 不对但实际是拷错目录JSON 指错文件文件本体损坏所以版本怎么换都没用。预测 2你会把 mmdeploy SDK 环境越换越乱尤其在 Windows 下手工替换onnxruntime.dllmmdeploy_ort_net.dllbackend 相关 dll最后原问题还在环境却更不稳定。预测 3你会在 Mask2Former 上反复导出但其实导出目录本身就不完整例如少了.data少了deploy.jsonpipeline 没同步读的是旧 onnx预测 4即使最后原生 ORT 能跑SDK 依旧可能失败因为那时问题就转成目录配置backend 配套SDK 与 ORT 的组合问题✅️小结我给你一个直接结论你当前这个错误大概率不是“实例分割模型算子不支持”或者“单纯的 opset/onnxruntime 版本不匹配”而是“mmdeploy SDK 读取到的模型文件不是合法可解析的 ONNX或者 SDK 目录结构/配置/运行时配套存在问题”。你现在最应该按这个顺序处理你下一步最应该马上做的事请你把下面 3 份内容贴出来我可以继续直接帮你定位到文件级别M2F目录完整文件列表至少要包括文件名和大小deploy.json和pipeline.json的内容或至少贴出里面引用模型文件的那部分运行下面这个脚本的输出结果尤其是onnx.loadonnx.checker.check_modelInferenceSessionimportosimportonnximportonnxruntimeasort model_pathrC:\Users\24674\Desktop\mmdet\M2F\你的实际onnx文件名.onnxprint(exists:,os.path.exists(model_path))print(size:,os.path.getsize(model_path))modelonnx.load(model_path)print(ir_version:,model.ir_version)forxinmodel.opset_import:print(opset:,x.domainifx.domainelseai.onnx,x.version)onnx.checker.check_model(model)print(checker ok)sessort.InferenceSession(model_path,providers[CPUExecutionProvider])print(session ok)我先追问一个最关键的问题你这个M2F目录里除了.onnx之外具体还有哪些文件尤其有没有deploy.json、pipeline.json、detail.json、以及.onnx.data这类配套文件 结语 互动说明希望以上分析与解决思路能为你当前的问题提供一些有效线索或直接可用的操作路径。若你按文中步骤执行后仍未解决不必焦虑或抱怨这很常见——复杂问题往往由多重因素叠加引起欢迎你将最新报错信息、关键代码片段、环境说明等补充到评论区我会在力所能及的范围内结合大家的反馈一起帮你继续定位 如果你有更优或更通用的解法非常欢迎在评论区分享你的实践经验或改进方案你的这份补充可能正好帮到更多正在被类似问题困扰的同学正所谓「赠人玫瑰手有余香」也算是为技术社区持续注入正向循环 文末福利技术成长加速包 文中部分问题来自本人项目实践部分来自读者反馈与公开社区案例也有少量经由全网社区与智能问答平台整理而来。若你尝试后仍没完全解决问题还请多一点理解、少一点苛责——技术问题本就复杂多变没有任何人能给出对所有场景都 100% 套用的方案。如果你已经找到更适合自己项目现场的做法非常建议你沉淀成文档或教程这不仅是对他人的帮助更是对自己认知的再升级。如果你还在持续查 Bug、找方案可以顺便逛逛我专门整理的 Bug 专栏《全栈 Bug 调优实战版》️这里收录的都是在真实场景中踩过的坑希望能帮你少走弯路节省更多宝贵时间。✍️如果这篇文章对你有一点点帮助欢迎给 bug菌 来个一键三连关注 点赞 收藏你的支持是我持续输出高质量实战内容的最大动力。同时也欢迎关注我的硬核公众号 「猿圈奇妙屋」获取第一时间更新的技术干货、BAT 等互联网公司最新面试真题、4000G 技术 PDF 电子书、简历 / PPT 模板、技术文章 Markdown 模板等资料通通免费领取。你能想到的绝大部分学习资料我都尽量帮你准备齐全剩下的只需要你愿意迈出那一步来拿。 Who am I?我是 bug菌热活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区CSDN 博客之星 Top30、华为云多年度十佳博主/卓越贡献者、掘金多年度人气作者 Top40掘金、InfoQ、51CTO 等平台签约及优质作者全网粉丝累计30w。更多高质量技术内容及成长资料可查看这个合集入口 点击查看 ️硬核技术公众号「猿圈奇妙屋」期待你的加入一起进阶、一起打怪升级。- End -

相关新闻