Tensorflow 2 目标检测与 OpenCV C++

7
我使用Tensorflow 2 Object Detection API训练了SSD ResNet V1模型,然后想在C++代码中使用OpenCV这个模型。首先,在训练后我有三个文件:
- checkpoint - ckpt-101.data-00000-of-00001 - ckpt-101.index
请注意,我没有.meta文件,因为它没有生成。接着,我使用Object Detection API中的exporter_main_v2.py脚本从这些文件中创建了SavedModel。
python3 exporter_main_v2.py input_type=image_tensor --pipeline_config_path /path/to/pipeline.config --trained_checkpoint_dir=/path/to/checkouts --output_directory=/path/to/output/directory

运行此脚本后,我得到了saved_model.pb文件。

我尝试在OpenCV中使用此文件的方式如下:

cv::dnn::Net net = cv::dnn::readNetFromTensorflow("/path/to/saved_model.pb");

但我收到了以下错误:

OpenCV(4.2.0) /home/andrew/opencv/modules/dnn/src/tensorflow/tf_io.cpp:42: error: (-2:Unspecified error) FAILED: ReadProtoFromBinaryFile(param_file, param). Failed to parse GraphDef file: /home/andrew/Documents/tensorflow_detection/workspace/pb_model/saved_model/saved_model.pb in function 'ReadTFNetParamsFromBinaryFileOrDie'

我尝试冻结saved_model.pb,但是据我所知,在TF2.x中这是不可能的,因为TF2.x不支持Sessions和Graphs。此外,我没有.pbtxt文件。

我的问题是:是否可以在OpenCV C++中使用使用TF2目标检测API训练的模型?

如果您能帮助我解决这些问题或提供任何有用的建议,我将非常感激。

2个回答

1
可以使用Tensorflow 2模型与对象检测API和Opencv,如专用维基所述:https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API 到目前为止,更多的模型与Tensorflow 1兼容,但对于SSD来说应该没问题。 要冻结您的图形,您必须执行以下操作:
import tensorflow as tf

from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2

loaded = tf.saved_model.load('my_model')
infer = loaded.signatures['serving_default']

f = tf.function(infer).get_concrete_function(input_1=tf.TensorSpec(shape=[None, 224, 224, 3], dtype=tf.float32))
f2 = convert_variables_to_constants_v2(f)
graph_def = f2.graph.as_graph_def()

# Export frozen graph
with tf.io.gfile.GFile('frozen_graph.pb', 'wb') as f:
   f.write(graph_def.SerializeToString())

如在OpenCV Github问题评论中所说:https://github.com/opencv/opencv/issues/16582#issuecomment-603819498。然后,您可能需要使用OpenCV Wiki中提供的tf_text_graph_ssd.py生成冻结模型的文本图表示,就这样!

我使用了这段代码,但它对我没有起作用。我收到了错误信息 ValueError: Input 1 of node StatefulPartitionedCall was passed float from 53831:0 incompatible with expected resource. 你知道如何解决吗?另外,正如我在问题中提到的,我想使用OpenCV C++,而不是Python。 - Андрей Диденко
C++ 不应该有任何问题。至于引发的错误,我不知道,抱歉。您可以尝试使用 Tensorflow 1.15 或更低版本启动脚本来冻结模型。 - dnl_anoj

-1

Tensorflow 2不再支持会话,因此您无法轻松地将模型导出为冻结图。我发现了this,解决了我在使用Tensorflow对象检测模型与OpenCV时遇到的问题。希望这能有所帮助。


谢谢您的回复,我会阅读这篇文章。请问您训练时使用的是哪个确切版本的Tensorflow? - Андрей Диденко
在Colab上训练 版本: 1.15.2 - al76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接