一、im = Image.open(img_path) 报错如下:
/home/chuchienshu/.local/lib/python2.7/site-packages/PIL/TiffImagePlugin.py:692: UserWarning: Possibly corrupt EXIF data. Expecting to read 5876 bytes but only got 803. Skipping tag 34377 " Skipping tag %s" % (size, len(data), tag))
首先查了 Wikipedia ,了解到 exif 只是记录拍摄相机的各项参数的格式。
solution 可以参考这里
import piexif piexif.remove(img)
其实就把上面两行代码加在每个图片处理前即可。p.s. 这并不是把 exif corrupt 的图片删除了,而是重写了有问题的 exif ,其实就是抹去 exif 部分信息。
续:然而,问题接踵而至。。在我继续在处理过 exif 问题的数据集上跑实验时,又报错如下,
IOError: image file is truncated (18 bytes not processed)
很明显的受损图片,脏数据也忒多了点~~
采用网上的简单方案一、
from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True
发现并无报错,图片也可以显示出来了。但是大部分信息都丢失了,显然不是我们需要的。于是开始把这类图片从几十万张图中剔除出去。
for img_path in filelist: img_path = os.path.join(root, img_path) im = Image.open(img_path) # im = im.resize( (size,size), Image.ANTIALIAS ) try: im.load() except IOError: os.remove( img_path) print img_path
Image.open(img_path) 是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从文件读取(调用 load() 方法将强行加载图像数据),这时,受损图片就会报 IOerror 进而可以 remove。达到剔除脏数据的目的。