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

Deb*_*tta 8 python image-processing pandas 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')
Run Code Online (Sandbox Code Playgroud)

ImageGenerator代码:

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')
Run Code Online (Sandbox Code Playgroud)

找到1852个属于4个类的图像

找到115个属于4个类的图像

这是我的模型培训代码:

history = cnn.fit_generator(
        train_generator,
        steps_per_epoch=1852 // batch_size,
        epochs=20,
        validation_data=validation_generator,
        validation_steps=115 // batch_size)
Run Code Online (Sandbox Code Playgroud)

现在我在测试文件夹中有一些新图像(所有图像仅在同一文件夹内),我想要预测.但是当我使用时,.predict_generator我得到:

找到0图像属于0类

所以我试过这些解决方案:

1)Keras:如何在ImageDataGenerator中使用predict_generator?这没有用,因为它只尝试验证设置.

2)如何使用model.predict预测新图像? module image not found

3)如何在Keras中使用predict_generator对流测试数据进行预测?这也没有成功.

我的火车数据基本上存储在4个独立的文件夹中,即4个特定的类,验证也以相同的方式存储,并且工作得非常好.

所以在我的测试文件夹中,我有大约300张图像,我想要预测并制作数据帧,如下所示:

image_name    class
gghh.jpg       1
rrtq.png       2
1113.jpg       1
44rf.jpg       4
tyug.png       1
ssgh.jpg       3
Run Code Online (Sandbox Code Playgroud)

我还使用了以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误: [Errno 13] Permission denied: 'D:\\Datasets\\Trell\\images\\new_images\\testing'

但是我无法predict_generator测试我的测试图像.那么如何使用Keras预测我的新图像.我搜索了很多,在Kaggle Kernels上搜索但是还没有得到解决方案.

Deb*_*tta 16

因此,首先应将测试图像放在测试文件夹内的单独文件夹中.所以在我的情况下,我做了内另一个文件夹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
)
Run Code Online (Sandbox Code Playgroud)

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

找到306个属于1类的图像

最重要的是你要编写以下代码:

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]
Run Code Online (Sandbox Code Playgroud)

类号将由类名替换.最后一步,如果要将其保存到csv文件,请将其排列在数据框中,图像名称附加了预测类.

filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
                      "Predictions":predictions})
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*ter 8

我遇到了一些麻烦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)
Run Code Online (Sandbox Code Playgroud)

注意:重要的是要指定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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下不需要重置生成器,但如果之前已经设置过生成器,则可能需要使用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
Run Code Online (Sandbox Code Playgroud)

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

# Data frame
results=pd.DataFrame({"file":filenames,"pr":pred[:,0], "class":cl[:,0]})
Run Code Online (Sandbox Code Playgroud)