升级Tensorflow2.x opencv无法直接读取 saved_model.pb?

升级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')
复制代码

正如上面说的,这样加载了模型后,得到的预测结果是错误的,不知道哪里出了问题。

参考链接

opencv文档

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享