CAM介绍
一直以来,深度神经网络的可解释性都被大家诟病,训练一个神经网络被调侃为“炼丹”。所得的模型也像一个“黑盒”一样,给它一个输入,然后得到结果,却不知道模型是如何得出结论的,究竟学习到了什么知识。如果能将其训练或者推理过程可视化,那么可以对其更加深入的理解,目前深度神经网络可视化可以分为:
- 可视化卷积核;
- 可视化特征图;
- 可视化激活热力图,也就是不同位置像素点对得出结果的影响程度
图 神经网络可视化汇总
其中,可视化卷积核 (a) 的方法最早出现,早在 2012 年的 AlexNet 就借助它来帮助解释 CNN 中卷积核的作用。
可视化特征图 (b) 方法出自 2014 年的《Visualizing and Understanding Convolutional Networks》一文,也就是上一期的学习的ZFNet的方法,这种方法通过反卷积和反池化对特征图进行了可视化,对于浅层网络的可视化效果良好。
而可视化类激活热力图(Class Activation Map, CAM),也就是本文的主角,提出自 2015 年,它能够更进一步地可视化神经网络在预测某一类别时,具体关注了图像的哪些像素。在此基础上,近年来也一直有改进的方法被提出,比如Grad-CAM,ScoreCAM等等
image from woopets(activation maps created with a pretrained Resnet-18)
简单总结:
- 对深度学习实现可解释性分析、显著性分析
- 可扩展性强,后续衍生出各种基于CAM的算法
- 每张图片、每个类别,都能生成CAM热力图
- 弱监督定位:图像分类模型解决定位问题
- 潜在的“注意力机制"
- 使得Machine Teaching成为可能
CAM算法原理
首先我们可以看到,他的过程实际上就是一个新的CNN网络,从输入图像,到CNN网络,再到一个全局平均池化GAP。从最后一个GAP中我们可以得到512个平均值,得到512个feature之后,最后的线性层实际上就是对得到的512个feature让神经网络去学习哪个的权重更大,最后得到最后的预测结果。
GAP全局平均池化
在常见的卷积神经网络中,全连接层之前的卷积层负责对图像进行特征提取,在获取特征后,传统的方法是接上全连接层之后再进行激活分类,而GAP的思路是使用GAP来替代该全连接层(即使用池化层的方式来降维),更重要的一点是保留了前面各个卷积层和池化层提取到的空间信息\语义信息,所以在实际应用中效果提升也较为明显!最早是在 Network In Network 中提出的。
这个全局平均池化,其实是对512x14x14的feature map进行做平均,这样就得到了512个平均值。实际上,GAP直接从 feature map 的通道信息下手,比如我们现在的分类有N种,那么最后一层的卷积输出的 feature map 就只有N个通道,然后对这个 feature map 进行全局池化操作,获得长度为N的向量,这就相当于直接赋予了每个通道类别的意义。文用GAP代替线性层是很有意义的,比如在VGG中,线性层的参数几乎占据所有参数的90%,所以进行替换是很有必要的;除此之外,我们会看到ResNet也有全局池化层。因为线性层不是起主要作用的,但是却占据了很多的参数,在ZFNet中也已经探究过了最后一层了,所以替换为GAP层既能减少参数,也不会太对模型造成影响。
GAP简单总结
- 取代全连接层,避免使用全连接层导致参数量爆炸
- 全局平均池化 (GAP) 减少参数量、防止过拟合
- 而且每个GAP平均值,间接代表了卷积层最后一层输出的每个channel
GAP VS GMP
这里面作者讲了一下GAP和GMP,那为什么不用GMP呢,实际上GAP对关键区域范围内的特征都有影响,但在GMP中,非最大值的特征不影响模型分类性能,虽然GAP和GMP分类性能接近,但定位性能不同,所以最后还是选择了GAP。
CAM算法的缺点及改进
CAM算法确实很不错,但是他也存在一部分的缺点
1.必须得有GAP层,否则得修改模型结构后重新训练
2.只能分析最后一层卷积层输出,无法分析中间层
所以在后续的Grad-CAM中,针对这两个问题就进行了改进,利用求梯度的方法,这样就不需要对模型重新训练,并且也可以对每一层卷积层都能进行分析,得到最后的激活图,后续会对Grad-GAM进行学习。
CAM简单概括即为:修改网络全连接为GAP形式,利用GAP层与全连接的权重作为特征融合权重,对特征图进行线性融合获取CAM。
CAM可视化
通过线性分类权重,间接反映了类别对通道(channel)的关注程度,最后一层卷积层既保留了语义信息,又保留了位置信息。将某一类的线性分类权重与最后一层卷积层进行对应相乘,可得到该类的CAM类激活热力图。
所以最后其实是得到最后的M c按照权重,最后进行上采样回原图的shape,最后就可以得到我们的类激活热力图。
同张图,不同类别
除此之外,由于因为CAM基于分类,所以被激活的区域是根据分类决定的,即同一个特征图,只更新不同的权重。所以即使我们使用同一张input,就像下面这个例子,这一同一张图,查看不同的类别
示例图片的地面真值是圆顶。五张类激活映射分别是前五名预测类别和得分。我们可以看到如果输出是宫殿,网络关注的是整块区域的。如果输出是圆顶,网络只是关注宫殿顶部。
不同图,同个类别
我们还可以查看,不同图,同个类别的可视化,从中我们会发现,实际上抓取的信息都是类别的主要特征,比如狗主要的是头的特征等的,这些也可以体现出CAM的重要意义
CAM弱监督定位
所谓的弱监督定位,实际上是用图像分类标注训练定位、检测、分割。
在早期的方法中,有一些比如可使用图像遮挡测试进行定位,可使用重叠图块进行预测,但是这些工作需要多次前向预测,并且是非端到端的;也可使用全局最大池化,导致只能获得边缘点,而非物体范围。
但是提出了CAM之后,这个方法可以使用GAP全局平均池化后进行绘制CAM热力图,并进行物体定位,只需要取连通图的20%的区域画出框,就可以得到结果。
直观上来说,CAM表示出了神经网络较为关注的区域,并且确定了类别,所以我们就可以认为,神经网络关注的区域按理来说,应该是类别的区域,在下图,我们也可以看到出来的他的表现,可以看出来,表现的还是比较好的,论文中认为IOU的阈值为0.5,最后的准确率大概能达到41%以上,比随机框的0.5%好很多。
用语义特征编码进行分类
由于我们的GAP层后,学习到了一部分有用的特征,所以在这个时候,我们就可以取出这一部分语义特征,对语义特征进行分类,其实简单来说,就是把训练好的模型的GAP层的输出,放到SVM线性层进行分类,判断是否能学到知识,其实我觉得这个和线性层是类似的,是相同的。除此之外,作者还在很多数据集上进行了测试,都得到了不错的结果,也侧面说明,实际上GAP从中还是学习到了很多的知识的。
CAM各种有意思的应用
CAM还可以利用在很多有意思的区域,这里面列了几种,还是非常有意思有意义的,也侧面展示了CAM是非常非常有用的,让我也个人感觉是非常make sense的。
发现场景中有意义的物体
我们可以用CAM可以看到场景中的一些物体,我们可以看到CAM关注的区域,实际上就是,对于场景有重要意义的位置。
定位比较抽象的概念
还可以通过一个短语训练一个网络,通过检测文字的信息,这样可以得出图像和短语中有意义判断的区域
弱监督文字检测
还可以进行文字检测,进行文字检测,我们可以看到CAM图关注的还是文字的区域
VQA任务
我们还可以做VQA任务,我们可以对得到结果在图像中表现出来,比如brown是哪一部分,在图像中也会展示出来。
显著性分析的意义
在学习过程中,我发现很有意思的一个东西,就是从Machine Learning到Machine Teaching,在视频中讲解了一个博士做的一个工作的结果,在一定的训练和学习的时候,AI已经能够达到远超人类的能力了,这个时候,AI已经可以可以教一些工人去学习,告诉他们哪一部分是比较重要的了,去teach和帮助人类去学习了。
包括还有一篇比较有意思的论文,Making a Bird AI Expert Work for You and Me,AI已经可以教你去识别各种鸟类了,他可以帮助你成为专家,教你去学习
其实听到这一部分,我觉得很有意思,实际上AlphaGo不就是在做这样的事情么,包括腾讯的绝艺机器人成为国家的陪练,这时候AI已经超过了人类的,他可以反过来去教人类怎么下围棋,怎么跳出一个已有的框,得到更好的结果。
但是,有些人说的也对,这有什么意义呢,如果AI已经表现的很好,那我们的钻研可能就变成了没什么意义了,有些人苦练围棋三十载,准备一鸣惊人的时候,AI已经双手插兜,找不到对手了,那他可能苦练的意义就不大了,这也是一种悲哀。不过在某一方面,AI在学习,我们人也在学习,科技的进步一定是有意义的,一定会对我们的生活带来好处。
总结和思考
- 为什么要对深度学习模型做可解释性分析和显著性分析?
- CAM有哪些应用场景?
- CAM方法,与基于梯度和反向传播的显著性分析方法,有什么区别?
- 原始的CAM方法有什么缺点?后续有哪些算法做了什么样的改进?
- 论文中,如何用CAM热力图实现物体的定位?这种定位方法的巧妙之处是什么?
- 如何理解CAM的“弱监督定位” ?
- 哪些经典的图像分类网络中用到了GAP层?
- GAP层在普通卷积神经网络中的作用是什么?
- GAP层在CAM中的作用是什么?
- 原生CAM仅用于图像分类,针对目标检测、图像分割、关键点检测等涉及位置坐标的Dense Prediction任务,如何进行可解释性分析和显著性分析?
- CAM方法有哪些缺点?如何改进?
对于CAM中的弱监督的物体定位,其实是用图像分类标注训练定位、检测、分割,可使用图像遮挡测试进行定位,可使用重叠图块进行预测,这些工作需要多次前向预测,并且是非端到端的;也可使用全局最大池化,导致只能获得边缘点,而非物体范围。可以使用GAP方式进行绘制CAM热力图,并进行物体定位,只需要取连通图的20%的区域画出框,就可以得到结果。
与反向传播的显著性分析方法来比,实际上CAM生成是一个粗粒度的矩阵,而基于反向传播的方法实际上生成的比较细粒度的矩阵,在CAM的附件中有,他的方法实际上是求了对于每一个像素的梯度,所以是比较细粒度的,这两者是不同的,从下图我们也可以看到一些比较。
在论文中,实际上是通过对CAM热力图的连通性进行操作,取最大值的20%的区域进行画框,这样就可以完成定位,这样定位的巧妙之处在于,实际上不需要通过更多的任务,我们只通过有图像分类的数据集就可以实现物体的定位,非常巧妙。
在一些经典的图像分类网络中,我所知道的Inception和ResNet其实就用到了GAP层,这其实极大的减少了参数,也提高了网络的泛化性,是一个很好的尝试和改进。
读了这篇论文后,让我知道,CAM 可视化可以帮助我们理解模型原理,分析预测错误的原因。但是需要注意的是,CAM 的可视化只能解释模型在分类时关注的区域;除此之外,CAM使得弱监督学习发展成为可能,可以慢慢减少对人工标注的依赖,能降低网络训练的成本。通过可视化,就像往黑箱子里打了一个手电筒,让人们可以尝试去理解网络,是非常好的一篇论文。
参考阅读
- 可以根据按照代码教程:https://github.com/TommyZihao/Train_Custom_Dataset,用pytorch训练自己的图像分类模型,基于torch-cam实现各个类别、单张图像、视频文件、摄像头实时画面的CAM可视化
- torch-cam库的github https://github.com/frgfm/torch-cam