使用 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 对象检测 api 中评估预训练模型
tensorflow 评估和预测的不同结果(F1-Score)
TensorFlow C++ 评估性能比 Python 一更差