UserWarning: Possibly corrupt EXIF data.


前言

既然看到了这篇博客,那说明你用的数据集出毛病了,让我猜一猜,用的肯定是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)
  1. 无所畏惧型:无视警告信息

看警告信息其实不是报错,而且会自动skip有问题的图片,所以可以直接无视警告信息

import warnings
warnings.filterwarnings('ignore')
  1. 多才多艺型:跟警告战斗到底

将警告信息设置成报错:

import warnings
warnings.filterwarnings("error", category=UserWarning)

在打开图片后,捕获异常,并抛出异常:

try:
    img = Image.open(filePath)
except:
    print(filePath)

尝试了几次,反正我是没整明白,放弃。

  1. 完美无缺型:眼里容不得一粒沙子,要把它去掉(是我没错了)

好不容易下载的官方数据集,删掉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 数据集,得嘞,直接照着下图删吧,就是这十张图片的锅(看着也没毛病),这官方数据集真不让人省心。

有问题的图片

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值