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條經驗 獲得超8個贊
Keras 以RGB格式加載圖像,而 OpenCV 以BGR格式加載圖像。
ResNet50的預處理函數使用caffe設置,它期望圖像為RGB格式,并應用以下內容:
反轉通道(RGB -> BGR)
從各自的值中減去 [103.939, 116.779, 123.68]
由于每個通道要減去的值不同,因此通道順序很重要。此外,預訓練的ResNet50 模型的各層已經按照一定的順序進行了訓練。
因此,使用 OpenCV 加載圖像時,必須將通道順序從BGR反轉為RGB
imgcv_resized?=??imgcv_resized[:,:,::-1]
添加回答
舉報