在加载训练图像数据,准备训练模型的时候,报错如下:
OSError: image file is truncated (71 bytes not processed)
搜索查了一下,有两种原因,一种说是图像太大,另一种说是图像不完整。找到的解决方式为如下:
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
这么设置,确实可以了,但是对于训练集中有多少有问题的图像,不清楚,而且这些图像如果比例太大,对训练效果会不会产生影响也不清楚。
所以还是想先确认一下,到底这种类型的图像有多少.
报错位置信息如下:
for i, (images, target) in enumerate(train_loader):
具体内部错误如下:
File "/opt/anaconda3/envs/yolov5/lib/python3.6/site-packages/PIL/ImageFile.py", line 260, in load
"image file is truncated "
OSError: image file is truncated (34 bytes not processed)
所以写了一个测试脚本,就是对训练路径下面的所有图像都用pillow中的Image读取一下,看看哪个图像报错,结果遍历完图像发现一个报错的也没有,这个地方有些疑问。在网上查的时候,看到有人使用keras.preprocessing.image.load_img()找到了出问题的图像,所以打算试一下,结果安装虚拟环境下载需要好久,就先让它下载着,在另外一个环境中使用OpenCV进行读取测试一下,在imread的过程中,出现了几条Premature end of JPEG file提示,总共有三张图像,还好不多,看了下这三张图像确实显示不完整,就是图像下面的一部分是灰色的,看着就像是没有下载完。这样只要剔除这三张有问题的图像就可以了。
但在查询torchvision.datasets.ImageFolder的时候,发现其中有一个参数可以对加载的图像进行判断,is_valid_file:A function that takes path of an Image file and check if the file is a valid file (used to check of corrupt files)
def is_valid_jpg(jpg_file):
"""判断JPG文件下载是否完整"""
if jpg_file.split('.')[-1].lower() == 'jpg':
with open(jpg_file, 'rb') as f:
f.seek(-2, 2)
return f.read() == '\xff\xd9'
else:
return True
通过这种方式就可以对训练数据集中出错的图像进行判断,剔除不满足要求的图像。