Tensorflow pb模型转uff模型方法及遇到KeyError20和expected Const问题解决

article/2025/8/16 6:58:07

项目所需要将Tensorflow 生成的pb模型转为uff模型,方法很简单,但是遇到的问题着实很多,这里主要记录下问题及解决方法,总之,最后是成功生成uff格式的模型的,有需要的可以参考。


pb模型转为uff模型的方法及步骤,网上很多,最后使用的方法如下:

1、电脑没装win10+ubuntu的双系统,为了简便,用vmware创建了个ubuntu的虚拟机,ubuntu系统是ubuntu-16.04.3-desktop-amd64;

2、进入虚拟机的Ubuntu系统,打开Terminal,安装了个Anaconda,使用如下命令创建Python虚拟环境,并安装python2.7和numpy:

conda create --name tensorflow-cpu python=2.7 numpy

3、创建完毕后,激活tensorflow-cpu虚拟环境:

conda activate tensorflow-cpu

4、安装cpu版本的tensorflow,这里没安装gpu版本的,cpu版本的转换uff够用了,用的1.10.0版本的也可以,别的版本的需要自己测试了:

pip install --upgrade pip
pip install tensorflow==1.10.0

5、去下载TensorRT-5.0.2.6.Ubuntu-16.04.4.x86_64-gnu.cuda-9.0.cudnn7.3.tar.gz:

下载网址:https://developer.nvidia.com/nvidia-tensorrt-5x-download

下载完后解压,主要得到三个安装whl文件:

6、上面下载的文件拷贝到Ubuntu系统,分别进入相应的目录,安装这三个whl文件即可:

pip install tensorrt-5.0.2.6-py2.py3-none-any.whl
pip install uff-0.5.5-py2.py3-none-any.whl
pip install graphsurgeon-0.3.2-py2.py3-none-any.whl

7、将训练好的pb模型文件拷贝到Ubuntu系统,进入到模型目录,使用如下命令转换模型文件:

convert-to-uff -o ssd_inception_v2_coco.uff --input_file frozen_inference_graph.pb

结果如下图所示,生成所需要的uff模型:


上述方法很简单,但是遇到的问题就让人惆怅了。

问题1:运行convert-to-uff转换命令后,运行不成功,提示KeyError:20的错误:

原因分析:前期探索过程中使用的uff-0.6.5和graphsurgeon-0.4.1版本,就会报这个错,试了好久,后来换成uff-0.5.5和graphsurgeon-0.3.2,就不报这个错误了。

问题2:运行convert-to-uff转换命令后,提示“uff.model.exceptions.UffException: Transpose permutation has op Sub, expected Const. Only constant permuations are supported in UFF.”的错误:

原因分析Tensorrt并不支持Tensorflow的所有操作,但是tf.transpose操作对于Tensorrt5.0是支持的,但是并不支持tf.transpose里面还有tf.subtract操作,所以需要对代码里面的tf.subtract操作进行Constant folding optimizer处理,将运算转换为常量;也就是网上NVIDIA给出的解决方法:

刚看到这个constfold optimizer,根本不知道是什么啊,没办法,只能各种搜,最终google到了一个可以适用于这个错误的解决方法,就是在训练模型的代码里,找到tf.transpose的位置,加入如下代码,解决此问题,其实就是Tensorflow的一种优化处理,Constant folding optimizer,用来提升代码处理速度的

import contextlib
import tensorflow as tf@contextlib.contextmanager
def options(options):old_opts = tf.config.optimizer.get_experimental_options()tf.config.optimizer.set_experimental_options(options)try:yieldfinally:tf.config.optimizer.set_experimental_options(old_opts)……
……
……with options({'constant_folding': True}):……tf.transpose(……)……

此外,也搜索到了官方给的名为fold constants的工具,fold_constants.py文件,可以自己试试官方的方法,文件代码如下(偶然的机会在google上搜到的,链接没保存,找不到了):

#!/usr/bin/env python3
from tensorflow.core.protobuf import config_pb2, rewriter_config_pb2, meta_graph_pb2
from tensorflow.core.framework import graph_pb2
from tensorflow.python.saved_model import tag_constants
from tensorflow.python.framework import importer, ops
from tensorflow.python.grappler import tf_optimizer
from tensorflow.python.training import saver# For automatic output node deduction.
import graphsurgeon as gs
import argparsedef constfold(graphdef):graph = ops.Graph()with graph.as_default():outputs = [node.name for node in gs.StaticGraph(graphdef).graph_outputs]output_collection = meta_graph_pb2.CollectionDef()output_list = output_collection.node_list.valuefor output in outputs:output_list.append(output.encode("utf-8"))importer.import_graph_def(graphdef, name="")metagraph = saver.export_meta_graph(graph_def=graph.as_graph_def(add_shapes=True), graph=graph)metagraph.collection_def["train_op"].CopyFrom(output_collection)rewriter_config = rewriter_config_pb2.RewriterConfig()rewriter_config.optimizers.extend(["constfold"])rewriter_config.meta_optimizer_iterations = (rewriter_config_pb2.RewriterConfig.ONE)session_config = config_pb2.ConfigProto()session_config.graph_options.rewrite_options.CopyFrom(rewriter_config)return tf_optimizer.OptimizeGraph(session_config, metagraph, graph_id=b"tf_graph")def main():parser = argparse.ArgumentParser("Folds constants in the provided frozen model")parser.add_argument("model_file", help="The frozen model in which to fold constants.")parser.add_argument("-o", "--output-file", help="The path at which to write the new graph, with constants folded.")args, _ = parser.parse_known_args()with open(args.model_file, 'rb') as f:graphdef = graph_pb2.GraphDef()graphdef.ParseFromString(f.read())folded_graph = constfold(graphdef)if args.output_file:with open(args.output_file, "wb") as f:f.write(folded_graph.SerializeToString())if __name__ == '__main__':main()

问题3:加了上面的代码后,可能会出现“AttributeError: module 'tensorflow' has no attribute 'config'”的问题:

原因分析:跑训练模型的代码使用tensorflow版本必须大于等于1.14.0,小于此版本会报这个错,tensorflow gpu 1.14.0以后的版本需要cuda10.0以上版本才可以;

 


完!方法很简单,但是遇到的问题让人烦。


最后,如果上述方法还行不通的话,本人建议使用英伟达开源的模型转换工具;

官方链接为:https://github.com/AastaNV/TRT_object_detection

按照网站的步骤,执行完main.py将会生成temp.uff文件,还能测试生成的uff文件可不可用。

这个方法的参考链接:https://www.it610.com/article/1283183189296168960.htm

https://www.minds.ai/post/deploying-ssd-mobilenet-v2-on-the-nvidia-jetson-and-nano-platforms


有问题,可一起讨论。

 

 

 

 


http://chatgpt.dhexx.cn/article/u25RtYtS.shtml

相关文章

安装TensorRT,然后导入uff库包的时候报错:ImportError: ERROR: Failed to import module(cannot import name ‘GraphDef`)

欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 安装TensorRT,然后导入uff库包的时候报错:ImportError: ERROR: Failed to import module(cannot import name GraphDef from…

pb模型转uff模型(tensorflow2.x)

大多数的博客只是提到tensorflow1.x系列下的转换。大概步骤就是安装tensorrt,同时安装tensorrt下的几个python的wl文件。可参见博主之前的博客: 1.tensorrt的安装Ubuntu配置TensorRT及验证_竹叶青lvye的博客-CSDN博客 2.tensorrt下几个whl文件的安装TensorRT加速方…

Sony索尼HLG灰片电影调色LUT预设合集 HLG CINEMATIC LUTPACK BUNDLE

Sony索尼HLG灰片电影调色LUT预设合集 HLG CINEMATIC LUTPACK BUNDLE 原文地址:https://www.aeziyuan.com/t-20546.html 包括用于Sony索尼LOG相机的39组LUT预设。是目前为止Sony索尼相机最好的预设之一。 它适用于支持LUT预设效果的大多数软件。例如Premiere Pro&…

两种HDR格式(HLG, HDR10)的理解

1、HLG只在sps的vui中会携带信息,包括colour_primaries(9),transfer_characteristics(18),matrix_coefficients(9) 2、HDR10除了SPS的VUI中携带的信息,在key frame会携带相应的SEI(mastering display、content light l…

详解HDR的三个标准——HLG/HDR10/Dolby Vision

HDR的三大标准:HLG(Hybrid Log Gamma);HDR10;Dolby Vision HLG:HLG的全称是Hybrid Log Gamma,它是由英国BBC和日本NHK电视台联合开发的高动态范围HDR的一个标准。HLG不需要元数据,能…

HLG移动

在平面坐标系内&#xff0c;有两个坐标轴x轴和y轴。&#xff08;x,y&#xff09;表示点的坐标。 有一点处于&#xff08;x1,y1&#xff09;位置上&#xff0c;他可以向相临8个位置移动&#xff08;移动方式见下图&#xff09;。 划定范围&#xff1a;此点只可以在[0<x<3…

HLG 2025

确定大小 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 50(15 users)Total Accepted: 12(11 users)Rating: Special Judge: NoDescription现在有N个字母&#xff0c;&#xff08;N < 26&#xff09;&#xff0c;我们称之为A、B、C、D......。这次他们之间想确定…

SDR屏幕放HDR(HLG)视频画面泛灰

假设场景线性光E&#xff08;RGB&#xff09;1. SDR&#xff1a;数据位宽为10bit。灰度值2^10 * E1023; HDR&#xff1a;HDR根据OETF&#xff08;光电转换&#xff09;将相对场景线性光映射到非线性信号值 E 0.5&#xff1b; 灰度值2^10*0.5512&#xff1b; 所以本来需要显…

HDR相关标准-HLG/HDR10/HDR10+/DOLBY VISION

目录 主要参考信息 动态元数据及使用 相关标准文件 主要参考信息 杜比视界HDR参数_qq26983255的博客-CSDN博客_pq和hlghttps://blog.csdn.net/qq26983255/article/details/119830337?spm1001.2014.3001.5502 HDR到底是什么&#xff1f;_相见不如怀念-CSDN博客一&#xf…

PQ和HLG标准及其转换

目录 PQ标准的电光转换函数PQ_EOTF PQ标准的光电转换函数PQ_OETF HLG标准的电光转换函数HLG_EOTF HLG标准的光电转换函数 HLG_OETF HLG标准转PQ标准HLG2PQ PQ标准转HLG标准PQ2HLG PQ标准的电光转换函数PQ_EOTF PQ标准的光电转换函数PQ_OETF HLG标准的电光转换函数HLG_EOTF…

OpenGLSL中处理HDR.ToneMapping(HLG)

紧跟前提文章&#xff0c;没有HDR.ToneMapping知识基础的同学请先阅读之前的文章&#xff1a; HDR in Android 专栏 这篇文章主要是介绍在GLSL中处理HLG&#xff08;hybrid-log-gamma 混合对数伽马曲线&#xff09;的HDR tonemap SDR的渲染流程。 先看看Wiki有关HLG的概述&am…

HDR中HLG与PQ曲线的互转

HDR视频中由于电光转换曲线的不同&#xff0c;技术标准也大致分为了杜比视界、HDR10、HDR10、HLG等&#xff0c;目前常用的主要是以PQ曲线的HDR10和HLG。这两者之间的区别在HDR视频编码参数中进行过详细的说明。一般的HLG适用于广电&#xff08;根据用户设备的峰值亮度动态的调…

使用DataList吧

这是个具有明显煽动性的标题&#xff0c;没错&#xff0c;在这里就是提议大家使用DataList。在MSDN中文站有一篇关于repeater&#xff0c;datalist和datagrid的性能测试的文章&#xff0c;我也把这篇文章转到了我的站的“转载嘿嘿 希望你接受我的教训 一定早做打算 精华”里&am…

html5-datalist标签-定义选项列表

datalist使用 datalist使用需与input关联起来&#xff0c;input定义list属性&#xff0c;同时datalist定义id属性&#xff0c;两者的值必须相同。 实例代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…

常用数据集合—List

1、List、Map、Set、Queue、Array 2、数据结构&#xff1a;数组、链表 3、实现List方法的类Ctrl T&#xff08;设置的是Eclipse快捷键&#xff09;或右键查找 4、这里就简单看下最常用的ArrayList 5、构造方法一目了然 6、添加数据&#xff0c;一条条添加或者添加集合 良好…

DataList的数据绑定

8.4.1 DataList的数据绑定 DataList控件中通过自定义模板来设置数据的显示样式&#xff0c;它支持如下模板类型&#xff1a; ItemTemplate&#xff1a;包含一些 HTML元素和控件&#xff0c;将为数据源中的每一行呈现一次这些HTML元素和控件。 AlternatingItemTemplate&#xf…

datalist标签

学习笔记&#xff0c;仅供参考&#xff0c;有错必纠 参考自&#xff1a;w3school 关于datalist标签 <datalist> 标签定义选项列表&#xff0c;应该与 <input>标签配合使用该&#xff0c;它定义 input 可能的值&#xff1b; <datalist> 及其选项不会被显示出…

datalist 元素

效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>datalist 元素</title> </head> <body><form action"#" method"post">请输入用户…

<datalist>标签

<datalist>标签是HTML5新增的元素&#xff0c;用于input的标签可选值。 用法&#xff1a;input标签的list属性指定自定义的datalist可选值&#xff0c;datalist的id于list值相同即可完成绑定。 可选值: <input type"text" list"myDatalist">…