Tensorflow:DecodeJpeg 方法在桌面和移动设备上为同一图像提供不同的像素值

Posted

技术标签:

【中文标题】Tensorflow:DecodeJpeg 方法在桌面和移动设备上为同一图像提供不同的像素值【英文标题】:Tensorflow: DecodeJpeg method gives different pixel values on desktop and mobile for the same image 【发布时间】:2018-09-19 19:03:28 【问题描述】:

我在训练模型时使用Tensorflow's DecodeJpeg 读取图像。为了在 android 设备上使用相同的方法,我使用 DecodeJpeg 为 android 编译了带有 Bazel 的 Tensorflow。

我尝试在我的桌面上读取相同的图像,这是一台运行 Windows 的 x86_64 机器。我在默认值的图像上运行DecodeJpeg 方法,dct_method 设置为''INTEGER_FASTINTEGER_ACCURATE

我在arm64 设备上为相同的图像做了同样的事情。但是,在相同的设置下,同一图像的像素值存在显着差异。

例如,在 (100,100,1) 处,桌面上的值为213,而在arm64 上为204

如何确保这两个设备的像素值相同?[![这是我使用的图像][1]][1]

更新:(100,100) 的 Gimp 上,像素值为 (179,203,190)

对于dct_method 设置为INTEGER_FAST,x86_64 上(100,100) 的值为(171, 213, 165),arm 上为(180, 204, 191)

对于dct_method 设置为INTEGER_ACCURATE,x86_64 上(100,100) 的值为(170, 212, 164),arm 上为(179, 203, 190)

它是(170, 212, 164)PIL,这也是我用cv2.imread 得到的。

【问题讨论】:

【参考方案1】:

根据tensorflow image decode_jpeg documentation 我希望它在解码 jpeg 时可能与某些属性有关。 很可能是channels 属性和/或ratio 属性和/或fancy_upscaling 属性。

两者都可以改变像素的值...

关于channels

attr 通道表示解码图像所需的颜色通道数。

接受的值为:

0: Use the number of channels in the JPEG-encoded image.
1: output a grayscale image.
3: output an RGB image.

关于ratio

attr 比率允许在解码期间将图像缩小一个整数因子。允许的值为 1、2、4 和 8。这比以后缩小图像要快得多。

关于fancy_upscaling

fancy_upscaling:一个可选的布尔值。默认为真。如果为 true,则使用更慢但更好的色度平面升级(仅限 yuv420/422)。


请注意,您可能还需要明确指定dct_method的值,因为根据documentation,如果您不指定值,它将使用系统-具体的默认值

在我看来,它(dct_method 为空参数)是最可能的原因,它解释了为什么在 x86_64 和 ARM 上没有相同的结果。

内部 jpeg 库更改为没有该库的版本 具体选项

【讨论】:

请查看问题的更新。我已经包含了不同dct 方法的值。在 x86_64 和 arm 上,我使用 ratiofancy_upscaling 的默认值,channels 设置为 3

以上是关于Tensorflow:DecodeJpeg 方法在桌面和移动设备上为同一图像提供不同的像素值的主要内容,如果未能解决你的问题,请参考以下文章

ssd训练之bug:Invalid JPEG data or crop window, data size 565248

TensorFlow的数据读取方法

在 Jupyter 中可视化 TensorFlow 图的简单方法?

TensorFlow 常用函数与方法

TensorFlow模型保存和提取方法

81TensorFlow 2 模型部署方法实践--TensorFlow Serving 部署模型