大型数据集含损坏图OSError: image file is truncated和PIL.UnidentifiedImageError: cannot identify image file解决方案

在训练深度学习网络模型时,所用大规模图像数据集(如万级、十万级、百万级等等)中包含有损毁或损坏的图像,进行了几个小时的第一轮迭代突然因数据集载入问题而突然中断,时间成本很高,对所遇问题可采用以下方法排除、解决。希望有参考意义~

报错问题:OSError: image file is truncated

原因分析:在python使用 PIL 处理图像的时候,有时会因为一些莫名的数据操作使得图像数据产生一些小问题,在之后使用该图像数据时会出现这个错误OSError: image file is truncated。图像数据有自己的基本格式,是一串二进制的数据,开头是ff d8,结尾是ff d9。当报错OSError: image file is truncated时,多数情况是尾部截断了,即尾部的ff d9不见了,标识点不见了,而报错。

解决方式有两种。

方式一:将损坏数据丢掉。 在代码前部,增加一下内容即可。如此,当遇到数据截断的图片时,PIL会直接break,跳出函数,不报错,进行下一个。

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

方式二:将数据补全,再用。 有时损坏数据较多,数据丢掉成本太高,且截断部分影响不大,可以考虑将数据补全,在数据后面补上ff d9。代码如下,针对自己的数据集,遍历即可。

from PIL import Image
from io import BytesIO
ori_img='001.jpg'
with open(ori_img, 'rb') as f:

    f = f.read()

f = f + B'\xff' + B'\xd9'

img = Image.open(BytesIO(f))
if img.mode != "RGB":
    img = im.convert('RGB')

报错问题:‘PIL.UnidentifiedImageError: cannot identify image file ‘001.jpg’

原因分析:操作系统不能执行指定的任务(如打开文件)时引发的。这里双击报错图片,的确打不开。这些图片可以删掉。

我的项目中,用于模型训练的数据集是十万级的,这种打不开的图片由数据集提供方告知有几十张,前期已生成数据集txt目录,因此可用简单的遍历,输出打不开的图片和目录所在行数,手动删除即可。代码如下:

from PIL import Image

txt_path = '/home/yy/dataset/train.txt'
fh = open(txt_path, 'r')
i = 0
for line in fh:
    i += 1
    line = line.rstrip()
    words = line.split()
    img = words[0]
    try:
        flag = Image.open(img)
    except Exception as e:
        print(img, i)

这个报错也有可能是PIL库的问题,需自己确认。如果打不开的图片文件很多,可以在代码中直接删除图片。参考以下博文:

有两篇博文针对第一种报错 OSError: image file is truncated. 有比较详细的分析和解决方案,供大家学习参考~

Original: https://blog.csdn.net/qq_39691492/article/details/124468857
Author: 小白白程序员
Title: 大型数据集含损坏图OSError: image file is truncated和PIL.UnidentifiedImageError: cannot identify image file解决方案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/633607/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球