我在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
答案 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)。
注意:未测试。