小白同学最近开始接触计算机视觉和神经网络方面的知识,在一个老师的偶然指导下,开始接触CNN可视化,从我看的第一篇论文开始,到现在大概三周的时间,做一个简单的记录,也方便自己日后回看和学习。
论文一、Learning Deep Features for Discriminative Localization学习判别本地化的深层特征 CVPR 2016论文可以在这里找到
论文翻译参考的这篇博文 网上还有很多的阅读笔记阅读笔记1、阅读笔记2、阅读笔记3、再一篇阅读笔记、最后一篇
前面几篇是仅仅针对论文的阅读笔记,这篇利用神经网络内部表征可视化class-specific image regions区域和tensorflow 实现 Class Activation Map用于分类目标定位里有相应的代码实现
作者的源代码是用Caffe框架和Matlab实现的,源码在这儿
1.介绍
这篇文章主要说明了如何运用全局平均池化层GAP提高CNN网络的定位能力。本文提出一种端到端的方法,不需要做其他的额外工作,只需要输入图片就可以定位物体。网络卷积层定位能力很出色,但使用最后的全连接层分类时会降低网络的定位能力。
作者对CNN提取的feature做ClassActivation Mapping处理,这样做可以让网络既能分类又可以定位每张图具体的分类区域。
2.Class Activation Mapping
CAM主要是通过GAP(Global Average Pooling)来实现的。GAP不是本文提出的,本文的创新点在于用GAP来精确定位物体的位置。
一般来说,GAP在最后一个卷积层后面,在GAP之后通常是softmax层。GAP输出最后一个卷积层的每个单元的特征图(featuremap)的平均值。这些值的加权总和用于生成最后的输出值。所以,可以通过计算最后一个卷积层特征图的加权总和来获得CAM。
通过GAP生成CAM的过程如图:
对于一个给定的图,用fk(x,y)代表最后一个卷积层在空间坐标(x,y)中单元k的激活值。然后,对于每个单元k,通过GAP后的结果Fk为∑x,yfk(x,y)。则,对于每个类c,输入softmax的Sc为∑kwc,kFk,wc,k代表单元k对应的类c的权重。实际上,wc,k就是Fk对类c的重要性。最后类c的sotfmax输出Pc为exp(Sc)/∑cexp(Sc)。这里我们忽略偏差项:把softmax的偏差项设置为0,因为它几乎对分类表现没有影响。
把Fk=∑x,yfk(x,y)带入Sc,得
我们用Mc定义类别c的CAM,则空间每个元素为
则Sc =∑x,yMc(x,y),所以Mc(x,y)直接表明了把空间网格(x,y)激活对图片划分为类别c的重要性。
CAM简单说就是不同空间区域的线性加权可视化。将类激活图的大小改变成输入图片的大小,就能清楚地看出与特定类最相关的区域。
下图展示了一些CAM输出的用例,不同类的区别性区域已经高亮。我们展示了同一张图用不同类别的c生成的CAM图的不同之处。即使是同一张图,对不同类的区别性区域也不同。
3.实验部分
作者以AlexNet,VGGnet和GoogLeNet的主要的网络架构,把网络的全连接层移除,再针对不同网络移除一些卷积层,增加一个卷积核为大小为3x3,步长为1,边界填充为11024个单元的卷积层,接一个GAP,然后再接一个softmax层,生成三种网络,AlexNet-GAP, VGGnet-GAP, GoogLeNet-GAP。
实验内容包括分类,定位,鸟类的Fine-grained Recognition,CAM能不能定位更高层次的概念,观察不同卷积单元对特征的提取能力。
4.总结
文章通过CAM,可以直接端到端的对图片进行定位,来识别分类物体的位置。这个技术为很多弱监督学习提供了启发。但是这个方法也有一个致命的缺点:它只能找出物体的一些突出特征的区域,比如狗的头部,这样就导致在定位的时候,容易只定位到物体的一部分。而且使用CAM可以提高定位能力却会在一定程度上降低分类的准确性。
这篇文章的实验部分写得非常好,对比非常全面。
参考这些笔记学习论文内容后,之后又自己尝试去寻找相关论文学习,第一次找论文,颇有些不得要领啊。。。。。。找了好久找不准方向,后来看到了 可视化阅读笔记4这篇博文,在参考下找到了另两篇论文进行学习。