使用OpenCV 3.4加载CNN张量流模型时出错

时间:2019-03-12 14:08:55

标签: python c++ opencv tensorflow

我目前正在尝试使用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实现。我拥有的经过训练的模型的图形如下所示:

Full model graph

拥有训练有素的模型后,我将使用以下代码冻结它:

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/

优化的模型图如下:

Optimized model graph

Preprocessing block

DownConvolution block

UpConvolution block

所有这些之后,我尝试通过以下方式使用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'

1 个答案:

答案 0 :(得分:0)

问题与在deconv2d块size()中使用tf.shape和tf.stack有关(可能是由于strided_slice操作)。 我可以使用此模型来训练和推断张量流

但是,为了成功地将其加载到OpenCV中,我必须删除这些操作,因为尚不支持这些操作See picture。从图中可以看出,我手动创建了deconv_output_size张量(之前由tf.stack创建)。这样,该张量是恒定的,并且不会像以前一样在张量流图内部动态创建。

我还通过在tensorflow外部使用numpy进行了相同的操作来摆脱了预处理块。

我希望这对某人有帮助。

干杯!