ICLR2014:论文解读与复现《Deep inside CNN:Visualising Image Classification Models and Saliency Maps》

《Deep Inside Convolution Networks: Visualising Image Classification Models and Saliency Maps》

原文地址

https://arxiv.org/abs/1312.6034

论文阅读方法

三遍论文法

初识(Abstract & Introduction & Conclusion)

目前卷积神经网络被广泛应用在图像识别任务中,理解深度模型中获取的视觉表征信息是十分重要的,这是本文聚焦的主题。

过去的CNN可视化工作中,Erhan提出通过最大化感兴趣的神经元活动(在图像空间中使用梯度上升gradient-ascent进行优化)来构造一个输入图像,从而可视化深度模型。Zeiler提出一个Deconvolutional Network,由每个层的输出重构出每层的输入。

本文主要解决了分类CNN(ImageNet)的可视化问题,主要有3个贡献:

  1. 证明了理解分类CNN模型可以使用输入图像的数值优化;
  2. 提出了一种在图像中提取指定类别的空间表征信息(image-specific class saliency map)的方法(只通过一次back-propagation),并且这种saliency maps可以用于弱监督的物体定位
  3. 证明gradient-based的可视化方法可以推广到deconvolutional network的重构过程。

本文所使用CNN细节:与AlexNet类似,但是网络宽度没有那么宽,训练时使用了额外的image jittering。

相知(Body)

2. Class Model Visualisation

给定一个训练好的分类CNN和感兴趣的类别,可视化方法基于数值来生成图像(能够体现CNN所学习到的类别信息)。
在这里插入图片描述
使用上述公式进行图片的生成,Sc(I)代表图片I送入CNN得到的类别c分数(由CNN分类层计算得到),需要生成一张图片I(L2-regularised),使得上式最大。

图片I为图像空间中的局部最优解,它由反向传播算法计算得到,不同于CNN的计算,这个过程是固定CNN中的参数,在输入image中进行优化求解(gradient ascent)。初始化图片I为zero-image(由于CNN在训练时使用的为零中心化数据),然后加上训练集的RGB均值即可得到最后结果。

需要注意的是,实验中使用的Sc不是归一化后的分数,即没有经过soft-max层(下式)。原因其实很简单,如果使用Pc作为Sc,在训练过程中会通过最小化其他类别的分数来提高Sc(作者也做了相应的实验,最后得到Image确实在视觉上不突出),而我们真正需要的是确保优化过程只关注类别c

soft-max
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
上图为该方法的可视化结果,例如ostrich(鸵鸟)这张图,可以看到对于这个类别,要使Sc最大化,生成的图像能够出现很明显的鸵鸟形状,而且数量还很多。

3. Image-Specific Class Saliency Visualisation

给定一张图像I0,类别c,代表CNN的类别c分数Sc(I),我们根据对的Sc(I)影响来排序I0中的像素,先举个简单的例子,考虑linear model的情况
在这里插入图片描述
图像I由一维向量表示,w和b代表model的weight向量和bias向量。在这种情况下,w元素的大小就决定了图像I中相应像素对于类别c的重要性

对于CNN这类高度非线性模型来说,上述的分析不能直接简单地应用。给定一张图像I0在I0附近使用一阶泰勒展开的线性函数来近似Sc(I)
在这里插入图片描述
其中w即为Sc对于图像I的导数在I0点的值:
在这里插入图片描述

3.1 Class Saliency Extraction

给定一张图像I0(m行n列)和对应的类别c,现在求得它对应saliency map M (M∈Rmxn),首先按照上述公式利用back-propagation 可以求得导数w,然后对w元素进行重新排列即可得到Saliency Map。

对于灰度图像I,w元素的数量等于I0的像素个数,所以Saliency Map可以由Mi,j = |wh(i,j)|求得,其中h(i, j)为w元素的索引,表示图像的第i行第j个像素。

对于RGB图像I,索引为h(i,j,c)的w元素代表图像I中像素(i,j)的c通道,对于像素(i,j)的single class saliency,使用三个通道中最大的值来代表:Mi,j = maxc|wh(i,j,c)|.

Saliency Map是利用训练好的CNN直接提取的,无需使用额外的标注(eg. 分割mask/检测bounding box),而且对于某个特定类别的image-specific saliency map的求解是很快的,只需要一次back-propagation。
在这里插入图片描述
上图为改方法在Image-Net中test集可视化结果(Saliency Map),可以看到Saliency Map能够在一定程度上显示图像所对应类别的物体位置,比如那张小狗,在Saliency Map上就能够看到小狗的轮廓与位置。

3.2 Weakly Supervised Object Localisation

由上节方法得到的Saliency Map编码了给定图像中特定类别的物体位置信息,所以它可以被用来进行物体定位(尽管它在分类任务上得到训练,弱监督学习)。

给定一张图像和其对应的Saliency Map,可以使用GraphCut颜色分割模型来得到物体分割mask。要使用颜色分割模型主要是因为Saliency Map只能捕捉到一个物体最具有区分性的部分,它无法highlight整个物体,因此需要将threshold map传递到物体的其他区域,本文使用colour continuity cues来达到这个目的。

前景和背景模型都被设置为高式混合模型,高于图像Saliency distribution 95%的像素被视为前景,Saliency低于30%的像素被视为背景。标记了前景和背景像素之后,前景像素的最大连接区域即为对应物体的分割mask(使用GraphCut算法)。
在这里插入图片描述

4. Relation to Deconvolutional Networks

基于反卷积网络来对第n层的输入Xn进行重构相等(或相似)于计算"可视化神经元活动f"相对于Xn的梯度,所以反卷积网络与通过CNN进行梯度反向传播技术可以有效地对应起来。

对于卷积层Xn+1 = Xn * Kn,梯度的计算为: ∂f / ∂Xn = ∂f / ∂(Xn+1 * ^Kn), Kn和^Kn分别为卷积核和其flipped模式,flipped卷积就是用来计算第n层的重构Rn: Rn = Rn+1 * ^Kn .

对于ReLU层,Xn+1 = max(Xn,0),梯度形式为:∂f / ∂Xn = ∂f / ∂(Xn+1 * 1),其中1代表元素级别的指示函数。这不同于反卷积网络中的ReLU重构,Rn = Rn+1 * 1,这里的sign指示函数由输出重构Rn+1计算,而不是输入Xn.

最后考虑到max-pool层,如下式,输出feature map中的p由输入的对应响铃区域求解得到:
在这里插入图片描述
梯度形式为:
在这里插入图片描述
其中s为:
在这里插入图片描述
这里的argmax为反卷积网络中的max-pooling switch.

这一块其实我也不是很理解,关于Zeiler那篇文章中的反卷积网络的反卷积没太理解(希望dalao指点),作者大概的意思是其实反卷积网络基本等效于基于梯度反向传播方法的可视化,本文的gradient-based visualization是其方法的概括,因为基于梯度的方法不止可以引用于所有层的activities的可视化。

本文对于类模型可视化(第2节)反映了CNN中关于’类’的概念,这并不受限于任何某个特定图像。同时,Class Saliency可视化(第3节)是与特定图像相关的,从这个意义上讲,其与Zeiler文中关于特定图像的卷积层可视化有关。

回顾(Review)

这篇文章发表于是14年的ICLR,关于CNN的可视化/可解释性方面的。在AlexNet在ImageNet比赛上大放异彩后,深度学习可谓是焕发第二春,特别是在CV领域,CNN大行其道,暴打各种传统方法。但对于善于思考、挖掘本质的人类来说,我们不仅要知其然也要知其所以然,所以关于神经网络的可解释性和可视化也一直受到学术界的关注。

我觉得这篇文章最重要的工作是从两个方面探索了用于分类任务的CNN,一个是与类别无关的模型可视化,通过固定Model中的参数,反向对input进行训练,看一下网络对于分类目标学习到的东西可视化出来是个什么样子;另一个是与特定图像以及类别极度相关的,给定一张图像和其本身的label,通过一次方向传播,在input上得到的各梯度大小反映了对于这张图像,CNN主要关注的是哪些区域。

代码

github地址
复现的代码主要是基于ResNet网络(用于猫狗分类数据集),这里贴一段主要的代码,具体大家看github:

model.eval()
valdataiter = iter(valloader)
x,y = valdataiter.next()
x = x.to(device)
x.requires_grad_()
y = y.to(device)
saliency = None

logits = model.forward(x)
logits = logits.gather(1, y.view(-1, 1)).squeeze() # 得到正确分类
logits.backward(torch.cuda.FloatTensor([1., 1., 1., 1., 1.])) # 只计算正确分类部分的loss

saliency = abs(x.grad.data) # 返回X的梯度绝对值大小
saliency, _ = torch.max(saliency, dim=1)  # 一个pixel只取最大值
saliency.squeeze()  # 得到Saliency Map

以上为个人的浅见,水平有限,如有不对,望大佬们指点。

未经本人同意,请勿转载,谢谢。

在Python中,可以使用OpenCV库来进行显著性检测。OpenCV提供了四种带有Python绑定的显著性检测器实现,包括:cv2.saliency.ObjectnessBING_create()、cv2.saliency.StaticSaliencySpectralResidual_create()、cv2.saliency.StaticSaliencyFineGrained_create()和cv2.saliency.MotionSaliencyBinWangApr2014_create()。\[1\]\[3\] 以下是一个示例代码,用于生成显著性热力图: ```python import cv2 import numpy as np def heat_map(path): fix = cv2.imread(path) max_val = np.max(fix) min_val = np.min(fix) fix = (fix - min_val) / (max_val - min_val) fix *= 255 pred_ = fix.astype(np.uint8) pred_heat_map = cv2.applyColorMap(pred_, cv2.COLORMAP_JET) cv2.imwrite('./fix_heat.png', pred_heat_map) fix_path = './1.jpg' heat_map(fix_path) ``` 这段代码会读取一张图片,然后将其转换为显著性热力图,并保存为`fix_heat.png`文件。\[2\] 你可以根据自己的需求选择适合的显著性检测器,并使用相应的函数进行处理。 #### 引用[.reference_title] - *1* *3* [使用Python,OpenCV执行视觉显著性检测(Visual Saliency Detection)](https://blog.csdn.net/qq_40985985/article/details/124727023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Saliency map (fixation map) 生成热点图-python实现](https://blog.csdn.net/qq_36481821/article/details/108679054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值