2 回答
TA贡献1810条经验 获得超5个赞
# Keras prediction
img = image.load_img(img_path, target_size=(224, 224))
# OpenCV prediction
imgcv = cv2.imread(img_path)
dim = (224, 224)
imgcv_resized = cv2.resize(imgcv, dim, interpolation=cv2.INTER_LINEAR)
如果你仔细看的话,你在cv2的情况下指定的插值是
cv2.INTER_LINEAR
(双线性插值);但是,默认情况下image.load_img()
使用INTER_NEAREST
插值方法。img_to_array(img)
。这里的参数dtype
是:无
默认为 None,在这种情况下使用全局设置 tf.keras.backend.floatx() (除非您更改它,否则它默认为“float32”)
因此,img_to_array(img)
您有一个由值组成的图像float32
,而cv2.imread(img)
返回一个值的 numpy 数组uint8
。
确保从 BGR 转换为 RGB,因为 OpenCV 直接加载为 BGR 格式。您可以使用
image = image[:,:,::-1]
或image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
; 否则,R 和 B 通道将会颠倒,导致比较不正确。
由于您在这两种情况下应用的预处理是相同的,因此唯一的区别是我上面提到的那些;适应这些变化应确保可重复性。
我想做一个观察:假设使用一个cv2
自动(并且可以说仅加载整数)而不是浮点数的库(在本例中),唯一正确的方法是将第一个预测数组(Keras)转换为uint8
因为通过将后者转换为float32
,信息中可能存在的差异就会丢失。例如,通过cv2
加载到uint8
,并通过强制转换而不是233
得到233.0
。然而,也许初始像素值是233,3
,但由于第一次转换而丢失了。
TA贡献1827条经验 获得超7个赞
Keras 以RGB格式加载图像,而 OpenCV 以BGR格式加载图像。
ResNet50的预处理函数使用caffe设置,它期望图像为RGB格式,并应用以下内容:
反转通道(RGB -> BGR)
从各自的值中减去 [103.939, 116.779, 123.68]
由于每个通道要减去的值不同,因此通道顺序很重要。此外,预训练的ResNet50 模型的各层已经按照一定的顺序进行了训练。
因此,使用 OpenCV 加载图像时,必须将通道顺序从BGR反转为RGB
imgcv_resized = imgcv_resized[:,:,::-1]
添加回答
举报