Tensorflow记录:如何读取和绘制图像值?

时间:2019-07-05 06:24:23

标签: python numpy tensorflow

我在tensorflow记录文件(data.record)中有数据,而且我似乎能够读取该数据。我想做一些简单的事情:仅显示给定示例的(png编码)图像。但是我不能将图像作为一个numpy数组来显示。我的意思是,数据在那里,仅将其拉出并显示出来有多困难?我想我缺少真正明显的东西。

height = 700 # Image height
width = 500 # Image width

file_path = r'/home/train.record'
with tf.Session() as sess:
    feature = {'image/encoded': tf.FixedLenFeature([], tf.string),
               'image/object/class/label': tf.FixedLenFeature([], tf.int64)}
    filename_queue = tf.train.string_input_producer([data_path], num_epochs=1)
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(filename_queue)
    parsed_example = tf.parse_single_example(serialized_example, features=feature)
    image_raw = parsed_example['image/encoded']
    image = tf.decode_raw(image_raw, tf.uint8)
    image = tf.cast(image, tf.float32)
    image = tf.reshape(image, (height, width))

这似乎是从train.record提取的图像,具有正确的尺寸,但是它是tensorflow.python.framework.ops.Tensor类型的图像,当我尝试使用类似的图像进行绘制时:

cv2.imshow("image", image)

我刚得到一个错误:TypeError: Expected cv::UMat for argument 'mat'

我尝试使用eval,如下面的链接所建议:

array = image.eval(session = sess)

但是没有用。该程序仅在该位置挂起(例如,如果我将其放在上面的最后一行之后)。

更一般地说,即使我试图获取类标签,似乎我只是缺少了一些东西:

label = parsed_example['label']

我得到了同样的东西:不是值,而是tensorflow.python.framework.ops.Tensor类型的对象。当我在ipython笔记本中键入名称时,我可以从字面上看到该值,但是不确定如何将其作为int(或其他任何方式)进行访问。

请注意,我尝试了这种方法,它的某些方法似乎可以直接转换为numpy数组,但它们不起作用:https://github.com/yinguobing/tfrecord_utility/blob/master/view_record.py

我刚收到错误there is no numpy method for a tensor object

注意,我使用的是tensorflow 1.13,Python 3.7,可在Ubuntu 18中使用。无论是从Spyder还是从命令行运行,我都得到相同的结果。

相关问题
-How to print the value of a Tensor object in TensorFlow?
-https://github.com/aymericdamien/TensorFlow-Examples/issues/40

2 个答案:

答案 0 :(得分:1)

import tensorflow as tf


with tf.Session() as sess:
  r  = tf.random.uniform([10, 10])
  print(type(r))
  # <class 'tensorflow.python.framework.ops.Tensor'>
  a = r.eval()
  print(type(a))
  # <class 'numpy.ndarray'>

我无法复制您的确切情况。但是,您需要将Tensor评估为NumPy NDArray。据我了解,TensorRecord并不是问题。 Colab link for the code

答案 1 :(得分:1)

要显示TFRecord文件中的单个图像,可以执行以下操作:

import tensorflow as tf
import matplotlib.pyplot as plt

def parse_fn(data_record):
    feature = {'image/encoded': tf.FixedLenFeature([], tf.string),
               'image/object/class/label': tf.FixedLenFeature([], tf.int64)}
    sample = tf.parse_single_example(data_record, feature)
    return sample

file_path = r'/home/train.record'
dataset = tf.data.TFRecordDataset([file_path])
record_iterator = dataset.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    # Read and parse record
    parsed_example = parse_fn(record_iterator)

    # Decode image and get numpy array
    encoded_image = parsed_example['image/encoded']
    decoded_image = tf.image.decode_jpeg(encoded_image, channels=3)
    image_np = sess.run(decoded_image)

    # Display image
    plt.imshow(image_np)
    plt.show()

这假定图像是JPEG编码的。您应该使用适当的解码功能(例如,对于PNG图片,请使用tf.image.decode_png)。

注意:未测试。