gpt4 book ai didi

python - 当使用 OpenCV 完成图像加载和调整大小时,Resnet50 会产生不同的预测

转载 作者:行者123 更新时间:2023-12-02 15:27:02 25 4
gpt4 key购买 nike

我想使用使用 OpenCV 的 Keras Resnet50 模型来读取和调整输入图像的大小。
我正在使用来自 Keras 的相同预处理代码(使用 OpenCV,我需要转换为 RGB,因为这是 preprocess_input() 期望的格式)。
我使用 OpenCV 和 Keras 图像加载得到的预测略有不同。我不明白为什么预测不一样。
这是我的代码:

import numpy as np
import json
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
import cv2

model = ResNet50(weights='imagenet')

img_path = '/home/me/squirle.jpg'

# Keras prediction
img = 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 prediction
imgcv = 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)]

我如何使用 OpenCV imread()resize()获得与 Keras 图像加载相同的预测?

最佳答案

# 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这里的论点是:无

  • Default to None, in which case the global settingtf.keras.backend.floatx() is used (unless you changed it, it defaultsto "float32")


    因此,在 img_to_array(img)你有一个由 float32 组成的图像值,而 cv2.imread(img)返回 uint8 的 numpy 数组值。
  • 确保从 BGR 转换为 RGB,因为 OpenCV 直接加载为 BGR 格式。您可以使用 image = image[:,:,::-1]image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB) ;否则,您将颠倒 R 和 B channel ,从而导致不正确的比较。

  • 由于您应用的预处理在两种情况下都是相同的,唯一的区别是我上面提到的那些;调整这些变化应确保可重复性。
    我想做出一个观察:假设一个库(在本例中为 cv2)自动(并且可以说只加载整数)而不是浮点数,唯一正确的方法是转换第一个预测数组(Keras ) 到 uint8因为通过将后者转换为 float32 ,丢失了可能的信息差异。例如,使用 cv2你加载到 uint8 ,并通过类型转换而不是 233你得到 233.0 .但是,初始像素值可能是 233,3但是由于第一次转换而丢失了。

    关于python - 当使用 OpenCV 完成图像加载和调整大小时,Resnet50 会产生不同的预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64132842/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com