详解Python如何批量检查图像是否可用
作者:SpikeKing 发布时间:2021-10-03 13:42:07
标签:Python,批量,检查,图像
数据集中的图像,一般不可用在以下3个方面:
1.图像过小
2.无法打开
3.“Premature end of JPEG file”
这些图像可能会导致模型的学习异常,因此,使用多进程检查数据集中的每张图像,是很有必要的。
具体逻辑如下:
遍历文件夹,多进程处理每一张图像
判断图像是否可读,是否支持resize尺寸,边长是否满足
判断JPG图像是否Premature end
删除错误图像
脚本如下:
#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2020. All rights reserved.
Created by C. L. Wang on 10.11.20
"""
import argparse
import os
from multiprocessing import Pool
import cv2
def traverse_dir_files(root_dir, ext=None):
"""
列出文件夹中的文件, 深度遍历
:param root_dir: 根目录
:param ext: 后缀名
:return: [文件路径列表, 文件名称列表]
"""
names_list = []
paths_list = []
for parent, _, fileNames in os.walk(root_dir):
for name in fileNames:
if name.startswith('.'): # 去除隐藏文件
continue
if ext: # 根据后缀名搜索
if name.endswith(tuple(ext)):
names_list.append(name)
paths_list.append(os.path.join(parent, name))
else:
names_list.append(name)
paths_list.append(os.path.join(parent, name))
return paths_list, names_list
def check_img(path, size):
"""
检查图像
"""
is_good = True
try:
img_bgr = cv2.imread(path)
h, w, _ = img_bgr.shape
if h < size or w < size:
is_good = False
_ = cv2.resize(img_bgr, (size, size))
except Exception as e:
is_good = False
if path.endswith("jpg"):
with open(path, 'rb') as f:
check_chars = f.read()[-2:]
if check_chars != b'\xff\xd9':
print('[Info] Not complete jpg image')
is_good = False
if not is_good:
print('[Info] error path: {}'.format(path))
os.remove(path)
def check_error(img_dir, n_prc, size):
"""
检查错误图像的数量
"""
print('[Info] 处理文件夹路径: {}'.format(img_dir))
paths_list, names_list = traverse_dir_files(img_dir)
print('[Info] 数据总量: {}'.format(len(paths_list)))
pool = Pool(processes=n_prc) # 多线程下载
for idx, path in enumerate(paths_list):
pool.apply_async(check_img, (path, size))
if (idx+1) % 1000 == 0:
print('[Info] idx: {}'.format(idx+1))
pool.close()
pool.join()
print('[Info] 数据处理完成: {}'.format(img_dir))
def parse_args():
"""
处理脚本参数,支持相对路径
:return: in_folder 输入文件夹, size 尺寸, n_prc 进程数
"""
parser = argparse.ArgumentParser(description='检查图片脚本')
parser.add_argument('-i', dest='in_folder', required=True, help='输入文件夹', type=str)
parser.add_argument('-p', dest='n_prc', required=False, default=100, help='进程数', type=str)
parser.add_argument('-s', dest='size', required=False, default=50, help='最小边长', type=str)
args = parser.parse_args()
in_folder = args.in_folder
size = int(args.size)
n_prc = int(args.n_prc)
print("[Info] 文件路径:{}".format(in_folder))
print("[Info] 进程数: {}".format(n_prc))
print("[Info] 边长: {}".format(size))
return in_folder, n_prc, size
def main():
arg_in, n_prc, size = parse_args()
check_error(arg_in, n_prc, size)
if __name__ == '__main__':
main()
来源:https://blog.csdn.net/caroline_wendy/article/details/120282256
0
投稿
猜你喜欢
- asp禁止站外盗链,站外提交方法、以及asp判断星期几方法.防盗链,主要通过判断上一页面来源是否是本站来实现的,不是本站的链接就
- 本文为 djangorestframework-simplejwt 使用记录。(官方文档) 1. 安装 pip inst
- iframe的防插与强插(一)中介绍了“市面上”能见到的两种防御被第三方网站iframe的方法,以及相应的变态突破方法。貌似把“受害人”逼上
- Jira提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作JiraJira Python文
- 我正在参加天池上的一个竞赛,刚开始用的是DenseNet121但是效果没有达到预期,因此开始尝试使用模型融合,将Desenet和Xcepti
- 上次在“给网页添加打印按钮”一文中,有一段代码是“复制本文链接到剪贴板”js脚本,很可惜只能在IE中使用。这次在“淘宝网在线充值中心 - 荆
- django启动我们在启动一个django项目的时候,无论你是在命令行执行还是在pycharm直接点击运行,其实都是执行'runse
- 本文实例讲述了scrapy自定义pipeline类实现将采集数据保存到mongodb的方法。分享给大家供大家参考。具体如下:# Standa
- 这篇文章主要介绍了Python Django 简单分页的实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse,
- 题目:利用协程来遍历目录下,所有子文件及子文件夹下的文件是否含有某个字段值,并打印满足条件的文件的绝对路径。#!/user/bin/env
- 1. 定义本质是函数,用来装饰其他函数,为其他函数添加附加功能2. 原则a. 不能修改被装饰函数的源代码b. 不能修改被装饰的函数的调用方式
- 这个javascript划词搜索功能,在很多地方我们都会看到,特别是装了浏览器插件的时候,当我们用鼠标选择一段文字的时候,就会出现搜索提示,
- 【人工智能项目】混合高斯模型运动目标检测本次工作主要对视频中运动中的人或物的边缘背景进行检测。那么走起来瓷!!!原视频高斯算法提取工作imp
- python字典怎么排序?定义一个字典类型mydict = {2: '小路', 3: '黎明', 1:
- var iframe = document.createElement("iframe"); iframe.id = &
- A:西米喜欢健身B:超超不爱健身,喜欢打游戏step1:分词A:西米/喜欢/健身B:超超/不/喜欢/健身,喜欢/打/游戏step2:列出两个
- 查看python搜索包的路径的实现方法:python搜索包的路径存储在sys.path下查看方法:import syssys.path临时添
- 今天偶尔在知乎上看到某大佬用Python写的ATM系统案例,然后观摩了下他的实现思路和源码,感觉受益颇多,于是就根据自己的思路和目前掌握的P
- 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码)。此类程序只是提高了12306网站的 <