TensorFlow 2.5.0下如何将saved_model.pb转换为frozen_graph.pb
TensorFlow 2.X 目标检测SavedModel转Frozen Graph.pb方案
你遇到的AttributeError: '_UserObject' object has no attribute 'inputs'报错,是因为TensorFlow Object Detection API导出的SavedModel不是普通Keras序列模型,通用Keras转冻结图的脚本无法直接适配,需通过签名提取的方式完成转换,具体步骤如下:
- 第一步:确认导出的SavedModel目录完整,包含
saved_model.pb文件和variables文件夹 - 第二步:编写并运行以下转换脚本:
import tensorflow as tf from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2 # 替换为你本地的SavedModel文件夹路径 saved_model_path = "./exported_saved_model" # 替换为你想要输出frozen_graph.pb的文件夹路径 output_dir = "./frozen_model_output" # 加载SavedModel并提取默认推理签名 loaded_model = tf.saved_model.load(saved_model_path) infer_signature = loaded_model.signatures["serving_default"] # 生成ConcreteFunction,输入尺寸适配MobileNetSSD的300*300输入,如有自定义尺寸可自行修改 concrete_func = infer_signature.get_concrete_function( tf.TensorSpec(shape=[1, 300, 300, 3], dtype=tf.uint8, name="input_tensor") ) # 将变量转换为常量,得到冻结图 frozen_graph_def = convert_variables_to_constants_v2(concrete_func) # 写入本地得到frozen_graph.pb tf.io.write_graph( graph_or_graph_def=frozen_graph_def, logdir=output_dir, name="frozen_graph.pb", as_text=False )
- 第三步:转换完成后,你可以使用生成的
frozen_graph.pb生成对应pbtxt文件,也可以直接传入OpenCV DNN的readNetFromTensorflow接口完成部署。
注意事项
- 模型输入节点固定为
input_tensor,输出节点可通过打印frozen_graph_def.node查看,MobileNetSSD类目标检测模型的默认输出为detection_boxes、detection_scores、detection_classes、num_detections,生成pbtxt时需对应节点名称 - 如需生成可直接用于OpenCV DNN的pbtxt,可直接匹配上述输入输出节点名称配置结构即可
- 转换完成后可通过Netron工具打开
frozen_graph.pb,确认节点结构和输入输出是否符合预期
内容的提问来源于stack exchange,提问作者Tyler Oleson
相关产品推荐
相关产品推荐

