如何在新图像上使用 .predict_generator() - Keras [英] How to use .predict_generator() on new Images - Keras

查看:35
本文介绍了如何在新图像上使用 .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批量大小=32train_datagen = ImageDataGenerator(重新缩放=1./255,剪切范围=0.2,zoom_range=0.2,水平翻转=真)test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(火车目录,target_size=(img_height, img_width),批量大小=批量大小,class_mode='分类')验证生成器 = test_datagen.flow_from_directory(测试目录,target_size=(img_height, img_width),批量大小=批量大小,class_mode='分类')

<块引用>

找到 1852 张图片,属于 4 个类别

找到属于 4 个类别的 115 张图片

这是我的模型训练代码:

history = cnn.fit_generator(train_generator,step_per_epoch=1852//批量大小,时代=20,验证数据=验证生成器,validation_steps=115//批量大小)

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

<块引用>

找到属于 0 个类别的 0 张图片

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

1) Keras:如何将 predict_generator 与 ImageDataGenerator 一起使用? 这没有成功,因为它只尝试验证集.

2) 如何使用model.predict预测新图片?未找到模块图片

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

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

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

image_name 类呵呵.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 上搜索过,但没有找到解决方案.

解决方案

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

test_generator = test_datagen.flow_from_directory(目录=pred_dir,target_size=(28, 28),color_mode="rgb",批量大小=32,class_mode=无,洗牌=假)

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

<块引用>

找到属于 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)标签 = dict((v,k) for k,v in labels.items())预测 = [labels[k] for k in predicted_class_indices]

其中的班级编号将替换为班级名称.如果要将其保存为 csv 文件,最后一步是将其排列在数据框中,并在图像名称后附加预测的类.

filenames=test_generator.filenames结果= pd.DataFrame({文件名":文件名,预测":预测})

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

I've used ImageDataGenerator and flow_from_directory for training and validation.

These are my directories:

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 Code:

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

This is my model training code:

history = cnn.fit_generator(
        train_generator,
        steps_per_epoch=1852 // batch_size,
        epochs=20,
        validation_data=validation_generator,
        validation_steps=115 // batch_size)

Now I have some new images in a test folder (all images are inside the same folder only), on which I want to predict. But when I use .predict_generator I get:

Found 0 images belonging to 0 class

So I tried these solutions:

1) Keras: How to use predict_generator with ImageDataGenerator? This didn't work out, because its trying on validation set only.

2) How to predict the new image by using model.predict? module image not found

3) How to get predictions with predict_generator on streaming test data in Keras? This also didn't work out.

My train data is basically stored in 4 separate folders, i.e. 4 specific classes, validation also stored in same way and works out pretty well.

So in my test folder I have around 300 images, on which I want to predict and make a dataframe, like this:

image_name    class
gghh.jpg       1
rrtq.png       2
1113.jpg       1
44rf.jpg       4
tyug.png       1
ssgh.jpg       3

I have also used this following code:

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)

But I get this error: [Errno 13] Permission denied: 'D:\Datasets\Trell\images\new_images\testing'

But I haven't been able to predict_generator on my test images. So how can I predict on my new images using Keras. I have googled a lot, searched on Kaggle Kernels also but haven't been able to get a solution.

解决方案

So first of all the test images should be placed inside a separate folder inside the test folder. So in my case I made another folder inside test folder and named it all_classes. Then ran the following code:

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
)

The above code gives me an output:

Found 306 images belonging to 1 class

And most importantly you've to write the following code:

test_generator.reset()

else weird outputs will come. Then using the .predict_generator() function:

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

Running the above code will give output in probabilities so at first I need to convert them to class number. In my case it was 4 classes, so class numbers were 0,1,2 and 3.

Code written:

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

Next step is I want the name of the classes:

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 will be replaced by the class names. One final step if you want to save it to a csv file, arrange it in a dataframe with the image names appended with the class predicted.

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

Display your dataframe. Everything is done now. You get all the predicted class for your images.

这篇关于如何在新图像上使用 .predict_generator() - Keras的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆