前言
既然看到了这篇博客,那说明你用的数据集出毛病了,让我猜一猜,用的肯定是SUN397场景数据集吧?什么?不是?那你肯定是从网上爬来的图片,不接受反驳!
一个概念两个警告三个分析四个解决办法 奉上!!!
一、Exif是什么?
Exif文件格式与JPEG 文件格式相同,Exif按照JPEG的规格在JPEG中插入一些图像/数字相机的信息数据以及缩略图像,大致就是图片的附属信息,很容易泄露隐私啊!
二、出现问题警告
模型训练到中间突然自己中断了,然后蹦出来警告:
/app/anaconda3/envs/tensorflow/lib/python3.5/site-packages/PIL/TiffImagePlugin.py:763: UserWarning: Possibly corrupt EXIF data.Expecting to read 8 bytes but only got 4. Skipping tag 41486
" Skipping tag %s" % (size, len(data), tag))
再或者处理掉部分有问题数据后,还有报错:
OSError: cannot identify image file <_io.BufferedReader name='E:/******/SUN397\\val\\playground\\sun_bvtjyvutqdbkcbus.jpg'>
三、问题分析
- 图片损坏等原因,导致读取不完整;
- 图片Exif信息与实际不符合;
- 图片格式问题,PIL或者CV读取不了
四、解决方法
- 1、简单粗暴型:直接删除数据集图片exif信息
下载piexif包:
pip install piexif -i https://pypi.douban.com/simple/
删掉图片exif信息:
import piexif
img_path = '*******'
piexif.remove(img_path)
- 无所畏惧型:无视警告信息
看警告信息其实不是报错,而且会自动skip有问题的图片,所以可以直接无视警告信息
import warnings
warnings.filterwarnings('ignore')
- 多才多艺型:跟警告战斗到底
将警告信息设置成报错:
import warnings
warnings.filterwarnings("error", category=UserWarning)
在打开图片后,捕获异常,并抛出异常:
try:
img = Image.open(filePath)
except:
print(filePath)
尝试了几次,反正我是没整明白,放弃。
- 完美无缺型:眼里容不得一粒沙子,要把它去掉(是我没错了)
好不容易下载的官方数据集,删掉exif信息总感觉不完美了,那我只能把有问题的图片找出来去掉了。
import glob
import os
import shutil
from PIL import Image
path = '**********/train/'
image = [path + x for x in os.listdir(path) if os.path.isdir(path + x)]
for f in image:
print(f)
for im in glob.glob(f + '/*.jpg'):
# print(im)
try:
img = Image.open(im)
except:
print(im)
print('corrupt is:')
print('corrupt img', im)
shutil.move(im, '***********/shanchu/')
# os.remove(im)
遍历数据集,对所有图片进行读取,有问题的图片就会打印出来,并使用shutil移动到其他文件夹或者使用os.remove直接去除,不过因为数据集比较大,总感觉可能会漏掉或者没找完,可以多跑几遍,同时train一下模型检验一下,反正我是跑了好几遍才把毒瘤找完,找出来之后整个世界都清爽了。
福利放松时间
都看到这里了总得来点更简单的方法吧,你要是用的 SUN397 数据集,得嘞,直接照着下图删吧,就是这十张图片的锅(看着也没毛病),这官方数据集真不让人省心。