OSError: image file is truncated (XX bytes not processed) 报错解决指南
一、前言
我在训练深度神经网络时遇到了如下报错
······此处省略一万字
File "/root/anaconda3/envs/FEHR/lib/python3.9/site-packages/PIL/Image.py", line 995, in convert
self.load()
File "/root/anaconda3/envs/FEHR/lib/python3.9/site-packages/PIL/ImageFile.py", line 290, in load
raise OSError(msg)
OSError: image file is truncated (61 bytes not processed)
关于这个报错,我在网络上找到了解决方案。首先我要感谢他们的无私奉献,为我的科研工作节省了不少时间。美中不足的是大部分文章都是知其然而不知其所以然,写了两行代码草草了事。
这是非常不严谨的,对于很多小白来说,直接会懵掉:代码啥意思?该写在哪里?
下面我来尝试解决这些问题,希望对大家有帮助。
二、可能的原因
这个错误其含义是:由于图像文件在读取过程中被截断,以下是一些可能的原因:
- 文件读取不完整:文件是不完整的,读取过程中可能会出现问题,导致文件未完全加载。
- PIL库的限制:
PIL(Python Imaging Library)
有一个默认的最大块大小(MAXBLOCK
),如果图像文件超过这个大小,可能会导致截断错误。 - 文件传输或存储问题:在文件传输或存储过程中,可能会出现数据损坏或丢失,导致读取时出现错误。
当然,一般遇到这个问题是由于第2个原因。不过我还是提供 原因1 和 原因2 为根源的问题解决方案,但第2个优先(出现频率高);如果问题由第3个原因引起,还请读者自查。
三、解决方法
3.1 PIL库限制 解决方案
我们需要设置 ImageFile.LOAD_TRUNCATED_IMAGES = True
来允许PIL忽略截断错误并继续加载图像。
那我代码开头添加以下两行:
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
完犊子了,加在哪?为了回答这个问题,我把我控制台的反馈再写完整一点:
OSError: Caught OSError in DataLoader worker process 0.
Original Traceback (most recent call last):
File "/root/anaconda3/envs/FEHR/lib/python3.9/site-packages/torch/utils/data/_utils/worker.py", line 287, in _worker_loop
data = fetcher.fetch(index)
File "/root/anaconda3/envs/FEHR/lib/python3.9/site-packages/torch/utils/data/_utils/fetch.py", line 32, in fetch
data.append(next(self.dataset_iter))
File "/liushuai2/PCP/FeatEnHancer-main/detectron2/detectron2/data/common.py", line 296, in __iter__
yield self.dataset[idx]
File "/liushuai2/PCP/FeatEnHancer-main/detectron2/detectron2/data/common.py", line 125, in __getitem__
data = self._map_func(self._dataset[cur_idx])
File "/liushuai2/PCP/FeatEnHancer-main/detectron2/detectron2/utils/serialize.py", line 26, in __call__
return self._obj(*args, **kwargs)
File "/liushuai2/PCP/FeatEnHancer-main/Featurized-QueryRCNN/queryrcnn/dataset_mapper.py", line 82, in __call__
image = utils.read_image(dataset_dict["file_name"], format=self.img_format)
File "/liushuai2/PCP/FeatEnHancer-main/detectron2/detectron2/data/detection_utils.py", line 187, in read_image
return convert_PIL_to_numpy(image, format)
File "/liushuai2/PCP/FeatEnHancer-main/detectron2/detectron2/data/detection_utils.py