深度学习应用篇-计算机视觉-图像增广[1]:数据增广、图像混叠、图像剪裁类变化类等详解

news2024/11/24 8:34:37

在这里插入图片描述
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

在这里插入图片描述
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

本专栏主要方便入门同学快速掌握相关知识。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

专栏订阅:

  • 深度学习入门到进阶专栏
  • 深度学习应用项目实战篇

深度学习应用篇-计算机视觉-图像增广[1]:数据增广、图像混叠、图像剪裁类变化类等详解

一、数据增广

在图像分类任务中,图像数据的增广是一种常用的正则化方法,主要用于增加训练数据集,让数据集尽可能的多样化,使得训练的模型具有更强的泛化能力,常用于数据量不足或者模型参数较多的场景。除了 ImageNet 分类任务标准数据增广方法外,还有8种数据增广方式非常常用,这里对其进行简单的介绍和对比,大家也可以将这些增广方法应用到自己的任务中,以获得模型精度的提升。这8种数据增广方式在ImageNet上的精度指标如 图1 所示。

图1 8种数据增广方法

二、常用数据增广方法

注:如果没有特殊说明,本章节中所有示例为 ImageNet 分类,并且假设最终输入网络的数据维为:[batch-size, 3, 224, 224]

在ImageNet 分类任务中,训练阶段的标准数据增广方法为以下几步:

  1. 图像解码:简写为 ImageDecode
  2. 随机裁剪到长宽均为 224 的图像:简写为 RandCrop
  3. 水平方向随机翻转:简写为 RandFlip
  4. 图像数据的归一化:简写为 Normalize
  5. 图像数据的重排,[224, 224, 3] 变为 [3, 224, 224]:简写为 Transpose
  6. 多幅图像数据组成 batch 数据,如 batch-size[3, 224, 224] 的图像数据拼组成 [batch-size, 3, 224, 224]:简写为 Batch

相比于上述标准的图像增广方法,研究者也提出了很多改进的图像增广策略,这些策略均是在标准增广方法的不同阶段插入一定的操作,基于这些策略操作所处的不同阶段,我们将其分为了三类:

  1. RandCrop (上述的阶段2)后的 224 的图像进行一些变换: AutoAugment,RandAugment
  2. Transpose (上述的阶段5)后的 224 的图像进行一些裁剪: CutOut,RandErasing,HideAndSeek,GridMask
  3. Batch(上述的阶段6) 后的数据进行混合: Mixup,Cutmix

增广后的可视化效果如 图2 所示。

图2 数据增广后可视化

下文将介绍这些策略的原理与使用方法,其中,每种数据增广策略的参考论文与参考开源代码均在下面的介绍中列出。

图3 为测试图像,第三节将基于测试图像进行变换,并将变换后的效果进行可视化。

由于RandCrop是随机裁剪,变换前后的图像内容可能会有一定的差别,无法直观地对比变换前后的图像。因此,本节将 RandCrop 替换为 Resize

图3 测试图像

三、图像变换类

图像变换类指的是对 RandCrop 后的224 的图像进行一些变换,主要包括:

  • AutoAugment[1]
  • RandAugment[2]

3.1 AutoAugment

论文地址:https://arxiv.org/abs/1805.09501v1

开源代码github地址:https://github.com/DeepVoltaire/AutoAugment

不同于常规的人工设计图像增广方式,AutoAugment 是在一系列图像增广子策略的搜索空间中通过搜索算法找到的适合特定数据集的图像增广方案。针对 ImageNet 数据集,最终搜索出来的数据增广方案包含 25 个子策略组合,每个子策略中都包含两种变换,针对每幅图像都随机的挑选一个子策略组合,然后以一定的概率来决定是否执行子策略中的每种变换。

结果如 图4 所示。

图4 AutoAugment后图像可视化

3.2 RandAugment

论文地址:https://arxiv.org/pdf/1909.13719.pdf

开源代码github地址:https://github.com/heartInsert/randaugment

AutoAugment 的搜索方法比较暴力,直接在数据集上搜索针对该数据集的最优策略,其计算量很大。在 RandAugment 文章中作者发现,一方面,针对越大的模型,越大的数据集,使用 AutoAugment 方式搜索到的增广方式产生的收益也就越小;另一方面,这种搜索出的最优策略是针对该数据集的,其迁移能力较差,并不太适合迁移到其他数据集上。

RandAugment 中,作者提出了一种随机增广的方式,不再像 AutoAugment 中那样使用特定的概率确定是否使用某种子策略,而是所有的子策略都会以同样的概率被选择到,论文中的实验也表明这种数据增广方式即使在大模型的训练中也具有很好的效果。

结果如 图5 所示。

图5 RandAugment后图像可视化

四、图像裁剪类

图像裁剪类主要是对Transpose 后的 224 的图像进行一些裁剪,并将裁剪区域的像素值置为特定的常数(默认为0),主要包括:

  • CutOut[3]
  • RandErasing[4]
  • HideAndSeek[5]
  • GridMask[6]

图像裁剪的这些增广并非一定要放在归一化之后,也有不少实现是放在归一化之前的,也就是直接对 uint8 的图像进行操作,两种方式的差别是:如果直接对 uint8 的图像进行操作,那么再经过归一化之后被裁剪的区域将不再是纯黑或纯白(减均值除方差之后像素值不为0)。而对归一后之后的数据进行操作,裁剪的区域会是纯黑或纯白。

上述的裁剪变换思路是相同的,都是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,不同的是他们的裁剪方式、区域不太一样。

4.1 Cutout

论文地址:https://arxiv.org/abs/1708.04552

开源代码github地址:https://github.com/uoguelph-mlrg/Cutout

Cutout 可以理解为 Dropout 的一种扩展操作,不同的是 Dropout 是对图像经过网络后生成的特征进行遮挡,而 Cutout 是直接对输入的图像进行遮挡,相对于Dropout,Cutout 对噪声的鲁棒性更好。作者在论文中也进行了说明,这样做法有以下两点优势:(1) 通过 Cutout 可以模拟真实场景中主体被部分遮挡时的分类场景;(2) 可以促进模型充分利用图像中更多的内容来进行分类,防止网络只关注显著性的图像区域,从而发生过拟合。

结果如 图6 所示。

图6 Cutout后图像可视化

4.2 RandomErasing

论文地址:https://arxiv.org/pdf/1708.04896.pdf

开源代码github地址:https://github.com/zhunzhong07/Random-Erasing

RandomErasingCutout 方法类似,同样是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,作者在论文中也指出,随机裁剪的方式与随机水平翻转具有一定的互补性。作者也在行人再识别(REID)上验证了该方法的有效性。与Cutout不同的是,在RandomErasing中,图片以一定的概率接受该种预处理方法,生成掩码的尺寸大小与长宽比也是根据预设的超参数随机生成。

结果如 图7 所示。

图7 RandomErasing后图像可视化

4.3 HideAndSeek

论文地址:https://arxiv.org/pdf/1811.02545.pdf

开源代码github地址:https://github.com/kkanshul/Hide-and-Seek

HideAndSeek论文将图像分为若干块区域(patch),对于每块区域,都以一定的概率生成掩码,不同区域的掩码含义如 图8 所示。

图8 HideAndSeek分块掩码图

结果如 图9 所示。

图9 HideAndSeek后图像可视化

4.4 GridMask

论文地址:https://arxiv.org/abs/2001.04086

开源代码github地址:https://github.com/akuxcw/GridMask

作者在论文中指出,此前存在的基于对图像 crop 的方法存在两个问题,如 图10 所示:

  1. 过度删除区域可能造成目标主体大部分甚至全部被删除,或者导致上下文信息的丢失,导致增广后的数据成为噪声数据;

  2. 保留过多的区域,对目标主体及上下文基本产生不了什么影响,失去增广的意义。

图10 增广后的噪声数据

因此如果避免过度删除或过度保留成为需要解决的核心问题。

GridMask是通过生成一个与原图分辨率相同的掩码,并将掩码进行随机翻转,与原图相乘,从而得到增广后的图像,通过超参数控制生成的掩码网格的大小。

在训练过程中,有两种以下使用方法:

  1. 设置一个概率p,从训练开始就对图片以概率p使用GridMask进行增广。
  2. 一开始设置增广概率为0,随着迭代轮数增加,对训练图片进行GridMask增广的概率逐渐增大,最后变为p。

论文中验证上述第二种方法的训练效果更好一些。

结果如 图11 所示。

图11 GridMask后图像可视化

五、图像混叠

图像混叠主要对 Batch 后的数据进行混合,包括:

  • Mixup[7]
  • Cutmix[8]

前文所述的图像变换与图像裁剪都是针对单幅图像进行的操作,而图像混叠是对两幅图像进行融合,生成一幅图像,两种方法的主要区别为混叠的方式不太一样。

5.1 Mixup

论文地址:https://arxiv.org/pdf/1710.09412.pdf

开源代码github地址:https://github.com/facebookresearch/mixup-cifar10

Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实现,不仅在图像分类上,在目标检测上也取得了不错的效果。为了便于实现,通常只对一个 batch 内的数据进行混叠,在 Cutmix 中也是如此。

如下是 imaug 中的实现,需要指出的是,下述实现会出现对同一幅进行相加的情况,也就是最终得到的图和原图一样,随着 batch-size 的增加这种情况出现的概率也会逐渐减小。

结果如 图12 所示。

图12 Mixup后图像可视化

5.2 Cutmix

论文地址:https://arxiv.org/pdf/1905.04899v2.pdf

开源代码github地址:https://github.com/clovaai/CutMix-PyTorch

Mixup 直接对两幅图进行相加不一样,Cutmix 是从一幅图中随机裁剪出一个 ROI,然后覆盖当前图像中对应的区域。

结果如 图13 所示。

图13 Cutmix后图像可视化

六、实验

基于PaddleClas套件,使用上述几种数据增广方法在ImageNet1k数据集上进行了实验测试,每个方法的分类精度如下。

模型初始学习率策略l2 decaybatch sizeepoch数据变化策略Top1 Acc论文中结论
ResNet500.1/cosine_decay0.0001256300标准变换0.7731-
ResNet500.1/cosine_decay0.0001256300AutoAugment0.77950.7763
ResNet500.1/cosine_decay0.0001256300mixup0.78280.7790
ResNet500.1/cosine_decay0.0001256300cutmix0.78390.7860
ResNet500.1/cosine_decay0.0001256300cutout0.7801-
ResNet500.1/cosine_decay0.0001256300gridmask0.77850.7790
ResNet500.1/cosine_decay0.0001256300random-augment0.77700.7760
ResNet500.1/cosine_decay0.0001256300random erasing0.7791-
ResNet500.1/cosine_decay0.0001256300hide and seek0.77430.7720

注意

  • 在实验中,为了便于对比,将l2 decay固定设置为1e-4,在实际使用中,推荐尝试使用更小的l2 decay。结合数据增广,发现将l2 decay由1e-4减小为7e-5均能带来至少0.3~0.5%的精度提升。

  • 在使用数据增广后,由于训练数据更难,所以训练损失函数可能较大,训练集的准确率相对较低,但其拥有更好的泛化能力,所以验证集的准确率相对较高。

  • 在使用数据增广后,模型可能会趋于欠拟合状态,建议可以适当的调小l2_decay的值来获得更高的验证集准确率。

七、测试增强

在网络训练过程中,数据增强是提升模型能力的有效方式,目前在图像分割、分类和检测场景中都取得了不错的模型训练效果。

数据增强同样也可以应用于测试阶段,将原始的图像进行各种形式的变换得到多张图片,比如图像翻转,图像旋转,图像拉伸等操作,然后对这些图片分别进行推理,再对这多个结果进行综合分析以确定最终结果,这便是测试时增强( Test-Time-Augmentation,TTA)。

7.1. 测试时增强的原因

如果只对图像做一种增强时,采用的变换有可能会使图像的关键信息丢失,从而导致后续任务得不到正确的结果。

7.2. 测试时增强的作用

通过分析多项数据增强的图像,然后综合分析,有可能会平滑掉某一种变换导致的关键信息丢失现象带来的损失,从而提升预测的准确率。

参考文献

[1] Autoaugment: Learning augmentation strategies from data

[2] Randaugment: Practical automated data augmentation with a reduced search space

[3] Improved regularization of convolutional neural networks with cutout

[4] Random erasing data augmentation

[5] Hide-and-seek: Forcing a network to be meticulous for weakly-supervised object and action localization

[6] GridMask Data Augmentation

[7] mixup: Beyond empirical risk minimization

[8] Cutmix: Regularization strategy to train strong classifiers with localizable features)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于VGG16实现宝石图像分类任务(acc 84%)--paddle paddle

作业:补充网络定义部分,使用卷积神经网络实现宝石分类 要求:1.补充完成CNN的网络结构定义方法实现宝石识别 2.可尝试不同网络结构、参数等力求达到更好的效果 卷积神经网络 卷积神经网络是提取图像特征的经典网络,其结构一般包…

【hello C++】类和对象(下)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象…

Spring Boot项目使用 jasypt 加密组件进行加密(例如:数据库、服务的Key、等等进行加密)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

【018】C++的指针数组和数组指针

C 指针数组和数组指针 引言一、指针数组1.1、数值的指针数组1.2、字符的指针数组1.3、二维字符数组 二、指针的指针三、数组指针3.1、数组首元素地址和数组首地址3.2、数组指针的使用示例3.3、二维数组和数组指针的关系 四、多维数组的物理存储总结 引言 💡 作者简介…

从0实现基于Alpha zero的中国象棋AI(会分为多个博客,此处讲解蒙特卡洛树搜索)

从0实现基于Alpha zero的中国象棋AI 0.0、前言 ​ 题主对于阿尔法狗的实现原理好奇,加上毕业在即,因此选择中国象棋版的阿尔法zero,阿尔法zero是阿尔法狗的升级版。在完成代码编写的历程中,深刻感受到深度学习环境的恶劣&#x…

零门槛快速创业:GPT和AI工具的秘密武器

在不到一周的时间里,David创建了一个按需印刷的Etsy商店,该商店具有引人注目的标识和大量独特的文字和艺术。 我最近花了大约一周的时间来建立Etsy店面。在本文中,我将向你展示我如何(可能更有趣的是,在哪里&#xff…

YOLOv5:TensorRT加速YOLOv5模型推理

YOLOv5:TensorRT加速YOLOv5模型推理 前言前提条件相关介绍TensorRT加速YOLOv5模型推理YOLOv5项目官方源地址将训练好的YOLOv5模型权重转换成TensorRT引擎YOLOv5 best.pt推理测试TensorRT Engine推理测试小结 参考 前言 由于本人水平有限,难免出现错漏&am…

笔试强训8

作者:爱塔居 专栏:笔试强训 作者简介:大三学生,希望和大家一起进步 day13 一. 单选 1.下列关于视图的说法错误的是: A 视图是从一个或多个基本表导出的表,它是虚表B 视图一经定义就可以和基本表一样被查询…

Python遍历网格中每个点

遍历网格中每个点 1. 问题描述2. Python实现2.1 网格参数初始化2.2 遍历赋值2.3 矩阵赋值1. 问题描述 最近需要实现一个对矩阵赋值并对矩阵表示的网格参数进行测试的任务,写了一段代码提供参考。 假设网格的长宽均为 2. Python实现 2.1 网格参数初始化 首先定义好需要划分…

【小呆的力学笔记】非线性有限元的初步认识【三】

文章目录 1.2.2 基于最小势能原理的线性有限元一般格式1.2.2.1 离散化1.2.2.2 位移插值1.2.2.3 单元应变1.2.2.4 单元应力1.2.2.5 单元刚度矩阵1.2.2.6 整体刚度矩阵1.2.2.7 处理约束1.2.2.8 求解节点载荷列阵1.2.2.9 求解位移列阵1.2.2.10 计算应力矩阵等 1.2.2 基于最小势能原…

基于深度学习的高精度推土机检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度推土机检测识别系统可用于日常生活中检测与定位推土机目标,利用深度学习算法可实现图片、视频、摄像头等方式的推土机目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训…

通过location实现几秒后页面跳转

location对象属性 location对象属性 返回值location.href获取或者设置整个URLlocation.host返回主机(域名)www.baidu.comlocation.port 返回端口号,如果未写返回空字符串location.pathname返回路径location.search返回参数location.hash返回…

【SCADA】关于KingSCADA仿真驱动的应用

大家好,我是雷工! 在有些时候我们需要用到虚拟仿真的数据,例如在效果演示时为了有良好的动态效果。在KingSCADA软件中可以通过Simulate驱动作为虚拟设备实现这一功能需求。 下面为大家演示该功能的应用: 一、KingIOServer工程设计…

Go实现跨域Cors中间件

概述 本版本主要实现cors中间件 github 地址:Sgin 欢迎star,将会逐步实现一个go web框架 内容 通过建造者模式创建我们的跨域中间件Cors \ 我们了解到,当使用XMLHttpRequest发送请求时,如果浏览器发现违反了同源策略就会自动加…

StableDiffusion入门教程

目录 介绍模型的后缀ckpt模型&#xff1a;safetensors模型文件夹VAE 模型在哪下载Hugging face:<https://huggingface.co/models>下载SD官方模型文生图模型标签介绍 C站&#xff1a;<https://civitai.com/>筛选模型的类型CheckPoint Type &#xff08;模型的类型&a…

Python学习笔记 - 探索元组Tuple的使用

欢迎各位&#xff0c;我是Mr数据杨&#xff0c;你们的Python导游。今天&#xff0c;我要为大家讲解一段特殊的旅程&#xff0c;它与《三国演义》有关&#xff0c;而我们的主角是元组&#xff08;tuple&#xff09;。 让我们想象这样一个场景&#xff0c;三国演义中的诸葛亮&am…

pandas数据预处理

pandas数据预处理 pandas及其数据结构pandas简介Series数据结构及其创建DataFrame数据结构及其创建 利用pandas导入导出数据导入外部数据导入数据文件 导出外部数据导出数据文件 数据概览及预处理数据概览分析利用DataFrame的常用属性利用DataFrame的常用方法 数据清洗缺失值处…

Cesium教程 (3) 矢量切片mvt-imagery-provider加载

Cesium教程 (3) 矢量切片mvt-imagery-provider加载 目录 0. 矢量切片 1. 开源项目 2. 环境 3. 代码 4. TODO 0. 矢量切片 WMTS&#xff1a;加载最快&#xff0c;图片格式&#xff0c;样式固定&#xff1b; WMS&#xff1a;加载数量大则慢&#xff0c;但可以点击查询等&am…

htmlCSS-----CSS选择器(上)

目录 前言&#xff1a; 1.初级选择器 &#xff08;1&#xff09;ID选择器 &#xff08;2&#xff09;class选择器 &#xff08;3&#xff09;标签选择器 &#xff08;4&#xff09;通配选择器 前言&#xff1a; CSS选择器是CSS页面处理的重要组成部分&#xff0c;前面讲到…

MMPose关键点检测实战

安装教程 https://github.com/TommyZihao/MMPose_Tutorials/blob/main/2023/0524/%E3%80%90A1%E3%80%91%E5%AE%89%E8%A3%85MMPose.ipynb git clone https://github.com/open-mmlab/mmpose.git -b tutorial2023 -b代表切换到某个分支&#xff0c;保证分支和作者的教程一致 ra…