You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:57:01