opencv呼叫自己訓練的tensorflow模型,記錄!
阿新 • • 發佈:2018-12-20
記錄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,'\n')
可以檢視是不是有div、sub、和argmax節點。如果有這些節點的話,opencv3.4.0是沒辦法載入模型的。