我目前正在尝试使用OpenCV加载类似tensorflow模型的U-net。该模型是使用Tensorflow 1.12.0使用Python 3.6.8创建,训练和冻结的,而我正尝试使用C ++中的OpenCV(3.4.2)加载它(目前,我正在测试使用Python中的OpenCV加载模型)。一种类似的方式来实现我在C ++中的工作。
我正在使用此(https://github.com/jakeret/tf_unet)U-net实现。我拥有的经过训练的模型的图形如下所示:
拥有训练有素的模型后,我将使用以下代码冻结它:
import tensorflow as tf
import numpy as np
from tensorflow.python.tools import freeze_graph
# Freeze the graph
save_path=".../Unet/unet_trained/run_016/" #directory to model files
input_graph_path = save_path+'graph.pbtxt'#complete path to the input graph
checkpoint_path = save_path+'model_epoch99.ckpt' #complete path to the model's checkpoint file
input_saver_def_path = ""
input_binary = False
output_node_names = "output_map/output" #output node's name
restore_op_name = "save/restore_all"
filename_tensor_name = "save/Const:0"
output_frozen_graph_name = save_path+'frozen_model_.pb' # the name of .pb file you would like to give
clear_devices = False
freeze_graph.freeze_graph(input_graph_path, input_saver_def_path,
input_binary, checkpoint_path, output_node_names,
restore_op_name, filename_tensor_name,
output_frozen_graph_name, clear_devices, "")
下一步,我要在终端上运行以下命令:
python3 strip_unused.py --input_graph frozen_model_run16.pb
--output_graph strip_model_run16.pb --input_node_names x
--output_node_names output_map/output --input_binary True --output_binary True
和
python3 optimize_for_inference.py --input strip_model_run16.pb
--output optimized_model_run16.pb --frozen_graph True --input_names x
--output_names output_map/output
(可选)最后,为了可视化张量板中的图形,我运行:
python3 import_pb_to_tensorboa.py --model_dir optimized_model_run16.pb
--log_dir unet_trained/frozenmodel/
优化的模型图如下:
所有这些之后,我尝试通过以下方式使用OpenCV加载该模型:
import cv2
tensorflowNet = cv2.dnn.readNetFromTensorflow("/path/to/model/frozenmodel/
optimized_model_run16.pb")
但是我收到此错误
cv2.error: OpenCV(3.4.2) /io/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:520: error: (-2:Unspecified error) More than one input is Const op in function 'getConstBlob'
,我找不到解决方案或说明来解决它。
提前感谢您的帮助!
编辑:
如果我这样加载模型(添加.pbtxt文件)
tensorflowNet = cv2.dnn.readNetFromTensorflow("/home/dev/optimized_model_run16.pb", "/home/dev/graph.pbtxt")
我遇到了另一个错误:
cv2.error: OpenCV(3.4.2) /io/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:613: error: (-215:Assertion failed) const_layers.insert(std::make_pair(name, li)).second in function 'addConstNodes'
答案 0 :(得分:0)
问题与在deconv2d块size()
中使用tf.shape和tf.stack有关(可能是由于strided_slice操作)。 我可以使用此模型来训练和推断张量流。
但是,为了成功地将其加载到OpenCV中,我必须删除这些操作,因为尚不支持这些操作See picture。从图中可以看出,我手动创建了deconv_output_size张量(之前由tf.stack创建)。这样,该张量是恒定的,并且不会像以前一样在张量流图内部动态创建。
我还通过在tensorflow外部使用numpy进行了相同的操作来摆脱了预处理块。
我希望这对某人有帮助。
干杯!