【问题标题】: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,而不是转换。所以,更好的是,正确的顺序是解码、调整大小、转换。