使用ImageDataGenerator训练多分类模型时出现图像截断OSError如何解决
问题解决方法
报错的核心原因是存在尾部数据截断的JPG图片,你之前用Image.verify()仅校验图片文件头合法性,不会校验全量像素数据,因此无法检出这类问题;小数据集训练时未触发报错是因为没有随机读取到这些问题文件,类别增多、数据集扩大后才会碰到。
解决方案按优先级排序如下:
- 方案1:设置PIL自动兼容截断图片(最快生效,无需修改数据集)
在你所有代码的最开头(导入库的部分)加入两行配置,即可让PIL自动忽略截断错误,正常加载图片:
from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True
该配置对绝大多数场景都适用,不会影响正常训练效果。
- 方案2:修正图片校验逻辑,清理问题文件
如果不想兼容截断文件,需要把所有问题文件找出来删除或替换,使用如下校验代码(替代你之前的校验逻辑):
import os from PIL import Image categ = ['Train', 'Valid', 'Test'] dataset = '/content/drive/MyDrive/Colab Notebooks/Datasets/FSLR_Application_Dataset' truncated_files = [] for cat in categ: img_path = os.path.join(dataset, cat) for foldername in os.listdir(img_path): sign_path = os.path.join(img_path, foldername) for sign in os.listdir(sign_path): if sign.endswith('.jpg'): file_path = os.path.join(sign_path, sign) try: img = Image.open(file_path) img.load() # 加载全量像素数据,检出截断问题 img.resize(image_size) # 模拟训练时的resize操作,进一步校验 except Exception as e: truncated_files.append(file_path) print('问题文件:', file_path, '错误信息:', str(e)) print(f"共检出{len(truncated_files)}个异常文件,可手动清理后重新训练")
额外代码优化建议
你当前代码存在参数冲突:flow_from_directory中已经指定了batch_size=5,model.fit中传入的batch_size=2000对生成器输入的训练流程完全无效,可以直接删除fit中的batch_size参数,避免后续混淆。
内容的提问来源于stack exchange,提问作者Lord Dickenstein
相关产品推荐
相关产品推荐

