概述
CAM(Class Activation Mapping),与原始图尺寸相同,每个位置取0到1,。理解为对预测输出的贡献分布。利用可视化分析网络提取的重点特征,如果CAM能够把握到相应的重点即可相对便捷的进行目标检测的标注。
由于全连接层和softmax层会更难理解,已经更为抽象,所以一般选择最后一个卷积层进行分析。但是最后一个卷积层会有很多通道,每一个通道所提取的特征不同,对最后的抽象特征的贡献也不同。
步骤:
- 提取需要可视化的特征层,77512张量
- 获取channel的权重,512维度的向量
- 线性融合,张量在channel维度上进行加权求和—>7*7
- map进行归一化,resize到原图
- (gradient-free与gradient-based)主要区别在于特征层融合权重的选择上,是否需要梯度信息
「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)
-
相关论文阅读
Learning Deep Features for Discriminative Localizatiion 2016
优点:
使用了GAP(全局平均池化),无论W*H的大小,转化输出为1
整合了整个空间的信息,网络对输入的空间变化更robust
# 获取全连接层的权重
self._fc_weights = self.model._modules.get(fc_layer).weight.data
# 获取目标类别的权重作为特征权重
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操作,去除负值
batch_cams = F.relu(batch_cams, inplace=True)
# 归一化操作
batch_cams = self._normalize(batch_cams)
Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization 2016-2020
优点:
为了适应非GAP的网络
- 为了可以适应任意一层进行热力图,适用于梯度表达,只要可求导的激活函数即可
参考: