萬字長文:深度卷積神經(jīng)網(wǎng)絡(luò)特征可視化技術(shù)(CAM)最新綜述

極市導(dǎo)讀
?本文通過引用七篇論文來論述CAM技術(shù),對CAM的概念、作用及獲取方式進(jìn)行闡述,針對CAM的兩種方式gradient-based和gradient-free進(jìn)行了梳理,并附代碼解析。?>>加入極市CV技術(shù)交流群,走在計算機(jī)視覺的最前沿
前言
眾所周知,深度學(xué)習(xí)是一個"黑盒"系統(tǒng)。它通過“end-to-end”的方式來工作,輸入數(shù)據(jù)例如RGB圖像,輸出目標(biāo)例如類別標(biāo)簽、回歸值等,中間過程不可得知。如何才能打開“黑盒”,一探究竟,讓“黑盒”變成“灰盒”,甚至“白盒”?因此就有了“深度學(xué)習(xí)可解釋性“這一領(lǐng)域,而CAM(Class Activation Mapping)技術(shù)就是其中之一,其利用特征可視化來探究深度卷積神經(jīng)網(wǎng)絡(luò)的工作機(jī)制和判斷依據(jù)。本文通過七篇論文來論述該技術(shù),并附帶代碼解析。
CAM是什么?
CAM全稱Class Activation Mapping,既類別激活映射圖,也被稱為類別熱力圖、顯著性圖等。是一張和原始圖片等同大小圖,該圖片上每個位置的像素取值范圍從0到1,一般用0到255的灰度圖表示??梢岳斫鉃閷︻A(yù)測輸出的貢獻(xiàn)分布,分?jǐn)?shù)越高的地方表示原始圖片對應(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 為輸出的顏色模式
可視化的時候,可以利用熱力圖和原圖疊加的形式呈現(xiàn)。如下圖,顏色越深紅的地方表示值越大??梢哉J(rèn)為,網(wǎng)絡(luò)預(yù)測“狗”這個類別時,紅色高亮區(qū)域是其主要判斷依據(jù)。

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

A.原始圖片 B. Resnet50 預(yù)測結(jié)果 C. Resnet34 預(yù)測結(jié)果
利用可視化的信息引導(dǎo)網(wǎng)絡(luò)更好的學(xué)習(xí),例如可以利用CAM信息通過"擦除"或""裁剪""的方式對數(shù)據(jù)進(jìn)行增強(qiáng); 利用CAM作為原始的種子,進(jìn)行弱監(jiān)督語義分割或弱監(jiān)督定位。既然CAM能夠cover到目標(biāo)物體,所以可以僅利用分類標(biāo)注來完成語義分割或目標(biāo)檢測任務(wù),極大程度上降低了標(biāo)注的工作量,但這對CAM的要求更高。一般情況下,分類網(wǎng)絡(luò)只會提取到最具有判別性的特征。所以也有很多做法來提高分類網(wǎng)絡(luò)的CAM精準(zhǔn)度,如下圖。

插圖來自: Tell Me Where to Look: Guided Attention Inference Network
如何獲取CAM?

卷積神經(jīng)網(wǎng)絡(luò)的卷積操作可以看做是濾波器對圖片進(jìn)行特征提取,通過滑動窗口的方式實(shí)現(xiàn),因此特征層和輸入圖片存在空間上的對應(yīng)關(guān)系。如上圖表示某層特征圖,?
?表示特征圖第?
?層?
?行?
?列的值,可以認(rèn)為是被層層卷積核過濾后而保留的有效信息,其值越大,表明特征越有效,對網(wǎng)絡(luò)預(yù)測結(jié)果越重要。一個深層的卷積神經(jīng)網(wǎng)絡(luò),通過層層卷積操作,提取空間和語義信息。一般存在其他更難理解的層,例如分類的全連接層、softmax層等,很難以利用可視化的方式展示出來。所以,CAM的提取一般發(fā)生在卷積層,尤其是最后一層卷積。通常每一層的特征圖還會有很多層,一般稱為channel(通道),例如Resnet18最后一層特征圖有512個通道。這512個通道可以認(rèn)為提取到不同的特征,該特征具有高度抽象性,且每個通道對最后的結(jié)果貢獻(xiàn)不同,因此單獨(dú)可視化每個通道獲取熱圖也讓人很難理解。所以一般CAM的獲取是根據(jù)每個通道不同的貢獻(xiàn)大小去融合獲取一張CAM。
所以,總結(jié)CAM獲取的步驟如下:
step1:提取需要可視化的特征層,例如尺寸為?
?的張量;
step2:獲取該張量的每個channel的權(quán)重,即長度為512的向量;
step3:通過線性融合的方式,將該張量在channel維度上加權(quán)求和,獲取尺寸為7*7的map;
step4:對該map進(jìn)行歸一化,并通過插值的方式resize到原圖尺寸;
類似目標(biāo)檢測領(lǐng)域 anchor-base和anchor-free, CAM也有兩種不同的陣營gradient-based和gradient-free。做法不同,其本質(zhì)類似: 提取目標(biāo)特征層,并進(jìn)行加權(quán)融合獲取激活圖(CAM)。主要的區(qū)別在于上述step2敘述的特征層之間融合權(quán)重的選擇上。gradient-based利用梯度獲取權(quán)重,gradient-free 則不需要梯度信息。本文根據(jù)時間順序,解析7篇比較重要CAM獲取方式的論文,幫助讀者對網(wǎng)絡(luò)處理信息流有更深入的理解。"Talk is cheap. Show me the code"。本文也會給出核心代碼實(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)
開山之作:利用GAP獲取CAM
論文標(biāo)題: Learning Deep Features for Discriminative Localizatiion
論文地址: https://arxiv.org/pdf/1512.04150.pdf

首先介紹一下GAP(Global average pooling,全局平均池化 )操作。參考上圖, 這個概念來自network in network,利用全局平均池化獲取特征向量,再和輸出層進(jìn)行全連接。GAP直接將特征層尺寸
轉(zhuǎn)化成
,既每一層的特征圖里面的所有像素點(diǎn)值求平均獲取對應(yīng)特征向量值作為GAP輸出。
GAP的好處是:
可以減少參數(shù)的數(shù)量,可以看出, 不管
多大,都直接轉(zhuǎn)化為了1個值,池化非常徹底。另外GAP層是沒有數(shù)據(jù)參數(shù)的。因?yàn)閰?shù)量少了,GAP也降低了過擬合的風(fēng)險。一般情況下,可適應(yīng)任意尺寸的圖片輸出。因?yàn)椴还茌斎氤叽缍啻?,通過GAP都轉(zhuǎn)化為了長度和最后一層特征圖channel等長的特征向量,對于一個設(shè)計好的網(wǎng)絡(luò),該值為固定值。所以在部署測試的時候,網(wǎng)絡(luò)可以處理不同尺寸的圖片,而不需要resize。 GAP直接對特征層的空間信息進(jìn)行求和,整合了整個空間的信息,所以網(wǎng)絡(luò)對輸入的空間變化的魯棒性更強(qiáng)。

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

其中
?為最后一層特征圖位置?
?的值,?
為類別c的全連接權(quán)重。
該方法的缺點(diǎn)是只能適用于最后一層特征圖和全連接之間是GAP操作。如果不是,就需要用戶修改網(wǎng)絡(luò)并重新訓(xùn)練(或 fine-tune)。所以對本文簡單概括即為:修改網(wǎng)絡(luò)全連接為GAP形式,利用GAP層與全連接的權(quán)重作為特征融合權(quán)重,對特征圖進(jìn)行線性融合獲取CAM。
核心代碼解讀:
代碼非常簡單, 提取到特征圖和目標(biāo)類別全連接的權(quán)重,直接加權(quán)求和,再經(jīng)過relu操作去除負(fù)值,最后歸一化獲取CAM,具體如下:
# 獲取全連接層的權(quán)重
self._fc_weights = self.model._modules.get(fc_layer).weight.data
# 獲取目標(biāo)類別的權(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)心的是對分類有正面影響的特征,所以加上了relu以移除負(fù)值。其實(shí)并不一定要是分類問題,只要是可求導(dǎo)的激活函數(shù),在其他問題也一樣使用Grad-CAM。特征融合權(quán)重計算公式如下:

其中
為目標(biāo)類別的score,后面會論述該score具體是什么。?
?為需要可視化的目標(biāo)特征圖。論文里證明了grad-CAM是上文利用GAP一般形式,這里不再復(fù)述,具體可看論文附錄。這里提出兩個問題并進(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)類別score?
是用通過softmax之后的還是之前的?

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

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

可以看出,二者的梯度差異就是softmax輸出的多一項(xiàng)
?,而對于已經(jīng)訓(xùn)練好的網(wǎng)絡(luò),該項(xiàng)為定值。后面特征層進(jìn)行加權(quán)求和,再歸一化后,該項(xiàng)?
?會被消掉。所以通過softmax和不通過softmax在理論上完全一致。但是在實(shí)際應(yīng)用中我發(fā)現(xiàn),加上softmax后,權(quán)重?
?會變得非常小,就是因?yàn)橛?xùn)練的充分好的網(wǎng)絡(luò),預(yù)測輸出?
?的值是非常接近1的,所以?
的值非常非常小,存在丟失精度的風(fēng)險。所以目標(biāo)類別score建議使用不經(jīng)過softmax的值。
核心代碼解讀:
僅需要對目標(biāo)類別的score進(jìn)行求導(dǎo), 然后追蹤到目標(biāo)特征圖的梯度, 對該梯隊(duì)進(jìn)行element-wise求平均(GAP操作)即獲得特征融合的權(quán)重。具體如下:
# 利用onehot的形式鎖定目標(biāo)類別
one_hot = np.zeros((1, output.size()[-1]), dtype=np.float32)
one_hot[0][index] = 1
one_hot = torch.from_numpy(one_hot).requires_grad_(True)
# 獲取目標(biāo)類別的輸出,該值帶有梯度鏈接關(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)
# 獲取對應(yīng)特征層的梯度map
grads_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é)果,定位會更精準(zhǔn),也更適用于目標(biāo)類別物體在圖像中不止一個的情況。Grad-CAM是利用目標(biāo)特征圖的梯度求平均(GAP)獲取特征圖權(quán)重,可以看做梯度map上每一個元素的貢獻(xiàn)是一樣。而本文認(rèn)為梯度map上的每一個元素的貢獻(xiàn)不同,因此增加了一個額外的權(quán)重對梯度map上的元素進(jìn)行加權(quán)。其中該權(quán)重
如下:

其中c為目標(biāo)類別, k表示特征圖第 k層(或者說第 k個channel),
?為該層特征圖上的元素位置??梢钥闯龉街杏玫搅硕A偏導(dǎo)和三階偏導(dǎo),計算會更復(fù)雜。本文不做詳細(xì)推導(dǎo),具體可見論文。
核心代碼解讀:
這里值得說明的是, 上面的公式有二次偏導(dǎo)和三次偏導(dǎo),論文中進(jìn)行了冪次方的轉(zhuǎn)化,實(shí)現(xiàn)更容易。
## 獲取特征權(quán)重的過程
# 反向傳播
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)重map
alpha = 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來優(yōu)化CAM效果,首先解釋一下smoothGrad。對于分類網(wǎng)絡(luò),最終分類類別取決于哪個類別的score最大,公式為:

其中x為輸入圖片,
為類別c的類別score。
對x求導(dǎo),獲?。?/p>

?表示x的每個像素的微小變化會對c類的分類score產(chǎn)生多大的影響,稱之為saliency maps,如下圖。

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

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

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

上圖中,對于Grad-CAM++中的 ?
?被替換成了?
?,其中?
?表示為添加噪聲的原圖獲取的?
,共進(jìn)行了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)
# 對特征層加權(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 += cam
total_cams /= self.n_samples # 求平均操作
return total_cams.datagradient-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)為:
對于深度神經(jīng)網(wǎng)絡(luò),梯度可能是存在噪聲的,并存在飽和問題。 利用Grad-CAM很容易找到錯誤置信度的樣本,既具有更高權(quán)重的激活圖對網(wǎng)絡(luò)輸出的貢獻(xiàn)較小的例子。
因此本文提出了gradient-free 的做法。首先,作者定義了CIC( (Increase of Confidence)的概念,既相對于baseline圖片的置信度增量,公式如下:

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

本文的做法流程為:

解釋一下:對獲取的特征圖進(jìn)行channel-wise遍歷,對每層特征圖進(jìn)行上采樣+歸一化,與原始圖片進(jìn)行pixel-wise相乘融合,然后送進(jìn)網(wǎng)絡(luò)獲取目標(biāo)類別score(softmax后),減去baseline的目標(biāo)類別score,獲取CIC。再進(jìn)行softmax操作來保證所有CIC之和為1。最后將CIC作為特征融合權(quán)重融合需要可視化的特征層。
核心代碼解讀:
值得注意的是,計算CIC時默認(rèn)使用的baseline為全黑的圖片,既全0的矩陣,因此CIC score不需要減去baseline的score。
with torch.no_grad():# gradient-free, 所以不需要計算梯度
for i in range(K): # 對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ò)獲取對應(yīng)類別得分
output = self.model_arch(input * norm_saliency_map)
output = F.softmax(output)
score = output[0][predicted_class]
# 利用該得分作為權(quán)重對該層的特征圖進(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)系類似于smooth Grad-CAM++ 和 Grad-CAM++的關(guān)系。本文同樣是利用了smoothGrad技術(shù)來降低輸出噪聲。關(guān)于smoothGrad平滑策略, 本文給出了兩種做法,一種是噪聲增加在特征圖上,一種是噪聲增加在輸入圖上。這兩種做法在論文給出的不同數(shù)據(jù)集上的測試指標(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分析來確定特征圖上每個單元的重要程度。Ablation Study 可以理解為通過控制變量地進(jìn)行移除各種組件等來探究各個因素對于模型整體貢獻(xiàn)的強(qiáng)弱多寡,找到對性能最主要的影響因素,這里不對該理論作過多介紹。直接看文章的做法。

k為特征圖的channel個數(shù),這里的?
?是原始圖片c類別的類別score輸出,?
?為將特征圖第k個channel全部設(shè)置為0后,將原始圖片再送進(jìn)網(wǎng)絡(luò),獲取的c類別的score。二者得分的之差,再除以
?就獲取slope,其實(shí)就是特征融合的權(quán)重。
由于計算?
?是個比較耗時的操作,于是有下面的簡化形式:

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

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

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

