通过数据扩充来扩展数据集

本文介绍了如何通过数据增强技术扩大野生动物检测数据集,特别是针对驼鹿检测。讨论了适用的几何变换(如翻转和旋转)和图像过滤(如平滑和锐化)方法,提供Python代码示例,并展示增强后的图像。通过这种方式,作者将原始数据集的样本数量增加了18倍,为后续的深度学习模型训练提供了更多样化的输入。
摘要由CSDN通过智能技术生成

目录

介绍

数据扩充

几何变换

图像过滤

现在所有的技巧都在一个算法中

下一步


在这里,我们将简要介绍数据增强技术。然后,我们选择适合我们数据集的适当扩充方法。然后,我们提供并解释用于实现增强算法的Python代码。最后,我们演示所得的图像示例。

下载源34.8 KB

下载模型-26 MB(外部链接)

介绍

野蛮的野生生物可能给企业和房主带来痛苦。鹿、驼鹿甚至猫等动物都会对花园、庄稼和财产造成破坏。

在本系列文章中,我们将演示如何在Raspberry Pi上实时(或近实时)检测有害生物(例如驼鹿),然后采取措施消除有害生物。由于我们不想造成任何伤害,我们将通过播放巨大的噪音来吓跑害虫。

欢迎您下载该项目的源代码。我们假设您熟悉Python并且对神经网络的工作原理有基本的了解。

上一篇文章中,我们准备了驼鹿分类数据集的初始版本。它包括200个用于驼鹿类的样本和284个用于背景类的样本。有点小吧?在本文中,我们将演示如何在不收集新图像的情况下增强数据集。

数据扩充

数据扩充提供了一种使用各种图像修改从现有图像中获取新样本的方法。其中最常见的是几何变换、色彩空间变换、数据降噪和图像过滤。在应用数据增强算法时,我们应确保图像修改适合我们的数据集,并且不会损害样本。

让我们考虑一下驼鹿数据集。哪种修改类型适用?

色彩空间转换和数据噪声将无法实现。颜色是动物分类的重要功能,因此我们不应更改样本图像的颜色空间。数据噪声处理对于包含手写数字或符号的数据集是一种有效的技术。我们不希望这对在其自然栖息地的驼鹿图像有用。

这使我们有了几何变换和图像过滤。在用Python实现它们时,我们将对其进行详细考虑。

几何变换

相当多的几何变换可用于图像数据增强:翻转、旋转、缩放、裁切、平移等。

一个明显且非常有用的转换是水平翻转,它相对于垂直轴镜像图像。

另一个流行的几何变换是旋转,它模拟从不同角度观看样品。请注意,此变换应仅应用适度的旋转角度以保留对象形状。

我们可以使用Python OpenCV包轻松实现几何变换:

class FlipProcessor:
    def name(self):
        return "flip"
        
    def process(self, image):
        return cv2.flip(image, 1)
    
class RotateProcessor:
    def __init__(self, angle, scale):
        self.angle = angle
        self.scale = scale
        
    def name(self):
        if self.angle>0:
            sa = str(self.angle)
        else:
            sa = "_"+str(-self.angle)
        return "rotate"+sa
        
    def process(self, image):
        (h, w, c) = image.shape
        center = (w/2, h/2)

        rmat = cv2.getRotationMatrix2D(center, self.angle, self.scale)
        rotated = cv2.warpAffine(image, rmat, (w, h))

        return rotated

图像过滤

图像过滤是一种有用的但不直观的数据增强类型。很难估计哪些过滤器将从现有图像中产生最有用的数据样本。

我们的数据集包含从野生动物视频中提取的帧,因此可以公平地假设某些帧清晰而有些模糊。因此,锐化和平滑框架可以改善和多样化我们的数据集。这是在Python代码中的样子:

class SmoothProcessor:
    def __init__(self, filter_size):
        self.filter_size = filter_size
        
    def name(self):
        return "smooth"+str(self.filter_size)
        
    def process(self, image):
        smoothed = cv2.GaussianBlur(image,(self.filter_size, self.filter_size),0)

        return smoothed

class SharpenProcessor:
    def __init__(self, filter_size):
        self.filter_size = filter_size
        
    def name(self):
        return "sharpen"+str(self.filter_size)
        
    def process(self, image):
        sharpen = cv2.bilateralFilter(image, self.filter_size, 150, 150);

        return sharpen

我们仅需复制原始图像即可进行另一次转换(稍后将对此进行说明):

class OriginalProcessor:        
    def name(self):
        return ""
        
    def process(self, image):
        return image

现在所有的技巧都在一个算法中

现在,我们拥有将要使用的所有转换。这是将通过转换自动提取我们拥有的所有图像的算法:

class Augmentor:
    def __init__(self, processors):
        self.processors = processors

    def generate(self, source, dest):
        files = FileUtils.get_files(source)
        if not os.path.isdir(dest):
            os.mkdir(dest)
        for (i, fname) in enumerate(files):
            img = cv2.imread(fname)
            for (j, proc) in enumerate(self.processors):
                p_img = proc.process(img)
                f = os.path.basename(fname)
                f = os.path.splitext(f)[0]
                f = f + proc.name() + ".png"
                dfname = os.path.join(dest, f)
                cv2.imwrite(dfname, p_img)

generate方法遍历源文件夹中的文件,将所有指定的转换应用于它们,并将修改后的图像以新名称(原始名称与处理器名称串联在一起)保存到目标目录。

我们可以使用以下代码将增强算法应用于样本图像:

folder = r"C:\PI_PEST\moose"
gen_folder = r"C:\PI_PEST\moose_gen"

processors = [OriginalProcessor(), FlipProcessor()]
gen = Augmentor(processors)
gen.generate(folder, gen_folder)

processors = [SmoothProcessor(5), SharpenProcessor(5)]
gen = Augmentor(processors)
gen.generate(gen_folder, gen_folder)

processors = [RotateProcessor(15, 1.2), RotateProcessor(-15, 1.2)]
gen = Augmentator(processors)
gen.generate(gen_folder, gen_folder)

请注意,我们是如何通过三个连续步骤实现增强的。

首先,我们进行翻转和原始处理器。现在我们了解了为什么OriginalProcessor仅按原样复制原始图像:在此步骤之后,我们希望将原始图像和翻转后的图像都复制到moose_gen文件夹中。

在第二步中,我们将平滑和锐化处理器应用于第一步中生成的所有图像。

在最后一步中,我们对前两个步骤中生成的所有图像应用了两个变换(顺时针和逆时针旋转15度)。样本的结果图像如下所示:

下一步

我们现在有几个样本?我们有18倍之多!

驼鹿类有3600个样本,背景类有5112个样本。就我们的目的而言,此大小的数据集将提供可接受的驼鹿检测结果。

但是,如果你正在开发一个商业害虫检测,你会想很多更大的数据集。在进行AI项目时,您会遇到的一个常见主题是,获取良好数据是最困难的任务。

有众所周知的,久经考验的DNN架构可以解决许多常见的问题,但获取大量的图像,清洗它们,并增强它们可能需要几天,几周,甚至几个月的时间,这取决于你正在解决的问题的大小。

接下来的文章中,我们将讨论我们的训练DNN分类与增强的数据集。

https://www.codeproject.com/Articles/5289751/Extending-Dataset-with-Data-Augmentation

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLOv5(You Only Look Once version 5)是一种流行的实时物体检测算法,它在YOLO系列中发展而来。为了提高模型的性能和泛化能力,扩充数据集是非常关键的步骤。这通常包括以下几个方面: 1. **数据增强(Data Augmentation)**:对原始图像进行各种变换,如翻转、裁剪、缩放、随机颜色扰动等,生成新的训练样本,增加模型对不同视角和光照条件的适应性。 2. **迁移学习(Transfer Learning)**:使用预训练的模型,如在ImageNet上预训练的模型,然后在其基础上进行微调,这样可以利用大规模通用数据集学到的基础特征。 3. **合成数据(Synthetic Data)**:创建逼真的虚拟场景或使用GAN技术生成与目标类别相关的假数据,以扩大训练样本范围。 4. **标注数据扩充(Label Expansion)**:如果可能,获取更多标注过的数据或者使用半监督、弱监督学习方法,利用未标注数据进行训练。 5. **多尺度训练(Multi-Scale Training)**:在训练时使用不同大小的输入图片,使模型能够处理不同尺寸的目标。 6. **领域适应(Domain Adaptation)**:对于特定任务或领域,调整数据集以反映实际应用中的变化,比如从城市街道到乡村环境的转变。 7. **联合学习(Federated Learning)**:在保护隐私的情况下,集合多个设备或地点的本地数据进行训练,可以扩展数据的地域性和多样性。 要使用YOLOv5扩充数据集,你需要确保数据集的质量,按照YOLOv5的训练脚本进行格式转换,并在训练参数中指定适当的选项来启用数据增强和其他扩展技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值