使用 Opencv 评估 tensorflow 模型失败

Posted

技术标签:

【中文标题】使用 Opencv 评估 tensorflow 模型失败【英文标题】:Evaluation of tensorflow model with Opencv fails 【发布时间】:2017-11-02 10:05:08 【问题描述】:

我正在使用以下简单的卷积网络:

def forward_pass(train_batch):

    with tf.name_scope('input'):
        inputData = tf.identity(train_batch)

    #network definition
    #image input 32 x 32 x 3
    #weights for the first convolution layer

    with tf.name_scope('conv1'):
        W_conv1 = weight_variable([5, 5, 3, 6])
        b_conv1 = bias_variable([6])
        #structure of the first convolution layer: convolution, activation, pooling
        h_conv1 = tf.nn.tanh(tf.nn.bias_add(conv2d(inputData, W_conv1), b_conv1))

    with tf.name_scope('pool1'):
        h_pool1 = max_pool_2x2(h_conv1)

    #image input 14 x 14 x 6
    #weights for the second convolution layer 

    with tf.name_scope('conv2'):
        W_conv2 = weight_variable([5, 5, 6, 16])
        b_conv2 = bias_variable([16])
        #structure of the second convolution layer: convolution, activation, pooling
        h_conv2 = tf.nn.tanh(tf.nn.bias_add(conv2d(h_pool1, W_conv2), b_conv2))

    with tf.name_scope('pool2'):
        h_pool2 = max_pool_2x2(h_conv2)

    #image input 10 x 10 x 16

    with tf.name_scope('reshape'):
        h_pool2_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 16])


    #fully connected layer
    with tf.name_scope('fc'):
        W_fc1 = weight_variable([5 * 5 * 16, 46])
        b_fc1 = bias_variable([46])
        y_re = tf.matmul(h_pool2_flat, W_fc1)
        fc_output = tf.nn.bias_add(y_re, b_fc1)

    with tf.name_scope('output'):
        output = tf.multiply(fc_output, 1.)


    return output

为了训练网络,我使用如下 Adam 优化器:

output = forward_pass(train_batch)

with tf.name_scope('one-hot'):
    label_batch_vector = tf.one_hot(label_batch, 46)

with tf.name_scope('loss'):
    cross_entropy = tf.reduce_mean(
     tf.nn.softmax_cross_entropy_with_logits(labels=label_batch_vector, logits=output))

with tf.name_scope('adam-optimizer'):
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

为了保存我最后使用的网络:

tf.train.write_graph(sess.graph.as_graph_def(), "", 'graph.pb')

使用 TensorFlow 进行训练产生了不错的结果,但现在我想使用 OpenCV 中的网络。

我将网络改造如下:

python3 $TF_TOOLS/freeze_graph.py \
  --input_graph=graph.pb \
  --input_checkpoint=Model.ckpt \
  --output_graph=frozen_graph.pb \
  --output_node_names=output/Mul

python3 $TF_TOOLS/optimize_for_inference.py \
  --input frozen_graph.pb \
  --output opt_graph.pb \
   --frozen_graph True \
   --input_names input/Identity \
  --output_names output/Mul

然后我使用 opt_graph.pb 来加载带有 cv::dnn::readNetFromTensorflow 的模型。然后我正在测试我的训练数据,我得到了 2% 的识别率。任何人都可以帮忙吗?是否有可能我没有在 opt_graph.pb 中正确保存权重?在我看来,训练数据似乎丢失了。

【问题讨论】:

在answers.opencv.org/question/177485/…中查看更多信息 【参考方案1】:

解决方法是在 tf.reshape 操作之前添加一个 tf.transpose(h_pool2, [0, 3, 1, 2]) 操作。在https://github.com/opencv/opencv/issues/10065 中查看更多信息。

【讨论】:

以上是关于使用 Opencv 评估 tensorflow 模型失败的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 使用混淆矩阵进行评估

如何在 Tensorflow 对象检测 api 中评估预训练模型

tensorflow 评估和预测的不同结果(F1-Score)

TensorFlow C++ 评估性能比 Python 一更差

使用 python3+OpenCV+TensorFlow 做手势识別

Opencv+TF-Slim实现图像分类及深度特征提取