![](/img/trans.png)
[英]Keras: how to disable resizing of images when using an ImageDataGenerator with flow_from_dataframe / flow_from_directory?
[英]How to apply normalization to images in testing phase when using keras ImageDataGenerator?
我正在尝试使用经过训练的模型来预测新图像。 我的准确率是95%。 但是无论我输入什么内容,predict_classes始终返回第一个标签[0]。 我猜原因之一是我在ImageDataGenerator
使用featurewise_center=True
和samplewise_center=True
。 我想我应该在输入图像上做同样的事情。 但是我找不到这些功能对图像做了什么。
任何建议将不胜感激。
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)
您需要使用ImageDataGenerator
实例的standardize()
方法。 从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)
请注意,它也会应用重新缩放,因此您无需自己进行缩放(即,删除img = img/255.
)。
此外,请记住,由于已设置featurewise_ceneter=True
,因此在将其用于训练之前,需要使用generator的fit()
方法:
train_datagen.fit(training_data)
# then use fit_generator method
model.fit_generator(train_datagen, ...)
不是完整的答案,而是一些信息:
从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')
我认为您应该采用这种方式进行培训。 然后为了测试,我认为使用train_datagen.standardize
是正确的。
我认为这是您使用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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.