【深度学习:数据增强】计算机视觉中数据增强的完整指南

在这里插入图片描述

【深度学习:数据增强】计算机视觉中数据增强的完整指南

    • 为什么要做数据增强?
    • 等等,什么是数据增强?
    • 数据增强技术
    • 数据增强的注意事项和潜在陷阱
    • 什么时候应该做数据增强?
    • 类不平衡的数据增强
    • 那么我应该选择哪些转换呢?
      • 视频数据增强
    • 如何实现数据增强
    • 专业人士使用哪些技术?
    • 高级技术,即“我不能使用 GAN 生成完全独特的数据吗”?
    • 结论

为什么要做数据增强?

可能面临的一个常见挑战是模型的过拟合。这种情况发生在模型记住了训练样本的特征,但却无法将其预测能力应用到新的、未见过的图像上。过拟合在计算机视觉中尤为重要,在计算机视觉中,我们处理高维图像输入和大型、过度参数化的深度网络。有许多现代建模技术可以解决这个问题,包括基于丢弃的方法、标签平滑或架构,这些方法可以减少所需的参数数量,同时仍能保持拟合复杂数据的能力。但是,对抗过拟合的最有效方法之一是数据本身。

深度学习模型通常需要大量数据,而提高模型性能的一种有效方法是提供更多数据,这是深度学习的核心要素。这可以通过两种方式完成:

  • 增加原始数据量。这是通过增加数据集中的图像数量来实现的,从而扩充了图像的基本分布,并有助于优化模型的决策边界,对抗过拟合。您拥有的样本越多(比如来自分类问题的特定类别),您就能更准确地描述该类别的特征。
  • 增加数据集的多样性。值得一提的是,无法泛化到新数据也可能是由数据集/分布偏移引起的。想象一下,使用一组训练后的狗在公园里的图像对狗品种进行分类,但在生产中的其他地方看到狗。扩大训练数据集以包含这些类型的图像可能会对模型的泛化能力产生巨大影响。(但大多数时候,图像增强将无法解决这个问题)。

然而,收集数据通常既昂贵又耗时。例如,在医疗保健应用中,收集更多数据通常需要接触患有特定疾病的患者,熟练的医疗专业人员花费大量时间和精力来收集和注释数据,并且通常使用昂贵的成像和诊断设备。在许多情况下,“获取更多数据”的解决方案将非常不切实际。此外,除了在迁移学习中使用之外,公共数据集通常并不适用于定制的计算机视觉问题。如果有某种方法可以在不返回数据收集阶段的情况下增加数据集的大小,那不是很好吗?这就是数据增强。

等等,什么是数据增强?

数据增强是通过各种转换从现有训练样本中生成新的训练样本。它是一种非常有效的正则化工具,几乎所有 CV 问题和模型的专家都在使用它。数据增强可以以一种非常简单有效的方式将几乎任何图像训练集的大小增加 10 倍、100 倍甚至无限大。从数学上讲:

更多的数据=更好的模型。数据增强 = 更多数据。因此,数据增强 = 更好的机器学习模型。

数据增强技术

在这里插入图片描述

用于数据增强的常见图像转换。

上图所示的方法列表绝不是详尽无遗的。还有无数其他方法可以操作图像和创建增强数据。你只受限于自己的创造力!

也不要觉得只限于孤立地使用每种技术。您可以(并且应该)将它们链接在一起,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多重转换

在这里插入图片描述

单源图像增强组合的更多示例。

数据增强的注意事项和潜在陷阱

  • 毋庸置疑,在将数据集拆分为训练、验证和测试子集后,应该进行任何数据增强。否则,您将在模型中造成重大数据泄漏,并且您的测试结果将毫无用处。
  • 如果您正在执行基于本地化的任务(如对象检测或分割),则在应用几何变换(如反射(翻转)、旋转、平移和裁剪)时,您的标签将发生变化。因此,您还需要将相同的转换应用于标签注释。
  • 裁剪图像时,会更改模型输入的大小和形状。对于卷积神经网络模型,您需要所有输入(包括测试集)具有相同的维度。处理此问题的常用方法是将裁剪转换也应用于测试集和验证集。调整图像大小是另一种选择。
  • 其中一些转换(如平移、旋转或缩放)可能会导致“空白区域”,即转换后的图像未完全覆盖输入模型的网格空间。在这些情况下,您可以使用恒定的黑/白/灰像素、随机噪声或扩展原始图像内容的插值来填充多余的像素。
  • 注意不要裁剪或平移太多,以免从图像中完全删除相关对象。当您知道对象检测任务中的边界框时,这很容易检测到,但如果完全裁剪掉与标签对应的对象,则可能会成为图像分类的问题。
  • 数据增强通常只在训练集上执行。虽然它也可以用作在非常小的验证甚至测试集中减少方差的策略,但在对测试集进行任何更改时应始终非常小心。您希望测试数据是对推理时间分布中看不见的示例的性能的无偏估计,而增强数据集可能与该分布不同。
  • 不建议同时使用过多的增强技术。你可能会想通过组合所有列出的转换来一次把所有东西都扔进去,厨房水槽,但这会很快使生成的图像变得非常不真实,人类无法识别,并且还会导致上述点中概述的潜在问题。使用所有这些转换并没有错,只是不要一次组合所有这些转换。

话虽如此,转换后的图像并不需要完美才能有用。数据量往往会超过数据质量。示例越多,异常值/错误图像对模型的不利影响就越小,数据集的多样性就越大。

尽管数据增强几乎总是对模型性能有积极影响,但它并非解决所有与数据集大小相关问题的灵丹妙药。你不能指望使用50张图像的微小数据集,使用上述技术将其放大到50,000张,并获得50,000张数据集的所有好处。数据增强可以帮助使模型对旋转、平移、照明和相机伪影等内容更加鲁棒,但不适用于其他变化,例如不同的背景、透视、对象外观的变化、场景中的相对位置等。

什么时候应该做数据增强?

您可能想知道“我应该在什么时候使用数据增强?什么时候有好处?答案是:总是!数据增强通常有助于规范化和改进您的模型,如果您以合理的方式应用它,则不太可能有任何缺点。唯一可以跳过它的情况是,如果你的数据集非常庞大和多样化,以至于增强不会为其增加任何有意义的多样性。但是我们大多数人都没有奢侈地使用这样的童话数据集🙂。

类不平衡的数据增强

扩增法也可用于处理类不平衡问题。与使用基于抽样或加权的方法相比,你可以简单地增加较小的类,使所有类的大小相同。

那么我应该选择哪些转换呢?

没有一个确切的答案,但你应该从思考自己的问题开始。转换生成的图像是否完全超出了现实世界的支持范围?即使公园里一棵树的倒立图像不是你在现实生活中会看到的,你也可能会看到一棵倒下的树的类似方向。不过,有些变换可能需要重新考虑,例如:

  • 垂直反射(倒置)十字路口的停车标志,用于自动驾驶中的物体识别。
  • 倒置的身体部位或模糊/彩色图像,用于放射学图像,其方向、光照和清晰度始终保持 一致。
  • 道路和社区卫星图像上的网格失真。(尽管这可能是应用轮换的最佳位置之一)。
  • 数字分类 (MNIST) 的 180 度旋转。这种转换将使您的 6 看起来像 9,反之亦然,同时保留原始标签。

你的转换不一定是完全现实的,但你绝对应该使用在实践中可能发生的任何转换。

除了对任务和领域的了解,对数据集的了解也很重要。更好地了解数据集中图像的分布情况,可以让您更好地选择哪种增强技术能为您带来合理的结果,甚至可能帮助您填补数据集中的空白。Encord Active 是帮助您探索数据集、可视化图像属性分布和检查图像数据质量的一个很好的工具。

然而,我们是工程师和数据科学家。我们不只是根据猜想做出决定,我们还要尝试和进行实验。我们拥有久经考验的模型验证和超参数调整技术。我们可以简单地尝试不同的技术,并选择在验证集上性能最大化的组合。

如果您需要一个良好的起点:水平反射(水平翻转)、裁剪、模糊、噪点和图像擦除方法(如剪切或随机擦除)是一个良好的基础。然后,你可以尝试将它们组合在一起,并添加亮度和色彩变化。

视频数据增强

视频数据的增强技术与图像数据非常相似,但有一些区别。通常,所选的变换将以相同的方式应用于视频中的每一帧(噪点除外)。修剪视频以创建较短的片段也是一种流行的技术(时间裁剪)。

如何实现数据增强

实施的具体细节取决于硬件、所选的深度学习库、所选的转换等。但通常有两种策略可以实现数据增强:离线和在线。

离线增强: 离线数据增强是指计算一个新的数据集,其中包括所有原始图像和转换后的图像,并将其保存到磁盘中。然后像往常一样,使用增强数据集而不是原始数据集来训练模型。这可能会大大增加所需的磁盘存储空间,因此我们不建议您这样做,除非您有特殊原因(如验证增强图像的质量或控制训练过程中显示的准确图像)。

在线扩增: 这是最常见的数据增强方法。在在线增强中,每次加载图像时都会对图像进行转换。在这种情况下,模型在每个时间点都会看到不同的图像变换,变换结果不会保存到磁盘中。通常情况下,变换会在每个纪元随机应用于图像。例如,您将在每个时区随机决定是否翻转图像、执行随机裁剪、采样模糊/锐化量等。

在这里插入图片描述

在线和离线数据扩增过程。

专业人士使用哪些技术?

您可能仍然想知道:"训练最先进模型的人是如何使用图像增强技术的?让我们一起来看看:

论文数据增强技术
LeNet-5 Translate, Scale, Squeeze, Shear
AlexNet Translate, Flip, Intensity Changing
ResNet Crop, Flip
MobileNet Flip, Crop, Translate
NasNet Crop, Elastic distortion
ResNeStAutoAugment, Mixup, Crop
DeiTAutoAugment, RandAugment, Random erasing, Mixup, CutMix
Swin Transformer RandAugment, Mixup, CutMix, Random erasing
U-Net Translate, Rotate, Gray value variation, Elastic deformation
Faster R-CNNFlip
YOLO Scale, Translate, Color space
SSD Crop, Resize, Flip, Color Space, Distortion
YOLOv4 Mosaic, Distortion, Scale, Color space, Crop, Flip, Rotate, Random erase, Cutout, Hide and Seek, GridMask, Mixup, CutMix, StyleGAN

Erasing/Cutout: 等等,这些剪切-混合-然后-修改的东西是什么?其中一些像剪切、随机擦除和网格掩码都是图像擦除方法。执行擦除时,您可以在图像中剪切出正方形、不同形状的矩形,甚至多个单独的剪切/蒙版。还有多种方法可以使该过程随机化。擦除是一种流行的策略,例如,在图像分类的背景下,可以迫使模型学习识别每个单独部分的对象,而不仅仅是通过擦除最独特的部分来识别最独特的部分(例如学习识别狗)通过爪子和尾巴,而不仅仅是脸)。擦除可以被认为是一种“输入空间中的丢失”。

Mixing: 数据增强中的另一种流行技术是混合。混合涉及组合单独的示例(通常属于不同类别)以创建新的训练图像。混合比我们见过的其他方法不太直观,因为生成的图像看起来不真实。让我们看一下几种常用的技术:

Mixup: Mixup 通过两个图像的线性插值(加权平均)来组合两个图像。然后将相同的插值应用于类标签。
在这里插入图片描述
混合图像的示例。具有标签(狗、猫)的二值图像分类问题中相应的图像标签将为(0.52,0.48)。

什么?这看起来像是模糊的废话!这些标签值是什么?为什么这有效?

从本质上讲,这里的目标是鼓励我们的模型学习不同类别之间更平滑的线性过渡,而不是振荡或行为不稳定。这有助于在推理时稳定模型在未见过的示例上的行为。

CutMix: CutMix 是 Cutout 和 Mixup 方法的组合。如前所述,混合图像看起来非常不自然,并且在执行本地化时可能会让模型感到困惑。 CutMix 不是在两个图像之间进行插值,而是简单地裁剪一个图像并将其粘贴到第二个图像上。与剪切相比,这也有一个好处,即剪切区域不仅会被丢弃并用垃圾替换,而且会被替换为实际信息。标签权重类似 - 对于分类问题,标签对应于增强图像中存在的相应类图像的像素百分比。为了定位,我们在合成图像的各自部分中保留与原始图像相同的边界框或分割。

在这里插入图片描述
AugMix: Augmix 与上面的例子有点不同,但这里也值得一提。 AugMix 不会将不同的训练图像混合在一起 - 相反,它混合同一图像的不同变换。通过探索图像之间的输入空间,这保留了混合的一些好处,并减少了对同一图像应用多次变换带来的退化影响。混合计算如下:

  1. 创建多个(默认为 3 个)增强图像。每个增强图像都是使用 1-3 种不同的变换创建的。
  2. 3个增强图像通过加权平均混合
  3. 通过加权平均将所得图像与原始图像混合

在这里插入图片描述
AugMix增强过程。整个方法还包括其他部分,例如特定的损失函数。

高级技术,即“我不能使用 GAN 生成完全独特的数据吗”?

图像增强仍然是一个活跃的研究领域,还有一些更先进的方法需要注意。以下技术更为复杂(尤其是最后两种),并不总是最实用或最有效的实施策略。为了完整起见,我们列出了这些内容。

特征空间增强: 特征空间增强包括在训练期间对隐藏层表示而不是原始图像执行增强。这个想法是,与通过输入空间相比,您更有可能遇到遍历特征空间的随机图像。这可以通过向隐藏的表示添加噪声、对它们执行混合或其他方法来完成。

GAN: 另一种方法是使用生成模型(通常是 GAN)生成新的合成图像,该模型学习底层数据生成分布。这可以无条件地完成,也可以从现有的训练示例开始,例如,使用样式转移。对于视频数据,可以使用仿真技术来合成帧序列。

自动增强: 为给定问题找到增强技术的最佳组合可能非常耗时,并且需要领域和特定数据集方面的专业知识。如果计算机能为我们完成所有这些工作,那不是很好吗?自动增强算法在可能的增强空间中搜索,以找到性能最佳的增强。像 AutoAugment 这样的强化学习方法可以找到高性能的增强策略。还存在基于对抗性学习的方法,这些方法会产生难以分类的转换。

结论

现在您知道什么是数据增强,以及它如何通过填写数据集来帮助解决过拟合问题。您知道应该将数据增强用于所有计算机视觉任务。你对最重要的数据增强转换和技术有一个很好的概述,你知道要注意什么,并且你已经准备好将数据增强添加到你自己的预处理和训练管道中。祝你好运!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/306744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Wordpress高级教程】 Wordpress免插件建立站群,wordpress整站迁移/安装

提示:该方法适用于Wordpress的站点,且无需插件哦(插件一般都需要付费的,博主比较穷,我们就通过技术来解决) 文章目录 前言一、准备工作二、搭建站群1.打包wp-content2.导入新站点3.导出数据库4.修改数据库配…

redis的高可用(主从复制、哨兵、群集)

redis的高可用(主从复制、哨兵、群集) 主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷&…

[Docker] Mac M1系列芯片上完美运行Docker

docker pull qinchz/dm8-arm64 container_name: dm8ports:- "5236:5236"mem_limit: 1gmemswap_limit: 1gvolumes:- /data/dm8:/home/dmdba/data 数据库实例参数已修改,接近oracle使用习惯 #字符集 utf-8 CHARSET1 #VARCHAR 类型对象的长度以字符为单位 …

vmware虚拟机内存异常占用问题一例

关键词 vmware esxi、hypervisor虚拟化平台内存模式 Guest virtual memory 一、问题现象 业务一台vmware虚拟机出现内存使用率告警,运维人员登录系统检查内存确实高水位状态 检查各进程使用内存不高,合计内存总数与使用率占用情况明显不匹配&#xf…

将dumpbin从Visual Studio中抠出来,并使用dumpbin查看exe和dll库的依赖关系

目录 1、初步说明 2、在开发的机器上使用dumpbin工具查看dll库的依赖关系 3、将dumpbin.exe从Visual Studio中抠出来 3.1、找到dumpbin.exe文件及其依赖的dll文件 3.2、在cmd中运行dumpbin,提示找不到link.exe文件 3.3、再次运行dumpbin.exe提示找不到mspdb10…

UV胶水能够粘接聚苯乙烯PS吗?需要注意哪些事项?又有哪些优势呢?

聚苯乙烯(Polystyrene,简称PS)是一种常见的合成聚合物,属于热塑性塑料。它是由苯乙烯单体聚合而成的,具有轻质、透明或半透明、电绝缘性好等特点。常见: 包装材料白色泡沫塑料(EPS,用于包装、保…

排序链表[中等]

一、题目 给你链表的头结点head,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3&…

Python多线程同步

同步条件(Event) 在Python中,多线程同步可以通过threading模块中的Event对象来实现。Event对象允许一个或多个线程等待某个事件的发生,当事件发生时,等待的线程将被唤醒。 event.isSet():返回event的状态值 event.wait()&#x…

项目-新闻头条-数据管理平台-ajax综合案例

愿许秋风知我意&#xff0c;解我心中意难平。 项目介绍 项目准备 推荐使用&#xff0c; 每个程序员都有自己的管理方式。 验证码登录 HTML结构&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><met…

线性回归(Linear Regression)

什么是机器学习 线性回归是一种用于建立变量之间线性关系的统计模型。在简单线性回归中&#xff0c;我们考虑一个自变量和一个因变量的关系&#xff0c;而在多元线性回归中&#xff0c;我们考虑多个自变量和一个因变量之间的关系。 简单线性回归 简单线性回归模型可以表示为…

vue购物车案例、v-model进阶、与后端交互

一 购物车案例 - 结算 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物车结算</title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></scr…

Real Fire Smoke

资产使用高分辨率的动画Spritesheet,并结合了Shuriken粒子系统。具有3种风格的火焰和爆炸。 效果分为7类。 主要特点: - 3种火 - 预制板共计80块 - 5种爆炸声 - 3个循环的火灾声音 - 7张火焰和烟雾的精灵图 - 8x8 帧的 spritesheet,分辨率在 2048 到 8192 像素之间 效果类别…

Spring cloud聚合父工程project

文章目录 本次微服务版本一. 新建父工程project1.1设置字符集utf-81.2注解生效激活1.3. Java8编译版本 二. 父工程 pom.xml 本次微服务版本 一. 新建父工程project 1.1设置字符集utf-8 1.2注解生效激活 1.3. Java8编译版本 二. 父工程 pom.xml <?xml version"1.0&quo…

【深度学习每日小知识】Logistic Loss 逻辑回归:损失和正则化

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

漫谈与人类智能相关数学知识的不足之处

客观地说&#xff0c;没有数学就没有当前的大语言模型、多模态大模型&#xff0c;甚至压根就没有人工智能。对人工智能而言&#xff0c;数学就是“天”&#xff01;但是&#xff0c;对于人类智能而言&#xff0c;数学虽然起到了很重要的作用&#xff0c;同样也起到了阻碍作用&a…

Application为啥不能作为Dialog的context?

大家好&#xff0c;相信大家在使用Dialog时&#xff0c;都有一个非常基本的认知&#xff1a;就是Dialog的context只能是Activity&#xff0c;而不能是Application&#xff0c;不然会导致弹窗崩溃&#xff1a; 这个Exception几乎属于是每个Android开发初学者都会碰到的&#xff…

FFmpeg获取音视频流信息

文章目录 前言一、需求二、源码三、运行结果 前言 本文记录用 FFmpeg 获取视频流音频流的信息&#xff08;编码格式、分辨率、帧率、播放时长…&#xff09;&#xff0c;所用的工程基于上个博客编译成功的工程&#xff1a;使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c 一、需求…

扩展边界opencv

扩展图像的边缘&#xff08;如上边增加50像素&#xff09;通常是通过添加额外的像素行来实现的 使用cv2.copyMakeBorder函数 valueborder_color指定了边框的颜色 import cv2 import numpy as np# 读取图像 image cv2.imread(th.jpg)# 设置边框宽度 top_border_width 50 # …

序列模型(4)—— Scaling Laws

本文介绍 LLM 训练过程中重要的 Scaling Laws&#xff0c;这是一个经验规律&#xff0c;指出了固定训练成本&#xff08;总计算量FLOPs&#xff09; C C C 时&#xff0c;如何调配模型规模&#xff08;参数量&#xff09; N N N 和训练 Token 数据量 D D D&#xff0c;才能实现…

【Emgu.CV教程】4.3、无缝融合应用之SeamlessClone()

SeamlessClone()函数才是真正的无缝克隆&#xff0c;它可以将一张小一点的图片&#xff0c;复制到另一张大一点的图片中&#xff0c;并且复制的位置可以用户自己定义&#xff0c;先看一下它的函数介绍&#xff1a; public static void SeamlessClone(IInputArray src, // 输入…
最新文章