The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification
論文:https://arxiv.org/pdf/2002.04264.pdf
代碼:https://github.com/PRIS-CV/Mutual-Channel-Loss
1 總體思路
目標細粒度分類,由于子類別間的差異很小且類內差異很大,難度較普通圖像分類更大。圖1所示為細粒度圖像分類數據集CUB-200[1]中的兩個物種,加州鷗和北極鷗,從豎直方向的圖片對比可以看出,兩個不同物種長相非常相似,而從對比水平方向可知,同一物種由于姿態,背景以及拍攝角度的不同,存在較大的類內差異。 因此,要想順利的對兩個極為相似的物種進行細粒度分類,最重要的是在圖像中找到能夠區分這兩個物種的區分性的區域塊(discriminative part),并能夠對這些有區分性的區域塊的特征進行較好的表示。
由于深度卷積網絡能夠學習到非常魯棒的圖像特征表示,對圖像進行細粒度分類的方法,大多都是以深度卷積網絡為基礎的,這些方法大致可以分為以下四個方向:
- 基于常規圖像分類網絡的微調方法;
- 基于細粒度特征學習(fine-grained feature learning)的方法;
- 基于目標塊的檢測(part detection)和對齊(alignment)的方法;
- 基于視覺注意機制(visual attention)的方法
以上內容引用自:https://zhuanlan.zhihu.com/p/53611407
本文作者另辟蹊徑,沒有采用上述四種方法,而是從損失函數入手,保持網絡結構不變,設計了一種稱為MC-loss(multi-channel loss)的損失函數。
2 MC-loss
作者提出的整體識別結構如下圖所示,結合了交叉熵損失和MC-loss:
總體損失為交叉熵損失和MC-loss的加權和:
上面公式中出現的F表示輸入圖像通過卷積網絡后提取的特征。對于一副輸入圖像,F∈RN×H×WF \in R^{N \times H \times W}F∈RN×H×W,N表示channel數量,H和W表示特征圖的高和寬。
在MC-loss中,作者定義N=c×ξN = c \times \xiN=c×ξ,ccc表示數據集中的總類別數,ξ\xiξ表示用于表示每一個類的channel數,ξ\xiξ是一個超參數,但一般應大于2。
對于一個給定的目標類別iii,其特征可以表示為Fi∈Rξ×WH,i=0,1,?,c?1F_i \in R^{\xi \times WH},i = 0,1,\cdots,c-1Fi?∈Rξ×WH,i=0,1,?,c?1。FiF_iFi?可以表示為:
獲取各類別的特征后,特征集F={F0,F1,?,Fc?1}F = \{F_0,F_1,\cdots,F_{c-1}\}F={F0?,F1?,?,Fc?1?}送入圖2所示的兩個分支分別計算兩項損失。交叉熵損失LCE(F)L_{CE}(F)LCE?(F)鼓勵網絡提取有助于全局目標類別判別的特征。LMC(F)L_{MC}(F)LMC?(F)則是關注不同的局部判別塊的特征。
MC-loss 由兩部分組成,分別為Ldis(F)L_{dis}(F)Ldis?(F)和Ldiv(F)L_{div}(F)Ldiv?(F):
2.1 Ldis(F)L_{dis}(F)Ldis?(F)
Ldis(F)L_{dis}(F)Ldis?(F)中的dis表示 discriminality component。如上面所示,作者設計用ξ\xiξ個channel的特征表示一個類別,discriminality component要求這些特征關注某個特定的類別并且每個channel的特征要足夠有判別力。
Ldis(F)L_{dis}(F)Ldis?(F)可以表示成:
GAP表示Global Average Pooling,全局平均池化;
CCMP表示Cross-Channel Max Pooling,跨channel最大池化;
CWA表示Channel-Wise Attention,給定每個channel的重要性。Mi=diag(Maski)M_i = diag(Mask_i)Mi?=diag(Maski?),Maski∈RξMask_i \in R^{\xi}Maski?∈Rξ是一個由0和1組成的mask,有?ξ2?\lceil \frac{\xi}{2} \rceil?2ξ??個1,?ξ2?\lfloor \frac{\xi}{2} \rfloor?2ξ??個0。
CWA:
CWA即使用Mask進行channel-attention,每次訓練迭代中有一部分的channel不參與,迫使每一個channel都去學習足夠有判別力的特征。相當于channel維度的dropout操作。CWA僅在訓練過程中存在,推理時不使用。
CCMP:
CCMP表示跨通道的最大池化操作,即在WH個空間位置選取各channel的最大值,即選取每一個空間位置上各channel的最大激活值。當然也可以使用跨通道平均池化,但平均池化等價于對各channel的激活值進行平均,不利于細粒度分類。
GAP:
GAP是在空間維度進行平均池化,得到各類的預測結果。
總體來說,discriminality component通過CWA迫使每個channel學習到的特征足夠有判別力,通過CCMP選取各channel的最大響應,然后通過GAP獲取各類別的預測結果。總體訓練目標是使得各類別的ξ\xiξ個channel學習得到的特征足夠有能力進行類別判斷。
2.2 Ldiv(F)L_{div}(F)Ldiv?(F)
Ldiv(F)L_{div}(F)Ldiv?(F)表示diversity component,相當于計算各channel特征間的距離,從而得到所有channel的總體相似度。作者使用的方法相比于普遍使用的歐氏距離和KL散度計算量更小。
diversity component的目的是同一類別的ξ\xiξ個channel應該關注圖像的不同區域,而不應該是同一類別的所有channel都關注最有判別力的區域,相當于空間注意力機制。具體的實現為:
先對特征的每一位置進行softmax操作,將其變為預測的類別。然后選取一個類別的ξ\xiξ個channel中各空間位置的最大值,然后在空間位置上求和,得到各類別的預測概率在所有channel內的和。然后對各類別求均值,值越大表示模型對于所有類別,不同的channel都關注到了圖像的不同區域。
Ldiv(F)L_{div}(F)Ldiv?(F)的物理意義表示模型對于數據集的所有類別,不同的channel都關注到了圖像的不同區域,即取值越大越好。
Ldiv(F)L_{div}(F)Ldiv?(F)的取值上限為ξ\xiξ,表示不同channel的特征注意到了圖像的不同區域。Ldiv(F)L_{div}(F)Ldiv?(F)的取值下限為1,表示不同channel的特征注意到了圖像的同一區域。如下圖所示:
2.3 總結MC-Loss
MC-Loss通過Ldis(F)L_{dis}(F)Ldis?(F)使得一個類別的ξ\xiξ個channel都盡可能學習關于該類別的有判別力的特征,如圖3(b)中一組ξ\xiξ個channel的特征都變成了同一顏色;通過Ldiv(F)L_{div}(F)Ldiv?(F)使得各個channel都關注圖像的不同空間位置,如圖3(b)中一組ξ\xiξ個channel的特征的不同位置都有了顏色加深的區域。總體實現了如下圖所示的結果:
3 實驗
數據集:
參數設置:
每一個類別對應的ξ\xiξ個通道是一個超參數,因為預訓練的網絡輸出的channel數是固定的,作者為了在預訓練網絡上進行微調,設置了不同的類別具有不同數量的超參數,如使用VGG16作為預訓練模型時,在CUB-200-2011數據集上,設置前88個類別各對應2個channel,后112個類別各對應3個channel。具體設置如下表所示:
訓練時設置超參數u=0.005,λ=10u = 0.005,\lambda = 10u=0.005,λ=10。
對比其他算法:
消融研究:
消融研究中從頭訓練模型,每個類別設置同樣數量的channel數,設置超參數u=1.5,λ=10u = 1.5,\lambda = 10u=1.5,λ=10。
ξ\xiξ的取值:
ξ=3\xi = 3ξ=3,分類效果和計算量都比較好。下面圖給出了設置ξ=6\xi = 6ξ=6時,學習到了過于冗余的特征。
對比其他損失函數:
可視化:
用Grad-CAM做可視化,第一行可以看出不同的channel學習到了目標的不同區域幫助進行細粒度分類。第二行相比第一行可以看出,如果去掉LdivL_{div}Ldiv?,那么不同的channel關注到的感興趣區域會比較接近。第三行標明如果去掉CWA,只有一個channel學習到了比較有判別力的特征,其余的兩個通道學習到的特征的判別能力都很有限。
MC-Loss-V2表示設置公式(6)為Ldivv2(F)=h(Fi)L_{div_v2}(F) = h(F_i)Ldivv?2?(F)=h(Fi?),上表的實驗結果表明MC-Loss-V2的效果不如MC-Loss。作者認為如果用公式(6)進行訓練,那么不同類別的channel組之間相互影響,但MC-Loss-V2只考慮了一個類別,其他的channel組的diversity會受到損失。
4 代碼分析
注意作者實現的CWA是通過在channel方向上應用最大池化實現的,具體為先對(N,C,H,W)的輸入進行ttanspose操作,轉化為(N,W,H,C)(N,W,H,C)(N,W,H,C),然后用于kernel大小為(1,ξ)(1,\xi)(1,ξ)的最大池化,實現在channel維度上的最大池化。代碼為:
def forward(self, input):input = input.transpose(3,1)input = F.max_pool2d(input, self.kernel_size, self.stride,self.padding, self.dilation, self.ceil_mode,self.return_indices)input = input.transpose(3,1).contiguous()return input總結
以上是生活随笔為你收集整理的The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遗传算法总结
- 下一篇: 访谈完100个年入百万的自媒体人后,我总