生也有涯,知也无涯。这篇文章主要讲述浅谈Class Activation Mapping(CAM)相关的知识,希望能为你提供帮助。
原文地址:https://www.cnblogs.com/luofeel/p/10400954.html
第一次接触Class Activation Mapping这个概念是在论文《Learning Deep Features for Discriminative Localization 》(2016CVPR)中。
简单来说,这篇文章主要介绍了两个核心技术:
GAP(Global Average Pooling Layer)
和
CAM(Class Activation Mapping)
- GAP(全局平均池化层)
文章图片
我们可以直观的看到,从卷积层到池化层,深度不变,尺寸变小了。我们使用更小尺寸的特征图来表示输入,虽然会丢失一些信息,但是池化层可以防止过拟合,降低维度,保留主要特征的同时减少计算量,减少了参数数量。
全局平均池化也一样,可以用来正则化。让我们来看一个容易的例子,我想这个相信可以帮助我们理解全局平均池化。
文章图片
首先是Max pooling(最大池化)。如图所示,最大池化是选择每个子区域的最大值,然后使用子区域的最大值表示该子区域。
Average pooling(平均池化)是指计算出子区域的平均值,用一个平均值来分别表示子区域子区域。
与平均池化类似,Global Average Pooling(全局平均池化)是指计算整个区域的平均值,仅用一个值来表示整个区域。通过下面这个图,我想我们可以更直观的理解GAP。
文章图片
左边是一个特征图。高度为6,宽度为6,深度为3。当它经过GAP,我们把每一层的参数用一个值表示,这个特征图就变成一个1*1*3的特征向量。
【浅谈Class Activation Mapping(CAM)】第一个提出GAP这个想法的,是一篇叫做《Network in Network》的论文。这篇论文发现用GAP代替全连接层,不仅可以降低维度,防止过拟合,减少大量参数,网络的性能也很不错。
GAP怎么代替全连接层呢?让我们回到一开始的例子。
文章图片
如果我们使用GAP,我们必须改变网络的结构。首先我们把最大池化层和全连接层扔掉,只需要将其换成一个尺寸为1*1*512的GAP,之后和原网络一样接一个softmax层就可以了。当然这只是我从理论出发举的一个小小的例子,性能是否改变还没有做过实验。
如果我们使用GAP来代替FC,优点是最小化参数数量的同时保持高性能,结构变得简单,也避免了过拟合。但是缺点是和FC相比,GAP收敛速度较慢。
虽然这个GAP不是新的技术,但是在论文《Learning Deep Features for Discriminative Localization 》中,他们发现了GAP的一个作用,能保留空间信息并且定位(localization)
尽管在图像级标签上进行了训练,它仍能够区分判别图像区域。 并且在许多任务中它都可以定位判别图像区域,尽管只是训练基于解决分类任务。
- CAM(类激活映射)
文章图片
The class activation map is simply a weighted linear sum of the presence of these visual patterns at different spatial locations.使用论文中的话来说,类激活图仅仅是在不同空间位置处存在这些视觉图案的加权线性和。 通过简单地将类激活映射上采样到输入图像的大小,我们可以识别与特定类别最相关的图像区域。如果把这段话翻译成数学语言,就是如下的公式。
By simply upsamplingthe class activation map to the size of the input image, we can identify the image regions most relevant to the particular category.
文章图片
但是我想这样理解起来是很困难的,所以我想通过图片来解释它。
文章图片
这是一个基于分类训练的CNN网络,最左边是输入,中间是很多卷积层,在最后一层卷积层之后接的是全局平均池化层(GAP),最后接一层softmax,得到输出。我们刚刚说过,GAP就是把特征图转换成特征向量,每一层特征图用一个值表示,所以如果这个特征图的深度是512,那么这个特征向量的长度就是512。我们的输出是Australian terrier,澳大利亚梗。我们用Australian terrier这个类对应的权重乘上特征图对应的层,用热力图归一化,即下面一排热力图:W1*蓝色层+W2*红色层+… +Wn*绿色层=类激活映射(CAM),所以说CAM是一个加权线性和。通常来说,最后一层卷积层的大小是不会等于输入大小的,所以我们需要把这个类激活映射上采样到原图大小,再叠加在原图上,就可以观察到网络得到这个输出是关注图片的哪个区域了。这也就是说可以是任意输入图片的大小和卷积层的深度。
我还想说一点是,因为CAM基于分类,所以被激活的区域是根据分类决定的,即同一个特征图,只更新不同的权重。所以即使我们使用同一张input,就像下面这个例子。
文章图片
示例图片的地面真值是圆顶。五张类激活映射分别是前五名预测类别和得分。我们可以看到如果输出是宫殿,网络关注的是整块区域的。如果输出是圆顶,网络只是关注宫殿顶部。
- CAM的缺陷
为了解决第一个问题,2017年出现了一种改进的技术叫Grad-CAM,Grad-CAM可以不改变网络结构进行可视化,详见这篇论文《Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization》 (2017 ICCV)。
- CAM的应用
文章图片
在弱标记图像中定位比较抽象的概念:
文章图片
弱监督文字检测,它可以关注文字部分即使网络没有训练过文字或者任何注释框:
文章图片
关于视觉问答,我们可以看到网络关注答案区域:
文章图片
利用CAM的可视化技术,我认为CAM也能帮助我们对比模型,选择一个更合适的结构:
文章图片
在日常做实验的时候也可以利用CAM帮助我们发现问题,改进结构:
文章图片
这是一个简单的二分类问题,识别图片是猫还是狗,通过CAM技术,我们可以看到网络关注哪里。在第二排第一第二个结果中,网络错误的将猫识别为狗,使用CAM我们可以很快发现错误原因是对于两张图片网络忽略了猫,而关注了其他区域。所以CAM可视化这可以帮助我们理解网络。
CAM使得弱监督学习发展成为可能,可以慢慢减少对人工标注的依赖,能降低网络训练的成本。通过可视化,就像往黑箱子里打了一个手电筒,让人们可以尝试去理解网络。
推荐阅读
- 移动端App UI设计入门与实战(视频教程)
- Dapper系列作者(懒懒的程序员一枚)
- Spring源码学习AbstractApplicationContext.refresh()
- appium微信小程序
- uniapp - textarea层级过高影响到遮罩层
- .net core读取appsettings.config中文乱码问题
- 和大家交流一下微信IPAD安卓协议源码
- 创建并运行rn app项目
- MyBatis Mapper文件简述