今天讀一篇AAAI21 Long-tailed Recognition方向的新文章,Bag of Tricks for Long-Tailed Visual Recognition with Deep Convolutional Neural Networks,來自CVPR19 Bilateral-Branch Network Xiu-Shen Wei老師的團隊。

這篇文章的出發點是總結現在常用的training tricks in long-tailed regonition,透過實驗結果來評價這些tricks的效果還有它們之間的相互影響,給後續研究以參考。[p。s。 本文其實總結的不錯,和 Decoupling Representation and Classifier for Long-Tailed Recognition,Kang, ICLR20 對比完善了對於tricks的分類,也補了好幾種方法的baseline。美中不足之處是太像tech report,羅列了A優於B、C+D比單獨用C差。。。等實驗結果,卻沒有系統分析造成這些結果的原因,我讀完全文留下了許多‘為何’批註。文章廣度有了,深度不夠。一點淺見,還是非常感謝本文作者們的工作。]

先總結一下Dataset,包括類別、特點、preprocessing和基於ResNet 的baseline(p。s。 應該是每個dataset只選擇了一種backbone大小,以後要follow這個文章的話也要注意此處設定)。

Dataset

Long-tailed CIFAR-10 和 Long-tailed CIFAR-100

imbalance factor=

\frac{n_{max}}{n_{min}}

,這裡的

n_{max}

n_{min}

分別是training set裡面最大和最小的類別的sample數。這兩個long-tailed版本的CIFAR是透過減少原本CIFAR的training sample來構造的,所以imbalance factor可以取到10~200不等,一般取50和100分別實驗。

Preprocessing 按照 (He2016Resnet paper)對CIFAR的處理來。

Training:pad 4 pixels on each size,then randomly crop a 32

\times

32 region。random horizontal flip by p=0。5, then normalization。

Testing: resize shorter side to 36 pixels and keep aspect ratio, then randomly crop a 32

\times

32 region, normalize。

Backbone:ResNet-32

iNaturalist 2018

iNaturalist是個很難的自然物種分類資料集,包含了438K samples from 8K species。除了large-scale和long-tailed,fine-grain也是個需要解決的問題。iNaturalist 2018有官方的train/val/test split,這篇文章是在train/val上做的實驗。

Preprocessing 按照(Goyal2017TrainImageNetIn1Hour)來。

Training:use scale and aspect ratio data augmentation (Szegedy et al 2015)and get a 224-by-224 randomly cropped region from an augmented image or its horizontal flip (p。s。 就是pytorch裡面的transforms。RandomResizedCrop+random horizontal flip哈)。Then normalize。

Testing:resize shorter side to 256 pixels and keep aspect ratio, then randomly crop a 224

\times

224 region, normalize。

Backbone:ResNet-50

ImageNet-LT

ImageNet-LT是(Liu19cvpr)用Pareto distribution在原本的ImageNet上面取樣得到的,1000類,每類5~1280sample不等,總共是19K的training data。

Preprocessing 同 iNaturalist 2018。

Backbone:ResNet-10

Bag of Tricks

1. Re-weighting

Re-weighting型別的方法會給minority class更多的權重,來平衡major-minor之間數量的不均衡。這個類別下面一共提到了

4種loss+1個baseline

(cross-entropy loss)。Hyper-parameter的設定都隨loss原論文。

結論是沒有哪個loss適用於各種程度的imbalance set,直接用re-weighting不work。

- Cross-entropy loss (CE)

L_{CE}(\textbf{z},c)=-log(\frac{exp(z_{c})}{\sum_{i=1}^{C}{exp(z_{i})}})

- Cost-sensitive cross-entropy loss (CS_CE)

L_{CS\_CE}(\textbf{z},c)=-\frac{n_{min}}{n_{c}}log(\frac{exp(z_{c})}{\sum_{i=1}^{C}{exp(z_{i})}})

-

- Class-balanced cross-entropy loss (CB_CE)

L_{CB\_CE}(\textbf{z},c)=-\frac{1-\beta}{1-\beta^{n_{c}}}log(\frac{exp(z_{c})}{\sum_{i=1}^{C}{exp(z_{i})}})

-

- Focal loss

p_{i}=sigmoid(z_{i})=\frac{1}{1+exp(-z_{i})}

p^t_i=\begin{cases}       p_i, & \text{if}\ i=c \\       1-p_i, & \text{otherwise}     \end{cases}

L_{Focal}(\textbf{z},c)=-\sum_{i=1}^{C}{(1-p_i^t)^\gamma log(p_i^t)}

- Class-balanced focal loss (CB_Focal)

L_{CB\_Focal}(\textbf{z},c)=-\frac{1-\beta}{1-\beta^{n_{c}}}log(\frac{exp(z_{c})}{\sum_{i=1}^{C}{(1-p_i^t)^\gamma log(p_i^t)}}

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

2。 Re-sampling

Re-sampling這一趴是基於decoupling那篇文章寫的(p。s。 我記得那篇文章說reweighting by loss 的方法沒什麼幫助,遂忽略,只把實驗focus在resampling上面)。這裡提到了

5種re-sampling

的方法,

結論是re-sampling直接用會帶來weak提升

。(p。s。 就個人使用感受而言,resampling尤其是progressively-balanced sampling和training schedule設定關係很大,i。e。,有的時候resampling結果不好調一調batchsize,epoch就能改善很多。文章裡面為了公平比較,一套引數來train所有weighting、sampling方法,其實結果不一定真的這樣。)

- Random over-sampling

:多多采樣tail classes,特點是effective,但是可能會overfitting。

- random under-sampling

:把head class裡面的sample移除,構造balanced training set。有的情況下比over-sampling效果好。

- Class-balanced sampling

:每一類的取樣頻率都相等(先選類,再random選該類的sample)。下面公式q=1代表這類。

p_{j}=\frac{n^q_j}{\sum_{i=1}^{C}{n_i^q}}

- Square-root sampling

:上面公式q=1/2, 構造出來一個比原來dataset balanced一些的取樣集。

- Progressively-balanced sampling

:隨著training程序逐漸從random sampling過渡到class-balanced sampling。(p。s。 BBN和decouple兩個同時期的工作,不約而同的提出了這個sampling方式,只是BBN把這個過程embed到網路裡面了。)下面公式裡的t和T分別是當前epoch和總epoch數目。

p_{j}^{PB}=(1-\frac{t}{T})\frac{n_j}{\sum_{i=1}^{C}{n_i}}+\frac{t}{T}\frac{1}{C}

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

3. Mix-up training

Mix-up本身是一種data augmentation trick,但是和resampling結合對long-tailed recognition很有效,所以單列一項(p。s。 BBN有這個)。這裡介紹了2種mix-up方法+和finetuning結合的實驗結果。

- Input mixup

:兩張原始input圖片pixel-wise線性相加,對合並後圖片的預測結果(softmax confidence ground truth)也是原labels的線性組合。

\hat{x}=\lambda x_i+(1-\lambda )x_j

\hat{y}=\lambda y_i+(1-\lambda)y_j

- Manifold mixup

:在network某些layer的輸出(features)做mixup。

\hat{g_k}=\lambda g_k(x_i)+(1-\lambda) g_k(x_j)

\hat{y}=\lambda y_i+(1-\lambda)y_j

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

- Fine-tuning after mixup training

:有研究證明,在mixup訓練好的模型基礎上去掉mixup再finetune幾個epoch會讓結果變好。看結果具體在哪個layer做mixup還挺重要的。

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

4. Two-stage training

Two-stage training即是

imbalanced training+balanced fine-tuning.

文中說CNNs trained on imbalanced datasets without any re-weighting or re-sampling method learn good feature representations but suffer poor recognition accuracy on under-represented tail categories。 在Decouple那篇文章裡也有讀到這個觀點,所以decouple討論了幾種finetuning的方法。但是很好奇good feature representations是怎麼樣被定義的,有什麼實驗結果支援?

Anyway,先看看文中的實驗。一共是2大類:

deferred re-balancing by resampling (DRS)

and

by re-weighting (DRW).

這兩類stage1都是train一個原汁原味的imbalanced CNN,stage2用resampling or reweighting的方法來finetune。本文也提出了一個用於finetune的resampling方法,class activation maps (CAM)-based sampling。經過stage1之後,feature map+GT label + FClayer權重可以等到class activation map,直觀理解就是一個大概的forground attention,然後用各種augmentation替換掉background得到一些新的training sample。至於這些training sample在stage2用多少,怎麼sample,就需要和其他resampling方法結合在一起。(p。s。 下面流程圖是比較好的情況,不知道tail class的CAM會不會很noisy?想看examples)

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

先看看DRW的效果, Cost-sensitive cross-entropy loss最佳(p。s。 今年NeurIPS有一個類似的loss,有空寫寫它)(pps。 class-balanced CE 為啥沒做second stage實驗?):

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

再看看DRS:

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

Bag of Tricks 組合拳

上面DRS和DRW兩個分組的第一名結合,結論是不如只做resampling。原因是這兩個trick都是想提高tail classes的影響,共同使用會引向overfit,所以整體accuracy下降(p。s。 這個只能說有可能,不知道怎麼證明?)。

第二個是2stage中的冠軍組合+mixup,結果顯示input mixup比manifold mixup更好。(also why?how to interprete the result?)

最終文章也顯示了組合tricks會提高iNaturalist和ImageNet-LT的準確率。

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

【閱讀筆記】Bag of Tricks for Long-Tailed Recog(AAAI21)

尾聲

如前面的幾處ps所言,更深層次的資訊還可以再挖掘一下,讓我來填填坑。