关于定义input_placeholder以预测给定图像

时间:2017-02-21 00:55:22

标签: tensorflow deep-learning keras

在以下功能中,作者的目的是基于vgg模型对下载的图像进行预测。

with tf.Graph().as_default():

url = ("https://upload.wikimedia.org/wikipedia/commons/d/d9/First_Student_IC_school_bus_202076.jpg")

image_string = urllib2.urlopen(url).read()
image = tf.image.decode_jpeg(image_string, channels=3)

image_float = tf.to_float(image, name='ToFloat')

# Subtract the mean pixel value from each pixel
processed_image = _mean_image_subtraction(image_float,
                                          [_R_MEAN, _G_MEAN, _B_MEAN])

input_image = tf.expand_dims(processed_image, 0)

with slim.arg_scope(vgg.vgg_arg_scope()):


    logits, _ = vgg.vgg_16(input_image,
                           num_classes=1000,
                           is_training=False,
                           spatial_squeeze=False)
pred = tf.argmax(logits, dimension=3)

init_fn = slim.assign_from_checkpoint_fn(
    os.path.join(checkpoints_dir, 'vgg_16.ckpt'),
    slim.get_model_variables('vgg_16'))

with tf.Session() as sess:
    init_fn(sess)
    segmentation, np_image, np_logits = sess.run([pred, image, logits])

我一直试图预测通过opencv读取的现有图像,我做的唯一修改是通过cv2读取图像,添加input_placeholder,并相应地修改sess.run。但是,我收到以下错误消息:

segmentation, np_image, np_logits = sess.run([pred,logits],feed_dict={input_placeholder:image})
ValueError: need more than 2 values to unpack

您是否想让我知道我所做的修改是错误的?

with tf.Graph().as_default():

image = cv2.imread('/data/cat.jpg',cv2.IMREAD_UNCHANGED)
input_placeholder = tf.placeholder(tf.float32,shape = [image.shape[0],image.shape[1],image.shape[2]])
image_float = np.float32(image)

# Subtract the mean pixel value from each pixel
processed_image = _mean_image_subtraction(image_float,[_R_MEAN, _G_MEAN, _B_MEAN])

input_image = tf.expand_dims(processed_image, 0)

with slim.arg_scope(vgg.vgg_arg_scope()):

    logits, _ = vgg.vgg_16(input_image,
                           num_classes=1000,
                           is_training=False,
                           spatial_squeeze=False)


pred = tf.argmax(logits, dimension=3)

init_fn = slim.assign_from_checkpoint_fn(
    os.path.join(checkpoints_dir, 'vgg_16.ckpt'),
    slim.get_model_variables('vgg_16'))

with tf.Session() as sess:
    init_fn(sess)
    segmentation, np_image, np_logits = sess.run([pred,logits],feed_dict={input_placeholder:image})

2 个答案:

答案 0 :(得分:1)

作为参考,请先查看官方文档:https://www.tensorflow.org/api_docs/python/tf/Session#run

对于传递给fetches sess.run()参数的每个图元素,您将返回一个值。在您的情况下,您将以下列表作为提取传递:[pred,logits]因此sess.run([pred,logits], ...)将返回2个值:运行pred操作和logits操作的结果。

引用文档

  

run()返回的值与提取的形状相同   参数,其中叶子被相应的值替换   由TensorFlow返回。

但是在这一行

segmentation, np_image, np_logits = sess.run([pred,logits],feed_dict={input_placeholder:image})

您正尝试将这两个值分配给3个不同的python变量(segmentationnp_imagenp_logits),因此您获得了ValueError

如果你看一下你提供的原始例子,最后一行是:

segmentation, np_image, np_logits = sess.run([pred, image, logits])

要模仿原始示例,请尝试从代码中删除np_image声明,如下所示:

segmentation, np_logits = sess.run([pred,logits],feed_dict={input_placeholder:image})

答案 1 :(得分:0)

是一个python错误:

segmentation, np_image, np_logits = sess.run([pred,logits],feed_dict={input_placeholder:image})

应该是

np_image, np_logits = sess.run([pred,logits],feed_dict={input_placeholder:image})

你只是将两次抓取传递给了跑步功能