梯度加权类激活热图(Grad-CAM)
Gradient-weighted Class Activation Mapping (Grad-CAM)
通过Grad-CAM我们能够绘制出如下的热力图(对应给定类别,网络到底关注哪些区域)。Grad-CAM(Gradient-weighted Class Activation Mapping)是CAM(Class Activation Mapping)的升级版(论文3.1节中给出了详细的证明),Grad-CAM相比与CAM更具一般性。CAM比较致命的问题是需要修改网络结构并且重新训练,而Grad-CAM完美避开了这些问题。
刚刚提到Grad-CAM能够帮我们分析网络对于某个类别的关注区域,那么我们通过网络关注的区域能够反过来分析网络是否学习到正确的特征或者信息。在论文6.3章节中举了个非常有意思的例子,作者训练了一个二分类网络,Nurse和Doctor。如下图所示,第一列是预测时输入的原图,第二列是Biased model(具有偏见的模型)通过Grad-CAM绘制的热力图。第三列是Unbiased model(不具偏见的模型)通过Grad-CAM绘制的热力图。通过对比发现,Biased model对于Nurse(护士)这个类别关注的是人的性别,可能模型认为Nurse都是女性,很明显这是带有偏见的。比如第二行第二列这个图,明明是个女Doctor(医生),但Biased model却认为她是Nurse(因为模型关注到这是个女性)。而Unbiased model关注的是Nurse和Doctor使用的工作器具以及服装,明显这更合理。
理论介绍
作者的想法还是比较简单的,参见下图。这里我们简单看下Image Classification任务,首先网络进行正向传播,得到特征层 A A A(一般指的是最后一个卷积层的输出)和网络预测值 y y y(注意,这里指的是softmax激活之前的数值)。假设我们想看下网络针对Tiger Cat这个类别的感兴趣区域,假设网络针对Tiger Cat类别的预测值为 y c y^c yc。接着对 y c y^c yc进行反向传播,能够得到反传回特征层 A A A的梯度信息 A ˊ \acute{A} Aˊ。通过计算得到针对特征层 A A A每个通道的重要程度,然后进行加权求和通过 R e L U ReLU ReLU就行了,最终得到的结果即是Grad-CAM。
至于为什么要这么做,我这里讲下我个人的观点(若有不对请指出)。首先得到的特征层 A A A是网络对原图进行特征提取得到的结果,越往后的特征层抽象程度越高,语义信息越丰富,而且利用CNN抽取得到的特征图是能够保留空间信息的(Transformer同样)。所以Grad-CAM在CNN中一般 A A A都指的是最后一个卷积层的输出(参考下图实验,越往后的特征层效果越好)。当然特征层 A A A包含了所有我们感兴趣目标的语义信息,但具体哪些语义信息对应哪个类别我们并不清楚。接着通过对类别 c c c的预测值 y c y^c yc进行反向传播,得到反传回特征层 A A A的梯度信息 A ˊ \acute{A} Aˊ,那么 A ˊ \acute{A} Aˊ就是 y c y^c yc对 A A A求得的偏导,换句话说, A ˊ \acute{A} Aˊ代表 A A A中每个元素对 y c y^c yc的贡献,贡献越大网络就认为越重要。然后对 A ˊ \acute{A} Aˊ在 w , h w, h w,h上求均值就能得到针对 A A A每个通道的重要程度(这里是对于类别 c c c而言的)。最后进行简单的加权求和在通过 R e L U ReLU ReLU就能得到文中所说的Grad-CAM。
链接:https://blog.csdn.net/qq_37541097/article/details/123089851
论文名称:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization
论文下载地址:https://arxiv.org/abs/1610.02391
推荐代码(Pytorch):https://github.com/jacobgil/pytorch-grad-cam
bilibili视频讲解:https://b23.tv/1kccjmb
参考链接:https://blog.csdn.net/qq_37541097/article/details/123089851
代码:
https://github.com/ramprs/grad-cam/ Lua,Torch
https://www.bilibili.com/video/BV1e3411j7x7/?spm_id_from=333.337.search-card.all.click&vd_source=6292df769fba3b00eb2ff1859b99d79e
https://github.com/jacobgil/pytorch-grad-cam
https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_classification/grad_cam
https://github.com/TommyZihao/Train_Custom_Dataset
博文:
https://blog.csdn.net/fire_to_cheat_/article/details/100838611
https://aistudio.baidu.com/aistudio/projectdetail/1649110
视频:
https://www.bilibili.com/video/BV16T4y1N7Lq/?p=1&vd_source=6292df769fba3b00eb2ff1859b99d79e
https://www.bilibili.com/video/BV19R4y1V7an/?spm_id_from=333.788.recommend_more_video.1&vd_source=6292df769fba3b00eb2ff1859b99d79e
CAM热力图系列算法:https://www.bilibili.com/video/BV1JG4y1s74x