3

我正在尝试使用训练有素的模型来预测新图像。我的准确率是 95%。但是无论我输入什么,predict_classes 总是返回第一个标签 [0]。我想原因之一是我使用featurewise_center=Trueand samplewise_center=Truein ImageDataGenerator。我想我应该对我的输入图像做同样的事情。但我找不到这些功能对图像做了什么。

任何建议将不胜感激。

ImageDataGenerator代码:

train_datagen = ImageDataGenerator(
samplewise_center=True,
rescale=1. / 255,
shear_range=30,
zoom_range=30,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2)

test_datagen = ImageDataGenerator(
samplewise_center=True,
rescale=1. / 255,
shear_range=30,
zoom_range=30,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)

预测代码(我使用 100*100*3 的图像来训练模型):

model = load_model('CNN_model.h5')
img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = img/255.

classes = model.predict_classes(img)

print (classes)

11/14 更新:

我将代码更改为预测图像,如下所示。但是,即使我提供了用于训练模型的图像(并且获得了 95% 的准确率),该模型仍然可以预测相同的类别。有什么我错过的吗?

model = load_model('CNN_model.h5')
img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = np.array(img, dtype=np.float64) 
img = train_datagen.standardize(img)

classes = model.predict_classes(img)
print(classes)
4

3 回答 3

3

您需要使用实例的standardize()方法。ImageDataGenerator来自Keras 文档

标准化

standardize(x)

将规范化配置应用于一批输入。

论据

  • x:要归一化的输入批次。

退货

输入,标准化。

所以它会是这样的:

img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = train_datagen.standardize(img)

classes = model.predict_classes(img)

请注意,它也会应用重新缩放,因此无需自己进行(即 remove img = img/255.)。

此外,请记住,由于您已设置,因此featurewise_ceneter=True您需要在使用fit()生成器进行训练之前使用它的方法:

train_datagen.fit(training_data)

# then use fit_generator method
model.fit_generator(train_datagen, ...)
于 2018-11-07T11:27:29.930 回答
1

我认为这是您用于cv2导入图像的问题,因为当您使用 时cv2.imread,通道不是“r,g,b”而是“b,g,r”。

例如,

import cv2
from tensorflow.keras.preprocessing import image

bgr = cv2.imread('r.jpg')
rgb = np.array(image.load_img('r.jpg'))
print(bgr[1,1,:],rgb[1,1,:])

结果:

[ 83 113   0] [  0 114  83]
于 2019-05-23T12:56:00.760 回答
0

不是一个完整的答案,而是一些信息:

从keras 文档中引用的这个链接

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

我认为您应该这样做以进行培训。然后对于测试,我认为 usingtrain_datagen.standardize是正确的。

于 2019-02-04T08:45:01.187 回答