首页 > 解决方案 > 数字标记文件的 ImageDataGenerator 排序不是您认为的那样

问题描述

我运行并训练了一个模型,该模型接受图像输入并将它们分类为两个类别之一。训练收敛良好,在测试集上的准确率约为 92%。我保存了模型并创建了一个新的 python 程序来加载模型然后在同一个测试集上进行预测。它给出了与前一个程序相同的结果。我对所犯的少数分类错误感到好奇。我的测试目录排列为 Test/ClassA 和 Test/ClassB。每个目录包含 30 个图像,为方便起见,标记为 1.jpg 到 30.jpg。在预测结果中,三幅图像被错误分类。然后,我拍摄了一张正确分类的图像,并将其放入有错误的三个文件中。然后我重新运行测试文件,期望三个错误会消失,但它们仍然存在。我怀疑 ImageDataGenerator 对文件排序做了一些奇怪的事情,但我不知道是什么。相关代码如下所示。

test_path ='c:/Temp/people/test' #path to test directory
test_batch_size=30 # 30 felon images and 30 nonfelon images
test_batches = ImageDataGenerator(preprocessing_function=keras.applications.mobilenet.preprocess_input
                             ).flow_from_directory(test_path, target_size=(224,224), batch_size=test_batch_size, shuffle=False)


test_labels=test_batches.classes
y=test_batches.class_indices
step_size=len(y) # step size is 2 for 2 classes 30 images each
model=load_model('c:/Temp/people/felon_classifier.h5')
predictions= model.predict_generator(test_batches, steps=step_size, verbose=0)   

剩下的代码只是简单地格式化预测输出,因此每个预测都与类(ClassA 或 ClassB)和概率一起打印出来。
任何人都知道我可能做错了什么?非常感激任何的帮助。鉴于这个问题,我不确定我是否可以相信预测结果。

标签: pythontensorflow

解决方案


我找到了错误分类的解决方案。它很简单,与测试目录中文件的命名有关。我的被​​标记为 1.jpg 2.jpg 等最多 30.jpg。Windows 操作系统按 1.jpg 2.jpg 3.jpg 到 30.jpg 的顺序排列它们。我发现 ImageDataGenerator 不会以相同的顺序读取文件。它将按以下顺序放置它们 1.jpg 10.jpg, 2.jpg, 20.jpg, 3,jpg, 30,jpg, 4.jpg, 5,jpg 等 为了避免使用单个数字键盘的文件名出现此问题带 0 的文件名如图所示 01.jpg 02.jpg 03.jpg 到 09.jpg 然后 10.jpg 到 30.jpg。当你这样做时,它确保 os 和 ImageDataGenerator 以相同的顺序读取文件。如果您拥有的文件数量超过 100 个,那么您必须将文件重命名为 001.jpg,002jpg 到 ..009.jpg,那么对于两位数的文件名,文件命名将是 010.jpg、020.jpg 等。在进行这些更改之后,现在一切都可以正常工作了。正如我所说的一个简单的修复,但一个非常微妙的问题。我编写了一个小的 python 函数,它确定目录中的文件数量,并根据目录中有多少文件,用所需的 0 填充对它们重新编号。如果您有很多文件要重命名,这很方便。


推荐阅读