【深度學習】基於深度學習的數據增廣技術一覽

週末在家無聊,偶然興心想對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

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分享幾個比較不錯的數據增廣庫,相關連接如下:

  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

以上是本人今天關於數據增廣的一點總結,並由此查找到一些數據增廣相關方法與代碼庫,該搜索肯定是不完善的,如有其他優秀的數據增廣方法,可以留言進行補充完善。

參考博客:【深度學習】基於深度學習的數據增廣技術一覽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章