解决细粒度图像分类的关键是发现能够反映子类微妙差异的有区分度的局部区域,那么现在已经有很多针对局部区域区分度特征表示的模型被设计出来。在本文中,我们提出一种不需要改变模型结构,仅通过一个损失函数就能探索子类细节特征。
被提出来的损失函数称为mutual-channel loss(MCLoss),由两个部分组成:Discriminality Component和Diversity Component,Discriminality指的是不同的类应该有不同关注,不同类提取的特征应该具有区分度,否则怎么说明这是不同的类呢?Diversity指同一个类的特征群应该多样化,如果一个类有10个特征图,而10个都长一样,那么就没有充分挖掘该类的细节,只有10个图各不一样,说明挖掘的才充分,所以也就是多样性Diversity。
最终,同类的特征图具有多样性,每一个都反映了不同的局部区域。这个MCLoss可以端到端参与训练,实验显示将MCLoss应用于常用网络在4种细粒度分类数据集上能够实现SOTA表现。同时你可以在https://github.com/ dongliangchang/Mutual-Channel-Loss获取代码。
细粒度图像分类比普通图像分类更难,因为在子类间的视觉相似度很高,一些差异很微小,并且这些差异往往分布在不同区域种。所以设计一种高效的特征信息提取方法去定位微小差异区域是解决细粒度图像分类的关键,也是目前的共识。
目前人们都都主要关注如何最好定位区分性目标部分,非常典型的就是两个组件组成的模型:1)明确执行区域检测;2)确保学习的特征是最大化区分度的。
在本文中,我们根据以上动机解决细粒度分类特有的挑战,但是与上面非常不同的一点是我们没有设计新模型,而是通过设计MCLoss来在不改变模型情况下确保特征具有高区分度。
具体而言,我们假设表示每个类的特征通道数是固定的,我们设计的MCLoss希望属于同一个类的特征是discriminative的,也就是每一个特征都对区别该类与其他类起到作用,但该类的特征组内又是互相排斥的,比如每一个通道都能够注意到不同的局部区域。
如图1,每个类用3个通道来表示,那么对内这三个特征通道是多样性的互斥的,表示能充分关注不同的区域,而对外这三个特征通道又能和其他组是差异化的,能够区分该类与其他类。
MCLoss的使用也简单,如图2所示,主干网络可以是像VGG或者ResNet,不过在FC前的特征上计算MCLoss,最后和分类随机融合后一起指导。到这里熟悉代码的人应该知道怎么使用MCLoss,只不过MCLoss是如何计算的不清楚罢了。
首先看下,总Loss是CEloss和MCloss的结合,在训练的时候通过权重μ进行加权和,得到总Loss:
L o s s ( F ) = L C E ( F ) + μ ∗ L M C ( F ) Loss(F)=L_{CE}(F)+μ*L_{MC}(F) Loss(F)=LCE(F)+μ∗LMC(F)
上文讲过MCLoss分为两部分,这两部分组成MCLoss:
L M C ( F ) = L d i s ( F ) − λ ∗ L d i v ( F ) L_{MC}(F)=L_{dis}(F)-λ*L_{div}(F) LMC(F)=Ldis(F)−λ∗Ldiv(F)
对于 L d i s L_{dis} Ldis的计算如下:
CWA:对于该类,首先获取到特征图 F 为 s h a p e = C H W F为shape=CHW F为shape=CHW, M M M是一个让通道随机失活的二值矩阵,比如:
C W A = [ 1 , 1 , 0 , 0 ] [ F 1 , F 2 , F 3 , F 4 ] CWA=[1,1,0,0][F1,F2,F3,F4] CWA=[1,1,0,0][F1,F2,F3,F4]就是让F3和F4不参与本次loss计算,可以理解为通道级的dropout,CWA后shape=CHW(只不过某通道全为0)
CCMP:是跨通道的maxpool操作,如下图所示,经过CCMP后shape=1HW(只有1个通道了)
GAP:很简单,就是在CCMP得到的单通道特征图上计算均值,最后得到一个值。
至此我们就完成了将一个类的所有通道计算出一个值,然后如公式4所示,总共c个类,得到c个g(F),也就是c个值,计算softmax后,计算与y的交叉熵,得到 L d i s L_{dis} Ldis。
The Discriminality Component可以理解为每组特征都代表一个类,而用于分类的分类器则是每个类通过GAP-CCMP-CWA得到了,然后和真实标签计算交叉熵分类损失,那么损失越小,说明拿到的特征图是有区分性的,能够基于此得到很好的分类效果,所以The Discriminality Component是为特征区分不同类设计的。
这部分是刻画每个类的通道组的多样性,降低通道冗余,提高特征提取能力。
首先一个类的通道组的多样性计算如下:
softmax,首先对于取得的特征图F,其shape=JHW,每个特征图在2D平面上做softmax,即一个特征图2维求和值为1,那么有J个通道的特征全部求和应该为J。
CCMP,这一步和上面的CCMP一样,通过沿通道计算每个像素位置的最大值,得到shape=1HW的特征图,最后求和得到 h ( F i ) h(F_i) h(Fi)
通过上述得到每个类的多样性值 h ( F i ) h(F_i) h(Fi),现在计算总多样性损失 L d i v L_{div} Ldiv,如公式6所示,即对C个类的 h ( F i ) h(F_i) h(Fi)求和再平均。
对于 L d i v L_{div} Ldiv的值域可以探讨下,我们假设有N个通道的注意力区域都刚好不重叠,则 h ( F i ) h(F_i) h(Fi)=1+1+…+1=N,然后每个类的通道组都是如此完美,则 L d i v L_{div} Ldiv=(N+N+…+N)/C=N,即 L d i v L_{div} Ldiv的最大值等于通道数;另一种极端情况则是N个通道都的注意力区域都重叠了,相当于只有1个通道起作用其他都冗余了,此时 h ( F i ) h(F_i) h(Fi)=1,则 L d i v L_{div} Ldiv=(1+1+…+1)/C=1,即 L d i v L_{div} Ldiv的最小值等于1,所以 L d i v ∈ [ 1 , C ] L_{div}∈[1,C] Ldiv∈[1,C]
L d i v L_{div} Ldiv的含义是重叠区域越小多样性越好,值越大,所以实际上模型越好该值越大,所以在MCLoss的公式中是"-"号。
L M C ( F ) = L d i s ( F ) − λ ∗ L d i v ( F ) L_{MC}(F)=L_{dis}(F)-λ*L_{div}(F) LMC(F)=Ldis(F)−λ∗Ldiv(F)
diversity component不能单独使用,因为它仅作为discriminality loss的正则化去发掘更多不同的有区分度的区域
最右侧是3个特征图的合并图,第二行是没有多样性的MCLoss,可以看到其实出现了很多冗余,第三行是没有CWA即随机丢弃一个通道,可以看到某些学习到一个有效特征后其余两个就不再学习其他有效的区域,造成对强特征图的依赖,不利于挖掘更多特征。