TensorFlow中有许多用于在训练期间扭曲输入图像的图像操作,例如tf.image.random_flip_left_right(image, seed=None)
和tf.image.random_brightness(image, max_delta, seed=None)
以及其他几个。
这些功能是针对单个图像(即具有形状[高度,宽度,颜色通道]的3-D张量)制作的。如何使它们在一批图像上工作(即形状为[批次,高度,宽度,颜色通道]的4-D张量)?
非常感谢一个工作范例!
答案 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
看到它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 read_cifar10
中描述。 distorted_inputs
中的处理,https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138 tf.train.batch
或tf.train.shuffle_batch
,具体取决于参数,并从inputs()
和distorted_inputs()
函数返回。 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/