Keras转ONNX接入OpenVINO推理报动态形状不支持错误如何解决
OpenVINO加载动态形状模型报错解决
报错核心原因
你使用的旧版IECore是OpenVINO 2022版本前的传统Inference Engine接口,该接口原生不支持带动态维度的输入。你导出的ResNet50 ONNX模型输入形状为(?,256,256,3),批次维度为动态值,直接调用load_network就会触发该运行错误。
解决方案
你可以根据自己的使用场景二选一:
- 方案1:固定输入批次维度,兼容原有旧API逻辑
如果你不需要动态调整推理批次大小,可以在加载网络后手动将动态维度reshape为固定值,不需要更换API,修改后的代码如下:
后续如果需要更换批次大小,重新调用model = keras.models.load_model('/resnet50.h5') onnx_model, _ = tf2onnx.convert.from_keras(model, opset=16) onnx.save(onnx_model, '/t1_model.onnx') ie = IECore() net = ie.read_network("/t1_model.onnx") input_name = list(net.input_info.keys())[0] output_name = list(net.outputs.keys())[0] # 核心修改:将动态批次维度替换为实际推理用的固定大小,示例为单批次推理 net.reshape({input_name: (1, 256, 256, 3)}) net.input_info[input_name].precision = 'FP32' net.outputs[output_name].precision = 'FP32' exec_net = ie.load_network(network=net, device_name='CPU')reshape设置对应维度值、重新加载网络即可。 - 方案2:切换官方推荐的新版OpenVINO API,原生支持动态形状
报错提示的ov::Core::compile_model是OpenVINO 2022及之后版本的主流API,原生支持动态输入形状,不需要手动固定维度,同一模型可以直接适配不同批次的推理输入,适配代码如下:
注意:新版API会自动完成输入输出精度适配,不需要手动设置FP32精度,也不需要拆分read_network、load_network两步操作。import numpy as np import onnx import tf2onnx from tensorflow import keras import openvino as ov # 模型转ONNX的逻辑无需修改 model = keras.models.load_model('/resnet50.h5') onnx_model, _ = tf2onnx.convert.from_keras(model, opset=16) onnx.save(onnx_model, '/t1_model.onnx') # 核心:用新版ov.Core替换旧版IECore core = ov.Core() # 一步完成模型读取、优化、加载,自动适配动态输入 compiled_model = core.compile_model(model="/t1_model.onnx", device_name="CPU") input_layer = compiled_model.input(0) output_layer = compiled_model.output(0) # 推理示例:支持任意合法批次大小输入,无需重复加载模型 # 单批次推理 input_1 = np.random.randn(1, 256, 256, 3).astype(np.float32) res_1 = compiled_model(input_1)[output_layer] # 4批次推理可直接传入对应形状数据 input_4 = np.random.randn(4, 256, 256, 3).astype(np.float32) res_4 = compiled_model(input_4)[output_layer]
内容的提问来源于stack exchange,提问作者진유훈
相关产品推荐
相关产品推荐

