CAM算法
论文名称:Learning Deep Features for Discriminative Localization, CVPR2016
下载地址:https://ieeexplore.ieee.org/document/7780688
通过全局平均池化(GAP)层,获得指定类别对最后一层卷积层输出的每个特征图Channel的权重,进而计算CAM类激活热力图,展示指定类别在原图上重点关注的特征区域。并巧妙用图像分类实现弱监督定位。打破深度学习的黑箱子,让人工智能展示自己的“注意力”和“学到的特征”,使得Machine Teaching成为可能。深入理解它,解释它、改进它,进而信赖它。知其然,也知其所以然。
算法原理
CAM类激活热力图 深度卷积神经网络可解释性分析,显著性分析
输入原始图像 全卷积神经网络(无池化) 最后一个卷积层是512个14*14 chaanel ,经过全局平均池化GAP,得到512个平均数 (标量),后面输入到全连接层进行分类,得到对于每个类别(比如1000个类别)的权重,然后进行softmax操作,把1000个权重变成概率,每个概率都是0-1之间,并且1000个概率求和为1。
其中蓝色权重w1是最后一层卷积输出蓝色channel计算得到的,所以w1间接反映了预测结果对蓝色的feature map的关注程度。蓝色feature map既有语义信息也有位置信息。把所有的feature map和对应的权重相乘,得到热力图,然后再将热力图进行双线性插值,得到原图的大小,变成高分辨率的热力图。
缺点:必须用GAP(减少参数量,防止过拟合)代替全连接层重新训练;只能分析网络的最后一层,不能分析中间层。改进:Grad-CAM
为什么都用全卷积神经网络,而不用池化?
池化引入了平移不变性,也意味着失去了长宽方向的位置信息,因此在CAM热力图中,不使用池化操作。最后如果不使用GAP,将feature map分别flatten输入到FC中,也会失去位置信息。
Grad-CAM深度学习可解释性分析
论文名称:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization
下载地址:https://arxiv.org/abs/1610.02391
参考博客:https://blog.csdn.net/qq_37541097/article/details/123089851
推荐代码(Pytorch):https://github.com/jacobgil/pytorch-grad-cam
bilibili视频讲解:https://b23.tv/1kccjmb
算法原理
参见上图。这里我们简单看下Image Classification
任务,首先网络进行正向传播,得到特征层A (一般指的是最后一个卷积层的输出)和网络预测值y(注意,这里指的是softmax激活之前的数值)。假设我们想看下网络针对Tiger Cat这个类别的感兴趣区域,假设网络针对Tiger Cat类别的预测值为
y
c
y^c
yc。接着对
y
c
y^c
yc进行反向传播,能够得到反传回特征层A的梯度信息
A
′
A'
A′。通过计算得到针对特征层A每个通道的重要程度,然后进行加权求和通过ReLU就行了,最终得到的结果就是Grad-CAM。
为什么这样做呢?
首先特征层A是网络对原图进行特征提取得到的结果,越往后的特征图抽象程度越高,所包含的语义信息也越丰富,同时CNN提取的feature map是能够保留空间信息的(Transformer同样)。所以特征层A一般是指的最后一个卷积的输出。参考下图,可以看到,越深的特征层做出的CAM图效果更好。当然特征层A包含了所有我们感兴趣目标的语义信息,但具体哪些语义信息对应哪个类别我们并不清楚。接着通过对类别C的预测值 y c y^c yc进行反向传播,得到反传回特征层A的梯度信息 A ′ A' A′, A ′ A' A′就是 y c y^c yc对A求得的偏导,换句话说** A ‘ A‘ A‘代表A中的每个元素对 y c y^c yc的贡献**,贡献越大网络就认为越重要。然后对 A ‘ A‘ A‘在w,h上求均值就能得到针对A每个通道的重要程度(这里是对于类别c而言的)。最后进行简单的加权求和再通过ReLU即可。
关于Grad-CAM总结下来就是下面的公式:
L
G
r
a
d
−
C
A
m
c
=
R
e
L
U
(
∑
k
α
k
c
A
k
)
⏟
l
i
n
e
a
r
c
o
m
b
i
n
a
t
i
o
n
L_{Grad-CAm}^c = ReLU \underbrace{( \sum_k \alpha_k^cA^k)}_{linear \; combination}
LGrad−CAmc=ReLUlinearcombination
(k∑αkcAk)
其中,
- A代表某个特征层,一般指的是最后一个卷积层输出的特征层
- k代表特征层A AA中第k个通道(channel)
- c代表类别c
- A k A^k Ak代表特征层A中通道K的数据
- α k c \alpha_k^c αkc代表针对 A k A^k Ak的权重
关于
α
k
c
\alpha_k^c
αkc的计算公式:
α
k
c
=
1
Z
∑
i
∑
j
⏞
g
l
o
b
a
l
a
v
e
r
a
g
e
p
o
o
l
i
n
g
∂
y
c
∂
A
i
j
c
⏟
g
r
a
d
i
e
n
t
s
v
i
a
b
a
c
k
p
r
o
p
\alpha_k^c = \overbrace{\frac{1} {Z} \sum_i \sum_j}^{global \; average \; pooling} \underbrace{ \frac{ \partial y^c} {\partial A_{ij}^c}}_{gradients \; via \; backprop}
αkc=Z1i∑j∑
globalaveragepoolinggradientsviabackprop
∂Aijc∂yc
其中,
- y c y^c yc代表网络针对类别c预测的分数,注意这里没有通过softmax激活
- A i j k A_{ij}^k Aijk代表特征层A在通道k中,坐标ij位置处的数据
- Z等于特征层的宽度× 高度
论文中说使用使用ReLU是为了过滤掉Negative pixles,而Negative pixles可能是归属于其他类别的pixles。