【问题标题】:How to convert byte image from [0,255] to [-1,1] float range in Python for Tensorflow Mobilenet predictions?如何在 Python 中将字节图像从 [0,255] 转换为 [-1,1] 浮点范围以进行 Tensorflow Mobilenet 预测?
【发布时间】:2017-08-10 13:58:00
【问题描述】:

我是一名 R 用户,对 Python 和 TensorFlow 都不熟悉,并且一直在努力让我重新训练的图像分类器在修改 label_image.py 以用于 Mobilenets 时进行实际预测。我已经发现了问题,并且知道我需要实现this tutorial 的最后一行,但我不知道如何实现。

如果您要使用 label_image 中的 Mobilenet 模型或 您自己的程序,您需要输入指定的图像 大小转换为浮点范围到“输入”张量。通常 24 位图像在 [0,255] 范围内,您必须将它们转换为 具有公式的模型预期的 [-1,1] 浮点范围(图像 - 128.)/128..

在 R 中,我习惯于将 JPEG 作为 3 维数组处理。如果它是那种格式,我会知道该怎么做,但是从tf.gfile.FastGFile("fileName.jpg", 'rb').read() 返回的图像类型是bytes。我真的不明白这是什么。直接将他们给出的公式应用于图像对象返回TypeError: unsupported operand type(s) for -: 'bytes' and 'float'。我假设在更改范围后,我仍然需要将其设为bytes 格式才能将其输入网络,但我也不是 100% 清楚这一点。任何有关此对象类型是什么以及如何使用它的说明将不胜感激。

【问题讨论】:

    标签: python machine-learning tensorflow jpeg


    【解决方案1】:

    tf.gfile.FastGfile..read() 返回一个二进制字符串,以获取您必须解码的图像值。

    imagedata = tf.gfile.FastGFile("fileName.jpg", 'rb').read()
    img_decoded = tf.image.decode_jpeg(imagedata, dct_method="INTEGER_ACCURATE")
    image_standardized = tf.image.per_image_standardization(image)
    image_standardized = tf.clip_by_value(image_standardized, -1.0, 1.0)
    

    【讨论】:

    • 谢谢!我认为在第 3 行中,您的意思是要对图像进行 img_decoded,对吗?这完成了我需要的一部分,但现在它是一个张量对象。如何将其恢复为以前的相同类型的二进制字符串?
    • 是的,它返回解码后的jpeg图像,将解码后的张量再次编码为二进制字符串,可以使用tf.image.encode_jpeg(some_image)
    • 那是我的怀疑,但它给了我一个“TypeError: Input 'image' of 'EncodeJpeg' Op has type float32 that does not match expected type of uint8.” API 中列出的所有参数在我看来都没有明显的解决方法,所以我认为我走错了路。
    • 没错。将其转换为 [-1, 1] 范围后,将无法编码
    【解决方案2】:

    bytes 实际上是原始字节的缓冲区,位于 [0,255] 范围内。您可以通过迭代得到 int 值。然后就可以正常化了。

    image = b'\x20\x30\x40'
    normalized = [(x-128.)/128 for x in image]
    print(normalized) # [-0.75, -0.625, -0.5]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多