<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          跟我學(xué)萬(wàn)字長(zhǎng)文:最前沿的特征可視化(CAM)技術(shù)

          共 11024字,需瀏覽 23分鐘

           ·

          2020-08-09 20:16

          作者:皮特潘
          編輯:致新

          前言

          眾所周知,深度學(xué)習(xí)是一個(gè)"黑盒"系統(tǒng)。它通過(guò)“end-to-end”的方式來(lái)工作,輸入數(shù)據(jù)例如RGB圖像,輸出目標(biāo)例如類(lèi)別標(biāo)簽、回歸值等,中間過(guò)程不可得知。如何才能打開(kāi)“黑盒”,一探究竟,讓“黑盒”變成“灰盒”,甚至“白盒”?因此就有了“深度學(xué)習(xí)可解釋性“這一領(lǐng)域,而CAM(Class Activation Mapping)技術(shù)就是其中之一,其利用特征可視化來(lái)探究深度卷積神經(jīng)網(wǎng)絡(luò)的工作機(jī)制和判斷依據(jù)。本文通過(guò)七篇論文來(lái)論述該技術(shù),并附帶代碼解析。

          CAM是什么?

          CAM全稱Class Activation Mapping,既類(lèi)別激活映射圖,也被稱為類(lèi)別熱力圖、顯著性圖等。是一張和原始圖片等同大小圖,該圖片上每個(gè)位置的像素取值范圍從0到1,一般用0到255的灰度圖表示??梢岳斫鉃閷?duì)預(yù)測(cè)輸出的貢獻(xiàn)分布,分?jǐn)?shù)越高的地方表示原始圖片對(duì)應(yīng)區(qū)域?qū)W(wǎng)絡(luò)的響應(yīng)越高、貢獻(xiàn)越大。

          為了更直觀表達(dá),一般將灰度圖轉(zhuǎn)化為彩色圖。例如可以使用Opencv 函數(shù)轉(zhuǎn)換:

          img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_JET) # 將灰度圖轉(zhuǎn)化為偽色彩圖,                                                                     # COLORMAP_JET 為輸出的顏色模式

          可視化的時(shí)候,可以利用熱力圖和原圖疊加的形式呈現(xiàn)。如下圖,顏色越深紅的地方表示值越大??梢哉J(rèn)為,網(wǎng)絡(luò)預(yù)測(cè)“狗”這個(gè)類(lèi)別時(shí),紅色高亮區(qū)域是其主要判斷依據(jù)。


          ????????A.原始圖片 ? ? ? ? ? ? ? ? ?B. CAM灰度圖? ? ? ? ? ? ? ? ? ??

          ????????C. CAM彩色熱圖 ? ? ? ? ? ? ?D. 原圖+CAM熱圖疊加

          CAM有什么用?

          CAM主要有以下作用:

          1. 有助于理解和分析神經(jīng)網(wǎng)絡(luò)的工作原理及決策過(guò)程,進(jìn)而去更好地選擇或設(shè)計(jì)網(wǎng)絡(luò)。例如對(duì)于分類(lèi)網(wǎng)絡(luò),如果參考CAM相當(dāng)于除了分類(lèi)accuracy以外,對(duì)網(wǎng)絡(luò)又提出了更高的要求:不但要求預(yù)測(cè)準(zhǔn)確率高,還需要網(wǎng)絡(luò)提取到我們需要的特征。下圖可以看出,不同網(wǎng)絡(luò)對(duì)相同的數(shù)據(jù)的CAM是有較為明顯的差異。當(dāng)然即便是同一個(gè)網(wǎng)絡(luò),不同訓(xùn)練過(guò)程也會(huì)導(dǎo)致CAM有很大的差異。

            A.原始圖片? ? ? B. Resnet50 預(yù)測(cè)結(jié)果? ?C. Resnet34 預(yù)測(cè)結(jié)果

          2. 利用可視化的信息引導(dǎo)網(wǎng)絡(luò)更好的學(xué)習(xí),例如可以利用CAM信息通過(guò)"擦除"或""裁剪""的方式對(duì)數(shù)據(jù)進(jìn)行增強(qiáng);

          3. 利用CAM作為原始的種子,進(jìn)行弱監(jiān)督語(yǔ)義分割或弱監(jiān)督定位。既然CAM能夠cover到目標(biāo)物體,所以可以僅利用分類(lèi)標(biāo)注來(lái)完成語(yǔ)義分割或目標(biāo)檢測(cè)任務(wù),極大程度上降低了標(biāo)注的工作量,但這對(duì)CAM的要求更高。一般情況下,分類(lèi)網(wǎng)絡(luò)只會(huì)提取到最具有判別性的特征。所以也有很多做法來(lái)提高分類(lèi)網(wǎng)絡(luò)的CAM精準(zhǔn)度,如下圖。

          插圖來(lái)自: Tell Me Where to Look: Guided Attention Inference Network

          如何獲取CAM?


          卷積神經(jīng)網(wǎng)絡(luò)的卷積操作可以看做是濾波器對(duì)圖片進(jìn)行特征提取,通過(guò)滑動(dòng)窗口的方式實(shí)現(xiàn),因此特征層和輸入圖片存在空間上的對(duì)應(yīng)關(guān)系。如上圖表示某層特征圖,表示特征圖第列的值,可以認(rèn)為是被層層卷積核過(guò)濾后而保留的有效信息,其值越大,表明特征越有效,對(duì)網(wǎng)絡(luò)預(yù)測(cè)結(jié)果越重要。一個(gè)深層的卷積神經(jīng)網(wǎng)絡(luò),通過(guò)層層卷積操作,提取空間和語(yǔ)義信息。一般存在其他更難理解的層,例如分類(lèi)的全連接層、softmax層等,很難以利用可視化的方式展示出來(lái)。所以,CAM的提取一般發(fā)生在卷積層,尤其是最后一層卷積。通常每一層的特征圖還會(huì)有很多層,一般稱為channel(通道),例如Resnet18最后一層特征圖有512個(gè)通道。這512個(gè)通道可以認(rèn)為提取到不同的特征,該特征具有高度抽象性,且每個(gè)通道對(duì)最后的結(jié)果貢獻(xiàn)不同,因此單獨(dú)可視化每個(gè)通道獲取熱圖也讓人很難理解。所以一般CAM的獲取是根據(jù)每個(gè)通道不同的貢獻(xiàn)大小去融合獲取一張CAM。

          所以,總結(jié)CAM獲取的步驟如下:

          「step1」:提取需要可視化的特征層,例如尺寸為的張量;

          「step2」:獲取該張量的每個(gè)channel的權(quán)重,即長(zhǎng)度為的向量;

          「step3」:通過(guò)線性融合的方式,將該張量在channel維度上加權(quán)求和,獲取尺寸為的map;

          「step4」:對(duì)該map進(jìn)行歸一化,并通過(guò)插值的方式resize到原圖尺寸;

          類(lèi)似目標(biāo)檢測(cè)領(lǐng)域 anchor-base和anchor-free, CAM也有兩種不同的陣營(yíng)gradient-based和gradient-free。做法不同,其本質(zhì)類(lèi)似: 「提取目標(biāo)特征層,并進(jìn)行加權(quán)融合獲取激活圖(CAM)。主要的區(qū)別在于上述step2敘述的特征層之間融合權(quán)重的選擇上」。gradient-based利用梯度獲取權(quán)重,gradient-free 則不需要梯度信息。本文根據(jù)時(shí)間順序,解析7篇比較重要CAM獲取方式的論文,幫助讀者對(duì)網(wǎng)絡(luò)處理信息流有更深入的理解。"Talk is cheap. Show me the code"。本文也會(huì)給出核心代碼實(shí)現(xiàn)的解釋。參考代碼連接: ?https://pypi.org/project/torch-cam/

          本文涉及的論文如下:

          「gradient-based」:

          • Grad-CAM (2016.10)
          • Grad-CAM++ (2017.10)
          • Smooth Grad-CAM++ (2019.08)

          「gradient-free」:

          • CAM (2015.12)
          • score-CAM (2019.10)
          • ss-CAM (2020.06)
          • Ablation-CAM (2020)

          開(kāi)山之作:利用GAP獲取CAM

          「論文標(biāo)題」: ?Learning Deep Features for Discriminative Localizatiion

          「論文地址」: ?https://arxiv.org/pdf/1512.04150.pdf

          首先介紹一下GAP(Global average pooling,全局平均池化 )操作。參考上圖, 這個(gè)概念來(lái)自network in network,利用全局平均池化獲取特征向量,再和輸出層進(jìn)行全連接。GAP直接將特征層尺寸轉(zhuǎn)化成,既每一層的特征圖里面的所有像素點(diǎn)值求平均獲取對(duì)應(yīng)特征向量值作為GAP輸出。

          GAP的好處是:

          1. 可以減少參數(shù)的數(shù)量,可以看出, 不管多大,都直接轉(zhuǎn)化為了個(gè)值,池化非常徹底。另外GAP層是沒(méi)有數(shù)據(jù)參數(shù)的。因?yàn)閰?shù)量少了,GAP也降低了過(guò)擬合的風(fēng)險(xiǎn)。
          2. 一般情況下,可適應(yīng)任意尺寸的圖片輸出。因?yàn)椴还茌斎氤叽缍啻螅ㄟ^(guò)GAP都轉(zhuǎn)化為了長(zhǎng)度和最后一層特征圖channel等長(zhǎng)的特征向量,對(duì)于一個(gè)設(shè)計(jì)好的網(wǎng)絡(luò),該值為固定值。所以在部署測(cè)試的時(shí)候,網(wǎng)絡(luò)可以處理不同尺寸的圖片,而不需要resize。
          3. GAP直接對(duì)特征層的空間信息進(jìn)行求和,整合了整個(gè)空間的信息,所以網(wǎng)絡(luò)對(duì)輸入的空間變化的魯棒性更強(qiáng)。

          本文的做法通過(guò)上圖就可以很直觀理解,為GAP到輸出層全連接到目標(biāo)類(lèi)別(上圖目標(biāo)類(lèi)別為狗)的權(quán)重,由于GAP特征向量是直接來(lái)自于特征圖(線性關(guān)系),因此該權(quán)重可視為特征圖對(duì)目標(biāo)類(lèi)別score的貢獻(xiàn)程度,進(jìn)行加權(quán)求和既可以獲取CAM,公式如下:

          其中為最后一層特征圖位置的值,為類(lèi)別的全連接權(quán)重。

          該方法的缺點(diǎn)是只能適用于最后一層特征圖和全連接之間是GAP操作。如果不是,就需要用戶修改網(wǎng)絡(luò)并重新訓(xùn)練(或 fine-tune)。所以對(duì)本文簡(jiǎn)單概括即為:修改網(wǎng)絡(luò)全連接為GAP形式,利用GAP層與全連接的權(quán)重作為特征融合權(quán)重,對(duì)特征圖進(jìn)行線性融合獲取CAM。

          「核心代碼解讀」:

          代碼非常簡(jiǎn)單, 提取到特征圖和目標(biāo)類(lèi)別全連接的權(quán)重,直接加權(quán)求和,再經(jīng)過(guò)relu操作去除負(fù)值,最后歸一化獲取CAM,具體如下:

          # 獲取全連接層的權(quán)重self._fc_weights = self.model._modules.get(fc_layer).weight.data# 獲取目標(biāo)類(lèi)別的權(quán)重作為特征權(quán)重weights=self._fc_weights[class_idx, :]# 這里self.hook_a為最后一層特征圖的輸出batch_cams = (weights.unsqueeze(-1).unsqueeze(-1) * self.hook_a.squeeze(0)).sum(dim=0)# relu操作,去除負(fù)值batch_cams = F.relu(batch_cams, inplace=True)# 歸一化操作batch_cams = self._normalize(batch_cams)

          更通用的做法:Grad-CAM

          「論文標(biāo)題」: Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

          「論文地址」: https://arxiv.org/pdf/1610.02391.pdf

          上文的局限性就是網(wǎng)絡(luò)架構(gòu)里必須有GAP層,但并不是所有模型都配GAP層的。而本文就是為克服該缺陷提出的,其基本思路是目標(biāo)特征圖的融合權(quán)重可以表達(dá)為梯度。另外,因?yàn)闊釄D關(guān)心的是對(duì)分類(lèi)有正面影響的特征,所以加上了relu以移除負(fù)值。其實(shí)并不一定要是分類(lèi)問(wèn)題,只要是可求導(dǎo)的激活函數(shù),在其他問(wèn)題也一樣使用Grad-CAM。特征融合權(quán)重計(jì)算公式如下:

          其中 為目標(biāo)類(lèi)別的score,后面會(huì)論述該score具體是什么。?為需要可視化的目標(biāo)特征圖。論文里證明了grad-CAM是上文利用GAP一般形式,這里不再?gòu)?fù)述,具體可看論文附錄。這里提出兩個(gè)問(wèn)題并進(jìn)行論述。

          「A. ?grad-CAM和 CAM(這里指上一篇論文的做法)的區(qū)別?」

          1. CAM 只能用于最后一層特征圖和輸出之間是GAP的操作,grad-CAM可適用非GAP連接的網(wǎng)絡(luò)結(jié)構(gòu);
          2. CAM只能提取最后一層特征圖的熱力圖,而gard-CAM可以提取任意一層;

          「B. 目標(biāo)類(lèi)別score 是用通過(guò)softmax之后的還是之前的?」

          論文原文中目標(biāo)類(lèi)別score是指網(wǎng)絡(luò)未經(jīng)過(guò)softmax的得分,但是某些代碼實(shí)現(xiàn)當(dāng)中也使用了通過(guò)softmax后的。二者有無(wú)區(qū)別?下面我們通過(guò)公式推導(dǎo)一下。因?yàn)檫@兩種做法僅僅相差一個(gè)softmax,所以對(duì)softmax的求導(dǎo)。假設(shè)softmax層有C個(gè)輸出,記為:。則softmax輸出為:

          則輸出 對(duì)的偏導(dǎo)為,由于這里計(jì)算的是目標(biāo)類(lèi)別,所以僅需計(jì)算對(duì)應(yīng)輸出的偏導(dǎo):

          所以特征融合的權(quán)重則變成:

          可以看出,二者的梯度差異就是softmax輸出的多一項(xiàng),而對(duì)于已經(jīng)訓(xùn)練好的網(wǎng)絡(luò),該項(xiàng)為定值。后面特征層進(jìn)行加權(quán)求和,再歸一化后,該項(xiàng)會(huì)被消掉。所以通過(guò)softmax和不通過(guò)softmax在理論上完全一致。但是在實(shí)際應(yīng)用中我發(fā)現(xiàn),加上softmax后,權(quán)重會(huì)變得非常小,就是因?yàn)橛?xùn)練的充分好的網(wǎng)絡(luò),預(yù)測(cè)輸出的值是非常接近1的,所以的值非常非常小,存在「丟失精度」的風(fēng)險(xiǎn)。所以「目標(biāo)類(lèi)別score建議使用不經(jīng)過(guò)softmax的值」。

          「核心代碼解讀」:

          僅需要對(duì)目標(biāo)類(lèi)別的score進(jìn)行求導(dǎo), 然后追蹤到目標(biāo)特征圖的梯度, 對(duì)該梯隊(duì)進(jìn)行element-wise求平均(GAP操作)即獲得特征融合的權(quán)重。具體如下:

          # 利用onehot的形式鎖定目標(biāo)類(lèi)別one_hot = np.zeros((1, output.size()[-1]), dtype=np.float32)one_hot[0][index] = 1one_hot = torch.from_numpy(one_hot).requires_grad_(True) # 獲取目標(biāo)類(lèi)別的輸出,該值帶有梯度鏈接關(guān)系,可進(jìn)行求導(dǎo)操作one_hot = torch.sum(one_hot * output)self.model.zero_grad()one_hot.backward(retain_graph=True) # backward 求導(dǎo)# 獲取對(duì)應(yīng)特征層的梯度mapgrads_val = self.extractor.get_gradients()[-1].cpu().data.numpy()target = features[-1].cpu().data.numpy()[0, :] # 獲取目標(biāo)特征輸出weights = np.mean(grads_val, axis=(2, 3))[0, :] # 利用GAP操作, 獲取特征權(quán)重cam = weights.dot(target.reshape((nc, h * w)))# relu操作,去除負(fù)值, 并縮放到原圖尺寸cam = np.maximum(cam, 0)cam = cv2.resize(cam, input.shape[2:])# 歸一化操作batch_cams = self._normalize(batch_cams)

          比Grad-CAM更進(jìn)一步:Grad-CAM++

          「論文標(biāo)題」: Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks

          「論文地址」: https://arxiv.org/pdf/1710.11063.pdf

          本文的提出是為了優(yōu)化Grad-CAM的結(jié)果,定位會(huì)更精準(zhǔn),也更適用于目標(biāo)類(lèi)別物體在圖像中不止一個(gè)的情況。Grad-CAM是利用目標(biāo)特征圖的梯度求平均(GAP)獲取特征圖權(quán)重,可以看做梯度map上每一個(gè)元素的貢獻(xiàn)是一樣。而本文認(rèn)為梯度map上的「每一個(gè)元素的貢獻(xiàn)不同」,因此增加了一個(gè)額外的權(quán)重對(duì)梯度map上的元素進(jìn)行加權(quán)。其中該權(quán)重如下:

          其中為目標(biāo)類(lèi)別, 表示特征圖第 層(或者說(shuō)第 和channel),為該層特征圖上的元素位置??梢钥闯龉街杏玫搅硕A偏導(dǎo)和三階偏導(dǎo),計(jì)算會(huì)更復(fù)雜。本文不做詳細(xì)推導(dǎo),具體可見(jiàn)論文。

          「核心代碼解讀:」

          這里值得說(shuō)明的是, 上面的公式有二次偏導(dǎo)和三次偏導(dǎo),論文中進(jìn)行了冪次方的轉(zhuǎn)化,實(shí)現(xiàn)更容易。

          ## 獲取特征權(quán)重的過(guò)程# 反向傳播self._backprop(scores, class_idx)# 注意,這里用乘法,因?yàn)檎撐闹袑?次偏導(dǎo)和3次偏導(dǎo)進(jìn)行了2次方和3次方的轉(zhuǎn)化grad_2 = self.hook_g.pow(2)grad_3 = self.hook_g.pow(3)# 獲取alpha權(quán)重mapalpha = grad_2 / (2 * grad_2 + (grad_3 * self.hook_a).sum(axis=(2, 3), keepdims=True))# 利用alpha 權(quán)重map去獲取特征權(quán)重return alpha.squeeze_(0).mul_(torch.relu(self.hook_g.squeeze(0))).sum(axis=(1, 2))

          結(jié)合梯度平滑策略:Smooth Grad-CAM++

          「論文標(biāo)題」: Smooth Grad-CAM++: An Enhanced Inference Level Visualization Technique for Deep Convolutional Neural Network Models

          「論文地址」: https://arxiv.org/pdf/1908.01224.pdf

          該論文做法是結(jié)合smoothGrad來(lái)優(yōu)化CAM效果,首先解釋一下smoothGrad。對(duì)于分類(lèi)網(wǎng)絡(luò),最終分類(lèi)類(lèi)別取決于哪個(gè)類(lèi)別的score最大,公式為:

          其中為輸入圖片,為類(lèi)別的類(lèi)別score。

          對(duì)求導(dǎo),獲?。?/p>

          表示的每個(gè)像素的微小變化會(huì)對(duì)類(lèi)的分類(lèi)score產(chǎn)生多大的影響,稱之為saliency maps,如下圖。

          該方法雖然能顯示出與分類(lèi)結(jié)果相關(guān)的區(qū)域,但如圖所示,存在很多噪聲,且很難探究噪聲的組成。smoothGrad的做法也很簡(jiǎn)單,即為多次輸入加入隨機(jī)噪聲的圖片,對(duì)結(jié)果并求平均,用以消除輸出saliency maps的"噪聲",達(dá)到“引入噪聲”來(lái)“消除噪聲”的效果。核心公式如下:

          為對(duì)原圖增加噪聲并前向的次數(shù), 為高斯噪聲??梢钥吹?,隨著的增加,噪聲逐漸減少,saliency maps逐漸聚焦到目標(biāo)物體區(qū)域。

          回到Smooth Grad-CAM++,如下圖所示,和Grad-CAM++的區(qū)別在于特征圖融合權(quán)重的求法上, 對(duì)原圖多次增加高斯噪聲,對(duì)目標(biāo)類(lèi)別對(duì)特征圖的梯度求平均。

          上圖中,對(duì)于Grad-CAM++中的被替換成了,其中表示為添加噪聲的原圖獲取的,共進(jìn)行了次操作。

          「核心代碼解讀」:

          這里給的實(shí)現(xiàn)smoothGrad操作是作用在alpha的2次偏導(dǎo)和3次偏導(dǎo)上, 實(shí)現(xiàn)方式不同,本質(zhì)一樣。

          for i in range(self.n_samples): # 進(jìn)行n_samples次加噪聲操作    self.model.zero_grad()    # 輸入圖片增加高斯噪聲    x_with_noise = torch.normal(mean=x, std=std_tensor).requires_grad_()    score = self.model(x_with_noise)    score[0, idx].backward(retain_graph=True) # 求梯度    activations = self.values.activations    gradients = self.values.gradients    n, c, _, _ = gradients.shape    # 獲取alpha, 和grad-cam++一致    numerator = gradients.pow(2)    denominator = 2 * gradients.pow(2)    ag = activations * gradients.pow(3)    denominator += \    ag.view(n, c, -1).sum(-1, keepdim=True).view(n, c, 1, 1)    denominator = torch.where(        denominator != 0.0, denominator, torch.ones_like(denominator))    alpha = numerator / (denominator + 1e-7)    relu_grad = F.relu(score[0, idx].exp() * gradients)    # 獲取weights    weights = (alpha * relu_grad).view(n, c, -1).sum(-1).view(n, c, 1, 1)    # 對(duì)特征層加權(quán)融合, 并進(jìn)行relu+歸一化操作    cam = (weights * activations).sum(1, keepdim=True)    cam = F.relu(cam)    cam -= torch.min(cam)    cam /= torch.max(cam)	total_cams += camtotal_cams /= self.n_samples # 求平均操作return total_cams.data

          gradient-free的做法:score-CAM 和 ss-CAM

          「論文標(biāo)題」: Score-CAM: Score-Weighted Visual Explanations for Convolutional Neural Networks

          「論文地址」: https://arxiv.org/pdf/1910.01279.pdf

          本文摒棄了利用梯度獲取特征權(quán)重的做法,作者認(rèn)為:

          1. 對(duì)于深度神經(jīng)網(wǎng)絡(luò),梯度可能是存在噪聲的,并存在飽和問(wèn)題。

          2. 利用Grad-CAM很容易找到錯(cuò)誤置信度的樣本,既具有更高權(quán)重的激活圖對(duì)網(wǎng)絡(luò)輸出的貢獻(xiàn)較小的例子。

          因此本文提出了gradient-free 的做法。首先,作者定義了CIC( (Increase of Confidence)的概念,既相對(duì)于baseline圖片的置信度增量,公式如下:

          其中X為輸入圖片, 為baseline圖片,可以設(shè)置為0,既全黑圖片.為輸入類(lèi)別得分的神經(jīng)網(wǎng)絡(luò),為第k層特征圖, 為神經(jīng)網(wǎng)絡(luò)第層卷積。

          本文的做法流程為:

          解釋一下:對(duì)獲取的特征圖進(jìn)行channel-wise遍歷,對(duì)每層特征圖進(jìn)行上采樣+歸一化,與原始圖片進(jìn)行pixel-wise相乘融合,然后送進(jìn)網(wǎng)絡(luò)獲取目標(biāo)類(lèi)別score(softmax后),減去baseline的目標(biāo)類(lèi)別score,獲取CIC。再進(jìn)行softmax操作來(lái)保證所有CIC之和為1。最后將CIC作為特征融合權(quán)重融合需要可視化的特征層。

          「核心代碼解讀」:

          值得注意的是,計(jì)算CIC時(shí)默認(rèn)使用的baseline為全黑的圖片,既全0的矩陣,因此CIC score不需要減去baseline的score。

          with torch.no_grad():# gradient-free, 所以不需要計(jì)算梯度    for i in range(K): # 對(duì)K層特征圖進(jìn)行遍歷操作          # 獲取第i層特征圖,并進(jìn)行上采樣操作          saliency_map = torch.unsqueeze(activations[:, i, :, :], 1)          saliency_map = F.interpolate(saliency_map, size=(h, w), mode='bilinear')          # 歸一化          norm_saliency_map = (saliency_map - saliency_map.min()) /                               (saliency_map.max() - saliency_map.min())          # 利用第i層特征圖作為mask覆蓋原圖,重新送入網(wǎng)絡(luò)獲取對(duì)應(yīng)類(lèi)別得分          output = self.model_arch(input * norm_saliency_map)          output = F.softmax(output)          score = output[0][predicted_class]          # 利用該得分作為權(quán)重對(duì)該層的特征圖進(jìn)行加權(quán)線性融合, baseline默認(rèn)為全0的圖,所以這里直接          # 用該得分作為特征權(quán)重          score_saliency_map +=  score * saliency_map    # relu去除負(fù)值    score_saliency_map = F.relu(score_saliency_map)    # 歸一化    score_saliency_map = (score_saliency_map - score_saliency_map.min())/                                                (score_saliency_map_max - score_saliency_map.max())    # score_saliency_map 為所求    return score_saliency_map

          「論文標(biāo)題」: SS-CAM: Smoothed Score-CAM for Sharper Visual Feature Localization

          「論文地址」: https://arxiv.org/pdf/2006.14255v1.pdf

          本文和score-CAM的關(guān)系類(lèi)似于smooth Grad-CAM++ 和 Grad-CAM++的關(guān)系。本文同樣是利用了smoothGrad技術(shù)來(lái)降低輸出噪聲。關(guān)于smoothGrad平滑策略, 本文給出了兩種做法,一種是噪聲增加在特征圖上,一種是噪聲增加在輸入圖上。這兩種做法在論文給出的不同數(shù)據(jù)集上的測(cè)試指標(biāo)也互有高低,具體選擇也依情況而定。

          利用Ablation分析的方法:Ablation-CAM

          「論文標(biāo)題」: Ablation-CAM: Visual Explanations for Deep Convolutional Network via Gradient-free Localization

          「論文地址」: https://openaccess.thecvf.com/content_WACV_2020/papers/Desai_Ablation-CAM_Visual_Explanations_for_Deep_Convolutional_Network_via_Gradient-free_Localization_WACV_2020_paper.pdf

          本文利用ablation分析來(lái)確定特征圖上每個(gè)單元的重要程度。Ablation Study 可以理解為通過(guò)控制變量地進(jìn)行移除各種組件等來(lái)探究各個(gè)因素對(duì)于模型整體貢獻(xiàn)的強(qiáng)弱多寡,找到對(duì)性能最主要的影響因素,這里不對(duì)該理論作過(guò)多介紹。直接看文章的做法。

          為特征圖的channel個(gè)數(shù),這里的是原始圖片類(lèi)別的類(lèi)別score輸出,為將特征圖第個(gè)channel全部設(shè)置為0后,將原始圖片再送進(jìn)網(wǎng)絡(luò),獲取的類(lèi)別的score。二者得分的之差,再除以就獲取slope,其實(shí)就是特征融合的權(quán)重。

          由于計(jì)算是個(gè)比較耗時(shí)的操作,于是有下面的簡(jiǎn)化形式:

          然后和Grad-CAM一致,對(duì)特征圖利用該權(quán)重進(jìn)行融合+relu去負(fù)值,如下:

          一句話概括就是遍歷地將每層特征圖置0后再進(jìn)行網(wǎng)絡(luò)前向獲取目標(biāo)類(lèi)別得分, 該值與原始得分的相對(duì)大小作為特征圖融合權(quán)重。論文實(shí)驗(yàn)表明, 該方法是優(yōu)于grad-CAM的.

          后記

          本文針對(duì)CAM的兩種方式gradient-based和gradient-free進(jìn)行了梳理,由于水平問(wèn)題,可能有些地方理解不特別到位。拋磚引玉,希望能讓讀者對(duì)該任務(wù)有一個(gè)更直觀的感受。

          機(jī)器學(xué)習(xí)算法工程師


          ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一個(gè)用心的公眾號(hào)

          長(zhǎng)按,識(shí)別,加關(guān)注

          進(jìn)群,學(xué)習(xí),得幫助

          你的關(guān)注,我們的熱度,

          我們一定給你學(xué)習(xí)最大的幫助


          瀏覽 92
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  韩国精品一二三 | 青青草视频涩情 | A∨无码| 99久久小视频 | 激情五月丁香色婷婷 |