Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一张图的一百种 “活” 法 | MMClassification 数据增强介绍第二弹

一张图的一百种 “活” 法 | MMClassification 数据增强介绍第二弹

作者头像
OpenMMLab 官方账号
发布于 2022-01-18 01:18:46
发布于 2022-01-18 01:18:46
1.1K00
代码可运行
举报
文章被收录于专栏:OpenMMLabOpenMMLab
运行总次数:0
代码可运行

上一篇中,我们介绍了包括随机翻转、裁剪等在内的一系列基础数据增强手段——

(点击图片跳转)

而在本篇中,我们将会介绍一些较为进阶的组合增强手段和图像混合增强

本文内容

组合数据增强

▷ AutoAugment

▷ RandAugment

图像混合增强

▷ Mixup

▷ CutMix

▷ 在 MMClassification 中的应用

1. 组合数据增强

既然数据增强手段能够提高模型的泛化能力,那么我们自然希望通过一系列数据增强的组合获得最优的泛化效果,从而衍生出了一系列组合增强手段,这里我们介绍其中最著名也最常用的两个手段,AutoAugment 和 RandAugment。

AutoAugment

原论文:AutoAugment: Learning Augmentation Policies from Data

链接:

https://arxiv.org/abs/1805.09501

在 AutoAugment 提出以前,深度学习的研究重点往往是网络结构的优化,连续多年的主流数据增强手段还是随机裁剪缩放(RandomResizedCrop)、随机翻转(RandomFlip),以及渐渐淡出视野的随机光照变换(Lighting)。毕竟数据变换的组合、参数多种多样,而且还会和具体的数据集有关,选择一组合适的数据增强组合的确是一件苦力活。

AutoAugment 提出了一个具有较强可操作性的数据增强组合搜索方法。

1.使用一个 RNN 网络对数据增强空间进行采样,也就是选择一组数据增强策略和相应的参数。每组方法包含 5 个子策略组,每个子策略组包含连续的两个数据增强方法。

2. 使用这一组数据增强策略训练某一个固定结构的神经网络,进而得到其对训练精度的增益。

3. 将该增益作为强化学习的 reward,从而使用 Proximal Policy Optimization(PPO)强化学习算法对用于采样的 RNN 神经网络进行优化。

4. 学习完成后,选择效果最好的 5 组策略,共计 25 个子策略组,综合而成最后的数据增强手段。

在实际使用时,对每张图片,都会随机应用这 25 个子策略组中的一组子策略进行处理。

那么问题来了,这些子策略应该如何获得呢?MMClassification 中提供了针对 ImageNet 数据集的 AutoAugment 策略;对于其他数据集,可以参照原论文训练学习新的策略,也可以直接使用 ImageNet 数据集的策略,后文中也会提到其他的替代方案。

如果在使用 MMClassification 进行训练时需要使用 ImageNet 的 AutoAugment 策略,可在配置文件中使用以下写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 该基配置文件位于 configs/_base_/datasets/pipelines
# 假设本配置文件位于 configs/_base_/datasets,可使用以下相对路径
_base_ = ['./pipelines/auto_aug.py']

train_pipeline = [
    ...
    # 使用 {{_base_.xxx}} 的写法,可以调用基配置文件中的变量
    dict(type='AutoAugment', policies={{_base_.policy_imagenet}}),
    ...
]

这里我们提供了一个小 demo 脚本来演示效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import mmcv
from mmcls.datasets import PIPELINES

# 示例策略,包含两个子策略组,每个子策略组包含两个数据增强方法
# 为了便于演示,我们设所有的概率都为 1.0
demo_policies = [
    [
        dict(type='Posterize', bits=4, prob=1.),  # 降低图片位数
        dict(type='Rotate', angle=30., prob=1.)   # 旋转
    ],
    [
        dict(type='Solarize', thr=256 / 9 * 4, prob=1.),  # 翻转部分暗色像素
        dict(type='AutoContrast', prob=1.)                # 自动调整对比度
    ],
]
# 数据增强配置,利用 Registry 机制创建数据增强对象
aug_cfg = dict(
    type='AutoAugment',
    policies=demo_policies,
    hparams=dict(pad_val=0),  # 设定一些所有子策略共用的参数,如填充值(pad_val)
)
aug = PIPELINES.build(aug_cfg)

img = mmcv.imread("./kittens.jpg")
# 为了便于信息在预处理函数之间传递,数据增强项的输入和输出都是字典
img_info = {'img': img}
img_aug = aug(img_info)['img']

mmcv.imshow(img_aug)

关于配置选项更具体的说明,可以阅读 MMClassficiation 的 官方文档。

官方文档链接: https://mmclassification.readthedocs.io/zh_CN/latest/api.html#mmcls.datasets.pipelines.AutoAugment

RandAugment

原论文:RandAugment: Practical automated data augmentation with a reduced search space

论文链接:

https://arxiv.org/abs/1909.13719

AutoAugment 将强化学习引入到了数据增强策略的设定中,但是这也意味着针对一个新的数据集学习一套新的数据增强策略会十分复杂且消耗计算资源。

另一方面,为了节约计算资源,大家一般会选择一个训练集子集或者一个小模型来进行数据增强策略的学习。但研究表明,将小数据集 / 小模型上学习到的增强策略应用于完整的任务往往无法获得最优的效果。

为了解决这些问题,研究人员们提出了 RandAugment 这一方法。该方法尽可能地缩减了需要学习的参数, AutoAugment 的每组策略包含5个子策略组,共计10个策略,每个策略又包含幅度和概率两个参数,而 RandAugment 将所有的策略幅度统一为一个值,概率统一设定为平均,因而可以调整的参数只有幅度和每次应用的增强项数这两个变量。

这样一来,不需要应用复杂的强化学习,只需要简单的网格搜索就可以获得针对特定数据集和网络最优的数据增强策略。

具体而言, RandAugment 设置了一个包含各种数据增强变换的集合,对每张图片,随机应用 K 个数据增强变换,每个变换的幅度都是预先设定的幅度(或者在预设幅度的基础上添加一个随机浮动)。

在 MMClassification 中,我们同样提供了这个数据增强变换集合,使用时可在配置文件中使用以下写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 该基配置文件位于 configs/_base_/datasets/pipelines
# 假设本配置文件位于 configs/_base_/datasets,可使用以下相对路径
_base_ = ['./pipelines/rand_aug.py']

train_pipeline = [
    ...
    # 使用 {{_base_.xxx}} 的写法,可以调用基配置文件中的变量
    dict(
        type='RandAugment',
        policies={{_base_.rand_increasing_policies}},
        num_policies=2,     # 每次随机应用的数据增强变换数
        total_level=10,     # 最大变换幅度 10
        magnitude_level=9,  # 每个数据增强变换的幅度
        magnitude_std=0.5,  # 每次变换时,幅度随机浮动的方差
        ),
    ...
]

同样的,这里我们也提供了一个小 demo 脚本来演示效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import mmcv
from mmcls.datasets import PIPELINES

# 示例策略,包含三个数据增强方法
demo_policies = [
    dict(type='Invert'),
    dict(type='Rotate', magnitude_key='angle', magnitude_range=(0, 30)),
    dict(type='Shear',
         magnitude_key='magnitude',
         magnitude_range=(0, 0.3),
         direction='horizontal'),
]
# 数据增强配置,利用 Registry 机制创建数据增强对象
aug_cfg = dict(
    type='RandAugment',
    policies=demo_policies,
    num_policies=2,     # 每次随机应用的数据增强变换数
    total_level=10,     # 最大变换幅度 10
    magnitude_level=9,  # 每个数据增强变换的幅度
    magnitude_std=0.5,  # 每次变换时,幅度随机浮动的方差
    hparams=dict(pad_val=0),  # 设定一些所有子策略共用的参数,如填充值(pad_val)
)
aug = PIPELINES.build(aug_cfg)

img = mmcv.imread("./kittens.jpg")
# 为了便于信息在预处理函数之间传递,数据增强项的输入和输出都是字典
img_info = {'img': img}
img_aug = aug(img_info)['img']

mmcv.imshow(img_aug)

2. 图像混合增强

以上,我们介绍的数据增强方法都是针对单张图片进行的变换,而在最近的研究中,使用复数张图片进行混合的增强手段也有着广泛的应用。

这里我们介绍最常用的两种方法,Mixup 和 CutMix。

Mixup

原论文:mixup: Beyond Empirical Risk Minimization

论文链接:

https://arxiv.org/abs/1710.09412

在监督学习任务中,我们通常可以假设样本为随机变量 X,标签为随机变量 Y,我们希望做的是根据 X-Y 联合分布,优化出一个最佳的 f(x)。但现实中,我们根本无法获得 X-Y 的联合分布,具体到分类任务,也就是我们无法穷尽像素的组合与标签之间的关系,因而只能用一系列样本来拟合这一联合分布。

Mixup 这一增强手段的目的,也即在于优化 “用样本拟合联合分布” 这一步。它采用了一个十分简单的操作,将两张图片直接进行线性组合,对应的,标签也进行线性组合。其中,叠加在背景图片上的图片强度按照 Beta(a,a)分布随机采样获得,a 为超参数。

CutMix

原论文:CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features

链接:

https://arxiv.org/abs/1905.04899?context=cs.CV

CutMix 和 Mixup 的思路一致,其目的都是为了优化“用样本拟合联合分布”的方法。但 CutMix 的作者认为,简单地将两张图片叠加是不自然的,对于分类任务虽然有一定的效果提升,但对检测等下游任务,都会导致性能的下降。

CutMix 与 Mixup 的不同之处在于,CutMix 通过裁取一张图片中的部分区域,以类似拼贴画的方式贴到另一张图片上,来实现图片的混合。其中,裁切图片的面积比例按照 Beta(a,a)分布随机采样获得,a 为超参数。

在 MMClassification 中的应用

由于图像混合增强不同于其他的对单张图片作用的数据增强手段,其通常需要两张图片,因而使用方法也不同于其他增强方式在 pipeline 中配置的方式,而是在 model 的 train_cfg 中配置,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = dict(
    ...
    # alpha 为 Mixup 和 CutMix 中的超参数,与图片随机叠加的强度或随机裁剪的面积相关
    # prob 表示对一个 batch 的图像,采用对应增强方法的概率,总和不能超过 1.0
    train_cfg=dict(augments=[
        dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5),
        dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5)
    ]))

同样地,我们提供了一份 demo 脚本来展示效果(由于混合对象是随机选取的,可能出现图像自混合,从而没有效果的现象,可重复尝试):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import numpy as np
import mmcv
from mmcls.models.utils import Augments

img1 = mmcv.imresize(mmcv.imread("./kittens.jpg"), (224, 224))
img2 = mmcv.imresize(mmcv.imread("./house.jpg"), (224, 224))

imgs = [torch.from_numpy(img.transpose(2, 0, 1)) for img in (img1, img2)]
img_batch = torch.stack(imgs)
labels = torch.tensor([0, 1])

# ---- Mixup ----
mixup_cfg = dict(type='BatchMixup', alpha=0.8, num_classes=2, prob=1.0)
mixup = Augments([mixup_cfg])
img_batch_aug, label_batch_aug = mixup(img_batch, labels)
img1_aug = img_batch_aug[0].numpy().transpose(1, 2, 0).astype('uint8')
img2_aug = img_batch_aug[1].numpy().transpose(1, 2, 0).astype('uint8')
mmcv.imshow(img1_aug, win_name=f'mixup-{label_batch_aug[0]}')
mmcv.imshow(img2_aug, win_name=f'mixup-{label_batch_aug[1]}')

# ---- CutMix ----
cutmix_cfg = dict(type='BatchCutMix', alpha=1.0, num_classes=2, prob=1.0)
cutmix = Augments([cutmix_cfg])
img_batch_aug, label_batch_aug = cutmix(img_batch, labels)
img1_aug = img_batch_aug[0].numpy().transpose(1, 2, 0).astype('uint8')
img2_aug = img_batch_aug[1].numpy().transpose(1, 2, 0).astype('uint8')
mmcv.imshow(img1_aug, win_name=f'cutmix-{label_batch_aug[0]}')
mmcv.imshow(img2_aug, win_name=f'cutmix-{label_batch_aug[1]}')

在接下来的文章中,我们将会以一个当前流行的数据增强流程为例,详细介绍其使用方法,敬请期待~

向上滑动查看参考文献

[1] MMClassification: OpenMMLab's Image Classification Toolbox and Benchmark

[2] AutoAugment: Learning Augmentation Policies from Data

[3] RandAugment: Practical automated data augmentation with a reduced search space

[4] mixup: Beyond Empirical Risk Minimization

[5] CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features

[4] Free photo on Pixabay

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenMMLab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MMClassificiation|实现数据增强的 N 种方法
众所周知,即使是目前最先进的神经网络模型,其本质上也是在利用一系列线性和非线性的函数去拟合目标输出。
OpenMMLab 官方账号
2022/01/18
2.5K0
MMClassificiation|实现数据增强的 N 种方法
ResNet 高精度预训练模型在 MMDetection 中的最佳实践
ResNet 高精度预训练 + Faster R-CNN,性能最高能提升 3.4 mAP!
OpenMMLab 官方账号
2022/05/25
3.3K1
ResNet 高精度预训练模型在 MMDetection 中的最佳实践
计算机视觉的数据增广技术大盘点!附涨点神器,已开源!
如果要把深度学习开发过程中几个环节按重要程度排个序的话,相信准备训练数据肯定能排在前几位。要知道一个模型网络被编写出来后,也只是一坨代码而已,和智能基本不沾边,它只有通过学习大量的数据,才能学会如何作推理。因此训练数据其实和一样东西非常像!——武侠小说中的神功秘笈,学之前菜鸟一只,学之后一统江湖!
深度学习技术前沿公众号博主
2020/09/11
1.3K0
计算机视觉的数据增广技术大盘点!附涨点神器,已开源!
深度学习应用篇-计算机视觉-图像增广1:数据增广、图像混叠、图像剪裁类变化类等详解
在图像分类任务中,图像数据的增广是一种常用的正则化方法,主要用于增加训练数据集,让数据集尽可能的多样化,使得训练的模型具有更强的泛化能力,常用于数据量不足或者模型参数较多的场景。除了 ImageNet 分类任务标准数据增广方法外,还有8种数据增广方式非常常用,这里对其进行简单的介绍和对比,大家也可以将这些增广方法应用到自己的任务中,以获得模型精度的提升。这8种数据增广方式在ImageNet上的精度指标如 图1 所示。
汀丶人工智能
2023/06/03
6300
深度学习应用篇-计算机视觉-图像增广1:数据增广、图像混叠、图像剪裁类变化类等详解
更多模型,更强功能,快来开箱新一代图像分类开源框架
MMClassification 是 OpenMMLab 生态面向图像分类的开源算法库,主要了涵盖了计算机视觉领域丰富的基础模型架构。
OpenMMLab 官方账号
2022/12/30
6670
更多模型,更强功能,快来开箱新一代图像分类开源框架
深度学习中的数据增强技术:Augmentation
数据增强(Data Augmentation)是一种通过利用算法来扩展训练数据的技术。人工智能三要素之一为数据,但获取大量数据成本高,但数据又是提高模型精度和泛化效果的重要因素。当数据量不足时,模型很容易过拟合,精度也无法继续提升,因此数据增强技术应运而生:利用算法,自动增强训练数据。
用户7164815
2020/04/08
4.9K0
【金猿技术展】模块注册机制——打造AI算法流水线
模块注册机制基于注册器和构建器,可以轻松地进行模块拓展,而不需要在原有框架代码中进行改动。使用注册器管理字符串到类的映射,其中支持注册的模块类型包括但不限于模型结构、数据预处理模块、优化器。使用构建器可以将配置文件转换成对应的模块,其提供了灵活的构建方式,使得可以构建定制化的训练流水线。模块注册机制的另一特性是采用分层策略划分模块的注册域,不仅能够避免跨项目间同名模块的冲突,也能够支持跨项目间模块的相互调用。
数据猿
2021/12/28
4110
【金猿技术展】模块注册机制——打造AI算法流水线
yolo-world 源码解析(四)
For pre-training YOLO-World, we adopt several datasets as listed in the below table:
ApacheCN_飞龙
2024/03/09
4200
谷歌大脑开源「数据增强」新招数:ImageNet准确率达85%,大神Quoc Le出品
玩深度学习的人都知道,AI算法大部分是数据驱动。数据的质量一定程度上决定了模型的好坏。
量子位
2019/11/22
6600
谷歌大脑开源「数据增强」新招数:ImageNet准确率达85%,大神Quoc Le出品
2D和3D数据增强方法和Python代码
在前面的文章里我们讲过,机器学习和深度学习在训练过程中,训练误差不断下降,但测试误差下降到一定程度后就会停止或者上升,出现过拟合现象,解决过拟合问题主要有2个方法,其中一个是正则化(机器学习和深度学习中的正则化方法),另一个方法就是数据增强了。
Minerva
2020/05/26
4.5K0
【技术综述】深度学习中的数据增强方法都有哪些?
数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。
用户1508658
2019/07/25
1.6K0
【技术综述】深度学习中的数据增强方法都有哪些?
dataframe分割数据_语篇语义框架研究
\qquad mmSegmentation是openmmlab项目下开源的图像语义分割框架,目前支持pytorch,由于其拥有pipeline加速,完善的数据增强体系,完善的模型库,作为大数据语义分割训练及测试的代码框架是再好不过了。 \qquad 在开始本教程之前,你需要解决openmmlab的环境配置问题,好在这个repo上已经有很人性化的步骤讲解了,在此附上链接,就不赘述了:
全栈程序员站长
2022/09/25
3980
dataframe分割数据_语篇语义框架研究
MMsegmentation教程1:学习配置文件
我们整合了模块和继承设计到我们的配置里,这便于做很多实验。如果您想查看配置文件,您可以运行 python tools/print_config.py /PATH/TO/CONFIG 去查看完整的配置文件。您还可以传递参数 --cfg-options xxx.yyy=zzz 去查看更新的配置。
致Great
2022/03/04
2.8K0
学界 | 谷歌大脑提出自动数据增强方法AutoAugment:可迁移至不同数据集
选自arXiv 作者:Ekin D. Cubuk 等 机器之心编译 参与:Geek AI、路 近日,来自谷歌大脑的研究者在 arXiv 上发表论文,提出一种自动搜索合适数据增强策略的方法 AutoAugment,该方法创建一个数据增强策略的搜索空间,利用搜索算法选取适合特定数据集的数据增强策略。此外,从一个数据集中学到的策略能够很好地迁移到其它相似的数据集上。 引言 深度神经网络是强大的机器学习系统,当使用海量数据训练时,深度神经网络往往能很好地工作。数据增强是一种通过随机「增广」来提高数据量和数据多样性的
机器之心
2018/06/08
1.1K3
超级干货 | 用万字文章总结25种正则化方法(值得收藏)
卷积神经网络已经在一些与计算机视觉相关的任务上取得了相当不错的结果,如图像分类和目标检测。这种成功可以用卷积神经元的工作原理来解释:它根据图像的空间属性来突出给定的特征。浅层网络注意是归纳一些形状或者纹理特征;然而,更深层次的网络可以检测出更复杂更抽象的特征,比如整个物体或人脸。如今,从生物识别到疾病检测,很难找到其他没有CNN的计算机视觉技术。
集智书童公众号
2022/04/07
4.7K0
超级干货 | 用万字文章总结25种正则化方法(值得收藏)
【AutoML】如何选择最合适的数据增强操作
大家好,欢迎来到专栏《AutoML》。在这个专栏中,我们会讲述AutoML技术在深度学习中的应用。这一期讲述在数据增强中的应用,这也是AutoML技术最早期的应用之一。
用户1508658
2019/09/18
8330
【AutoML】如何选择最合适的数据增强操作
【MMDetection 超全专栏】二,配置类和注册器&数据处理&训练pipline
配置方式支持python/json/yaml,从mmcv的Config解析,其功能同maskrcnn-benchmark的yacs类似,将字典的取值方式属性化.这里贴部分代码,以供学习。
BBuf
2020/06/04
2.5K0
【技术综述】深度学习中的数据增强(下)
今天带来深度学习中的数据增强方法的下篇。我们将从以下几个方向入手。1,介绍一下什么是无监督的数据增强方法。2,简单介绍一下GAN生成数据的应用。3,介绍一下AutoAugment为代表的网络自动学习数据增强策略的方法。4,总结。
用户1508658
2019/07/25
5070
【技术综述】深度学习中的数据增强(下)
Imgaug之导入和增强图像
在机器视觉领域,想将深度学习应用于实际工程项目,并最终落地,会遇到很多问题:光照、遮挡等。而采集到的数据通常难以满足各种现实环境,需要进行数据增强操作。 imgaug是一个基于OpenCV的更高级的API,包含很多集成好的图像增强的方法。
狼啸风云
2021/03/16
2.1K0
Imgaug之导入和增强图像
yolo-world 源码解析(一)
ApacheCN_飞龙
2024/03/09
6250
推荐阅读
相关推荐
MMClassificiation|实现数据增强的 N 种方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验