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

标签 python pandas image-processing 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')

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')

Found 1852 images belonging to 4 classes

Found 115 images belonging to 4 classes

这是我的模型训练代码:

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 我得到:

Found 0 images belonging to 0 class

所以我尝试了这些解决方案:

1) Keras: How to use predict_generator with ImageDataGenerator?这没有成功,因为它只在验证集上尝试。

2) How to predict the new image by using model.predict? 未找到模块图像

3) How to get predictions with predict_generator on streaming test data in 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 上进行了搜索,但未能找到解决方案。

最佳答案

因此,首先应将测试图像放在测试文件夹内的单独文件夹中。所以在我的例子中,我在 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
)

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

Found 306 images belonging to 1 class

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

test_generator.reset()

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

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

运行上面的代码将给出概率输出,所以首先我需要将它们转换为类号。在我的例子中是 4 个类(class),所以类(class)编号是 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})

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

关于python - 如何在新图像上使用 .predict_generator() - Keras,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52270177/

相关文章:

opencv - 如何在 OpenCV 中使用夜视摄像头输入(帧)?

mysql - 如何在 CodeIgniter 中显示数据库中的图像?

python - 保存时添加 ManyToMany 字段

python - AttributeError:未知属性 axisbg

python - 在 Pandas DataFrame 中创建多列的所有可能组合

python - 合并长度不等的pandas数据框

python - 使用 pyvips 连接多个巨大的图像

python - Django 找不到应用程序模板

python - Pandas 中的数据帧丢失日期索引

python - 如何有效地将值列表连接到间隔列表?