Grad-CAM
Grad-CAM(Gradient-weighted Class Activation Mapping)提供了一种可视化视角来表明图像不同区域的卷积激活的重要程度。
实现:zjykzj/cam
CAM and Grad-CAM
CAM(Class Activation Mapping)来自于论文Learning Deep Features for Discriminative Localization,使用CAM可以可视化模型在识别某一类别时图像不同区域的卷积激活的影响,也就是说,可视化图像不同区域的重要程度。其操作流程如下图所示:

模型整体架构如上图所示,通过多个卷积层进行特征提取,然后使用全局平均池化层(GAP/Gloabl Average Pooling)进行特征融合,最后使用全连接层得到分类输出。CAM就是将输出层权重反向投影到卷积特征,来可视化图像不同区域的重要程度。前向实现如下:
- 假定
表示最后卷积层第 个滤波器在空间位置 的激活输出; - 针对第
个滤波器输出结果,执行全局平均池化得到激活 ; - 对于给定类别
,其最后全连接层输出 ,其中 表示针对第 个滤波器的池化层输入 ,以及输出类别为 对应的全连接层权重向量; - 也就是说,
表示 对于类别 的加权因子;
- 最后类别
的分类概率计算如下:
注意:上述操作中忽略了偏置(bias),仅关注于矩阵操作。通过上述操作后,可以得到
定义
所以,
Grad-CAM来自于论文Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization,针对CAM进行了改进,通过反向传播算法计算得到特征梯度作为加权因子,不再局限于分类网络以及全局平均池化层的使用。
实现
通过可视化卷积激活在不同不同区域的变化,可以发现一些很有趣的事情,比如:
- 更大判别力的模型拥有更聚焦的识别区域,
1 | python imagenet/Grad-CAM.py --arch resnet18 imgs/dog.jpg |

1 | python imagenet/Grad-CAM.py --arch resnet50 imgs/dog.jpg |

- 针对同一个分类类别,不同架构模型具有相似的高激活区域,
1 | python imagenet/Grad-CAM.py --arch mobilenet_v2 imgs/dog.jpg |

- 对于不同类别,其对应的高激活区域会有差别,比如类别Norwich_terrier的识别区域,
1 | python imagenet/Grad-CAM.py --arch resnet50 --cls-name Norwich_terrier imgs/dog.jpg |
