Opencvは自分で訓練したtensorflowモデルを呼び出して、記録します!

2401 ワード

Opencvが自分で訓練したtensorflowモデルを呼び出す過程で出会った問題を記録します!
一、opencv呼び出しtensorflowノードのタイプは少し厳しいが、現在は以下のノードがサポートされていないことが分かった.
1.画像の前処理(画素値正規化中)の加算、減算、乗算、除算等のノードであるため、図中にこれらのノードのpbファイルが含むopencvはロードできず、訓練時に画像を読み取るopencvの方法で画像を処理するしかなく、tfは使用できない.subtract()、またはtf.div()などのtfの操作は、図にこれらのノードがあればopencvがpbファイルを呼び出したときにこのようなエラーが報告されます!、次のようになります.
OpenCV(3.4.1) Error: Unspecified error (Unknown layer type Sub in op Sub) in cv::dnn::experimental_dnn_v4::`anonymous-namespace'::TFImporter::populateNet, file C:\Program Files\opencv\sources\modules\dnn\src\tensorflow\tf_importer.cpp, line 1582

2.tfを追加することもできない.argmax()のようなノードは、「1」と同じエラーを報告します.解決策は,このようなノードを図に残すことはできない.
二、以上から、opencv呼び出しtensorflowモデルは、先頭の画像前処理と末尾argmax操作を除去する必要があることが分かる.
プロセス中にいくつかのツールを使用して記録します.
1.ckpt pbファイルの転送
from tensorflow.python.framework import graph_util
import tensorflow as tf

out_path='F:/A_Projoct-Python/Camera failure/Camera failure/model_2/'
with tf.Session() as sess:
    # Load .ckpt file
    ckpt_path ='F:/A_Projoct-Python/Camera failure/Camera failure/model_2/model.ckpt-0'
    saver = tf.train.import_meta_graph(ckpt_path + '.meta')
    saver.restore(sess, ckpt_path)

    # Save as .pb file
    graph_def = tf.get_default_graph().as_graph_def()
    output_graph_def = graph_util.convert_variables_to_constants( sess,  graph_def,  ['classes'])
    with tf.gfile.GFile(out_path+'pb_model_0_no_image_preprocess_class.pb', 'wb') as fid:
        serialized_graph = output_graph_def.SerializeToString()
        fid.write(serialized_graph)

2.pbタイプファイルのノード名の表示
import tensorflow as tf
import os

#model_dir = './'
out_path='F:/A_Projoct-Python/Camera failure/Camera failure/model_2/'
model_name = 'pb_model_0_no_image_preprocess_class.pb'

def create_graph():
    with tf.gfile.FastGFile(os.path.join(out_path+  model_name), 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        tf.import_graph_def(graph_def, name='')

create_graph()
tensor_name_list = [tensor.name for tensor in tf.get_default_graph().as_graph_def().node]
for tensor_name in tensor_name_list:
    print(tensor_name,'
')

div、sub、argmaxノードがあるかどうかを確認できます.これらのノードがあればopencv 3.4.0モデルをロードすることはできません.