【问题标题】:Bug with tf.image.convert_image_dtype? Values not scalingtf.image.convert_image_dtype 的错误?值不缩放
【发布时间】:2019-03-03 18:21:07
【问题描述】:

我正在使用 Tensorflow 的 image.convert_image_dtype https://www.tensorflow.org/api_docs/python/tf/image/convert_image_dtype 将 dtype uint16 的 png 转换为 float32。

使用 TensorFlow 1.12.0。

根据文档: 使用浮点值表示的图像应具有 [0,1) 范围内的值。以整数数据类型存储的图像数据应具有 [0,MAX] 范围内的值,其中 MAX 是数据类型的最大正数。 此操作在数据类型之间转换,在转换之前适当地缩放值。

这应该将我的值放在 [0,1) 中以进行浮点转换,但是在评估新的 float32 张量时,我的白色像素接近 65535 - uint16 的最大值。似乎没有发生任何向上或向下的缩放。

我是否执行了错误的操作?我应该将元素除以 65535 以获得格式正确的浮点张量吗?

【问题讨论】:

  • 能否将代码添加到您的问题中?

标签: python image tensorflow machine-learning


【解决方案1】:

我发现了问题。 在类型转换之前使用 resize 会更改张量类型,因此 Tensorflow 无法正确进行缩放。

我正在使用:

#CAUSES SCALING ISSUE
file1 = tf.read_file("my_filename_here.png")
img = tf.image.decode_png(file1, channels=1, dtype=tf.uint16)
sizedImage = tf.image.resize_images(img, shape, shape)
finalimg = tf.convert_image_dtype(sizedImage, tf.float32)

这导致没有缩放。通过解码后直接进行转换来修复。

#CORRECT
file1 = tf.read_file("my_filename_here.png")
img = tf.image.decode_png(file1, channels=1, dtype=tf.uint16)
img = tf.convert_image_dtype(img, tf.float32)
finalImage = tf.image.resize_images(img, shape, shape)

我曾认为我可以通过在转换之前缩小规模来提高效率,但这打破了它。总结:解码后直接做convert_image_dtype。

【讨论】:

    【解决方案2】:

    解码图片时指定dtype,否则tensorflow autograph为你指定dtype,导致resize_函数出现问题。

    因此,在您的情况下,dtype 规范将是

    img = tf.image.decode_png(file1, channels=1, dtype=tf.float32)
    

    此外,resize 确实会返回一个 dtype 为 float32 的图像,因此如果之前已经转换过,则必须在使用 resize 之后再次将其转换为 uint,而不是转换。所以,更好的是,正确的顺序是解码、调整大小、转换。

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2018-12-13
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多