1. 程式人生 > >opencv呼叫自己訓練的tensorflow模型,記錄!

opencv呼叫自己訓練的tensorflow模型,記錄!

記錄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是沒辦法載入模型的。