【问题标题】:tf.image.random_brightness giving negative values randomly in TensorFlowtf.image.random_brightness 在 TensorFlow 中随机给出负值
【发布时间】:2018-06-09 22:49:28
【问题描述】:

'我正在 TensorFlow 中尝试使用旋转、随机亮度、随机饱和度等各种方法来增强图像数据。我观察到 tf.image.random_brightness 的输出并不一致 - 有时它会产生负值。我理解随机性,但产生负值是否正确?当我尝试使用 matplotlib.pyplot 绘制图像时,它失败说 ValueError: Floating point image RGB values must be in the 0..1 range 下面是一些代码示例:'

# Function which reads file and converts to image array
def read_images_from_file (input_queue):
    label = input_queue[1]

    file_content = tf.read_file(input_queue[0])
    image = tf.image.decode_jpeg(file_content, channels=NUM_CHANNELS)
    image = tf.image.convert_image_dtype(image, dtype=tf.float32, saturate=True)
    image = tf.image.resize_images(image, [IMAGE_HEIGHT, IMAGE_WIDTH])

.....
    #inside a function which applies various augmentations - code shown only for brightness

    X_init = tf.placeholder(tf.float32, shape=images.shape)
    X = tf.Variable(X_init)

    sess.run(tf.variables_initializer([X]), feed_dict={X_init: images})
    aug_images, aug_labels = (sess.run(tf.map_fn(lambda params: (tf.image.random_brightness(params[0], 0.8, 1), params[1]), (X, labels))))

    #inside a loop after calling above function - output of function is returned to aug_train_images

    print (aug_train_images[i])


'Some sample output:'
    [[[-0.18852733 -0.27872342 -0.31009597]
      [-0.18059228 -0.2786315  -0.3060825 ]
      [-0.1765788  -0.27461803 -0.302069  ]
      ...

      [-0.20366213 -0.19974056 -0.18405429]
      [-0.22792684 -0.22437292 -0.20458125]
      [-0.24324547 -0.23166458 -0.21205674]]

'我在 Ubuntu 16.10 上使用带有 Python 3.5.3 和 TensorFlow CPU 版本 1.5.0-rc0 的 Jupyter notebook。'

【问题讨论】:

  • keras 已经内置了图像数据增强功能。为什么不使用它?
  • 感谢米奇的建议。现在我正在学习 TensorFlow 和深度学习,因此试图将我的代码限制为 TF API。我觉得使用高级 API 会更容易并且会产生良好的结果,但学习(即我学习深度学习!)会更少。
  • 另外,我在 Keras 的数据增强库中找不到更改亮度/饱和度的方法。
  • 但是改变亮度/饱和度实际上会给卷积网络提供更多信息吗?我怀疑不是。

标签: python tensorflow


【解决方案1】:

您允许在 -0.8 和 0.8 之间随机改变强度(增量):

tf.image.random_brightness(params[0], 0.8, 1)

请注意,图像的强度在 [0-1] 范围内,因为您这样做了:

image = tf.image.convert_image_dtype(image, dtype=tf.float32, saturate=True)

这意味着图像中的每个强度值i都会改变为:

[i-0.8, i+0.8]

超出图像的 [0-1] 范围。换句话说,你会有负值和大于 1 的值。

第一条评论是 0.8 的 delta 似乎太多了(当然这取决于问题)。我推荐 0.1 左右的值(即允许 10% 的变化)。

第二件事,你必须确保在改变亮度后,图像仍然是图像,也就是说,将强度剪辑在 [0-1] 范围内。你可以这样做:

image = tf.clip_by_value(image, 0.0, 1.0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2012-03-04
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多