查看原文
其他

基于深度学习的数据增广技术一览

Happy 极市平台 2021-09-19

加入极市专业CV交流群,与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~

Tips

◎作者系极市原创作者计划特约作者Happy欢迎大家联系极市小编(微信ID:fengcall19)加入极市原创作者行列

周末在家无聊,偶然兴心想对CV领域常用的数据增广方法做个简单的调研与总结,重点是AI时代新兴的几种反响还不错的方法、各种第三方与官方实现代码等。那么今天由Happy来跟大家聊一聊深度学习中那些常用的数据增广方法。

在图像分类任务中,数据增广是一种常用的正则化方法,同时已成为提升模型性能所必不可少的步骤。从引领AI热潮的AlexNet到最近EfficientNet都可以看到数据增广的身影。数据增广的方法也由传统的裁剪、旋转、镜像等方式逐渐过渡到当前火热的AutoAug、RandAug等基于NAS搜索的数据增广方法。

以pytorch官方ImageNet训练中代码为例,如下所示。它基本上包含了CV中数据增广的几个比较关键的操作与节点:数据解析、数据尺寸变换、镜像变换、颜色空间变换、ToTensor、归一化等等。

train_dataset = datasets.ImageFolder( traindir, transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4), transforms.ToTensor(), normalize, transforms.RandomErasing() ]))

为更好的对数据增广方法进行介绍说明,我们可以将数据增广方法按照其作用位置、作用方式进行简单的分类如下:

  • 标准数据增广:泛指深度学习前期或更早期的一些常用数据增广方法。
    • 数据IO;包含ToTensor、ToPILImage、PILToTensor等
    • 图像镜像类:包含RandomHorizontalFlip、RandomVerticalFlip、RandomRotation、Transpose等
    • 颜色空间变换:ColoeJitter、Grayscale、
    • 图像裁剪缩放类:Resize、CenterCrop、RandomResizedCrop、TenCrop、FiveCrop等
    • 图像线性变换类:LinearTransform、RandomRotation、RandomPerspective
  • 图像变换类:泛指基于NAS搜索到的一组变换组合,包含AutoAugment、RandAugment、Fast AutoAugment、Faster AutoAugment、Greedy Augment等;
  • 图像裁剪类:泛指深度学习时代提出的一些类似dropout的数据增广方法,包含CutOut、RandErasing、HideAndSeek、GridMask等;
  • 图像混叠类:泛指在batch层面进行的操作,包含Mixup、Cutmix、Fmix等

标准数据增广

本文介绍主要以ImageNet分类为例进行介绍,并假设最终输入到网络的数据维度为。ImageNet的训练阶段,数据增广方式可以分为下面几个步骤:

  • 图像解码:常用解码方式为opencv和PIL,需要注意的是两者皆吗后的数据排列方式有区别:一个是BGR,一个是RGB。虽然推理阶段不同解码方式不会很大程度影响模型的性能,但终归还是会造成影响,大概会有零点几个点的差别吧;
  • RandCrop/RandResize:对前述解码图像进行裁剪/Resize,以确保输入到后续阶段的图像大小统一;
  • RandFlip:在分类任务中,常用的镜像为水平镜像;
  • Normalize:数据归一化,经该步骤处理的数据类型由uint8变换为float;
  • Transpose:数据重拍,将输入数据维度由 转为
  • Batch:它的作用是将前述处理数据进行最后的打包,一般由深度学习框架提供。

在前述标准数据增广基础上,研究者又提出了诸多改进的增广策略,这些策略主要是插入到上述不同操作后,基于所处阶段,我们可以简单的将其划分为例三类:

  • 对RandCrop后的图像进行的操作:比如AutoAugment、RandAugment;
  • 对Transpose后的图像进行的操作:比如CutOut、RandErasing、HideAndSeek、GridMask;
  • 对Batch后的数据进行的操作:比如Mixup、Cutmix

为更好的说明与对比上述方法,以下图为例,对变换后的效果进行可视化对比(注:图片来源网络,如侵权可联系删除)。

图像变换类

在这里,图像变换特指针对RandCrop后的图像进行的一些变换,主要包含:AutoAugment、Fast AutoAugment、RandAugment。当然还有其他方法,比如Faster AutoAugmeng、PBA等。但限于篇幅,这里仅对最知名的两种(AutoAugment与RandAugment)进行一些简单介绍与效果可视化。

AutoAugment

paper:https://arxiv.org/abs/1805.09501v1
code:https://github.com/DeepVoltaire/AutoAugment

在AutoAugment之前,无论是图像分类还是目标检测,抑或图像复原、语义分割所采用的数据增广方式均为人工设计,主要以传统方式为主。而AutoAugment则首个采用搜索技术进行数据增广的方法。

AutoAugment 是在一系列图像增广子策略的搜索空间中通过搜索算法找到的适合特定数据集的图像增广方案。针对 ImageNet 数据集,最终搜索出来的数据增广方案包含 25 个子策略组合,每个子策略中都包含两种变换:针对每幅图像都随机的挑选一个子策略组合,然后以一定的概率来决定是否执行子策略中的每种变换。AutoAugment处理后的效果如下所示。

RandAugment

paper: https://arxiv.org/pdf/1909.13719.pdf
code: https://github.com/heartInsert/randaugment

由于AutoAugment 的搜索方法比较暴力,直接在数据集上搜索针对该数据集的最优策略,这就导致了它的计算量很大。RandAugment 一文作者认为AutoAugment有以下两个缺陷:

  • 在大数据集上AutoAugment的性能增益有限;
  • 由于AutoAugment的数据强相关,其迁移能力比较差

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

注:除了上述所提到的两种基于搜索的到的数据增广方法外,还有其他基于NAS的数据增广方式,比如:

  • Fast AutoAugment:https://arxiv.org/abs/1905.00397
  • Faster AutoAugment:https://arxiv.org/abs/1911.06987
  • PBA:https://arxiv.org/pdf/1905.05393.pdf
  • Greedy AutoAugment:https://arxiv.org/abs/1908.00704

图像裁剪类

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

  • Cutout
  • RandErasing
  • HideAndSeek
  • GridMask

Cutout

Paper: https://arxiv.org/abs/1708.04552
Code: https://github.com/uoguelph-mlrg/Cutout

从某种程度上来讲,Cutout 可以理解为 Dropout 的一种扩展操作,不同的是 Dropout 是对图像经过网络后生成的特征进行遮挡,而 Cutout 是直接对输入的图像进行遮挡。经Cutout处理后的效果如下所示。

RandErasing

Paper: https://arxiv.org/pdf/1708.04896.pdf
Code: https://github.com/zhunzhong07/Random-Erasing

RandomErasingCutout 方法类似,同样是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,作者在论文中也指出,随机裁剪的方式与随机水平翻转具有一定的互补性。与Cutout不同的是,在RandomErasing中,图片以一定的概率接受该种预处理方法,生成掩码的尺寸大小与长宽比也是根据预设的超参数随机生成。注:笔者印象中,RandErasing还会添加噪声,一定程度上提升了模型的鲁棒性。

HideAndSeek

Paper: https://arxiv.org/pdf/1811.02545.pdf
Code: https://github.com/kkanshul/Hide-and-Seek

HideAndSeek论文将图像分为若干块区域(patch),对于每块区域,都以一定的概率生成掩码。经HideAndSeek处理后的效果如下所示。

Gridmask

Paper: https://arxiv.org/abs/2001.04086
Code: https://github.com/akuxcw/GridMask

该文是香港中文贾佳亚老师团队在数据增广方面的成果,作者认为之前Cutout方式可能(1)过渡删除主体目标信息,导致信息过多丢失;(2)较少删除主体目标信息,有失增广意义。基于上述考虑,作者提出了GridMask方法。GridMask是通过生成一个与原图分辨率相同的掩码,并将掩码进行随机翻转,与原图相乘,从而得到增广后的图像,通过超参数控制生成的掩码网格的大小。注:GridMask中的掩码有规律的分布,并且不会过度删除主体目标。经GridMask处理后的效果如下。

图像混叠类

图像混叠主要对 Batch 后的数据进行混合,需要注意的是:这类数据增广方式不仅对输入进行调整,同时还进行lable的调整以及损失函数的调整。这类方法主要包括以下两种:

  • Mixup
  • Cutmix

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

Mixup

Paper: https://arxiv.org/pdf/1710.09412.pdf
Code: https://github.com/facebookresearch/mixup-cifar10

Mixup是最早提出的一种图像混叠增广方案,它是对两幅不同的图像通过blending方式进行混叠,同时label也需要进行混叠。它有两种实现方式:(1) 同一batch内后混叠;(2)不同batch混叠。下图为同一batch内混叠效果图。

Cutmix

Paper: https://arxiv.org/pdf/1905.04899v2.pdf
Code: https://github.com/clovaai/CutMix-PyTorch

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

注:除了所提到的Mixup与Cutmix外,还有不少其他相关的方法,比如Fmix,见链接:https://github.com/ecs-vlc/FMix,

Conclusion

该文以CV领域的数据增广为出发点,对几种比较经典的数据增广方法进行了介绍。除了上述介绍的数据增广方法外,还有其他数据增强方法,比如下面几种:

  • Cutblur:一种用于图像超分的数据增广方法,https://arxiv.org/abs/2004.00448
  • Attribute Mix:用于细粒度识别的数据增广方法,https://arxiv.org/abs/2004.02684
  • DADA:基于Low Data Regime classification的数据增广方法,https://arxiv.org/abs/1809.00981
  • Supermix:用于知识蒸馏的数据增广方法,https://arxiv.org/abs/2003.05034
  • BayerAug:用于raw数据增广的方法,https://arxiv.org/abs/1904.12945

除了上述所提到的数据增广方法外,这里还给各位CVers分享几个比较不错的数据增广库,相关连接如下:

  1. albumentations:该库包含大量的传统图像数据增广方法,链接:https://github.com/albumentations-team/albumentations
  2. UDA:无监督数据增广,链接:https://github.com/google-research/uda
  3. torchsample:基于pytorch的高层封装,含数据增广模型训练等,链接:https://github.com/ncullen93/torchsample
  4. image_augmentor: 又一个传统图像数据增广方法,链接:https://github.com/codebox/image_augmentor
  5. imgaug:一个适合分类、检测的数据增广库。https://github.com/aleju/imgaug 1.vidaug:视频数据增广方法,链接:https://github.com/okankop/vidaug
  6. pytorch-官方数据增广:https://github.com/pytorch/vision/tree/master/torchvision/transforms
  7. 张航博士开源的FastAutoAugment:https://github.com/zhanghang1989/Fast-AutoAug-Torch
  8. FastAutoAugment官方实现:https://github.com/kakaobrain/fast-autoaugment
  9. AutoAugment的官方实现:https://github.com/tensorflow/models/tree/master/research/autoaugment
  10. Paddle官方数据增广:https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/data/imaug

以上是本人今天关于数据增广的一点总结,并由此查找到一些数据增广相关方法与代码库,该搜索肯定是不完善的,如有其他优秀的数据增广方法,可以留言进行补充完善。

码字不易,给个在看可否?

Reference paper

1.Cubuk E D, Zoph B, Mane D, et al. Autoaugment: Learning augmentation strategies from data[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2019: 113-123.
2.Cubuk E D, Zoph B, Shlens J, et al. Randaugment: Practical automated data augmentation with a reduced search space[J]. arXiv preprint arXiv:1909.13719, 2019.
3.DeVries T, Taylor G W. Improved regularization of convolutional neural networks with cutout[J]. arXiv preprint arXiv:1708.04552, 2017.
4.Zhong Z, Zheng L, Kang G, et al. Random erasing data augmentation[J]. arXiv preprint arXiv:1708.04896, 2017.
5.Singh K K, Lee Y J. Hide-and-seek: Forcing a network to be meticulous for weakly-supervised object and action localization[C]//2017 IEEE international conference on computer vision (ICCV). IEEE, 2017: 3544-3553.
6.Chen P. GridMask Data Augmentation[J]. arXiv preprint arXiv:2001.04086, 2020.
7.Zhang H, Cisse M, Dauphin Y N, et al. mixup: Beyond empirical risk minimization[J]. arXiv preprint arXiv:1710.09412, 2017.
8.Yun S, Han D, Oh S J, et al. Cutmix: Regularization strategy to train strong classifiers with localizable features[C]//Proceedings of the IEEE International Conference on Computer Vision. 2019: 6023-6032

推荐阅读:



添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:AI移动应用-小极-北大-深圳),即可申请加入AI移动应用极市技术交流群,更有每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、行业技术交流一起来让思想之光照的更远吧~


△长按添加极市小助手


△长按关注极市平台,获取最新CV干货


觉得有用麻烦给个在看啦~  

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存