tf.keras.image_dataset_from_directory读取图片不全及加载差异咨询
两种数据加载方法结果不同的原因
- 默认支持的图片扩展名不同
tf.keras.preprocessing.image_dataset_from_directory的image_extensions参数默认仅识别.bmp/.gif/.jpeg/.jpg/.png格式的图片,其余格式(如.webp/.tiff)、大写后缀(如.JPG/.PNG)的图像会被直接过滤。而ImageDataGenerator.flow_from_directory默认支持的图像扩展名更广,也兼容大小写后缀,不会过滤这类文件。 - 损坏文件的处理逻辑不同
image_dataset_from_directory扫描文件时会提前校验图片可解码性,遇到损坏、无法正常读取的图片会直接跳过不计入总数。而flow_from_directory扫描阶段仅匹配文件名后缀,不会提前做解码校验,会把损坏图片也计入总数,仅在实际读取数据时才会抛出异常。
使用image_dataset_from_directory加载全部文件的解决方法
- 补充完整扩展名参数
先确认你的数据集中所有图片的后缀,将全部用到的扩展名传入image_extensions参数,示例修改后的代码如下:
train_dataset = tf.keras.preprocessing.image_dataset_from_directory( directory=("e:/Desktop/IT FYP/Dataset/train"), labels="inferred", label_mode="categorical", image_size=(350, 350), seed=123, subset=None, interpolation="bilinear", follow_links=False, # 新增参数,补充数据集用到的所有图片扩展名、大写后缀 image_extensions=['.bmp', '.gif', '.jpeg', '.jpg', '.png', '.webp', '.tiff', '.tif', '.JPG', '.PNG'] )
- 清理损坏图片
如果补充扩展名后仍未匹配到全部文件,说明数据集中存在损坏无法解码的图片,你可以遍历目录逐个校验图片完整性,删除或修复损坏文件后再运行加载代码即可。
内容的提问来源于stack exchange,提问作者黃兆榮
相关产品推荐
相关产品推荐

