为了账号安全,请及时绑定邮箱和手机立即绑定

如何在新图像上使用 .predict_generator() - Keras

如何在新图像上使用 .predict_generator() - Keras

慕码人8056858 2021-06-02 16:41:22
我已经使用ImageDataGenerator和flow_from_directory进行培训和验证。这些是我的目录:train_dir = Path('D:/Datasets/Trell/images/new_images/training')test_dir = Path('D:/Datasets/Trell/images/new_images/validation')pred_dir = Path('D:/Datasets/Trell/images/new_images/testing')图像生成器代码:img_width, img_height = 28, 28batch_size=32train_datagen = ImageDataGenerator(    rescale=1. / 255,    shear_range=0.2,    zoom_range=0.2,    horizontal_flip=True)test_datagen = ImageDataGenerator(rescale=1. / 255)train_generator = train_datagen.flow_from_directory(    train_dir,    target_size=(img_height, img_width),    batch_size=batch_size,    class_mode='categorical')validation_generator = test_datagen.flow_from_directory(    test_dir,    target_size=(img_height, img_width),    batch_size=batch_size,    class_mode='categorical')找到属于 4 个类别的 1852 张图片找到属于 4 个类别的 115 个图像这是我的模型训练代码:history = cnn.fit_generator(        train_generator,        steps_per_epoch=1852 // batch_size,        epochs=20,        validation_data=validation_generator,        validation_steps=115 // batch_size)现在我在测试文件夹中有一些新图像(所有图像仅在同一个文件夹中),我想对其进行预测。但是当我使用时,.predict_generator我得到:找到属于 0 个类别的 0 个图像所以我尝试了这些解决方案:1) Keras:如何将 predict_generator 与 ImageDataGenerator 一起使用?这没有成功,因为它仅尝试验证集。2)如何使用model.predict来预测新图像? module image not found3)如何使用 predict_generator 对 Keras 中的流测试数据进行预测?这也没有奏效。我的火车数据基本上存储在 4 个单独的文件夹中,即 4 个特定的类,验证也以相同的方式存储并且效果很好。所以在我的测试文件夹中,我有大约 300 张图像,我想在这些图像上预测并制作一个数据框,如下所示:image_name    classgghh.jpg       1rrtq.png       21113.jpg       144rf.jpg       4tyug.png       1ssgh.jpg       3我还使用了以下代码:img = image.load_img(pred_dir, target_size=(28, 28))img_tensor = image.img_to_array(img)img_tensor = np.expand_dims(img_tensor, axis=0)img_tensor /= 255.cnn.predict(img_tensor)但我收到此错误: [Errno 13] Permission denied: 'D:\\Datasets\\Trell\\images\\new_images\\testing'但我一直无法predict_generator在我的测试图像上。那么我如何使用 Keras 预测我的新图像。我在谷歌上搜索了很多,也在 Kaggle Kernels 上搜索过,但没有找到解决方案。
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

因此,首先应将测试图像放置在测试文件夹内的单独文件夹中。所以就我而言,我在文件夹内创建了另一个文件test夹并将其命名为all_classes. 然后运行以下代码:


test_generator = test_datagen.flow_from_directory(

    directory=pred_dir,

    target_size=(28, 28),

    color_mode="rgb",

    batch_size=32,

    class_mode=None,

    shuffle=False

)

上面的代码给了我一个输出:


找到属于 1 个类别的 306 个图像


最重要的是,您必须编写以下代码:


test_generator.reset()


否则会出现奇怪的输出。然后使用.predict_generator()函数:


pred=cnn.predict_generator(test_generator,verbose=1,steps=306/batch_size)


运行上面的代码将给出概率输出,所以首先我需要将它们转换为类号。就我而言,它是 4 个班级,因此班级编号为 0、1、2 和 3。


编写的代码:


predicted_class_indices=np.argmax(pred,axis=1)


下一步是我想要类的名称:


labels = (train_generator.class_indices)

labels = dict((v,k) for k,v in labels.items())

predictions = [labels[k] for k in predicted_class_indices]

where by class numbers 将替换为 class 名称。如果要将其保存到 csv 文件,最后一步是将其排列在数据框中,并在图像名称后附加预测的类。


filenames=test_generator.filenames

results=pd.DataFrame({"Filename":filenames,

                      "Predictions":predictions})

显示您的数据框。现在一切都完成了。您将获得图像的所有预测类别。


查看完整回答
反对 回复 2021-06-15
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我遇到了一些麻烦predict_generator()。这里的一些帖子帮助很大。我也在这里发布我的解决方案,希望它能帮助其他人。我做的事情:

  • 使用对新图像进行预测 predict_generator()

  • 获取每个预测的文件名

  • 将结果存储在数据框中

我根据此处记录的“猫和狗”进行二元预测。但是,该逻辑可以推广到多类情况。在这种情况下,预测结果每类有一列。

首先,我加载我存储的模型并设置数据生成器:

import numpy as np

import pandas as pd

from keras.preprocessing.image import ImageDataGenerator

from keras.models import load_model


# Load model

model = load_model('my_model_01.hdf5')


test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(

        "C:/kerasimages/pred/",

        target_size=(150, 150),

        batch_size=20,

        class_mode='binary',

        shuffle=False)

注意:重要的是要指定shuffle=False以保留文件名和预测的顺序。


图像存储在C:/kerasimages/pred/images/. 数据生成器将只在(如 中指定的)的子文件夹中查找图像。尊重数据生成器的逻辑很重要,所以需要子文件夹。中的每个子文件夹都 被生成器解释为一个类。在这里,生成器将报告(因为只有一个子文件夹)。如果我们进行预测,类(由生成器检测到的)是不相关的。C:/kerasimages/pred/test_generator/images/C:/kerasimages/pred/Found x images belonging to 1 classes


现在,我可以使用生成器进行预测:


# Predict from generator (returns probabilities)

pred=model.predict_generator(test_generator, steps=len(test_generator), verbose=1)

在这种情况下不需要重置生成器,但如果之前已经设置过生成器,则可能需要使用test_generator.reset().


接下来,我舍入概率以获取类并检索文件名:


# Get classes by np.round

cl = np.round(pred)

# Get filenames (set shuffle=false in generator is important)

filenames=test_generator.filenames

最后,结果可以存储在数据框中:


# Data frame

results=pd.DataFrame({"file":filenames,"pr":pred[:,0], "class":cl[:,0]})


查看完整回答
反对 回复 2021-06-15
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您最有可能在使用flow_from_directory. 阅读文档:


flow_from_directory(目录,...)


在哪里:


directory:目标目录的路径。每个类应该包含一个子目录。每个子目录目录树中的任何 PNG、JPG、BMP、PPM 或 TIF 图像都将包含在生成器中。


这意味着在传递给此函数的目录中,您必须创建子目录并将图像放置在该子目录中。否则,当图像在您传递的目录(不是子目录)中时,确实有 0 个图像和 0 个类。


编辑


好的,如果您要执行预测,我相信您希望使用以下predict功能:(请注意,您必须以与学习过程中相同的格式向网络提供数据)


image = img_to_array(load_img(f"{directory}/{foldername}/{filename}"))

# here you prepare the input data, for example here we take the gray image

# gray scale is the 1st channel in the Lab color space

color_me = rgb2lab((1.0 / 255) * color_me)[:, :, 0]

color_me = color_me.reshape(color_me.shape + (1,))

# here data is in the format which is accepted by, in this case, my model

# for your model you have to do the preparation just the same as in the case of learning process

output = model.predict(np.array([color_me]))

# and here you have your predicted output


查看完整回答
反对 回复 2021-06-15
  • 3 回答
  • 0 关注
  • 312 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信