python—深度学习数据预处理—剔除读取失败的图片

起因:

在复现下面这个猫狗粉类代码时,总是遇到这样的报错:

(猫狗分类实战,推荐像我一样的纯小白阅读)https://blog.csdn.net/qq_33160678/article/details/108017822

博主说是因为路径问题,但是我仔细查看了路径应该是没问题的。而且最为迷惑的是,有时候一开始运行就报这个错,有时候则是运行了一会之后才出现这个错误。

经最强外挂(男朋友)提醒,代码能跑起来应该不是路径问题,应该是数据的问题。我打开data下的文件夹一看,嚯,真的有些图片是损坏的。

 

像这个910.jpg就无法打开,看来就是这种图片阻碍了我的程序。

男朋友提议,可以写一个脚本,剔除这些错误。其实我是不会写的(尴尬.jpg)

我在CSDN上找到了现成的代码,写的非常简洁优美,但是我试了试,不好用。

https://blog.csdn.net/u013171226/article/details/109065890?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162156631216780357238887%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162156631216780357238887&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-3-109065890.pc_search_result_cache&utm_term=python%E5%A6%82%E4%BD%95%E8%AF%BB%E5%8F%96%E5%9B%BE%E7%89%87%E5%B9%B6%E5%88%A0%E9%99%A4&spm=1018.2226.3001.4187

于是把里面的is_read_successfully(file)函数替换掉了,改用下面链接里的is_valid_image(path)函数。

https://www.jb51.net/article/171204.htm

测试,成功!感谢以上两位dalao的代码。

 

最后放上我的拼接成品哈哈哈哈哈哈哈

import os
import shutil
import warnings
import cv2
import io

from PIL import Image

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

base_dir = "/freespace/CAT_DOG/data/Cat/"
i = 0


'''
def is_read_successfully(file):
    try:
        imgFile = Image.open(file)
        return True
    except Exception:
        return False
'''

def is_valid_image(path):
    try:
        bValid = True
        fileObj = open(path, 'rb') # 以二进制形式打开
        buf = fileObj.read()
        if not buf.startswith(b'\xff\xd8'): # 是否以\xff\xd8开头
          bValid = False
        elif buf[6:10] in (b'JFIF', b'Exif'): # “JFIF”的ASCII码
          if not buf.rstrip(b'\0\r\n').endswith(b'\xff\xd9'): # 是否以\xff\xd9结尾
            bValid = False
        else:
            try:
              Image.open(fileObj).verify()
            except Exception as e:
              bValid = False
              print(e)
    except Exception as e:
       return False
    return bValid




for parent, dirs, files in os.walk(base_dir):
    for file in files:
        #if not is_read_successfully(os.path.join(parent, file)):
        if not is_valid_image(os.path.join(parent, file)):
            print(os.path.join(parent, file))
            #os.remove(os.path.join(parent, file)) #真正使用时,这一行要放开,自己一般习惯先跑一遍,没有错误了再删除,防止删错。
            i = i + 1
print(i)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值