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

时间:2016-01-27 03:12:38

标签: python deep-learning tensorflow

我创建了一个数据集并将其保存到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读取和解码图像,但问题是我无法从文件中获取行和列的值,因为它们是张量。那么我该如何动态地读取大小并相应地重塑图像。谢谢你们

2 个答案:

答案 0 :(得分:5)

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

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]))

答案 1 :(得分:3)

我建议使用以下工作流程:

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或同等版本。但是你可以使用最小和最大操作来设置裁剪窗口的大小,这样如果它小于请求的尺寸,你就会返回完整的图像,然后无条件地调整大小到500x500。裁剪后的图像已经达到500x500,因此调整大小应该成为有效的无操作。