2 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
# 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)
如果你仔細(xì)看的話,你在cv2的情況下指定的插值是
cv2.INTER_LINEAR
(雙線性插值);但是,默認(rèn)情況下image.load_img()
使用INTER_NEAREST
插值方法。img_to_array(img)
。這里的參數(shù)dtype
是:無
默認(rèn)為 None,在這種情況下使用全局設(shè)置 tf.keras.backend.floatx() (除非您更改它,否則它默認(rèn)為“float32”)
因此,img_to_array(img)
您有一個(gè)由值組成的圖像float32
,而cv2.imread(img)
返回一個(gè)值的 numpy 數(shù)組uint8
。
確保從 BGR 轉(zhuǎn)換為 RGB,因?yàn)?OpenCV 直接加載為 BGR 格式。您可以使用
image = image[:,:,::-1]
或image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
; 否則,R 和 B 通道將會(huì)顛倒,導(dǎo)致比較不正確。
由于您在這兩種情況下應(yīng)用的預(yù)處理是相同的,因此唯一的區(qū)別是我上面提到的那些;適應(yīng)這些變化應(yīng)確??芍貜?fù)性。
我想做一個(gè)觀察:假設(shè)使用一個(gè)cv2
自動(dòng)(并且可以說僅加載整數(shù))而不是浮點(diǎn)數(shù)的庫(在本例中),唯一正確的方法是將第一個(gè)預(yù)測(cè)數(shù)組(Keras)轉(zhuǎn)換為uint8
因?yàn)橥ㄟ^將后者轉(zhuǎn)換為float32
,信息中可能存在的差異就會(huì)丟失。例如,通過cv2
加載到uint8
,并通過強(qiáng)制轉(zhuǎn)換而不是233
得到233.0
。然而,也許初始像素值是233,3
,但由于第一次轉(zhuǎn)換而丟失了。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
Keras 以RGB格式加載圖像,而 OpenCV 以BGR格式加載圖像。
ResNet50的預(yù)處理函數(shù)使用caffe設(shè)置,它期望圖像為RGB格式,并應(yīng)用以下內(nèi)容:
反轉(zhuǎn)通道(RGB -> BGR)
從各自的值中減去 [103.939, 116.779, 123.68]
由于每個(gè)通道要減去的值不同,因此通道順序很重要。此外,預(yù)訓(xùn)練的ResNet50 模型的各層已經(jīng)按照一定的順序進(jìn)行了訓(xùn)練。
因此,使用 OpenCV 加載圖像時(shí),必須將通道順序從BGR反轉(zhuǎn)為RGB
imgcv_resized?=??imgcv_resized[:,:,::-1]
添加回答
舉報(bào)