将PB模型转为TensorRT UFF模型时遇AttributeError问题求助
解决TensorRT UFF转换时
from_tensorflow_frozen_model属性错误的问题 看起来你在TX2上把TensorFlow PB模型转TensorRT UFF格式时踩了版本兼容的坑,这个AttributeError本质是TensorRT版本和你用的旧API不匹配导致的,下面给你一步步解决的方案:
错误原因分析
你调用的from_tensorflow_frozen_model方法根本不在tensorrt.parsers.uffparser模块里——早期TensorRT版本中,UFF模型转换是由独立的uff库负责的,而不是tensorrt内置的parsers模块;到了TensorRT 7.x及以上版本,官方甚至已经逐步弃用UFF,转而推荐ONNX作为中间格式,这就导致旧的示例代码在新环境下跑不通。
具体解决步骤
1. 先确认你的TensorRT版本
先在代码里加一行打印版本的代码:
import tensorrt as trt print(trt.__version__)
根据版本不同,处理方式分两种:
情况1:TensorRT 7.x及以上(JetPack 4.5+的TX2通常是这个版本)
官方更推荐用ONNX格式替代UFF,步骤更简单兼容性也更好:
- 用
tf2onnx把PB模型转ONNX:!pip install tf2onnx !python -m tf2onnx.convert --input your_frozen_model.pb --inputs input_node_name:0 --outputs output_node_name:0 --output model.onnx - 然后用TensorRT的ONNX Parser加载模型:
import tensorrt as trt logger = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(logger) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser = trt.OnnxParser(network, logger) with open("model.onnx", "rb") as f: if not parser.parse(f.read()): for error in range(parser.num_errors): print(parser.get_error(error)) # 后续构建引擎的步骤和原来一致
如果你坚持要用UFF,需要单独安装NVIDIA的uff库,然后用uff模块的转换函数:
import uff # 转换PB到UFF字节流 uff_model = uff.from_tensorflow_frozen_model("your_frozen_model.pb", ["output_node_name"]) # 保存为UFF文件 with open("model.uff", "wb") as f: f.write(uff_model)
再用trt.UffParser解析这个UFF文件即可。
情况2:TensorRT 6.x及以下
这个版本还支持uffparser,但转换PB的函数依然在独立的uff库中,所以你需要:
- 确保安装了
uff:pip install uff(TX2上如果是JetPack自带环境,可能需要用apt安装对应包) - 把代码中调用
from_tensorflow_frozen_model的部分改成从uff模块导入,而不是tensorrt.parsers.uffparser
2. 额外注意事项
- 确认PB模型的输入输出节点名称正确:可以用TensorFlow的代码查看节点名:
import tensorflow as tf with tf.gfile.GFile("your_frozen_model.pb", "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) for node in graph_def.node: print(node.name) - TX2上的JetPack版本和TensorRT版本必须严格匹配,不要随便pip安装tensorrt,尽量用JetPack自带的包,避免版本冲突。
内容的提问来源于stack exchange,提问作者Nikhil Kulkarni
相关产品推荐
相关产品推荐

