预处理单个图像以进行预测。 (CNN建立并接受Keras培训)

时间:2018-07-06 11:23:17

标签: numpy opencv keras conv-neural-network cv2

缺乏对如何使用现有训练模型(keras序列)进行单个预测的理解。

CNN的预处理和训练如下:     从keras.preprocessing.image导入ImageDataGenerator

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

test_datagen = ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size=(64, 64),
                                                 batch_size=32,
                                                 class_mode='binary')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size=(64, 64),
                                            batch_size=32,
                                            class_mode='binary')

classifier.fit_generator(training_set,
                         steps_per_epoch=8000,
                         epochs=25,
                         validation_data=test_set,
                         validation_steps=2000)

由于predict_generator不起作用,所以我卡住了...

2 个答案:

答案 0 :(得分:2)

import numpy as np
from keras.preprocessing import image

test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', target_size(64,64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image,axis=0)
result = classifier.predict(test_image)
training_set.class_indices

答案 1 :(得分:1)

经过一番谷歌搜索后,我发现单个图像最好用opencv进行预处理,因此转到其文档,该文档通过终端(使用conda)在mac上安装。

conda install opencv

代码中的下一个对此进行了尝试:

import cv2
import numpy as np

predict_datagen = ImageDataGenerator(rescale=1./255)

img1 = cv2.imread('path_to_image/img_1.jpg')
img1 = cv2.resize(img1, (64, 64))

调整大小后,知道模型的图像输入形状为(64、64、3),我检查了形状是否与

相匹配
print(img1.shape)

结果发现一切都很好,所以我需要添加尺寸以符合模型的要求,这是我在收到ValueError之后弄清楚的:

ValueError: Error when checking : expected conv2d_1_input to have 4 dimensions, but got array with shape (64, 64, 3)

因此图像被重塑了:

img1 = np.array(img1).reshape((1, 64, 64, 3))#do not miss the order in tuple

此后,我收到了所需形状和大小的图像,并准备使用predict方法进行一次预测。