keras CAM和Grad-cam原理简介与实现
万字长文:特征可视化技术(CAM)

CAM是什么

CAM全称Class Activation Mapping,既类别激活映射图,也被称为类别热力图、显著性图等。是一张和原始图片等同大小图,该图片上每个位置的像素取值范围从0到1,一般用0到255的灰度图表示。可以理解为对预测输出的贡献分布,分数越高的地方表示原始图片对应区域对网络的响应越高、贡献越大。
为了更直观表达,一般将灰度图转化为彩色图。例如可以使用Opencv 函数转换:

  1. img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_JET) # 将灰度图转化为伪色彩图,
  2. # COLORMAP_JET 为输出的颜色模式

可视化的时候,可以利用热力图和原图叠加的形式呈现。如下图,颜色越深红的地方表示值越大。可以认为,网络预测“狗”这个类别时,红色高亮区域是其主要判断依据。
image.png

CAM有什么用

  • 有助于理解和分析神经网络的工作原理及决策过程,进而去更好地选择或设计网络。例如对于分类网络,如果参考CAM相当于除了分类accuracy以外,对网络又提出了更高的要求:不但要求预测准确率高,还需要网络提取到我们需要的特征。下图可以看出,不同网络对相同的数据的CAM是有较为明显的差异。当然即便是同一个网络,不同训练过程也会导致CAM有很大的差异。

CAM和Grad-CAM - 图2
A.原始图片 B. Resnet50 预测结果 C. Resnet34 预测结果

  • 利用可视化的信息引导网络更好的学习,例如可以利用CAM信息通过”擦除”或””裁剪””的方式对数据进行增强;
  • 利用CAM作为原始的种子,进行弱监督语义分割或弱监督定位。既然CAM能够cover到目标物体,所以可以仅利用分类标注来完成语义分割或目标检测任务,极大程度上降低了标注的工作量,但这对CAM的要求更高。一般情况下,分类网络只会提取到最具有判别性的特征。所以也有很多做法来提高分类网络的CAM精准度,如下图。

image.png

如何获取CAM

CAM和Grad-CAM - 图4

  • 卷积神经网络的卷积操作可以看做是滤波器对图片进行特征提取,通过滑动窗口的方式实现,因此特征层和输入图片存在空间上的对应关系。如上图表示某层特征图, CAM和Grad-CAM - 图5 表示特征图第 CAM和Grad-CAM - 图6CAM和Grad-CAM - 图7CAM和Grad-CAM - 图8 列的值,可以认为是被层层卷积核过滤后而保留的有效信息,其值越大,表明特征越有效,对网络预测结果越重要。一个深层的卷积神经网络,通过层层卷积操作,提取空间和语义信息。一般存在其他更难理解的层,例如分类的全连接层、softmax层等,很难以利用可视化的方式展示出来。所以,CAM的提取一般发生在卷积层,尤其是最后一层卷积。通常每一层的特征图还会有很多层,一般称为channel(通道),例如Resnet18最后一层特征图有512个通道。这512个通道可以认为提取到不同的特征,该特征具有高度抽象性,且每个通道对最后的结果贡献不同,因此单独可视化每个通道获取热图也让人很难理解。所以一般CAM的获取是根据每个通道不同的贡献大小去融合获取一张CAM。
  • 所以,总结CAM获取的步骤如下:

step1:提取需要可视化的特征层,例如尺寸为 CAM和Grad-CAM - 图9 的张量;
step2:获取该张量的每个channel的权重,即长度为512的向量;

  • 根据获取权重的方式不同,分为CAM、Grad-CAM等。

step3:通过线性融合的方式,将该张量在channel维度上加权求和,获取尺寸为77的map;
*step4
:对该map进行归一化,并通过插值的方式resize到原图尺寸;

  • 类似目标检测领域 anchor-base和anchor-free, CAM也有两种不同的阵营gradient-based和gradient-free。 做法不同,其本质类似: 提取目标特征层,并进行加权融合获取激活图(CAM)。 主要的区别在于上述step2叙述的特征层之间融合权重的选择上。gradient-based利用梯度获取权重,gradient-free 则不需要梯度信息。本文根据时间顺序,解析7篇比较重要CAM获取方式的论文,帮助读者对网络处理信息流有更深入的理解。 “Talk is cheap. Show me the code”。本文也会给出核心代码实现的解释。

    本文涉及的论文

    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

更通用的做法:Grad-CAM

Grad-CAM++

Smooth Grad-CAM++