Opencvは自分で訓練したtensorflowモデルを呼び出して、記録します!
2401 ワード
Opencvが自分で訓練したtensorflowモデルを呼び出す過程で出会った問題を記録します!
一、opencv呼び出しtensorflowノードのタイプは少し厳しいが、現在は以下のノードがサポートされていないことが分かった.
1.画像の前処理(画素値正規化中)の加算、減算、乗算、除算等のノードであるため、図中にこれらのノードのpbファイルが含むopencvはロードできず、訓練時に画像を読み取るopencvの方法で画像を処理するしかなく、tfは使用できない.subtract()、またはtf.div()などのtfの操作は、図にこれらのノードがあればopencvがpbファイルを呼び出したときにこのようなエラーが報告されます!、次のようになります.
2.tfを追加することもできない.argmax()のようなノードは、「1」と同じエラーを報告します.解決策は,このようなノードを図に残すことはできない.
二、以上から、opencv呼び出しtensorflowモデルは、先頭の画像前処理と末尾argmax操作を除去する必要があることが分かる.
プロセス中にいくつかのツールを使用して記録します.
1.ckpt pbファイルの転送
2.pbタイプファイルのノード名の表示
div、sub、argmaxノードがあるかどうかを確認できます.これらのノードがあればopencv 3.4.0モデルをロードすることはできません.
一、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モデルをロードすることはできません.