批量的TensorFlow图像操作

时间:2016-08-12 14:19:04

标签: tensorflow

TensorFlow中有许多用于在训练期间扭曲输入图像的图像操作,例如tf.image.random_flip_left_right(image, seed=None)tf.image.random_brightness(image, max_delta, seed=None)以及其他几个。

这些功能是针对单个图像(即具有形状[高度,宽度,颜色通道]的3-D张量)制作的。如何使它们在一批图像上工作(即形状为[批次,高度,宽度,颜色通道]的4-D张量)?

非常感谢一个工作范例!

5 个答案:

答案 0 :(得分:29)

一种可能性是使用最近添加的tf.map_fn()将单图像运算符应用于批处理的每个元素。

result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images)

这有效地构建了与keveman suggests构建相同的图形,但通过使用TensorFlow对循环的支持,它对于更大的批量大小更有效。

答案 1 :(得分:4)

您可以在循环中调用图像操作并连接结果。例如:

transformed_images = []
for i in range(batch_size):
  transformed_images.append(
    tf.expand_dims(tf.image.random_flip_left_right(image[i, :, :, :]), 0))
retsult = tf.concat(0, transformed_images)

答案 2 :(得分:2)

TLDR:您可以创建队列,为队列的单个元素定义读取和处理数据,而不是批量生成 - 所有这些都使用TF方法。

我不确定它是如何工作的但是如果您使用队列并使用tensorflow方法创建批次和读取图像,您可以使用批处理与单个图像一起使用。

我还没有在大型数据集上测试它,也不知道它有多好(速度,内存消耗等)。可能现在最好自己创建批处理。

我在cifar10示例中看到了这一点。你可以在https://github.com/tensorflow/tensorflow/tree/r0.10/tensorflow/models/image/cifar10

看到它
  1. 首先,他们使用tf.train.string_input_producer创建队列。 https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L222您可以使用不同类型的队列。例如,我尝试将tf.train.slice_input_producer用于多个图像。你可以在这里阅读Tensorflow read images with labels
  2. 然后他们就单张图像进行所有需要的操作。如果他们只需阅读它只是阅读,如果他们想要处理他们裁剪图像和做其他的东西。阅读在read_cifar10中描述。 distorted_inputs中的处理,https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138
  3. 他们会将 2 的结果传递给tf.train.batchtf.train.shuffle_batch,具体取决于参数,并从inputs()distorted_inputs()函数返回。
  4. 他们就像images, labels = cifar10.distorted_inputs()一样阅读并做了以下工作。它在https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_train.py#L66

答案 3 :(得分:0)

您可以使用tf.reverse在形状为[批次,高度,宽度,通道]的四维张量上模拟tf.image.random_flip_left_right和tf.image.random_flip_up_down。

答案 4 :(得分:0)

random_number = tf.random_uniform([], minval=0, maxval=4, dtype=tf.int32)   
random_batch_flip = tf.where(tf.less(tf.constant(2), random_number), tf.image.flip_left_right(batch), batch)

参考:http://www.guidetomlandai.com/tutorials/tensorflow/if_statement/