我最近将 cv2 用于 Tensorflow 的tf.image模块进行图像处理。然而,我的验证准确率下降了大约 10%。
我相信这个问题与
- cv2.imread() 与 tf.image.decode_jpeg()
- cv2.resize() 与 tf.image.resize_images()
虽然这些差异会导致更差的准确性,但在使用 plt.imshow() 时,这些图像似乎与人类无法区分。例如,以 ImageNet Validation Dataset 的 Image #1 为例:
首要问题:
- cv2.imread() 接受一个字符串并输出一个 BGR 3 通道 uint8 矩阵
- tf.image_decode_jpeg() 接收一个字符串张量并输出一个 RGB 3 通道 uint8 张量。
但是,将 tf 张量转换为 BGR 格式后,图像中的许多像素处存在非常细微的差异。
使用 tf.image.decode_jpeg 然后转换为 BGR
[[ 26 41 24 ..., 57 48 46]
[ 36 39 36 ..., 24 24 29]
[ 41 26 34 ..., 11 17 27]
...,
[ 71 67 61 ..., 106 105 100]
[ 66 63 59 ..., 106 105 101]
[ 64 66 58 ..., 106 105 101]]```
使用 cv.imread
[[ 26 42 24 ..., 57 48 48]
[ 38 40 38 ..., 26 27 31]
[ 41 28 36 ..., 14 20 31]
...,
[ 72 67 60 ..., 108 105 102]
[ 65 63 58 ..., 107 107 103]
[ 65 67 60 ..., 108 106 102]]```
第二题:
- tf.image.resize_images() 自动将 uint8 张量转换为 float32 张量,似乎加剧了像素值的差异。
- 我相信 tf.image.resize_images() 和 cv2.resize() 都是
tf.image.resize_images
[[ 26. 25.41850281 35.73127747 ..., 81.85855103
59.45834351 49.82373047]
[ 38.33480072 32.90485001 50.90826797 ..., 86.28446198
74.88543701 20.16353798]
[ 51.27312469 26.86172867 39.52401352 ..., 66.86851501
81.12111664 33.37636185]
...,
[ 70.59472656 75.78851318
45.48100662 ..., 70.18637085
88.56777191 97.19295502]
[ 70.66964722 59.77249908 48.16699219 ..., 74.25527954
97.58244324 105.20263672]
[ 64.93395996 59.72298431 55.17600632 ..., 77.28720856
98.95108032 105.20263672]]```
cv2.resize
[[ 36 30 34 ..., 102 59 43]
[ 35 28 51 ..., 85 61 26]
[ 28 39 50 ..., 59 62 52]
...,
[ 75 67 34 ..., 74 98 101]
[ 67 59 43 ..., 86 102 104]
[ 66 65 48 ..., 86 103 105]]```
这是一个演示刚才提到的行为的要点。它包括我如何处理图像的完整代码。
所以我的主要问题是:
- 为什么 cv2.imread() 和 tf.image.decode_jpeg() 的输出不同?
- 如果 cv2.resize() 和 tf.image.resize_images() 使用相同的插值方案,它们有何不同?
谢谢!