EfficientDet-D2从TensorFlow转ONNX遇输入张量异常及转换失败问题
EfficientDet模型TensorFlow转ONNX的输入形状指定问题
问题描述
- 初始转换命令将EfficientDet-D2的SavedModel转ONNX:
python3 -m tf2onnx.convert --saved-model ./tmp/efficientdet-d2-saved_model --output ./tmp/efficientdet-d2.onnx --opset 12 - 转换后用Netron可视化,输入张量显示为
unk_3256这类未知形式,无法正常推理 - 尝试指定输入形状转换时,执行以下命令报错
ValueError: Failed to import metagraph, check error log for more info.:python3 -m tf2onnx.convert --saved-model ./tmp/efficientdet-d2-saved_model --output ./tmp/efficientdet-d2.onnx --opset 13 --inputs "image_files:[1,3,768,768]"
解决步骤
1. 确认SavedModel的输入签名信息
先用官方工具查看模型的输入张量名称、默认形状和数据类型,避免用错输入名:
tf.saved_model.cli show ./tmp/efficientdet-d2-saved_model --all
重点查看serving_default签名下的输入字段,EfficientDet的TF模型通常输入张量名为image而非image_files,且默认输入格式为NHWC(即[batch, height, width, channels]),而非命令中写的NCHW格式。
2. 使用正确的转换命令
情况1:保持TF原生NHWC格式转换
如果推理框架支持NHWC,直接用匹配的形状转换:
python3 -m tf2onnx.convert --saved-model ./tmp/efficientdet-d2-saved_model \ --output ./tmp/efficientdet-d2.onnx \ --opset 13 \ --inputs "image:[1,768,768,3]" \ --signature-def serving_default
情况2:转换为ONNX常用的NCHW格式
如果需要NCHW格式的输入,添加--inputs-as-nchw参数指定转置输入:
python3 -m tf2onnx.convert --saved-model ./tmp/efficientdet-d2-saved_model \ --output ./tmp/efficientdet-d2.onnx \ --opset 13 \ --inputs "image:[1,768,768,3]" \ --inputs-as-nchw image \ --signature-def serving_default
3. 额外排查要点
- 升级tf2onnx到最新版本,避免版本兼容问题:
pip install --upgrade tf2onnx tensorflow - 如果模型有多个签名定义,必须用
--signature-def指定正确的推理签名(通常是serving_default)
内容的提问来源于stack exchange,提问作者ABD
相关产品推荐
相关产品推荐

