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_FAST
、INTEGER_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 上,我使用 ratio
和 fancy_upscaling
的默认值,channels
设置为 3
。以上是关于Tensorflow:DecodeJpeg 方法在桌面和移动设备上为同一图像提供不同的像素值的主要内容,如果未能解决你的问题,请参考以下文章
ssd训练之bug:Invalid JPEG data or crop window, data size 565248