【问题标题】:TensorFlow image operations for batches批量的 TensorFlow 图像操作
【发布时间】:2016-08-12 14:19:03
【问题描述】:

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

这些函数适用于单个图像(即形状为 [高度、宽度、颜色通道] 的 3-D 张量)。如何让它们处理一批图像(即形状为 [batch, height, width, color-channel] 的 4-D 张量)?

非常感谢一个工作示例!

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢它的工作! tf.image 中的函数没有内置此功能是否有原因?我已经在从 tf.map_fn() 调用的单个函数 preprocess() 中制作了所有图像失真。我相信这会导致所有图像的随机失真都不同,因为 map_fn() 使用新的随机值重复调用 preprocess() 。请详细说明您的答案与建议的另一个答案之间的区别,以及为什么 map_fn() 是更好的解决方案。我猜 tf.map_fn() 在运行时循环遍历图像,所以它不会为批处理中的每个图像添加操作到图表中?
    • 谢谢。我这样做了,它奏效了。但是现在训练比没有转换慢 5 倍,所以效率不高:-(
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的快速回答!我想过这样的事情,但我相信这会为批处理中的每个图像添加操作到 TensorFlow 图,因此不适用于不同的批处理大小。我想我可以为我需要的每个批量大小构建一个图表,但它看起来相当混乱。另一个答案似乎是正确的方法。不过再次感谢。
    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

      您可以使用 tf.reverse 在形状为 [batch, height, width, channel] 的 4-D 张量上模拟 tf.image.random_flip_left_right 和 tf.image.random_flip_up_down。

      【讨论】:

        【解决方案5】:
        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/

        【讨论】:

        • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
        猜你喜欢
        • 2020-09-01
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        相关资源
        最近更新 更多