点关注,不迷路,定期更新干货算法笔记~
可视化分析是CV中常用的技巧,通过可视化分析,可以发现模型在学习过程中重点关注了图像中的哪部分区域,帮助我们debug模型学习过程中可能存在的问题。例如在图像分类任务中,可以通过可视化分析,来看模型最关注的图像区域是对于分类至关重要的关键实体,还是背景,进而推断模型目前的学习情况。
那么如何可视化CV模型呢?这里我们介绍两种方法,第一种方法是CAM,一般用于ResNet等以卷积网络为主体的模型;第二种方法是直接绘制Attention Map,可以用于近期比较火的以Transformer为主题结构的ViT等模型中。最后,我们会详细介绍ViT可视化Attention Map的示例和代码,可以比较方便的用于各种分析场景。
1
CAM可视化
当我们通过ResNet等模型结构得到feature map后,可视化的方法就是根据每个feature map的重要性,对各个feature map进行加权融合,进而得到图像中各个位置对于分类重要程度的可视化结果。CAM类的方法是最常用的可视化方法之一。
CAM方法是在Learning Deep Features for Discriminative Localization(CVPR)中被提出的。该方法总共分为以下3个步骤:

CAM方法的缺陷在于,GAP+全连接这种网络结构并不通用,可能原始模型并没有这种结构。并且CAM只能可视化模型的最后一层。如果希望对结构不同的模型,或者不是最后一层的feature map进行可视化,需要重新训练全连接层,非常不方便。因此,后续Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization(ICCV)提出了一种更通用的可视化方法Grad-CAM。

Grad-CAM是根据梯度计算每个feature map权重的。对于图像分类问题,将目标label对应的梯度回传到要可视化的层的各个feature map,将这个梯度作为每个feature map的权重。这个梯度也会在每个feature map的维度进行Gobal Average Pooling,公式可以表示如下:

2
ViT可视化
随着Transformer在CV领域的应用,ViT最近逐渐成为非常火的图像backbone。ViT将图像分patch转换成序列,输入到Transformer中,并采用和BERT类似的[CLS] token进行分类。[CLS] token汇聚了对分类有帮助的图像中的重要信息。

对于VIT的可视化,非常直观的思路就是直接绘制attention矩阵。例如对于图像分类任务,我们一般关注用于分类的[CLS] token汇聚了哪些patch的信息。因此我们可以绘制每层的[CLS] token和各个patch的attention得分对应的热力图,来分析哪些patch对于分类最重要。
3
ViT可视化示例详解
下面我们通过实际代码来看看ViT是如何实现可视化的。代码来自github:链接,最核心的代码如下:

下面我们解析一下这段可视化代码。
最终绘制完成的可视化图像效果如下,可以看到模型对于主体的attention分数更大,对于背景的attention分数更小,表明ViT学到了根据图像主体进行分类。

4
总结
模型可视化是我们在日常分析模型效果的一个重要手段,通过可视化模型对于图像各个部分的关注程度,可以帮助判断模型学的好坏,是否关注了我们希望模型关注的区域,进而针对性进行优化。
END