工作中碰到某些公司的深度学习软件,能够在分类的过程中显示神经网络感兴趣的区域,从而了解训练是否朝着我们所期望的方向进行,避免花费大量的训练时间在错误的模型上。这个功能让人眼前一亮,因此深入了解了一下。

论文地址

CAM算法来源于论文Learning Deep Features for Discriminative Localization,论文地址
https://arxiv.org/pdf/1512.04150.pdf

Github 地址: https://github.com/metalbubble/CAM/blob/master/pytorch_CAM.py

论文解读

论文首先回顾了**Global Average Pooling ** 即全局平均池化方法,该方法是在最后一层卷积层产生的feature map后增加一个(1×1×类别数量)的卷积核,这样feature map 就变成了(w×h×类别数量),对于每一个w×h的feature map 上面的像素求平均值。从而替代全连接层,使得神经网络成为全卷积网络。全局平均池化相比全连接层主要有两个优点:

  1. 模型更轻量化(minimize the number of parameters): 众所周知,卷积神经网络大量的参数主要来源于全连接层,去掉了全连接层,模型大小自然大幅减少;
  2. 获得目标定位的能力(即论文中的object localization): 因为卷积神经网络的全连接层会将最后一层的feature map 拉平来和全连接层相连,这样空间位置信息就被破坏了,而全局平均池化不需要破坏空间结构;

之后论文谈论了作者算法与目前算法相比的优势:

  1. weakly-supervised object localization:在这个方向上,目前 Bergamo 提出了通过给图像部分区域mask来判断能够对模型有最大激励作用的区域。Cinbis 通过组合多个CNN特征来定位目标。然而这些方法不是end-to-end,而且需要多次前向传播来定位目标,相比作者的算法不够实用。其实作者的想法来源于Oquab 的Global Max Pooling, 如果最大值在目标的边缘,将非常影响定位结果,但是如果使用平均值能够有效地避免。
  2. 可视化CNN: 为了更好的理解卷积网络的特性,我们希望可视化cnn内部。有人使用反卷积来可视化哪个pattern激励哪个unit。也有人证明了,CNN在识别场景的时候同时也具备目标检测的能力,因此,可以在一次前向传播时,同时得到位置和类别。也有人尝试分析CNN编码过程,他们通过调转不同层的深度特征,然而其中用到了全连接层,只能知道哪些特征被保留下来,无法知道每一个特征的重要性。从而作者提出自己的方法CAM,能够明确知道那一块区域神经网络能够区别对待。

Class Activation Mapping(CAM)

本文的重点就是介绍如何通过全局平均池化在CNN中生成CAM。整个流程其实很简单,以分类网络为例:Class Activation Mapping算法解读
1.找到倒数第二层,即输出层(softmax)的前一层,图像通过层层卷积到倒数第二层产生conv feature map作为生成CAM的基底。
2.由于是全卷积网络,倒数第二层是1*1大小的卷积核,对应的参数应当是 待分类数C×倒数第三层卷积层数N×1×1,因此取出所有的参数。对于类别C,会有

original_CAMc =wc1 * Feature map1+ wc2 * Feature Map2 + ……+wcn * Feature Mapn (其中n为倒数第三层卷积核的数量,C为倒数第二层卷积核的数量)

3.对于original_CAM,我们还需要对其归一化,即整体减去最小值,再除以最大值。并将其上采样到神经网络输入的图片尺寸。最终再resize成原始图片的图片尺寸。
这里的公式和论文中的有些不同,主要是按照自己的理解写出来的,总体是一个意思。

GMP VS GAP

GMP能够帮助神经网络找到一个不同的区域,而GAP则能够更精确的找到目标存在在图像中的范围。对于GAP来说,所有的较高的值都会对整体训练有比较大贡献,因为是取平均,而对于GMP来说,只有最大值的那个点对训练会产生贡献。作者在ImageNet上测试了两种全局池化方式,发现分类结果相近,但是定位的结果GAP远远超过GMP。

结尾

接下来就是将GAP用在各种结构的网络上效果的提升,以及各种实验结果,此处不再赘述。前面提供的github仓库里有个pytorch的demo,仔细研究一下demo以及上面的公式,应该就可以完全理解。
第一次写博文,有不对的地方,还望指正,有问题欢迎交流。

相关文章:

  • 2021-05-11
  • 2021-07-13
  • 2021-04-23
  • 2022-01-04
  • 2021-11-05
  • 2021-06-27
  • 2022-01-14
  • 2021-04-01
猜你喜欢
  • 2021-10-14
  • 2022-01-05
  • 2022-12-23
  • 2021-10-12
  • 2021-11-12
相关资源
相似解决方案