基于深度学习的数据增广技术一览
加入极市专业CV交流群,与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流!
同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~
在图像分类任务中,数据增广是一种常用的正则化方法,同时已成为提升模型性能所必不可少的步骤。从引领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
RandomErasing
与 Cutout
方法类似,同样是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,作者在论文中也指出,随机裁剪的方式与随机水平翻转具有一定的互补性。与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分享几个比较不错的数据增广库,相关连接如下:
albumentations:该库包含大量的传统图像数据增广方法,链接:https://github.com/albumentations-team/albumentations UDA:无监督数据增广,链接:https://github.com/google-research/uda torchsample:基于pytorch的高层封装,含数据增广模型训练等,链接:https://github.com/ncullen93/torchsample image_augmentor: 又一个传统图像数据增广方法,链接:https://github.com/codebox/image_augmentor imgaug:一个适合分类、检测的数据增广库。https://github.com/aleju/imgaug1.vidaug:视频数据增广方法,链接:https://github.com/okankop/vidaug pytorch-官方数据增广:https://github.com/pytorch/vision/tree/master/torchvision/transforms 张航博士开源的FastAutoAugment:https://github.com/zhanghang1989/Fast-AutoAug-Torch FastAutoAugment官方实现:https://github.com/kakaobrain/fast-autoaugment AutoAugment的官方实现:https://github.com/tensorflow/models/tree/master/research/autoaugment 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