图片数据清洗

前言

数据对于深度学习算法模型的效果至关重要。通常,在对采集到的大量数据进行标注前需要做一些数据清洗工作。对于大量的数据,人工进行直接清洗速度会很慢,因此开发一些自动化清洗工具对批量数据首先进行自动清洗,然后再进行人工审核并清洗,可以很大程度上提高效率。

工具功能

根据收集到的需求,工具主要实现了以下功能:

  • 统计数据信息(总占用空间、数量、损坏图片数);
  • 去除已损坏图片,
  • 去除模糊图片,
  • 去除相似图片,
  • 机动车车色分类,
  • 昼夜分类
统计数据信息
# 获取数据集存储大小、图片数量、破损图片数量
def get_data_info(dir_path):
    size = 0
    number = 0
    bad_number = 0
    for root, dirs, files in os.walk(dir_path):
        img_files = [file_name for file_name in files if is_image(file_name)]
        files_size = sum([os.path.getsize(os.path.join(root, file_name)) for file_name in img_files])
        files_number = len(img_files)
        size += files_size
        number += files_number
        for file in img_files:
            try:
                img = Image.open(os.path.join(root, file))
                img.load()
            except OSError:
                bad_number += 1
    return size / 1024 / 1024, number, bad_number
去除已损坏图片
# 去除已损坏图片
def filter_bad(dir_path):
    filter_dir = os.path.join(os.path.dirname(dir_path), 'filter_bad')
    if not os.path.exists(filter_dir):
        os.mkdir(filter_dir)
    filter_number = 0
    for root, dirs, files in os.walk(dir_path):
        img_files = [file_name for file_name in files if is_image(file_name)]
        for file in img_files:
            file_path = os.path.join(root, file)
            try:
                Image.open(file_path).load()
            except OSError:
                shutil.move(file_path, filter_dir)
                filter_number += 1
    return filter_number
去除模糊图片

首先需要判断图片的清晰度,用opencv提供的拉普拉斯算子接口求得清晰度数值,数值越小,清晰度越低,也就越模糊(通常以100位分界值)。

# 去除模糊图片
def filter_blurred(dir_path):
    filter_dir = os.path.join(os.path.dirname(dir_path), 'filter_blurred')
    if not os.path.exists(filter_dir):
        os.mkdir(filter_dir)
    filter_number = 0
    for root, dirs, files in os.walk(dir_path):
        img_files = [file_name for file_name in files if is_image(file_name)]
        for file in img_files:
            file_path = os.path.join(root, file)
            # img = cv2.imread(file_path)
            img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
            image_var = cv2.Laplacian(img, cv2.CV_64F).var()
            if image_var < 100:
                shutil.move(file_path, filter_dir)
                filter_number += 1
    return filter_number

还有很多图像模糊检测的方法,可以参考:https://www.cnblogs.com/greentomlee/p/9379471.html

去除相似图片

对于一些通过视频抽帧得到的图片数据,连续图片相似度会很高,需要剔除相似度较高的图片数据。
首先我们需要计算两张图片的相似度,计算相似度的方法通常有以下几种:

  • 通过直方图计算图片的相似度;
  • 通过哈希值,汉明距离计算;
  • 通过图片的余弦距离计算;
  • 通过图片的结构度量计算。

四种方法结果可能会不同。
参考:https://blog.youkuaiyun.com/weixin_35132022/article/details/112514520
下面是利用python opencv中通过直方图计算图片的相似度。去除相似图片过程通过遍历求每张图片和它之后的四张图片(这里比较之后的几张可以根据实际需求调整)的相似度,如果相似度超过阈值则剔除后面的图片。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值