【学习打卡】GradCAM可解释性分析

文章目录

    • 引言
      • AI发展
      • CAM算法缺点
      • 高精度与可解释性
    • Grad-CAM
      • 算法原理
      • 应用:兼容各样任务
    • Guided Grad-CAM
      • Guided Backprop
        • 原理
      • Guided Grad-CAM
    • 实验
      • Grad-CAM、Guided Backprop和Guided Grad-CAM比较
    • 应用场景
      • 分析预测错误的原因
      • 各种任务
      • 发现数据集中的偏见
        • 题外话:水印
      • counterfactual map
      • 不同的层
    • 实际应用
      • 病灶检测
    • 讨论
      • 优点
      • 缺点
    • 延伸算法
      • Grad-CAM++
        • 解决的问题
        • 原理
        • 效果图
        • CAM、Grad-CAM、Grad-CAM++比较图
      • ScoreCAM
        • 解决的问题
        • 原理
      • LayerCAM
        • 应用
    • 扩展阅读

引言

  • Grad-CAM: Visual Explanations From Deep Networks via Gradient-Based Localization ICCV 2017
  • 对原生CAM(类激活热力图)改进,计算”特定类别预测分数相对于最后一层卷积层输出特征图每个元素的偏导数”,进而计算特征图每个channel对模型预测为特定类别的影响程度。
    • 无需修改模型,无需重新训练,即可对已有卷积神经网络模型绘制特定类别的Grad-CAM热力图,展示指定类别在原图上重点关注的特征区域,并用图像分类实现弱监督定位。可推广至图像分类、图像描述、视觉问答等多个任务。
  • 该课程由B站同济子豪兄主讲
  • 链接:
    • 课程链接:https://www.bilibili.com/video/BV1PD4y1B77q/?vd_source=2c3e1c3086544e2bbc96712d9fb90632
    • 代码实战:https://github.com/TommyZihao/Train_Custom_Dataset

AI发展

AI发展分 3 步:

  1. AI不如人类:可解释性可以帮助人们改进模型
  2. AI和人类水平相当:可 解释性帮助人类解释并信赖模型
  3. AI超越人类:可解释性可以帮助AI教人类进步

CAM算法缺点

  1. 必须得有GAP层,否则得修改模型结构后重新训练
  2. 只能分析最后一层卷积层输出,无法分析中间层
  3. 仅限图像分类任务

高精度与可解释性

高精度和可解释性是矛盾对立的 -> 平衡

  • 高精度 -> 复杂的模型
  • 可解释性 -> 简单的模型

CAM:改动模型结构(全连接层换成GAP) -> 牺牲精度 -> 换来可解释性

GradCAM:都要,不改动模型结果,不从头训练

Grad-CAM

算法原理

解决CAM三个缺点的

网络结构:普通的卷积神经网络结构,不需要一定是GAP层,全连接层也ok

图的分析:

  1. 输入一张 256 × 256 x 3 通道的彩色图片到卷积层中,最后输出feature map 512 x 14 x 14,即512个channel/512张纸,每张纸14 x 14,512页的纸落成一本书,输入到全连接层中,得到1000个类别(对于ImageNet数据集来说)的线性预测分数logit,用 y c y^c yc表示

    如果在CAM中,加了全连接层,该权重无法反应每个类别对最后一个卷积层/每一个channel的关注程度,因为全连接层把位置信息全部都丢掉了

  2. 故使用求梯度的方法,比如说tiger cat苦斑猫的分数,相对于这 512 x 14 x 14每一个数值的梯度。假如矩阵某个数值变大了一丢丢,它对最后网络预测为虎斑猫的预测分数产生什么样的影响,这就是导数的定义或者说是斜率的定义

    • 在卷积神经网络里面,一切都可以求导
    • y c y^c yc相对于每一个值的偏导数,它是512 x 14 x 14的,代表了512 x 14 x 14个元素每一个元素的偏导数, y c y^c yc 对它的偏导数
  3. 使用Global Average Pooling,如对这个蓝色通道 w n c w_n^c wnc/蓝色channel,给它求个平均,变成了蓝色的权重,同理得到512个权重,那么这个权重就和CAM里的权重在数学上是一样的/等价的,故可以用该权重来代替刚刚CAM里面的一个权重。

  4. 接下来把红色权重 × 红色channel + 紫色权重 × 紫色channel + …… + 最后一个权重 × 对应channel -> ReLU激活函数 -> tiger cat虎斑猫别热力图/Grad-CAM热力图,大小是14 x 14

  5. 双线性插值的方法缩放至原图,大小256 x 256。

  6. 虎斑猫在图像上关注的区域就是猫的这个区域

ReLU的作用:加了效果更好 -> 可以过滤无关特征(那部分不像虎斑猫)

总结:Grad-CAM算法原理,它避免了使用GAP,用全连接层的网络也完全ok,用求梯度的方法间接的求得这个权重,不需要修改网络结构,也不需要用数据重新训练,如果你来了一个用全连接层的网络,马上就可以用Grad-CAM做可解释新分析,绘制出每一个类别的Grad-CAM热力图了,所以这是一个非常不错的拿来即用算法。

应用:兼容各样任务

  • CAM只能应用在图像分类任务
  • Grad-CAM可以兼容各种各样的任务

Grad-CAM不管是什么任务,比如说图像描述任务视觉问答任务强化学习任务,只要这个任务,它输出的是一个东西,就可以求得该输出的东西,如512 x 14 x 14的每一个求偏倒数,进而得到结果

  • 甭管后边的任务多复杂
  • 甭管你用的是什么循环神经网络、长短时记忆神经网络
  • 甭管你用的是什么模态,是文字还是图像还是音频还是语音

举例子

比如在强化学习中,训练了一个超级玛利奥,它自己控制马里奥的上下左右,用这个方法分析,强化学习的智能体,当他决定往右走,知道为什么他会选择往右走,是因为右边有一个金币吗?左边有一个怪吗?他要躲避这个怪吗?还是说他要马上速通过关?可以用该方法解释强化学习的智能体的行为、解释它决策的依据是游戏画面上的什么东西使得他做出了向右的动作。

Guided Grad-CAM

Guided Backprop

原理

求得某一个输出【比如说虎斑猫(见上图)】的线性分类的logit相对于原始图像每一个像素的梯度,可以分析出每一个像素对模型预测为虎斑猫的影响程度,那么它得到的是一个细粒度的、高分辨率的图,256 x 256和原图一样大小的一个图。

Grad-CAM是一个粗粒度的,低分辨率的,14 x 14的一个矩阵。

Guided Grad-CAM

把Grad-CAM和Guided Backprop结合

  • 把14 x 14的Grad-CAM粗粒度的矩阵用双线性插值的方法缩放至256 x 256
  • 把该矩阵和Guided Backprop算法得到的矩阵逐元素乘法

得到Guided Grad-CAM图

  • 高分辨率的,256 x 256,和原始输入图像一样大
  • 满足Grad-CAM的类别判别性

(上图)比如说虎斑猫,会把虎斑猫的一些重要的像素描画出来,比如说身上的条纹、猫的鼻子、五官和耳朵

结论:故这是一个既高分辨率又具有类别判别性的可解释性分析的算法。可以细粒度地分析出图像中每个像素,每个部位对最后的影响。

实验

Grad-CAM、Guided Backprop和Guided Grad-CAM比较

  • 第 3 列:猫和狗,精准地定位成功

  • 第 6 列:对于Reset好几百层的模型,也是完全ok的

  • 第 2 列: 对于原来的Guided Backprop图,发现两张图非常像,里面又有猫又有狗,它的类别判别性比较弱

    • 第 3 列的Grad-CAM虽然是低分辨率的,但是类别判别性很强
    • 所以可以把Guided Backprop和Grad-CAM结合在一起,生成Guided Grad-CAM
  • 第 4 列:既是高分辨率又具有类别判别性。它只画出猫和只画出狗。比第 2 列强得多了

  • 第 5 列: 遮挡的方法。

    • 拿一个小滑块在原图上不同区域滑动得去遮挡,看遮挡住哪片区域会影响模型预测为猫的概率和预测为狗的概率。
      • 如果把一个滑块移到猫的区域,猫得类别会显著地受影响,会降低。
      • 如果移动到狗的脸上,模型预测为狗的概率就会降低,就是置信度会降低。

应用场景

分析预测错误的原因

利用Grad-CAM可以分析一些被网络预测错误的图片,能解释清楚为什么网络会预测错误,它也是情有可原的。

  • 第 1 列:图片标注的类别是volcano,火山是远景,但是网络预测的是沙滩,是近景。我们就知道网络为什么会犯错了
  • 第 2 列:图片标注的类别是volcano,但网络预测为汽车倒车镜,是因为这个圆椭圆的这个轮廓
  • 第 3 列:标注类别是烧杯,但网络预测为吸管,是因为吸管对应的区域确实很像吸管。
  • 第 4 列:标注类别是线圈,而网络预测为是蛇,确实这有点像一条蛇

第 2 行是top 1预测结果,第 3 行是top 5预测结果

不管是预测正确还是预测错误,都能够给出一个合理的解释,能让我们理解出网络为什么会做出这样的决策,知其然也知其所以然。

各种任务

左上角:

输入这张图片,网络根据图片生成一段描述性文字

  • 第一个图,一群人在海滩边放风筝,这一句话它关注的是图像中的哪些区域呢?风筝、人、海边、沙滩。
  • 第二个图,一个人在桌子旁边吃披萨,就人和披萨是高亮的。

左下角:

VQA视觉问答进行可解释性分析

输入图像,再往网络中输入一个问题。消防栓是什么颜色的?

  • 如果回答为红色,它关注的是消防栓的底部
  • 黄色关注的是消防栓的顶
  • 红色和黄色关注的是消防栓的全部

输出不同的答案,可以对应出网络的不同位置/图像的不同位置


右下角:同理

这是一个基于Resnet的VQA模型,Resnet是一个非常深的模型,按理说很难被解释的,是一个完全黑箱,但是通过Grad-CAM可以很好的解释啊,

同理

Torch是火炬,pytorch得图标也是一个火炬,预测错误是因为远处的闪光灯

发现数据集中的偏见

比如,用一个数据集去训练一个模型分辨医生、护士。按理说/日常生活的常识而言,医生中男性比较多、护士中女性比较多,如果该偏见被带入到数据集中,那数据集中男性医生比例偏高,女性护士的比例偏高,那训练出来的算法,可能误以为性别是决定医生、护士的一个重要特征,但是这是不科学、带有歧视和偏见的。谁说女性干不了医生,谁说男性干不了护士。

  • 第 2 列就是训练出来么一个带有偏见的模型。用偏见数据集训练出来带偏见的模型,它会关注脸的区域,比如说2-2图,他是一个医生,但是网络预测她是一个护士,依据是她脸部的区域,因为长头发或者女性的容貌,这是不对的,网络不应该看脸,而应专注于职业本身。

    • 可以通过热力图发现该偏见,进而改进我们的数据集,比如说女医生的数据多加一点、男护士的图片多加一点,从而把性别比例搞得均衡一点。
  • 第 3 列,用新数据集训练的模型,表现得很好,模型关注的是听诊器,而不再是长发及腰或者说是女性容貌跟性别无关了。

总结:所以用热力图可以发现数据集中的偏见,进而纠正模型的偏见

题外话:水印

第二行图片中间有个水印叫shutter stock,很多人工智能图片训练数据都来自于该图片网站,很多生成对抗网络训练出来的图片,会把这个水印也生成出来。所以你喂给网络什么数据就会学到什么,不管它是带水印的呀,还是带偏见的。ai不管这些的,它只关心自己的损失函数,

总结:大千世界有很多的敏感竞技话题,我们作为人要给ai把把关,不能让它学习到不公平的种族歧视的、性别歧视的这些偏见,可解释性分析就是检测ai有没有偏见的一个重要的探针和抓手。

counterfactual map

如果把求得的权重取个负号,然后再把画热力图画,那比如说虎斑猫的CAM图。就会画到狗的身上,狗的CAM图就会画到猫的身上,那这张图叫做counterfactual map就是,它反映的是与图像上与虎斑猫最无关的区域,因为加了一个负号,最相关就变成了最无关。

如果我们现在在做一个工业质检的一个模型,现在分析出,检测缺陷类别的counterfactual map,那么它画出的热力图中红色高亮区域,对应的是安全区,因为它是与缺陷最无关的区域。这对于一些细粒度的一些专业的问题非常重要。关于counterfactual map有很多论文在研究,这也涉及到machine teaching。

不同的层

不同的层也可以用Grad-CAM来研究

在CAM算法里,只能分析最后卷积层,现在各个层都可以研究

  • 只有越深层的网络,类别判别性才越高
  • 越往浅层走,这个Grad-CAM图就满屏都是

比如说到浅层的时候。这个relu2_1热力图既有狗的区域的高亮,也有猫的区域的高亮,而不再只是猫着一个区域高亮了

这是该算法的一个缺陷,我们一会儿在Layer CAM算法中做改进

实际应用

病灶检测

比如说,这是一个Kaggle的气胸检测的竞赛,从医疗图像上,医疗影像上来,用Grad-CAM定位出高量出病灶区域。这对于医学生的训练而言也是一个machine teaching,用大规模、大量的数据去训练一个ai,把它关注的区域展示给普通人/新手小白,因为它学到的知识通过大量数据验证/通过长时间学习习得,是非常靠谱的,它展示出来的高亮区域可供人参考。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXwzXSYw-1671525694922)(C:\Users\Trolley\AppData\Roaming\Typora\typora-user-images\image-20221219221246164.png)]

这是新冠肺炎的x光胸片的Grad-CAM图,可以发现新冠肺炎和普通肺炎是不一样的,关注的病灶区域是不一样的


讨论

优点

  1. 无需GAP层,无需修改模型结构,无需重新训练

  2. 可分析任意中间层

  3. 数学上是原生CAM的推广(论文附录有详细的证明)

  4. 细粒度图像分类、Machine Teaching

  5. CAM算法的优点也具备

    1. 对深度学习实现可解释性分析、显著性分析
    2. 可扩展性强,后续衍生出各种基于CAM的算法
    3. 每张图片、每个类别,都能生成CAM热力图
    4. 弱监督定位︰图像分类模型解决定位问题
    5. 潜在的“注意力机制”
    6. 按权重排序可得特征重要度,辅助Machine Teaching

缺点

  1. 图像上有多个同类物体时,只能画出一块热力图
  2. 不同位置的梯度值,GAP平均之后,影响相同的(常理说,边缘没有中心重要)
  3. 梯度饱和、梯度消失、梯度噪声
  4. 权重大的channel,不一定对类别预测分数贡献大
  5. 只考虑从后往前的反向传播梯度,没考虑前向预测的影响
  6. 深层生成的粗粒度热力图和浅层生成的细粒度热力图都不够精准

延伸算法

Grad-CAM++

解决的问题

解决了Grad-CAM的前两个缺点

  • 第一个缺点是图像中有多个同类物体,只能画出一块热力图,比如说图像中有三只猫,分别在左、右上、右下,经过卷积升级网络后,有一些channel捕捉左边猫的特征,有一些channel捕捉右上角猫的特征,还有一些channel捕捉右下角猫的特征。如果用Grad-CAM,只有一片热力图区域高亮,其他的值很低。但经过Crad-CAM++算法后,三个都是高亮的,解决了第一个问题。

  • 第二个问题是边缘和中心的像素,经过GAP之后,平均值权重的影响一样。通过给每个激活值/每个梯度值加一个权重,该权重通过二阶偏导数和三阶偏导数算出来,右下角的 S c S^c Sc是某类别的线性预测的logit,对它做指数/softmax得到最后的置信度。

原理

把虎斑猫类别的logit对最后卷积层的每个激活值的每个位置偏导数,有二阶偏导数,有三阶偏导数,算出来每一个位置的权重。每一个位置的权重不一样,那自然左下角的像素和中心的像素对最后的权重的影响也不一样了。

Grad-CAM++热力图是第一个channel × 第一个channel权重 + 第二个channel × 第二个channel权重 + …… + 最后一个channel × 最后一个channel的权重。

效果图

这么多苹果都是高亮的,还有右上第一个这么多狗,都很红

CAM、Grad-CAM、Grad-CAM++比较图

ScoreCAM

解决的问题

解决的是3、4、5的缺点

  • 第3个问题:梯度的饱和消失和噪声问题

    • 左上角:Gradient这列乱七八糟的什么像素都会有影响。第2 行 就算是蓝天背景的图片,不同的像素的梯度也是不一样的,对最后预测为某类别的影响也是不一样的,非常杂乱的,第三个不光是狗的区域,其他区域也会有很大的影响,这些区域的影响就会使得Grad-CAM聚焦没那么concentrate
  • 权重大的channel,不一定对类别预测的分数贡献大的问题。

    • 比如说火烈鸟的头,它的权重非常大,求GAP、求平均后,权重非常大。但是,该图输入到卷积神经网络中,channel本身的输出值不一定大,它对网络预测为它是火烈鸟类别的贡献也不一定大。只有channel的激活大 + 权重大 才可能使网络预测它为火烈鸟的置信度大。那他可能权重很大,但是激活很小,可能网络并没有关注到,不会出现很大的响应。

  • 只考虑从后向前,不考虑从前向后的问题。
    • Score-CAM,这是它标志性的图,它最终的效果会比Grad-CAM和Grad-CAM++,画出来的更加concentrate、更加收敛、更加聚紧

原理

输入一张图像,先输入到第一个卷积神经网络Phase 1中,得到比如说1000个channel,对这1000个14 x 14channel做上采样,得到1000个原图大小如256 x 256的channel,这些channel中一些对应狗的脚、狗的身体、背景,Phase 1结束。把1000个256 x 256的channel和原图逐元素的乘法。如果脚高亮的区域会把狗的脚区域取出来;身体区域高亮,会把身体这片区域取出来。

把1000个channel分别和原图做逐元素的channel就会把1000种原图区域取出来,再输入到第二个卷积神经网络,得到1000个类别的分数/权重,把这1000个权重和1000个高分辨率的channel线性组合。第一个权重 × 第一个颤抖 + 第二个channel × 第二个channel + …… +最后一个权重 × 最后一个channel,得到Score-CAM热力图。

score是啥意思呢?

  • 原来的Grad-CAM是从后往前反向传播求梯度的
  • 现在是从前向后算神经网络的输出值score的啊

LayerCAM

是由南开大学的程明明老师团队提出的

他解决的是深层生成的粗粒图和浅层生成的细粒度热力图都不够精准,也不够类别判别性这个缺点的。

效果图:粒度非常的精细,基本上达到了弱监督的、图像分割的效果

下图是中文版论文

在图中的右下角,可以看出网络越深,越粗粒度,类别判别性越好;而越浅的话,越细粒度,越高分辨率,但是类别范围性依然是很好的

总结:不同的CAM算法就是在一个权衡中,博得一个更优势的权衡。

应用

工业缺陷检测任务LayerCAM非常重要,它既是高分辨率的,又是类别判别性的。对于工业缺陷,可能在速度非常快的流水线上用高速摄像机、工业照相机拍摄到,普通人肉眼基本上分辨不出来。用现在这个方法能很快捕捉到,而且因为这种数据集非常难标注,故最好的方法是用弱监督的方法,收集到一些有缺陷的图片,用LayerCAM热力图的形式让他弱监督地定位,起到一个machine teaching的效果。

扩展阅读

Grad-CAM论文相关的扩展阅读、代码相关的扩展阅读和整理的一些扩展阅读以及我们讲它后续衍生的三种算法的论文。还有一些思考题,留给大家自己去思考。

你可能感兴趣的:(深度学习,Grad-CAM)