微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将图像另存为原始记录在TFRecord文件中,然后回读并在屏幕上显示图像

如何解决将图像另存为原始记录在TFRecord文件中,然后回读并在屏幕上显示图像

我要执行以下操作:在tensorflow中使用JPEG格式编码图像,将其放入probuff的 BytesList 功能中,对其进行序列化,保存,然后再次读取。阅读后,我必须使用feature_description解析图像,然后从JPEG格式解码图像。这是我尝试过的:

from sklearn.datasets import load_sample_images
from tensorflow.train import BytesList,FloatList,Int64List
from tensorflow.train import Feature,Features,Example
import tensorflow as tf
import numpy as np
import matplotlib as plt


# Loading the image and printing it
img = load_sample_images()["images"][0]
plt.imshow(img)
plt.axis("off")
plt.title("Original Image")
plt.show()

enter image description here

# Encode the image to JPEG
data = tf.io.encode_jpeg(img)

# Convert it to a protobuf Example
example_with_image = Example(
    features = Features(
        feature = {
            "image": Feature(bytes_list = BytesList(value = [data.numpy()]))
        }
    )
)

# Serialize the protobuf Example to a string
serialized_example = example_with_image.SerializetoString()

# Imagine we saved 'serialized_example' to disk and read it back into memory
# We Now want to print the image

# Provide 'feature_description' so that the parse function kNows the default 
# value
feature_description = {
    "image": tf.io.VarLenFeature(tf.string)
}

# Parse the serialized string
example_with_image = tf.io.parse_single_example(serialized_example,feature_description)

这一切都很好。然后,我尝试使用Tensorflow的decode_jpeg()函数将图像解码回去:

decoded_img = tf.io.decode_jpeg(example_with_image)

这不起作用。我得到以下ValueError

ValueError: Attempt to convert a value ({'image': <tensorflow.python.framework.sparse_tensor.SparseTensor object

at 0x000002B4C90AB9D0>}) with an unsupported type (<class 'dict'>) to a Tensor.

它也不适用于更通用的tf.io.decode_image() Tensorflow函数

老实说,我不知道发生了什么事。我不应该找回图像吗?怎么了?

解决方法

使用example_with_image后的

parse_single_example是一个字典,其键为图像,稀疏张量为值

example_with_image看起来像这样:

{'image': <tensorflow.python.framework.sparse_tensor.SparseTensor at 0x25b29440cc8>}

decode_jpeg函数需要一个字节值,但是您正在提供字典。

提取值的正确方法是:
代码:

image = tf.io.decode_jpeg(example_with_image1['image'].values.numpy()[0])
plt.imshow(image)

输出:

out

您还可以将图像解析为FixedLenFeature而不是VarLenFeature。在这种情况下,您将获得一个密集的张量而不是一个稀疏的张量。

代码:

feature_description = {
    "image": tf.io.FixedLenFeature([],tf.string)
}

# Parse the serialized string
example_with_image = tf.io.parse_single_example(serialized_example,feature_description)

image = tf.io.decode_jpeg(example_with_image['image'].numpy())
plt.imshow(image)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。