如何在TFRecord fi中读取不同大小的图像

2024-05-28 20:11:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个数据集并将其保存到TFRecord文件中。问题是图片的大小不同,所以我想保存图片的大小。所以我使用了TFRecordWriter并定义了如下特性:

example = tf.train.Example(features=tf.train.Features(feature={
  'rows': _int64_feature(image.shape[0]),
  'cols': _int64_feature(image.shape[1]),
  'image_raw': _bytes_feature(image_raw)}))

我希望我可以使用TFRecordReader读取和解码图像,但问题是我无法从文件中获取行和列的值,因为它们是张量。所以我该怎么做才能动态地读取大小并相应地重塑图像。谢谢你们


Tags: 文件数据图像imageraw定义tftfrecord
2条回答

我建议的工作流程如下:

TARGET_HEIGHT = 500
TARGET_WIDTH = 500

image = tf.image.decode_jpeg(image_buffer, channels=3)
image = tf.image.convert_image_dtype(image, dtype=tf.float32)

# Choose your bbox here.
bbox_begin = ...  (should be (h_start, w_start, 0))
bbox_size = tf.constant((TARGET_HEIGHT, TARGET_WIDTH, 3), dtype=tf.int32)

cropped_image = tf.slice(image, bbox_begin, bbox_size)

cropped_image具有恒定的张量大小,然后可以抛出到无序批处理中。

您可以使用tf.shape(image)动态访问解码图像的大小。您可以对生成的子元素进行计算,然后使用类似bbox_begin = tf.pack([bbox_h_start, bbox_y_start, 0])的方法将它们缝合在一起。只需要在其中插入您自己的逻辑来确定裁剪的起点,以及如果图像的起点小于您的管道所需的起点,您要执行的操作。

如果您只想将升迁如果图像小于目标尺寸,则需要使用tf.control_flow_ops.cond或等效的。但是可以使用min和max操作来设置裁剪窗口的大小,以便在它小于请求的维度时返回完整图像,然后无条件地调整最大大小为500x500。裁剪后的图像将已经是500x500,因此调整大小应该成为一个有效的no-op

您可以用动态的shape参数调用tf.reshape

image_rows = tf.cast(features['rows'], tf.int32)
image_cols = tf.cast(features['cols'], tf.int32)
image_data = tf.decode_raw(features['image_raw'], tf.uint8)
image = tf.reshape(image_data, tf.pack([image_rows, image_cols, 3]))

相关问题 更多 >

    热门问题