【问题标题】:Different Predictions with same Keras CNN相同 Keras CNN 的不同预测
【发布时间】:2019-09-04 12:37:45
【问题描述】:

我在 100x120 图像上训练了一个 CNN,创建了以下生成器:

train_datagen = ImageDataGenerator(
    rescale = 1. / 255,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizontal_flip = True)

test_datagen = ImageDataGenerator(
    rescale=1/255)

#Apply them
train_generator = train_datagen.flow_from_directory(
    directory = train_data_dir,
    target_size=(parameters["img_width"], parameters["img_height"]),
    batch_size = parameters["batch_size"],
    class_mode= "categorical", 
    subset = "training", 
    color_mode = "rgb",
    seed = 42)

test_generator = test_datagen.flow_from_directory(
    directory = test_data_dir,
    target_size = (parameters["img_width"], parameters["img_height"]),
    color_mode = "rgb",
    batch_size=1,
    class_mode = None,
    shuffle = False,
    seed = 41)

因此,我将不同图像的性能测试为:

# Method 1
test_generator.reset()
pred = model.predict_generator(test_generator,verbose = 1, steps = 1)
predicted_class_indices = np.argmax(pred, axis = 1)

# Convert the dictionary
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

但是,如果我想使用以下方法对同一图像生成预测:

# Method 2
crop_img = cv2.resize(img,(100, 120))                        
crop_img = np.reshape(crop_img,[1, 100, 120, 3])
crop_img = crop_img.astype('float32')
crop_img /= 255

# ID
pred = model.predict(crop_img)
predicted_class_indices = np.argmax(pred, axis = 1)
prediction = [labels[k] for k in predicted_class_indices]

我得到了不同的结果。可能是什么原因造成的?

【问题讨论】:

  • cv2 默认读入BGR。您确定要向网络发送RGB 图像吗?
  • 我添加了 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 但它仍然报告不同的输出

标签: python keras conv-neural-network


【解决方案1】:

Keras 的 ImageDataGenerator uses PIL and not openCV under the hood 用于加载和调整图像大小。当您使用双线性插值(cv2.resize 的default)调整大小时,ImageDataGenerator 默认使用最近邻插值。

您可以使用调整大小的方法,直到获得相同的结果,或者使用 keras-preprocessing 中的 load_imgimg_to_array 便利函数来确保您执行与训练期间完全相同的预处理:

from keras.prepropressing.image import load_img, img_to_array

img = load_img(path_to_img, target_size=(100, 120)
img = img_to_array(img) / 255.
model.predict(img)

【讨论】:

  • 通过这个设置它可以工作,但是有没有办法利用 keras 预处理库来处理已经加载并经过一些预处理步骤(例如去噪等)的图像
  • 是的,您可以使用 keras 预处理中的 img_to_arrayarray_to_img 在 numpy 数组和 PIL 图像之间来回切换,并使用 PIL 的 Image.resize() 方法调整大小,在与load_img() 中的方式相同
  • 如果我使用 load_img 保存并重新加载预处理的图像,它可以工作,如果我使用 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = array_to_img(img) img = img.resize((100 , 120), Image.NEAREST) img = img_to_array(img) / 255. img = np.reshape(img, [1, 100, 120, 3]) 它没有
  • 在什么意义上它不起作用?您是否收到错误消息,或者只是不同的结果?
  • 我得到不同的结果
猜你喜欢
  • 2020-10-28
  • 2018-11-24
  • 1970-01-01
  • 2019-01-02
  • 2021-01-25
  • 2020-10-24
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多