深度学习数据增强实战:从20张灰度图到百张训练集的批量处理方法

深度学习训练过程中,数据量不足的问题时常出现。本文将结合具体案例,向大家展示如何通过数据增强技术,将不足20张的图片数量扩充至百张以上。赶快学习!

项目背景与需求

项目里用的图片都是灰度的,原始数据量非常少,不足二十张。要训练深度学习模型,这怎么够?数据不足,我们就用增强来补足!通过多种变换方法的结合,我们的目标是让数据量超过百张,这样才能让迁移学习派上用场,让模型训练更高效,为后续研究打下坚实的基础。

然而,若仅用现有少量图像来训练,模型很可能过度适应,实际应用时难以展现理想效果。因此,数据增强显得尤为关键!

数据增强的重要性

数据增强对于深度学习模型的训练至关重要。若数据量不够,模型可能难以掌握充分特征,这会对其泛化能力造成影响。以这个仅有不到20张灰度图的项目为例,若直接进行训练,模型的表现必然不会令人满意。

数据增强能提升数据的丰富性,使模型有机会接触各式各样的图片。因此,当模型遇到新数据时,它能更精确地识别和作出判断,从而提升准确度。这有助于获得更优的预测效果,为实际应用提供更坚实的保障。

单核方法操作

数据增强的基础是采用单核处理。在编写代码时,我们每次仅处理一张图片,并对它进行一系列变换。具体步骤是:首先,从目标文件夹中读取原始图片,然后,从变化方法组中挑选相应的操作。

可选的操作组合有零到五种,比如转动、颠倒、放大等。依次对图片实施这些操作,可生成新的图片并保存。但这种方法速度较慢,尤其是面对大量图片时,所需时间会非常长,不太适合用于大规模数据增强。

单核方法操作简便,易于理解,编写代码也不复杂。对于初学者或是处理小规模数据的项目来说,这确实是个不错的选择。可以先通过单核方法来掌握数据增强的步骤和各类变换技巧,之后再考虑采用更高效的方法。

多核方法优势

#!usr/bin/python
# -*- coding: utf-8 -*-
import cv2
from imgaug import augmenters as iaa
import os
class MyAugMethod():
    def __init__(self):
        self.seq = iaa.Sequential()
        self.imglist_name = []
        self.imglist = []
    # 遍历输入文件夹,返回所有图片名称
    def show_path_file(self, inputpath, all_files_name, all_files):
        # 首先遍历当前目录所有文件及文件夹
        file_list = os.listdir(inputpath)
        # 保存图片文件的目录
        last_path = inputpath
        # 准备循环判断每个元素是否是文件夹还是文件,
        # 是文件的话,把名称传入list,是文件夹的话,递归
        for filename in file_list:
            # 利用os.path.join()方法取得路径全名,并存入cur_path变量
            # 否则每次只能遍历一层目录
            cur_path = os.path.join(inputpath, filename)
            # 判断是否是文件夹
            if os.path.isdir(cur_path):
                last_path = cur_path
                self.show_path_file(cur_path, all_files_name, all_files)
            else:
                filename = os.path.join(last_path, filename)
                all_files_name.append(filename)
                all_files.append(cv2.imread(filename))   
    # 定义增强的方法
    def aug_method(self):
        # 给指定的方法设置对应比例
        # 如Sometimes(0.5, GaussianBlur(0.3))表示每两张图片做一次模糊处理
        sometimes = lambda aug: iaa.Sometimes(0.5, aug)
        
        # 定义一组变换方法.
        self.seq = iaa.Sequential([
            # 选择0到5种方法做变换
            iaa.SomeOf((0, 5),
                [                                        
                    # 将图像进行超分辨率,每幅图采样20到200个像素,
                    # 替换其中的一些值,但不会使用平均值来替换所有的超像素
                    sometimes(
                        iaa.Superpixels(
                            p_replace=(0, 1.0),
                            n_segments=(20, 200)
                        )
                    ),
                    # 使用不同的模糊方法来对图像进行模糊处理
                    # 高斯滤波
                    # 均值滤波
                    # 中值滤波
                    iaa.OneOf([

图片[1]-深度学习数据增强实战:从20张灰度图到百张训练集的批量处理方法-东山笔记

iaa.GaussianBlur((0, 3.0)), iaa.AverageBlur(k=(2, 7)), iaa.MedianBlur(k=(3, 11)), ]), # 对图像进行锐化处理,alpha表示锐化程度 iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), # 与sharpen锐化效果类似,但是浮雕效果 iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)), # 添加高斯噪声 iaa.AdditiveGaussianNoise( loc=0, scale=(0.0, 0.05*255) ), # 每个像素增加(-10,10)之间的像素值 iaa.Add((-10, 10), per_channel=0.5), # 将-40到40之间的随机值添加到图像中,每个值按像素采样 iaa.AddElementwise((-40, 40)), # 改变图像亮度(原值的50-150%) iaa.Multiply((0.5, 1.5)), # 将每个像素乘以0.5到1.5之间的随机值. iaa.MultiplyElementwise((0.5, 1.5)), # 增强或弱化图像的对比度. iaa.ContrastNormalization((0.5, 2.0)), ], # 按随机顺序进行上述所有扩充 random_order=True ) ],random_order=True) # 增强函数 def aug_data(self, inputpath, times): # 获得输入文件夹中的文件列表 self.show_path_file(inputpath, self.imglist_name, self.imglist) # 实例化增强方法 self.aug_method() #对文件夹中的图片进行增强操作,循环times次 for count in range(times): print("aug data for {} times ".format(count)) images_aug = self.seq.augment_images(self.imglist) for index in range(len(images_aug)): filename = self.imglist_name[index].split(".jpg", 1)[0] filename = filename + "_" + str(count) +'.jpg' #保存图片 cv2.imwrite(filename, images_aug[index]) # print('image of count%s index%s has been writen'%(count,index)) if __name__ == "__main__": # 图片文件相关路径 inputpath = './data/test' times = 3 test = MyAugMethod() test.aug_data(inputpath, times)

多核技术着重解决了单核技术在速度上的局限。通过运用计算机的多核处理器,它能够同时处理多张图片,显著提升了数据增强的工作效率。

实际操作中,我们通过并行处理代码,使得多个核心可以同时进行不同图片的变换。这样一来,原本耗时较长的数据增强工作,在多核技术的帮助下,可以大幅减少所需时间。这为大规模图片的数据增强提供了更加迅速、实用的解决方案。

在项目数据量较多的情况下,多核技术的优势尤为突出。它能有效缩短处理时间,同时提升工作效率。这样一来,研究者就能迅速完成数据预处理,进而进入模型训练阶段,从而加速研究全过程的推进。

代码中的变换操作

代码中采用了多种变换手段来增强数据。通过旋转,图片能够从不同角度展示,模仿真实环境中物体可能存在的多种朝向。此外,还有水平与垂直两种翻转方式,用以丰富图片的观察角度。

缩放功能可以调整图片尺寸,让模型能匹配不同大小的物体。而且,我们还能根据实际情况,在操作列表中加入诸如裁剪、模糊等额外操作,这样就能增加数据的多样性。这些操作组合让原始图片呈现出更多变化,显著扩大了数据集的规模。

变换操作对模型训练的效果各异。比如,通过旋转和翻转,模型能掌握物体在不同视角和朝向下的特点,增强对物体姿态的辨识力;而缩放操作则能让模型更好地应对不同尺寸的目标,提升其适应性。研究者需根据项目具体需求和模型特性,灵活运用并组合这些操作。

拓展与建议

本次项目采用灰度图像,并未涉及色彩空间的转换。若为彩色图像,便可以实施颜色调整,比如提升亮度、增强对比或调整饱和度,以此使数据增强更为完善。

在实际使用时,可以依据不同情况对操作方法和数量进行调整,力求达到最佳效果。另外,对数据增强后的图片质量要进行严格检查,确保没有无效或错误数据对模型训练造成干扰。

各位朋友们,在你们进行数据增强工作时,是否遇到过什么特别的难题?若觉得这篇文章对您有所帮助,请别忘了点赞并转发。

© 版权声明
THE END
喜欢就支持一下吧
分享