如何使用Keras ImageDataGenerator预测单个图像?

j0pj023g  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(144)

我已经训练了CNN对3类图像进行分类。在训练模型时,我使用了keras的ImageDataGenerator类来对图像应用预处理函数并重新缩放。现在我的网络在测试集上训练得很好,但我不知道如何将预处理函数应用于单幅图像预测。如果我使用ImageDataGenerator,它会查找目录。建议我一些替代方案做预处理功能和重新缩放的单一图像。下面的代码
培训集:

train_datagen = ImageDataGenerator(preprocessing_function = tf.keras.applications.vgg16.preprocess_input,
                                   rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
training_set = train_datagen.flow_from_directory('./training_set',
                                                 target_size = (224, 224),
                                                 batch_size = 10,
                                                 class_mode = 'categorical')

字符串
测试集:

test_datagen =ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,                                                            
                                                         rescale = 1./255)
test_set = test_datagen.flow_from_directory('./test_set',
                                            target_size = (224, 224),
                                            batch_size = 10,
                                            shuffle=False,
                                            class_mode = 'categorical')


现在,我无法应用预处理功能和重新缩放单个图像预测之前。单一预测:

single_datagen = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,
                                   rescale = 1./255)
single_test = single_datagen.flow_from_directory('./single_prediction/cc.jpg',
                                            target_size = (224, 224),
                                            batch_size = 1,
                                            class_mode = 'categorical')


错误:NotADirectoryError:[错误20]不是目录:'./single_prediction/cc.jpg'

9cbw7uwe

9cbw7uwe1#

当你想预测一个图像时,你可以使用下面的代码。
它根据训练数据集中文件夹(类)的排列方式返回每个类的概率列表。因此,返回列表的第一个索引是训练数据集中的第一个文件夹(或类),依此类推。具有最高概率的索引是您预测的类。

from keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
from keras.applications.vgg16 import preprocess_input

#load the image
my_image = load_img('your_single_image.jpeg', target_size=(224, 224))

#preprocess the image
my_image = img_to_array(my_image)
my_image = my_image.reshape((1, my_image.shape[0], my_image.shape[1], my_image.shape[2]))
my_image = preprocess_input(my_image)

#make the prediction
prediction = model.predict(my_image)

字符串
使用下面的列表解析将结果四舍五入为整数,可以返回更清晰的结果。

import numpy as np
[np.round(x) for x in prediction]


索引为1的元素是预测类。

dm7nw8vv

dm7nw8vv2#

图像数据生成器查看您指定的目录,并在该目录中搜索指定类的子目录。因此创建一个名为'./single_prediction的目录。在该目录中创建一个单独子目录,称之为test。在名为test子目录中放置要测试的图像。或者,您可以编写一些python代码来生成预处理的图像。创建一个名为test的目录,并将您的图像放在其中。我没有测试过,但下面的代码应该可以工作。

import cv2
import numpy as np
import os
data_list=[]
dir=r'c:\test'
test_list=os.listdir(dir) # create a list of the files in the directory
batch_size=len(test_list) # determine number of files to process
for f in test_list:  # iterate through the files
    fpath=os.path.join (dir, f) # create path to the image file
    img=cv2.imread(fpath) # read image using cv2
    img=cv2.resize(img, (224,224)) # resize the image
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # cv2 creates bgr images, convert to rgb images
    img=tf.keras.applications.vgg16.preprocess_input(img)   # apply the Vgg16 preprocess function
    data_list.append(img)  # append processed image to the list
data=np.array(data_list)/255 # convert to an np array and rescale images
print (data.shape, batch_size)
predictions=model.predict(data,batch_size=batch_size, verbose=0 )
trials=len (predictions)
for i in range(0,trials):
    predicted_class=predictions[i].argmax() # get index of highest probability
    print (test_list[i], predicted_class) # print file name and class prediction

字符串

mu0hgdu0

mu0hgdu03#

以下方法应该适合您:

from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input

img_path = './test_set/<class_name>/img1.jpg'
img = image.load_img(img_path, target_size=(224, 224))
#convert to array so that we can pass into preprocess_function
img = image.img_to_array(img)
#preprocess using the same function used for training
img = preprocess_input(img, data_format=None)
#normalize image
img = img/255.0
#transform image array to a tensor
img = np.expand_dims(img, axis=0)

model.predict(img)

字符串
应该输出如下所示的内容:
第一个月

**注意:**所有测试数据的预处理方式必须与训练/验证数据的预处理方式相同。注意我们如何使用img = img/255.0重新缩放/归一化像素值。如果没有正确地预处理图像,您将在未训练的数据上进行测试。

相关问题