如何将编码的 jpeg 作为字节写入 Tensorflow tfrecord 然后读取它?
How do I write an encoded jpeg as bytes to Tensorflow tfrecord and then read it?
我正在尝试使用 tensorflows tfrecords 格式来存储我的数据集。
我设法读取 jpeg 图像并将它们解码为原始格式并将它们写入 tfrecord 文件。然后我可以稍后使用 tf.decode_raw.
阅读它们
问题是这会导致文件变大,因为我将图像存储为原始图像。现在我看到很多教程和博客说我可以将它们以编码格式存储,然后在阅读它们时只需解码它们。我找不到这方面的任何例子。我已经尝试了一段时间,但无论我采用何种方式,我都会收到格式错误。
TLDR
有谁知道如何将图像以 jpeg 格式而不是原始格式写入 tfrecord 文件。
谢谢,
大卫.
我的写作功能
def convert(image_paths, labels, out_path):
num_images = len(image_paths)
with tf.python_io.TFRecordWriter(out_path) as writer:
for i, (path, label) in enumerate(zip(image_paths, labels)):
print_progress(count=i, total=num_images-1)
img = open(path, 'rb').read()
data ={'image': wrap_bytes(img),
'label': wrap_int64(label)}
feature = tf.train.Features(feature=data)
example = tf.train.Example(features=feature)
serialized = example.SerializeToString()
writer.write(serialized)
用这个转换数据集:
{convert(image_paths=image_paths_train,
labels=cls_train,
out_path=path_tfrecords_train)}
我的阅读功能
def parse(serialized):
features = \
{
'image': tf.FixedLenFeature([], tf.string),
'label': tf.FixedLenFeature([], tf.int64)
}
parsed_example = tf.parse_single_example(serialized=serialized,
features=features)
# Get the image as raw bytes.
image_raw = parsed_example['image']
# Decode the raw bytes so it becomes a tensor with type.
image = tf.image.decode_image(image_raw,channels=3)
#image = tf.decode_raw(image_raw, tf.uint8)
# The type is now uint8 but we need it to be float.
image = tf.cast(image, tf.float32)
# Get the label associated with the image.
label = parsed_example['label']
# The image and label are now correct TensorFlow types.
return image, label
对于写入,只需将文件作为二进制文件 (fp = open('something.jpg', 'rb')
) 和 .read()
打开其内容。将该内容存储在 tfrecord Example
中,就像您现在存储图像一样(即,作为字节特征)。
为了阅读,不要做 decode_raw
,而是使用 tf.image.decode_image
并传入从样本 reader.
中获得的张量
如果你 post 你的代码,我可以提供更好的代码示例,但不知道你的代码是什么样子的,我能得到的详细信息。
我正在尝试使用 tensorflows tfrecords 格式来存储我的数据集。
我设法读取 jpeg 图像并将它们解码为原始格式并将它们写入 tfrecord 文件。然后我可以稍后使用 tf.decode_raw.
阅读它们问题是这会导致文件变大,因为我将图像存储为原始图像。现在我看到很多教程和博客说我可以将它们以编码格式存储,然后在阅读它们时只需解码它们。我找不到这方面的任何例子。我已经尝试了一段时间,但无论我采用何种方式,我都会收到格式错误。
TLDR 有谁知道如何将图像以 jpeg 格式而不是原始格式写入 tfrecord 文件。
谢谢, 大卫.
我的写作功能
def convert(image_paths, labels, out_path):
num_images = len(image_paths)
with tf.python_io.TFRecordWriter(out_path) as writer:
for i, (path, label) in enumerate(zip(image_paths, labels)):
print_progress(count=i, total=num_images-1)
img = open(path, 'rb').read()
data ={'image': wrap_bytes(img),
'label': wrap_int64(label)}
feature = tf.train.Features(feature=data)
example = tf.train.Example(features=feature)
serialized = example.SerializeToString()
writer.write(serialized)
用这个转换数据集:
{convert(image_paths=image_paths_train,
labels=cls_train,
out_path=path_tfrecords_train)}
我的阅读功能
def parse(serialized):
features = \
{
'image': tf.FixedLenFeature([], tf.string),
'label': tf.FixedLenFeature([], tf.int64)
}
parsed_example = tf.parse_single_example(serialized=serialized,
features=features)
# Get the image as raw bytes.
image_raw = parsed_example['image']
# Decode the raw bytes so it becomes a tensor with type.
image = tf.image.decode_image(image_raw,channels=3)
#image = tf.decode_raw(image_raw, tf.uint8)
# The type is now uint8 but we need it to be float.
image = tf.cast(image, tf.float32)
# Get the label associated with the image.
label = parsed_example['label']
# The image and label are now correct TensorFlow types.
return image, label
对于写入,只需将文件作为二进制文件 (fp = open('something.jpg', 'rb')
) 和 .read()
打开其内容。将该内容存储在 tfrecord Example
中,就像您现在存储图像一样(即,作为字节特征)。
为了阅读,不要做 decode_raw
,而是使用 tf.image.decode_image
并传入从样本 reader.
如果你 post 你的代码,我可以提供更好的代码示例,但不知道你的代码是什么样子的,我能得到的详细信息。