亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當使用 OpenCV 完成圖像加載和調整大小時,Resnet50 會產生不同的預測

當使用 OpenCV 完成圖像加載和調整大小時,Resnet50 會產生不同的預測

素胚勾勒不出你 2023-09-26 16:23:14
我想使用 Keras Resnet50 模型和 OpenCV 來讀取輸入圖像并調整其大小。我使用 Keras 中的相同預處理代碼(對于 OpenCV,我需要轉換為 RGB,因為這是 preprocess_input() 期望的格式)。我使用 OpenCV 和 Keras 圖像加載得到的預測略有不同。我不明白為什么預測不一樣。這是我的代碼:import numpy as npimport jsonfrom tensorflow.keras.applications.resnet50 import ResNet50from tensorflow.keras.preprocessing import imagefrom tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictionsimport cv2model = ResNet50(weights='imagenet')img_path = '/home/me/squirle.jpg'# Keras predictionimg = image.load_img(img_path, target_size=(224, 224))x = image.img_to_array(img)x = np.expand_dims(x, axis=0)x = preprocess_input(x)preds = model.predict(x)print('Predicted Keras:', decode_predictions(preds, top=3)[0])# OpenCV predictionimgcv = cv2.imread(img_path)dim = (224, 224)imgcv_resized = cv2.resize(imgcv, dim, interpolation=cv2.INTER_LINEAR)x = cv2.cvtColor(imgcv_resized , cv2.COLOR_BGR2RGB)x = np.expand_dims(x, axis=0)x = preprocess_input(x)preds = model.predict(x)print('Predicted OpenCV:', decode_predictions(preds, top=3)[0])Predicted Keras: [('n02490219', 'marmoset', 0.28250763), ('n02356798', 'fox_squirrel', 0.25657368), ('n02494079', 'squirrel_monkey', 0.19992349)]Predicted OpenCV: [('n02356798', 'fox_squirrel', 0.5161952), ('n02490219', 'marmoset', 0.21953616), ('n02494079', 'squirrel_monkey', 0.1160824)]如何使用 OpenCVimread()并resize()獲得與 Keras 圖像加載相同的預測?
查看完整描述

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)

  1. 如果你仔細看的話,你在cv2的情況下指定的插值是cv2.INTER_LINEAR(雙線性插值);但是,默認情況下 image.load_img()使用INTER_NEAREST插值方法。

  2. img_to_array(img)。這里的參數dtype是:無

默認為 None,在這種情況下使用全局設置 tf.keras.backend.floatx() (除非您更改它,否則它默認為“float32”)

因此,img_to_array(img)您有一個由值組成的圖像float32,而cv2.imread(img)返回一個值的 numpy 數組uint8

  1. 確保從 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,但由于第一次轉換而丟失了。



查看完整回答
反對 回復 2023-09-26
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

Keras 以RGB格式加載圖像,而 OpenCV 以BGR格式加載圖像。

ResNet50的預處理函數使用caffe設置,它期望圖像為RGB格式,并應用以下內容:

  1. 反轉通道(RGB -> BGR)

  2. 從各自的值中減去 [103.939, 116.779, 123.68]

由于每個通道要減去的值不同,因此通道順序很重要。此外,預訓練的ResNet50 模型的各層已經按照一定的順序進行了訓練。

因此,使用 OpenCV 加載圖像時,必須將通道順序從BGR反轉為RGB

imgcv_resized?=??imgcv_resized[:,:,::-1]


查看完整回答
反對 回復 2023-09-26
  • 2 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號