概述

CAM(Class Activation Mapping),与原始图尺寸相同,每个位置取0到1,。理解为对预测输出的贡献分布。利用可视化分析网络提取的重点特征,如果CAM能够把握到相应的重点即可相对便捷的进行目标检测的标注。
由于全连接层和softmax层会更难理解,已经更为抽象,所以一般选择最后一个卷积层进行分析。但是最后一个卷积层会有很多通道,每一个通道所提取的特征不同,对最后的抽象特征的贡献也不同。
步骤:

  1. 提取需要可视化的特征层,77512张量
  2. 获取channel的权重,512维度的向量
  3. 线性融合,张量在channel维度上进行加权求和—>7*7
  4. map进行归一化,resize到原图
  5. (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)
  • Ablation-CAM (2020)

    相关论文阅读

    Learning Deep Features for Discriminative Localizatiion 2016

    优点:

  • 使用了GAP(全局平均池化),无论W*H的大小,转化输出为1

  • 整合了整个空间的信息,网络对输入的空间变化更robust

    1. # 获取全连接层的权重
    2. self._fc_weights = self.model._modules.get(fc_layer).weight.data
    3. # 获取目标类别的权重作为特征权重
    4. weights=self._fc_weights[class_idx, :]
    5. # 这里self.hook_a为最后一层特征图的输出
    6. batch_cams = (weights.unsqueeze(-1).unsqueeze(-1) * self.hook_a.squeeze(0)).sum(dim=0)
    7. # relu操作,去除负值
    8. batch_cams = F.relu(batch_cams, inplace=True)
    9. # 归一化操作
    10. batch_cams = self._normalize(batch_cams)

    Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization 2016-2020

    优点:

  • 为了适应非GAP的网络

  • 为了可以适应任意一层进行热力图,适用于梯度表达,只要可求导的激活函数即可

参考:

  1. https://zhuanlan.zhihu.com/p/269702192