日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【CV细粒度识别论文总结】The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification

發(fā)布時(shí)間:2023/12/16 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CV细粒度识别论文总结】The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Paper:The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification(TIP 2021)

1 Motivation and Advantage

簡(jiǎn)單來(lái)說(shuō),就是想做細(xì)粒度的圖像分類(特征細(xì)膩,類間差異小,類內(nèi)差異大等原因)。別人都是通過(guò)關(guān)鍵區(qū)域標(biāo)注、注意力機(jī)制等方法解決,這篇文章作者另辟蹊徑,從損失函數(shù)入手,很有創(chuàng)意。

但是作者不想給模型增加額外的網(wǎng)絡(luò)參數(shù),所以提出只用一個(gè)新的損失函數(shù)就能夠很好地解決細(xì)粒度問(wèn)題,并且提出的損失函數(shù)具有很好的移植性,理論上能用于現(xiàn)有的各種網(wǎng)絡(luò)架構(gòu)。

2 Total Effect

  • 上面部分:傳統(tǒng)的細(xì)粒度分類模型,關(guān)注的是整個(gè)特征圖,同時(shí)關(guān)注到了一幅圖中的三個(gè)關(guān)鍵區(qū)域

  • 下面部分:MC-Loss方法,每個(gè)類別有多個(gè)通道,每個(gè)通道都對(duì)應(yīng)一個(gè)判別區(qū)域

    后面在方法介紹中細(xì)說(shuō)

3 Methodology of MC-Loss

細(xì)粒度識(shí)別框架的整體流程(經(jīng)典的細(xì)粒度分類模型,不針對(duì)具體某一種模型):

損失函數(shù)結(jié)合了Cross Entropy(CE)和 MC-Loss兩者,將卷積神經(jīng)網(wǎng)絡(luò)最后一層的輸出特征作為本文損失函數(shù)的輸入。

總體的損失函數(shù)表示為CE和MC的加權(quán)和:

Loss(F)=LCE(F)+μ×LMC(F)Loss(F)=L_{CE}(F)+\mu\times L_{MC}(F)Loss(F)=LCE?(F)+μ×LMC?(F)

  • CE:促使網(wǎng)絡(luò)提取有利于全局目標(biāo)類別的判別特征
  • MC:關(guān)注不同局部判別塊的特征

其中FFF是卷積層提取的特征,其中F∈RN×H×WF\in R^{N\times H\times W}FRN×H×WNNN表示channel數(shù),HWH WHW表示特征圖的高和寬。

在MC-Loss中,N=c×ξN=c\times \xiN=c×ξccc表示類別總數(shù),ξ\xiξ表示每類的channel數(shù)(需要注意:ξ\xiξ是一個(gè)超參,一般大于2,在paper中作者假定ξ\xiξ是個(gè)定值)

對(duì)于某個(gè)類別iii,特征表示為Fi∈Rξ×W×H,i=0,1,2,...,c?1F_i\in R^{\xi\times W\times H}, i=0, 1, 2, ..., c-1Fi?Rξ×W×H,i=0,1,2,...,c?1

獲取到各類別特征后,特征集表示為F={F0,F1,...,Fc?1}F=\{F_0, F_1, ..., F_{c-1}\}F={F0?,F1?,...,Fc?1?},把特征集輸入流程分別計(jì)算CE和MC兩個(gè)損失。

MC-Loss由兩部分組成:判別模塊和多樣性,在paper中表示為Ldis(F)L_{dis}(F)Ldis?(F)Ldiv(F)L_{div}(F)Ldiv?(F),所以LMC(F)L_{MC}(F)LMC?(F)表示為:

LMC(F)=Ldis(F)?λLdiv(F)L_{MC}(F)=L_{dis}(F)-\lambda L_{div}(F)LMC?(F)=Ldis?(F)?λLdiv?(F)

  • 判別性模塊(discriminality component)

    作者設(shè)定ξ\xiξ個(gè)channel的特征表示一個(gè)類別,這個(gè)模塊要求這些特征關(guān)注某個(gè)特定的類別并且每個(gè)channel的特征要有足夠的判別性。

    Ldis(F)L_{dis}(F)Ldis?(F)表示如下:

  • CWA:使用mask進(jìn)行channel-attention,mask是個(gè)01掩模,隨機(jī)選擇一半的通道?ξ?\lfloor \xi \rfloor?ξ?為0,Mi=diag(Maski)M_i=diag(\text{Mask}_i)Mi?=diag(Maski?)為一個(gè)對(duì)角矩陣,其中0對(duì)應(yīng)的位置(channel)被消除,其實(shí)就等同于是channel級(jí)別的dropout機(jī)制

    維度:c×ξ×WH→c×ξ2×WHc\times \xi \times WH \to c\times \frac{\xi}{2} \times WHc×ξ×WHc×2ξ?×WH

  • CCMP:跨channel的max pooling,在WH空間位置上選取最大值(avg pooling不適用細(xì)粒度分類?)

    c×ξ2×WH→c×1×WHc\times \frac{\xi}{2} \times WH\to c\times 1 \times WHc×2ξ?×WHc×1×WH

  • GAP:在空間維度進(jìn)行avg pooling

    c×1×WH→c×1c\times 1 \times WH \to c\times 1c×1×WHc×1

  • Softmax

借鑒別人博客中的一些解釋:THE MUTUAL-CHANNEL LOSS (MC-LOSS,附代碼分析)

  • 多樣性模塊(diversity component)

    這個(gè)模塊的目的是同一類別的ξ\xiξ個(gè)channel應(yīng)該關(guān)注圖像的不同區(qū)域,而不是同一類的所有channel都關(guān)注最有判別性的區(qū)域。多樣性組件不能單獨(dú)用于分類,它充當(dāng)判別器的正則化項(xiàng),隱式發(fā)現(xiàn)圖像中不同的原始區(qū)域的損失。

    Ldiv(F)L_{div}(F)Ldiv?(F)相當(dāng)于計(jì)算各個(gè)channel特征間的距離,相比于歐氏距離和KL散度計(jì)算量更小。

    Ldiv(F)L_{div}(F)Ldiv?(F)表示如下:

  • Softmax:先對(duì)特征的每一位置Softmax,變?yōu)轭A(yù)測(cè)類別
  • CCMP:選取一個(gè)類別的ξ\xiξ個(gè)channel中各空間位置的最大值
  • Sum:在空間位置求和,得到各類別的預(yù)測(cè)概率在所有channel上的和
  • Average:對(duì)各類別求均值,值越大表示模型對(duì)于所有類別,不同的channel都關(guān)注到了圖像的不同區(qū)域 (故越大越好)

所以,這也是為什么LMC(F)=Ldis(F)?λLdiv(F)L_{MC}(F)=L_{dis}(F)-\lambda L_{div}(F)LMC?(F)=Ldis?(F)?λLdiv?(F)這里是做減法

值得說(shuō)明的是:Ldiv(F)∈[1,ξ]L_{div}(F)\in [1,\xi]Ldiv?(F)[1,ξ],取最大值時(shí)表示不同channel的特征注意到了圖像的不同區(qū)域,取最小值時(shí)表示不同的channel的特征只注意到圖像的同一區(qū)域

4 Conclusion

MC-Loss通過(guò)Ldis(F)L_{dis}(F)Ldis?(F)使一個(gè)類別的ξ\xiξ個(gè)channel盡可能學(xué)習(xí)該類別最有判別性的特征(如上圖中同類別的多個(gè)通道都變成了同顏色),Ldiv(F)L_{div}(F)Ldiv?(F)使各channel關(guān)注圖像的不同空間位置(如上圖中一組ξ\xiξ個(gè)channel的特征的不同位置有了加深區(qū)域)

5 Core Code

def Mask(nb_batch, channels):foo = [1] * 2 + [0] * 1 # [1, 1, 0]bar = []for i in range(200):random.shuffle(foo)bar += foo# after the loop: bar->600bar = [bar for i in range(nb_batch)]bar = np.array(bar).astype("float32")bar = bar.reshape(nb_batch, 200 * channels, 1, 1)bar = torch.from_numpy(bar)bar = bar.cuda()bar = Variable(bar)return bar# calculate L_MC def supervisor(x, targets, height, cnum):mask = Mask(x.size(0), cnum)# calculate L_divbranch = xbranch = branch.reshape(branch.size(0), branch.size(1), branch.size(2) * branch.size(3))# Softmaxbranch = F.softmax(branch, 2)branch = branch.reshape(branch.size(0), branch.size(1), x.size(2), x.size(2))# CCMPbranch = my_MaxPool2d(kernel_size=(1, cnum), stride=(1, cnum))(branch)branch = branch.reshape(branch.size(0), branch.size(1), branch.size(2) * branch.size(3))# SUMloss_2 = 1.0 - 1.0 * torch.mean(torch.sum(branch, 2)) / cnum # set margin = 3.0# calculate L_dis# CWAbranch_1 = x * mask # channel-wise dropout# CCMPbranch_1 = my_MaxPool2d(kernel_size=(1, cnum), stride=(1, cnum))(branch_1) # GAPbranch_1 = nn.AvgPool2d(kernel_size=(height, height))(branch_1) branch_1 = branch_1.view(branch_1.size(0), -1)# Softmaxloss_1 = criterion(branch_1, targets)return [loss_1, loss_2] # MC_loss includes 2 parts: dis and divclass model_bn(nn.Module):def __init__(self, feature_size=512, classes_num=200):super(model_bn, self).__init__()self.features_1 = nn.Sequential(*list(VGG('VGG16').features.children())[:34])self.features_2 = nn.Sequential(*list(VGG('VGG16').features.children())[34:])self.max = nn.MaxPool2d(kernel_size=2, stride=2)self.num_ftrs = 600 * 7 * 7self.classifier = nn.Sequential(nn.BatchNorm1d(self.num_ftrs),# nn.Dropout(0.5),nn.Linear(self.num_ftrs, feature_size),nn.BatchNorm1d(feature_size),nn.ELU(inplace=True),# nn.Dropout(0.5),nn.Linear(feature_size, classes_num),)def forward(self, x, targets):x = self.features_1(x)x = self.features_2(x)if self.training:MC_loss = supervisor(x, targets, height=14, cnum=3)x = self.max(x)x = x.view(x.size(0), -1)x = self.classifier(x)loss = criterion(x, targets) # cross_entropy lossif self.training:return x, loss, MC_loss # return ce_loss and MC_losselse:return x, loss# in train function out, ce_loss, MC_loss = net(inputs, targets) loss = ce_loss + args["alpha_1"] * MC_loss[0] + args["beta_1"] * MC_loss[1] loss.backward()

上面即是MC-Loss的核心代碼,其余部分其實(shí)就是搭建CNN的代碼(可替換成自己的神經(jīng)網(wǎng)絡(luò))。

總結(jié)

以上是生活随笔為你收集整理的【CV细粒度识别论文总结】The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。