我使用 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, 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
我的火车数据基本上存储在 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 许可协议
因此,首先应将测试图像放在测试文件夹内的单独文件夹中。因此,就我而言,我在
test
文件夹中创建了另一个文件夹并将其命名为all_classes
。然后运行以下代码:上面的代码给了我一个输出:
最重要的是,您必须编写以下代码:
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)
下一步是我想要类的名称:
其中 by class numbers 将替换为 class names。最后一步,如果你想将它保存到 csv 文件,将它安排在一个数据框中,图像名称附加了预测的类。
显示您的数据框。现在一切都完成了。您将获得图像的所有预测类别。