CAM 系列论文阅读总结
1.1 CAM 是什么?
1.1.1 热成像仪
1.1.2 CAM通俗解释
CAM全称Class Activation Mapping,既类别激活映射图,也被称为类别热力图。
其原理与热成像仪产生的热力图类似。当我们需要模型解释其分类的原因时,它以热力图的形式展示它的决策依据,如同在黑夜中告诉我们哪有发热的物体。
可视化的时候,可以利用热力图和原图叠加的形式呈现。如下图,颜色越深红的地方表示值越大。可以认为,网络预测“猫”这个类别时,红色高亮区域是其主要判断依据。
CAM属于模型可视化,即说明模型对分类结果的解释性或依据。具体来说就是对某一类别具有可解释性。
1.2 CAM 有什么作用?
模型在训练的时候,你不知道模型到底学到了什么,就像是你教一个孩子学习东西,最终你给一两个示例,孩子分对了,但是孩子真的学习到你想要的区分特征了么,也就是说 get 到你的点了么?模型可视化就是做的这件事情
1.2.1 一个例子
举个例子,用神经网络模型来识别坦克(当时还没有深度学习的概念),他们采集了100张隐藏在树丛中的坦克照片,以及另100张仅有树丛的照片。一组顶尖的研究人员训练了一个神经网络模型来识别这两种不同的场景,这个神经网络模型效果拔群,在测试集上的准确率竟然达到了100%!于是这帮研究人员很高兴的把他们的研究成果带到了某个学术会议上,会议上有个哥们提出了质疑:你们的训练数据是怎么采集的?后来进一步调查发现,原来那100张有坦克的照片都是在阴天拍摄的,而另100张没有坦克的照片是在晴天拍摄的……也就是说,五角大楼花了那么多的经费,最后就得到了一个用来区分阴天和晴天的分类模型。
所以分类模型是否可靠?分类的依据是什么?如果让模型更具有解释性?
例如我们给孩子一张猫的图片,让他解释为什么这是一只猫,孩子会说因为它有尖耳朵、胡须等。而我们让CNN模型解释为什么将这张图片的分类结果为猫,只是让它标出是通过图片的哪些像素作出判断的。(严格来说,这样不能说明模型是否真正学到了我们人类所理解的“特征”,因为模型所学习到的特征本来就和人类的认知有很大区别。何况,即使只标注出是通过哪些像素作出判断就已经有很高价值了,如果标注出的像素集中在地面上,而模型的分类结果是猫,显然这个模型是有问题的)
1.2.2 CAM 的作用
(1)模型的可解释性
例如对于分类网络,如果参考CAM相当于除了分类accuracy以外,对网络又提出了更高的要求:不但要求预测准确率高,还需要网络提取到我们需要的特征。(不仅要分对,还要分的合理,有依据)
(2)弱监督定位
既然CAM能够覆盖到目标物体,所以可以仅利用分类标注信息来完成语义分割或目标检测任务,极大程度上降低了标注的工作量(预标注过程),但这对CAM的要求更高。一般情况下,分类网络只会提取到最具有判别性的特征。
1.3 CAM 的简单实现
如上图表示某层特征图,A表示特征图第层行列的值,可以认为是被层层卷积核过滤后而保留的有效信息,其值越大,表明特征越有效,对网络预测结果越重要。一个深层的卷积神经网络,通过层层卷积操作,提取空间和语义信息。通常每一层的特征图还会有很多层,一般称为channel(通道),例如Resnet18最后一层特征图有512个通道。这512个通道可以认为提取到不同的特征,该特征具有高度抽象性,且每个通道对最后的结果贡献不同。所以一般CAM的获取是根据每个通道不同的贡献大小去融合获取一张CAM。
步骤如下:
(1) 提取需要可视化的特征层,例如特征层为7x7x512
(2) 根据模型分类结果,取最大得分,获取分类类别,例如输出1000个类别,最大得分对应类别20
(3) 获取该类别(20)所对应的每一个channel的权重,即长度为512
(4)权重与channe在维度上加权求和,即获取7x7的map图。
w1*channel1 + w2*channel2 + ... + w512 * channel512 #每一个channel 大小为7*7
1.4 CAM 的发展
CAM的发展主要区别在于上述步骤3,权重的选择上,主要分为两种:
(1)gradient-free,主要代表有
- CAM (2015.12)
- score-CAM (2019.10)
- ss-CAM (2020.06)
- Ablation-CAM (2020)
(2)gradient-based
- Grad-CAM (2016.10)
- Grad-CAM++ (2017.10)
- Smooth Grad-CAM++ (2019.08)
gradient-based利用梯度获取权重,gradient-free 则不需要梯度信息。
1.5 开山之作:CAM
1.5.1 计算原理
先来看一下后面三层的计算过程:
CAM 的计算过程:
可以看出M的求解是不同的特征图加权求和的过程。而这些空间位置是可以映射到原图的。比如特征图大小是7*7,相当于把原图划分为7*7的网格。
1.5.2 复现结果
加载网络:squeezenet1_1
CAM以热力图的形式告诉了我们,模型是重点通过哪些像素来进行分类的了
GAP的重要性:
那么这时候我会想,引用GAP究竟是为了什么,我可不可以不用GAP算出热图,从维度关系上分析:对一般网络而言最后一层卷积层假如输出大小为5*5*256这种形式,那么FC层权重维度肯定是[256*5*5,C],但是这时候注意 也就是对于一个类别来说有256*5*5个权重,这时候这个权重大小是无法和256想对应的,也就是W和A是对应不上的,故不能得到热图
https://blog.csdn.net/daixiangzi/article/details/104594057?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
1.5.3 缺点分析
该方法的缺点是只能适用于最后一层特征图和全连接之间是GAP操作。
如果不是,就需要用户修改网络并重新训练。这极大地限制了它的使用场景。如果模型已经训练完成,或者训练成本很高,那么我们几乎不可能对其进行再训练。
所以对CAM简单概括即为:修改网络全连接为GAP形式,利用GAP层与全连接的权重作为特征融合权重,对特征图进行线性融合获取CAM。
1.6 Grad-CAM
1.6.1 计算原理
Grad-CAM求解过程:
从公式可以看出直接把GAP当做了一次均值计算,并没有直接在网络中引入GAP层
之所以使用ReLU激活函数,是因为我们只关注对于类别有关的区域,即特征图取值大于0的部分
针对特征图元素求导过程(链式求导法则)
relu 的作用:
Grad-CAM对最终的加权和加了一个ReLU,加这么一层ReLU的原因在于我们只关心对类别cc有正影响的那些像素点,如果不加ReLU层,最终可能会带入一些属于其它类别的像素,从而影响解释的效果。
因为我们真正感兴趣的就是哪些能够代表Tiger Cat这个类别的特征, 而那些小于0被舍弃的就是属于其他类别的, 在这里用上, 所有经过relu的参数能有更好的表达能力
1.6.2 复现结果
加载网络:Vgg16
1.6.3 grad-CAM和 CAM的区别?
(1)CAM 只能用于最后一层特征图和输出之间是GAP的操作,grad-CAM可适用非GAP连接的网络结构;
(2)CAM只能提取最后一层特征图的热力图,而gard-CAM可以提取任意一层;
1.7 Grad-CAM++
1.7.1 针对Grad-CAM的改进
相比grad_cam,定位更准确,能够适用于一张图片中的同类多目标的情况
主要公式:主要的变动是在对应于某个分类的特征映射的权重表示中加入了ReLU和权重梯度
Grad-CAM++的提出是为了优化Grad-CAM的结果,定位会更精准,也更适用于目标类别物体在图像中不止一个的情况。Grad-CAM是利用目标特征图的梯度求平均(GAP)获取特征图权重,可以看做梯度map上每一个元素的贡献是一样。而本文认为梯度map上的「每一个元素的贡献不同」,因此增加了一个额外的权重对梯度map上的元素进行加权。
1.7.2 计算原理
特征图上每一个元素所对应的权重求取过程:
进一步优化:
1.7.3 复现结果
加载网络:resnet18
- web跨域解决方案
- Bootstrap幻灯轮播如何支持触屏左右滑动手势?
- JavaScript 调试小技巧
- 图片上传预览js
- Isolation Forest算法实现详解
- css继承样式怎么控制?用选择器
- wordpress站内搜索结果页URL伪静态如何操作
- 如何实现大图居中超过的部分两边自动隐藏
- Ubuntu16.04安装后开发环境配置和常用软件安装
- wordpress如何屏蔽wp-json(禁用REST API)
- 贝叶斯系列——贝叶斯与其他统计流派的区别和联系
- bootstrap tab切换如何让鼠标移动自动切换内容
- css自动换行如何设置?url太长会撑开页面
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- winform总结5> winform程序开发注意事项
- mvc文件上传支持批量上传,拖拽以及预览,文件内容校验
- .net Core 1.0.1 下的Web框架的的搭建过程step by step
- 蓝牙芯片----BK34341开发笔记------快速入门(2)
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
- 蓝牙芯片----BK3431开发笔记------基本外部驱动应用(3)
- .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载
- 蓝牙芯片----BK3431开发笔记------RW stack中添加自定义服务教程(4)
- 图像简单处理
- 蓝牙---BLE GATT介绍
- Access数据库密码破解 C#
- 没啥用,更换注册表信息使webbrower选择适合的版本
- linux下分割和合并压缩包
- 编译.net .net Core程序 代码,仅做备份
- js删除数组对象中符合条件的数据