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

新手上路,请多包涵

我使用 ImageDataGeneratorflow_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, 28
batch_size=32
train_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 found

  1. 如何使用 predict_generator 对 Keras 中的流式测试数据进行预测? 这也没有成功。

我的火车数据基本上存储在 4 个单独的文件夹中,即 4 个特定的类,验证也以相同的方式存储并且效果很好。

所以在我的测试文件夹中我有大约 300 张图像,我想在这些图像上预测并制作一个数据框,如下所示:

 image_name    class
gghh.jpg       1
rrtq.png       2
1113.jpg       1
44rf.jpg       4
tyug.png       1
ssgh.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 上进行了搜索,但未能找到解决方案。

原文由 Debadri Dutta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 946
2 个回答

因此,首先应将测试图像放在测试文件夹内的单独文件夹中。因此,就我而言,我在 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]

其中 by class numbers 将替换为 class names。最后一步,如果你想将它保存到 csv 文件,将它安排在一个数据框中,图像名称附加了预测的类。

 filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
                      "Predictions":predictions})

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

原文由 Debadri Dutta 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在使用 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]})

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题