【深度学习】基于深度学习的数据增广技术一览
◎作者系極市原創(chuàng)作者計(jì)劃特約作者Happy
周末在家無聊,偶然興心想對CV領(lǐng)域常用的數(shù)據(jù)增廣方法做個(gè)簡單的調(diào)研與總結(jié),重點(diǎn)是AI時(shí)代新興的幾種反響還不錯(cuò)的方法、各種第三方與官方實(shí)現(xiàn)代碼等。那么今天由Happy來跟大家聊一聊深度學(xué)習(xí)中那些常用的數(shù)據(jù)增廣方法。
在圖像分類任務(wù)中,數(shù)據(jù)增廣是一種常用的正則化方法,同時(shí)已成為提升模型性能所必不可少的步驟。從引領(lǐng)AI熱潮的AlexNet到最近EfficientNet都可以看到數(shù)據(jù)增廣的身影。數(shù)據(jù)增廣的方法也由傳統(tǒng)的裁剪、旋轉(zhuǎn)、鏡像等方式逐漸過渡到當(dāng)前火熱的AutoAug、RandAug等基于NAS搜索的數(shù)據(jù)增廣方法。
以pytorch官方ImageNet訓(xùn)練中代碼為例,如下所示。它基本上包含了CV中數(shù)據(jù)增廣的幾個(gè)比較關(guān)鍵的操作與節(jié)點(diǎn):數(shù)據(jù)解析、數(shù)據(jù)尺寸變換、鏡像變換、顏色空間變換、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() ]))為更好的對數(shù)據(jù)增廣方法進(jìn)行介紹說明,我們可以將數(shù)據(jù)增廣方法按照其作用位置、作用方式進(jìn)行簡單的分類如下:
標(biāo)準(zhǔn)數(shù)據(jù)增廣:泛指深度學(xué)習(xí)前期或更早期的一些常用數(shù)據(jù)增廣方法。
數(shù)據(jù)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等;
圖像裁剪類:泛指深度學(xué)習(xí)時(shí)代提出的一些類似dropout的數(shù)據(jù)增廣方法,包含CutOut、RandErasing、HideAndSeek、GridMask等;
圖像混疊類:泛指在batch層面進(jìn)行的操作,包含Mixup、Cutmix、Fmix等
標(biāo)準(zhǔn)數(shù)據(jù)增廣
本文介紹主要以ImageNet分類為例進(jìn)行介紹,并假設(shè)最終輸入到網(wǎng)絡(luò)的數(shù)據(jù)維度為。ImageNet的訓(xùn)練階段,數(shù)據(jù)增廣方式可以分為下面幾個(gè)步驟:
圖像解碼:常用解碼方式為opencv和PIL,需要注意的是兩者皆嗎后的數(shù)據(jù)排列方式有區(qū)別:一個(gè)是BGR,一個(gè)是RGB。雖然推理階段不同解碼方式不會很大程度影響模型的性能,但終歸還是會造成影響,大概會有零點(diǎn)幾個(gè)點(diǎn)的差別吧;
RandCrop/RandResize:對前述解碼圖像進(jìn)行裁剪/Resize,以確保輸入到后續(xù)階段的圖像大小統(tǒng)一;
RandFlip:在分類任務(wù)中,常用的鏡像為水平鏡像;
Normalize:數(shù)據(jù)歸一化,經(jīng)該步驟處理的數(shù)據(jù)類型由uint8變換為float;
Transpose:數(shù)據(jù)重拍,將輸入數(shù)據(jù)維度由?轉(zhuǎn)為;
Batch:它的作用是將前述處理數(shù)據(jù)進(jìn)行最后的打包,一般由深度學(xué)習(xí)框架提供。
在前述標(biāo)準(zhǔn)數(shù)據(jù)增廣基礎(chǔ)上,研究者又提出了諸多改進(jìn)的增廣策略,這些策略主要是插入到上述不同操作后,基于所處階段,我們可以簡單的將其劃分為例三類:
對RandCrop后的圖像進(jìn)行的操作:比如AutoAugment、RandAugment;
對Transpose后的圖像進(jìn)行的操作:比如CutOut、RandErasing、HideAndSeek、GridMask;
對Batch后的數(shù)據(jù)進(jìn)行的操作:比如Mixup、Cutmix
為更好的說明與對比上述方法,以下圖為例,對變換后的效果進(jìn)行可視化對比(注:圖片來源網(wǎng)絡(luò),如侵權(quán)可聯(lián)系刪除)。
圖像變換類
在這里,圖像變換特指針對RandCrop后的圖像進(jìn)行的一些變換,主要包含:AutoAugment、Fast AutoAugment、RandAugment。當(dāng)然還有其他方法,比如Faster AutoAugmeng、PBA等。但限于篇幅,這里僅對最知名的兩種(AutoAugment與RandAugment)進(jìn)行一些簡單介紹與效果可視化。
AutoAugment
paper:https://arxiv.org/abs/1805.09501v1
code:https://github.com/DeepVoltaire/AutoAugment
在AutoAugment之前,無論是圖像分類還是目標(biāo)檢測,抑或圖像復(fù)原、語義分割所采用的數(shù)據(jù)增廣方式均為人工設(shè)計(jì),主要以傳統(tǒng)方式為主。而AutoAugment則首個(gè)采用搜索技術(shù)進(jìn)行數(shù)據(jù)增廣的方法。
AutoAugment 是在一系列圖像增廣子策略的搜索空間中通過搜索算法找到的適合特定數(shù)據(jù)集的圖像增廣方案。針對 ImageNet 數(shù)據(jù)集,最終搜索出來的數(shù)據(jù)增廣方案包含 25 個(gè)子策略組合,每個(gè)子策略中都包含兩種變換:針對每幅圖像都隨機(jī)的挑選一個(gè)子策略組合,然后以一定的概率來決定是否執(zhí)行子策略中的每種變換。AutoAugment處理后的效果如下所示。
RandAugment
paper: https://arxiv.org/pdf/1909.13719.pdf
code: https://github.com/heartInsert/randaugment
由于AutoAugment 的搜索方法比較暴力,直接在數(shù)據(jù)集上搜索針對該數(shù)據(jù)集的最優(yōu)策略,這就導(dǎo)致了它的計(jì)算量很大。RandAugment 一文作者認(rèn)為AutoAugment有以下兩個(gè)缺陷:
在大數(shù)據(jù)集上AutoAugment的性能增益有限;
由于AutoAugment的數(shù)據(jù)強(qiáng)相關(guān),其遷移能力比較差
在 RandAugment 中,作者提出了一種隨機(jī)增廣的方式,不再像 AutoAugment 中那樣使用特定的概率確定是否使用某種子策略,而是所有的子策略都會以同樣的概率被選擇到,論文中的實(shí)驗(yàn)也表明這種數(shù)據(jù)增廣方式即使在大模型的訓(xùn)練中也具有很好的效果。RandAugment處理后的效果如下所示。
注:除了上述所提到的兩種基于搜索的到的數(shù)據(jù)增廣方法外,還有其他基于NAS的數(shù)據(jù)增廣方式,比如:
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 的圖像進(jìn)行一些裁剪,并將裁剪區(qū)域的像素值置為特定的常數(shù)(默認(rèn)為0),主要包括:
Cutout
RandErasing
HideAndSeek
GridMask
Cutout
Paper: https://arxiv.org/abs/1708.04552
Code: https://github.com/uoguelph-mlrg/Cutout
從某種程度上來講,Cutout 可以理解為 Dropout 的一種擴(kuò)展操作,不同的是 Dropout 是對圖像經(jīng)過網(wǎng)絡(luò)后生成的特征進(jìn)行遮擋,而 Cutout 是直接對輸入的圖像進(jìn)行遮擋。經(jīng)Cutout處理后的效果如下所示。
RandErasing
Paper: https://arxiv.org/pdf/1708.04896.pdf
Code: https://github.com/zhunzhong07/Random-Erasing
RandomErasing 與 Cutout 方法類似,同樣是為了解決訓(xùn)練出的模型在有遮擋數(shù)據(jù)上泛化能力較差的問題,作者在論文中也指出,隨機(jī)裁剪的方式與隨機(jī)水平翻轉(zhuǎn)具有一定的互補(bǔ)性。與Cutout不同的是,在RandomErasing中,圖片以一定的概率接受該種預(yù)處理方法,生成掩碼的尺寸大小與長寬比也是根據(jù)預(yù)設(shè)的超參數(shù)隨機(jī)生成。注:筆者印象中,RandErasing還會添加噪聲,一定程度上提升了模型的魯棒性。
HideAndSeek
Paper: https://arxiv.org/pdf/1811.02545.pdf
Code: https://github.com/kkanshul/Hide-and-Seek
HideAndSeek論文將圖像分為若干塊區(qū)域(patch),對于每塊區(qū)域,都以一定的概率生成掩碼。經(jīng)HideAndSeek處理后的效果如下所示。
Gridmask
Paper: https://arxiv.org/abs/2001.04086
Code: https://github.com/akuxcw/GridMask
該文是香港中文賈佳亞老師團(tuán)隊(duì)在數(shù)據(jù)增廣方面的成果,作者認(rèn)為之前Cutout方式可能(1)過渡刪除主體目標(biāo)信息,導(dǎo)致信息過多丟失;(2)較少刪除主體目標(biāo)信息,有失增廣意義。基于上述考慮,作者提出了GridMask方法。GridMask是通過生成一個(gè)與原圖分辨率相同的掩碼,并將掩碼進(jìn)行隨機(jī)翻轉(zhuǎn),與原圖相乘,從而得到增廣后的圖像,通過超參數(shù)控制生成的掩碼網(wǎng)格的大小。注:GridMask中的掩碼有規(guī)律的分布,并且不會過度刪除主體目標(biāo)。經(jīng)GridMask處理后的效果如下。
圖像混疊類
圖像混疊主要對 Batch 后的數(shù)據(jù)進(jìn)行混合,需要注意的是:這類數(shù)據(jù)增廣方式不僅對輸入進(jìn)行調(diào)整,同時(shí)還進(jìn)行l(wèi)able的調(diào)整以及損失函數(shù)的調(diào)整。這類方法主要包括以下兩種:
Mixup
Cutmix
前文所述的圖像變換與圖像裁剪都是針對單幅圖像進(jìn)行的操作,而圖像混疊是對兩幅圖像進(jìn)行融合,生成一幅圖像。兩種方法的主要區(qū)別為混疊的方式不太一樣。
Mixup
Paper: https://arxiv.org/pdf/1710.09412.pdf
Code: https://github.com/facebookresearch/mixup-cifar10
Mixup是最早提出的一種圖像混疊增廣方案,它是對兩幅不同的圖像通過blending方式進(jìn)行混疊,同時(shí)label也需要進(jìn)行混疊。它有兩種實(shí)現(xiàn)方式:(1) 同一batch內(nèi)后混疊;(2)不同batch混疊。下圖為同一batch內(nèi)混疊效果圖。
Cutmix
Paper: https://arxiv.org/pdf/1905.04899v2.pdf
Code: https://github.com/clovaai/CutMix-PyTorch
與 Mixup 直接對兩幅圖進(jìn)行相加不一樣,Cutmix 是從一幅圖中隨機(jī)裁剪出一個(gè) ROI,然后覆蓋當(dāng)前圖像中對應(yīng)的區(qū)域.
注:除了所提到的Mixup與Cutmix外,還有不少其他相關(guān)的方法,比如Fmix,見鏈接:https://github.com/ecs-vlc/FMix,
Conclusion
該文以CV領(lǐng)域的數(shù)據(jù)增廣為出發(fā)點(diǎn),對幾種比較經(jīng)典的數(shù)據(jù)增廣方法進(jìn)行了介紹。除了上述介紹的數(shù)據(jù)增廣方法外,還有其他數(shù)據(jù)增強(qiáng)方法,比如下面幾種:
Cutblur:一種用于圖像超分的數(shù)據(jù)增廣方法,https://arxiv.org/abs/2004.00448
Attribute Mix:用于細(xì)粒度識別的數(shù)據(jù)增廣方法,https://arxiv.org/abs/2004.02684
DADA:基于Low Data Regime classification的數(shù)據(jù)增廣方法,https://arxiv.org/abs/1809.00981
Supermix:用于知識蒸餾的數(shù)據(jù)增廣方法,https://arxiv.org/abs/2003.05034
BayerAug:用于raw數(shù)據(jù)增廣的方法,https://arxiv.org/abs/1904.12945
除了上述所提到的數(shù)據(jù)增廣方法外,這里還給各位CVers分享幾個(gè)比較不錯(cuò)的數(shù)據(jù)增廣庫,相關(guān)連接如下:
albumentations:該庫包含大量的傳統(tǒng)圖像數(shù)據(jù)增廣方法,鏈接:https://github.com/albumentations-team/albumentations
UDA:無監(jiān)督數(shù)據(jù)增廣,鏈接:https://github.com/google-research/uda
torchsample:基于pytorch的高層封裝,含數(shù)據(jù)增廣模型訓(xùn)練等,鏈接:https://github.com/ncullen93/torchsample
image_augmentor: 又一個(gè)傳統(tǒng)圖像數(shù)據(jù)增廣方法,鏈接:https://github.com/codebox/image_augmentor
imgaug:一個(gè)適合分類、檢測的數(shù)據(jù)增廣庫。https://github.com/aleju/imgaug 1.vidaug:視頻數(shù)據(jù)增廣方法,鏈接:https://github.com/okankop/vidaug
pytorch-官方數(shù)據(jù)增廣:https://github.com/pytorch/vision/tree/master/torchvision/transforms
張航博士開源的FastAutoAugment:https://github.com/zhanghang1989/Fast-AutoAug-Torch
FastAutoAugment官方實(shí)現(xiàn):https://github.com/kakaobrain/fast-autoaugment
AutoAugment的官方實(shí)現(xiàn):https://github.com/tensorflow/models/tree/master/research/autoaugment
Paddle官方數(shù)據(jù)增廣:https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/data/imaug
以上是本人今天關(guān)于數(shù)據(jù)增廣的一點(diǎn)總結(jié),并由此查找到一些數(shù)據(jù)增廣相關(guān)方法與代碼庫,該搜索肯定是不完善的,如有其他優(yōu)秀的數(shù)據(jù)增廣方法,可以留言進(jìn)行補(bǔ)充完善。
碼字不易,給個(gè)在看可否?
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
總結(jié)
以上是生活随笔為你收集整理的【深度学习】基于深度学习的数据增广技术一览的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收藏 | 700页NLP算法在百度、阿里
- 下一篇: 【深度学习】常见优化器的PyTorch实