升级Tensorflow2.x opencv无法直接读取saved_model.pb?
升级到Tensorflow2.0 之后 .pb 文件 无法转换成 .pbtxt
先说结论
看起来没有作用
很遗憾我没能彻底解决这个问题;参考官网文档的做法,我确实做到了cv加载tensorflow2.0 的pb模型。
但是但是使用这个模型得到的预测结果并不真实,和这个模型的真实情况不符合,数据完全就是错误的。 时间原因没有继续深入了解,直接换了思路达到目的。
初次接触Tensorflow,自己训练模型投入使用遇到了很多问题,可能这个问题有更好的解法,我没有在博客上面找到,欢迎大家指正我的代码,一起交流,谢谢!
问题
调用代码:
net = cv.dnn.readNetFromTensorflow("./model/saved_model.pb")
复制代码
报错堆栈:
[libprotobuf ERROR D:\a\opencv-python\opencv-python\opencv\3rdparty\protobuf\src\google\protobuf\wire_format_lite.cc:581] String field 'opencv_tensorflow.FunctionDef.Node.ret' contains invalid UTF-8 data when parsing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes.
Traceback (most recent call last):
File "D:/Python/projects/RisklyBehaviorDetect/SceneDetect/test.py", line 102, in <module>
net = cv.dnn.readNetFromTensorflow("./model/saved_model.pb")
cv2.error: OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\tensorflow\tf_io.cpp:42: error: (-2:Unspecified error) FAILED: ReadProtoFromBinaryFile(param_file, param). Failed to parse GraphDef file: ./model/saved_model.pb in function 'cv::dnn::ReadTFNetParamsFromBinaryFileOrDie'
复制代码
解决办法
def write_graph_to_pb():
m = tf.saved_model.load('./model/')
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
tfm = tf.function(lambda x: m(x)) # full model
tfm = tfm.get_concrete_function(tf.TensorSpec(m.signatures['serving_default'].inputs[0].shape.as_list(),
m.signatures['serving_default'].inputs[0].dtype.name))
frozen_func = convert_variables_to_constants_v2(tfm)
frozen_func.graph.as_graph_def()
tf.io.write_graph(graph_or_graph_def=frozen_func.graph, logdir="./model/", name="saved_model_graph.pb", as_text=False)
复制代码
这里./model/
这个文件夹下面有saved_model.pb模型文件以及variables文件夹。必须要有这个文件夹。这个应该是tensorflow2.0 之后发生的变化。不再产出pbtxt,也无法将pb模型直接转换成pbtxt。
调用方法转换之后,输出的saved_model_graph.pb,可以被cv直接加载,也不需要转成pbtxt。
调用方法如下:
net = cv.cnn.readNetFromTensorflow('saved_model_graph.pb')
复制代码
正如上面说的,这样加载了模型后,得到的预测结果是错误的,不知道哪里出了问题。
参考链接
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END