Keras flow_from_directory返回0张图片:批量预测无图片检测问题
解决
flow_from_directory找不到测试图片的问题 我来帮你分析下这个问题哈~你遇到的核心问题是ImageDataGenerator.flow_from_directory的工作规则和你的目录结构不匹配,导致它识别不到图片。
问题原因
flow_from_directory这个方法要求指定的目标目录下必须包含对应类别的子文件夹,哪怕是测试集也一样。比如你的train目录应该是下面有cats和dogs子目录对吧?但你的test目录应该是直接把图片放在了根目录里,没有创建对应的类别子文件夹,所以这个方法会认为没有符合要求的图片数据。
解决方案
根据你的需求,分两种情况处理:
情况1:测试集有明确的类别标签
调整你的test目录结构,按照和train一样的方式组织:
- 在
dogs_vs_cats/test/下新建两个子目录:cats和dogs - 把测试集中的猫类图片全部移到
test/cats/,狗类图片移到test/dogs/
最终目录结构应该是这样:
dogs_vs_cats/ ├── train/ │ ├── cats/ │ └── dogs/ ├── test/ │ ├── cats/ │ └── dogs/ └── 你的笔记本文件.ipynb
这样你的原有代码就能正常读取到图片了,不需要修改代码逻辑。
情况2:测试集是无标签的(只有图片,没有类别区分)
如果你的测试集没有明确的类别,只是一堆待预测的图片,那flow_from_directory就不适用了,推荐手动加载图片:
import os import numpy as np from PIL import Image # 定义图片预处理参数 target_size = (300, 300) test_dir = "test/" test_images = [] filenames = [] # 遍历test目录下的所有图片 for img_file in os.listdir(test_dir): # 过滤非图片文件 if img_file.lower().endswith(('.png', '.jpg', '.jpeg')): # 读取并预处理图片 img_path = os.path.join(test_dir, img_file) img = Image.open(img_path).resize(target_size) img = np.array(img) / 255.0 # 归一化到0-1区间,和ImageDataGenerator默认行为一致 test_images.append(img) filenames.append(img_file) # 转换为模型可接受的数组格式 test_images = np.array(test_images)
之后你就可以用model.predict(test_images)来获取预测结果,同时filenames列表里也保存了对应的图片文件名。
额外小提示
如果不确定当前工作目录是否正确,可以在代码里先打印当前路径验证:
import os print(os.getcwd())
确保输出的路径是dogs_vs_cats的根目录,这样相对路径test/才会被正确识别。
内容的提问来源于stack exchange,提问作者Jitesh Malipeddi
相关产品推荐
相关产品推荐

