如何在TensorFlow 2.x目标检测API中导出冻结推理图并解决相关报错
TensorFlow 2.x Object Detection API导出冻结推理图解决方案
报错原因说明
_UserObject has no attribute 'inputs'报错的根因是Object Detection API导出的SavedModel是经过封装的自定义对象,不是原生tf.keras.Model实例,直接对加载后的根对象取inputs属性不生效,必须先获取对应的推理签名函数。
方案1:从已导出的SavedModel直接转换
先通过官方提供的exporter_main_v2.py脚本导出标准SavedModel,再通过以下代码转换为单个冻结推理图:
import tensorflow as tf from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2 # 按实际路径替换 saved_model_path = "exporter_main_v2导出的SavedModel目录路径" output_pb_path = "待保存的冻结图路径/frozen_inference_graph.pb" # 加载SavedModel model = tf.saved_model.load(saved_model_path) # 获取OD API默认的推理签名函数 infer_func = model.signatures["serving_default"] # 把变量转换为常量,完成冻结 frozen_function = convert_variables_to_constants_v2(infer_func) # 写入冻结pb文件 tf.io.write_graph( graph_or_graph_def=frozen_function.graph, logdir=".", name=output_pb_path, as_text=False )
如果需要确认输入输出节点名用于后续推理,可追加以下代码打印:
print("输入节点列表:", [node.name for node in frozen_function.inputs]) print("输出节点列表:", [node.name for node in frozen_function.outputs])
方案2:修改官方导出脚本直接生成冻结图
可以直接修改exporter_main_v2.py的逻辑,在导出SavedModel的步骤完成后,直接插入上述转换代码,导出时同步生成冻结图,无需后续单独转换。
注意事项
- 转换得到的冻结图和TensorFlow 1.x版本
export_inference_graph.py导出的结构完全兼容,可直接用于原有适配TF1冻结图的推理链路 - 不要直接对
tf.saved_model.load()返回的根对象取inputs/outputs属性,必须通过signatures["serving_default"]获取推理函数后再操作
内容的提问来源于stack exchange,提问作者William Jiang
相关产品推荐
相关产品推荐

