如何冻结lf-net张量流模型以在opencv dnn中使用它?

时间:2019-12-04 12:05:05

标签: python c++ opencv tensorflow

我想在opencv中使用lf-net模型与我的应用程序中的sift和akaze关键点检测器沙描述符进行比较 opencv版本:4.1.2 张量流版本:1.4 操作系统:Ubuntu 18.04 Lts

github链接下载lf-net: https://github.com/vcg-uvic/lf-net-release

预训练的模型下载链接可以在Readme.md中找到

首先,我尝试用这些行冻结模型:

 input_graph_def = sess.graph.as_graph_def()

output_node_names=ops['kpts'].op.name+","+ops['feats'].op.name+","+ops['scale_maps'].op.name+","+ops['kpts_scale'].op.name+","+ops['degree_maps'].op.name+","+ops['kpts_ori'].op.name
output_graph_def = graph_util.convert_variables_to_constants(
        sess, # The session
        input_graph_def, # input_graph_def is useful for retrieving the nodes 
        output_node_names.split(",")  
)


output_graph="export/frozen.pb"
with tf.gfile.GFile(output_graph, "wb") as f:
    f.write(output_graph_def.SerializeToString())
tf.train.write_graph(output_graph_def, 'export/', 'frozentxt.pbtxt',as_text=True)

(只需将此行复制到run_lfnet.py第115行)

并尝试通过opencv dnn模块的readNetFromTensorflow加载它。

Net net = readNetFromTensorflow(pbFilePath);// with only .pb file

以以下例外结尾:

  

cv :: Exception'     what():OpenCV(4.1.2-openvino)/home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp:90:错误:(-212:解析错误)在功能“ getInputNodeId”中找不到名称为MSDeepDet / strided_slice_8的输入节点

然后我尝试使用pb和pbtxt文件

Net net = readNetFromTensorflow(pbFilePath, pbtxtFilePath);

其他例外:

  

what():OpenCV(4.1.2-openvino)/home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:663:错误:(-215:断言失败)const_layers.insert(std :: make_pair(name,li))。second在函数'addConstNodes'中

然后我读到我也需要使用optimize_for_inference(https://github.com/opencv/opencv/issues/12715

with tf.gfile.FastGFile(output_graph, "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    tf.summary.FileWriter('logs', graph_def)

    inp_node = 'Placeholder'
    out_node =  output_node_names.split(",")
    graph_def = optimize_for_inference_lib.optimize_for_inference(graph_def, [inp_node], out_node,
                                                                tf.float32.as_datatype_enum)
    graph_def = TransformGraph(graph_def, [inp_node], out_node, ["sort_by_execution_order"])

    tf.train.write_graph(graph_def, "export/", 'graph_opt.pbtxt', as_text=True)

收到以下警告

  

警告:tensorflow:找不到预期的Conv2D输入到'MSDeepDet / ConvOnlyResNet / block-1 / pre-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'MSDeepDet / ConvOnlyResNet / block-1 / mid-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'MSDeepDet / ConvOnlyResNet / block-2 / pre-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'MSDeepDet / ConvOnlyResNet / block-2 / mid-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'MSDeepDet / ConvOnlyResNet / block-3 / pre-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'MSDeepDet / ConvOnlyResNet / block-3 / mid-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'MSDeepDet / ConvOnlyResNet / fin-bn / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'SimpleDesc / bn1 / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'SimpleDesc / bn2 / FusedBatchNorm'

     

警告:tensorflow:找不到预期的Conv2D输入到   'SimpleDesc / bn3 / FusedBatchNorm'

似乎我在输入节点中错过了一些东西,但是呢? :/ 有人可以帮助我吗? 最好的问候

编辑:链接到张量板屏幕

原始模型https://zupimages.net/viewer.php?id=19/49/3nla.png

冻结模型https://zupimages.net/viewer.php?id=19/49/p4dz.png

在冻结模型中似乎没有为ConvOnlyResnet定义入口点,但在原始图形中将占位符链接到convonlyrestnet

我错了吗?我该如何解决?

0 个答案:

没有答案