深度学习暑期学校(加拿大、蒙特利尔,2016.8.1-7)

半世苍凉 提交于 2019-12-08 00:21:00

 

 

 

 

learning to see.pdf

 

 

 

 

@lutingting 2016-11-04 16:15 字数 10899 阅读 4087
 
 

SIFT特征提取及匹配

数字图像处理 图像特征提取


 

 

 

1.SIFT(Scale-invariant feature transform)算子的核心思想

  • 利用不同尺度的高斯核函数对图像进行平滑,即构造图像的尺度空间
  • 比较不同尺度平滑后的图像差别,在某局部范围内,差别最大或者差别最小的像素点就是特征明显的点

由于SIFT特征的检测方式,使得它具有:

  • 尺度不变性:在尺度空间内进行的特征点检测
 

2.什么是尺度空间呢?

 

2.1 一篇百度文库的文章关于尺度空间的分析

具体内容参考文献4

通常会听到尺度变化等这类词语,看到的也总是一堆的数学公式,有时候真的不知道这到底有啥用,有啥意义,没有弄懂这些意义,当然就更不可能理解,不可能去掌握、应用它了,现在我才理解,小波变化其实也是一种尺度变化。今天我看到一篇南航数学系写的关于尺度空间解释的文章,感觉很通俗易懂,我们不从数学上来推导什么是尺度空间,只是从生活常识方面来解释尺度空间的意义,意义懂了,数学方面自然就好理解了。

 

例子1

首先我们提出一个问题,请看下面的图片,让我们人为的进行判断:下面所显示的左右图片中哪个的角尖锐?

  • 图1(a)中,显然右边的角更尖锐,这是因为同左边的角相比其角度值较小
  • 图1(b)中,也是右边的角更尖锐,这是因为同左边的角相比其曲率值较大
  • 图1(c)中,问题的答案则要困难得多。左边的角一方面具有较小的角度值(因此更尖锐),另一方面又具有较小的曲率值(因此更圆钝)。右边的角情形刚好相反,一方面因为具有较大的角度值更圆钝,另一方面又因为具有较大的曲率值显得更尖锐。事实上,本问题对于图1(a)和图1(b)来说是纯粹的数学问题,依据数学上的基本概念(即角度、曲率)便可以做出判断。而图1(c)中两个角之间的比较已经不再是纯粹的数学问题,在数学上没有明确的答案。确切地说,这是一个尺度空间中的视觉问题,其答案取决于问题所在的“尺度”而不是某个数学指标。这里,“尺度”可以被直观地理解为观察窗口的大小。在图1(c)中,我们观察两个角的窗口大小都是
  • 图1(d)中,调整了观察窗口,其大小变成(假设所比较的两个角都具有无限长的边)。在这个较大的尺度下,问题的答案变得非常明朗:左边的角更加尖锐。
  • 图1(e)中,观察窗口的大小变更为在这个较小的尺度下,问题的答案发生了有趣的变化:此时右边的角更加尖锐。

此例子的结果阐述了“尺度”对于解决视觉问题的重要性,即一个视觉问题的答案往往会依赖于其所在的尺度。在生活中这样的例子也比比皆是,比如要观察一棵树,所选择的尺度应该是“米”级;如果观察树上的树叶,所选择的尺度则应该是“厘米”级。一般来说,摄像设备所能呈现的画面分辨率是固定的。要以同样的分辨率分别观察树和树叶,我们需要调整摄像设备的摄像位置。因此,视觉问题中的“尺度”概念也可以被形象地理解为摄像设备与被观察物体之间的距离:较远的距离对应较大的尺度,较近的距离对应较小的尺度。

 

例子2

接下来我们看看第二个例子吧,看看图二中显示的图片那些是角点?

  • 图2(a) 呈现了一片雪花的形状轮廓,要求我们找出该形状上的角点。在很多计算机视觉任务中,角点都有着重要的作用。数学上,角点一般是指大曲率点或曲率无穷大点。
  • 在图2(b)中,雪花形状上所有曲率无穷大点都被确认为角点,一共有192个,如圆圈所标记。这个答案在数学上无疑是正确的、完美的令人惊奇的,但它对于完成一个视觉任务(比如理解和分析这个形状)来说并没有多大的意义。
  • 如果我们仅选择图2(c)中所标记出的48个点作为角点,感觉上要更好点。作为图2(b)中所标记的192个角点中的一部分,这48个角点在理解和分析雪花形状的结构时要比其余的角点具有更高的重要性。
  • 实际上,按照这一思路,我们不难发现在这48个角点中又有12个角点其重要性还要更高一些,如图2(d)中所标记。

同例1 一样,本例中问题的答案依赖于问题所在的尺度:当我们非常靠近雪花形状观察它时(即在较小的尺度下),能够看清楚所有的细节,却不容易感知其整体轮廓,从而倾向于不加区分地选取图2(b)中所标记的192 个点作为角点。反过来,当我们从一个很远的距离观察雪花形状时(即在较大的尺度下),虽然轮廓的细节已经模糊不清,但却能够一眼看出其整体结构,从而倾向于选取图2(d) 中所标记的12 个点作为角点。此外,图2(c) 中所标记的角点对于理解雪花形状也很有帮助。事实上,如果我们不是保守地将自己固定在某个尺度下来观察物体,便能够获得充足的视觉信息。比如说图2(b)-2(d) 所呈现的三组角点已经很好地向我们展示了雪花形状的三个结构层次。这一效果是其中的任意一组角点都无法实现的。

 

现实生活中的例子

现实生活中视觉问题的复杂性也往往需要我们做到这一点:当我们去参观某处文化遗迹时,远远地就已经开始观察建筑物的外形,然后较近距离时开始注意到门窗、台阶、梁柱的建筑风格,最后会凑上前去细看门窗上的图案、石碑上的碑文等。当一部机器人也能够自主地做到这一点时,说明它已经具备了更高的人工智能。我们对尺度空间技术的研究也正是朝着这个方向努力。概括地说,“尺度空间”的概念就是在多个尺度下观察目标,然后加以综合的分析和理解。 这里用的是图像来解释尺度,当然,对于抽象的信号,理解还是一样的,不过到时候我们看的工具不是我们人眼或者是摄像机从外表区分了,这时候我们用的工具也可能是时域的分析法,也可能是频率域的傅里叶变化等分析法,它是我们进一步发现我们感兴趣事物的工具。

 

2.2 SIFT中的尺度空间的概念

  • David Lowe关于Sfit算法,2004年发表在Int. Journal of Computer Vision的经典论文中,对尺度空间(scale space)是这样定义的

    It has been shown by Koenderink (1984) and Lindeberg (1994) that under a variety of reasonable assumptions the only possible scale-space kernel is the Gaussian function. Therefore,the scale space of an image is defined as a function, L(x; y; sigma) that is produced from the convolution of a variable-scale Gaussian, G(x; y; sigma), with an input image, I(x; y)

  • 从上面的定义可以看到:

    • 高斯卷积核是实现尺度变换的唯一变换核
    • 一幅图像的尺度空间被定义为:高斯卷积核与该图像的卷积,它是高斯卷积核中的参数的函数,这里用到“空间”这个词,是因为是可以连续变化的,具体地,图像的尺度空间为:

       

       

      其中:

      • 是高斯核函数
      • 是尺度因子,的大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的值对应粗糙尺度(低分辨率),小的值对应精细尺度(高分辨率)。
      • 是卷积操作
      • 就是输入图像的尺度空间。
 

3.SIFT特征提取

一幅图像的SIFT特征提取,分为4个步骤:

  • 尺度空间极值检测
  • 关键点位置及尺度确定
  • 关键点方向确定
  • 特征向量生成

下面分别是这四部分的详细内容

 

3.1 尺度空间极值检测

SIFT特征点其实就是尺度空间中稳定的点/极值点,那么,为了得到这些稳定点:

  • 首先,需要对输入图像建立尺度空间(通过图像高斯金字塔)
  • 然后,需要从建立得到的尺度空间中检测极值点(转换为图像差分高斯金字塔中极值点的检测)
    • 获取差分高斯金字塔
    • DoG中极值点的检测
 

3.1.1 尺度空间的建立(高斯金字塔的建立)

对于一幅输入图像,为了进行sift特征检测、实现scale-invariant(任何尺度下都能够有对应的特征点),需要对该图像的尺度空间进行分析,即建立高斯金字塔图像、得到不同scale的图像,这里的高斯金字塔与最原始的高斯金字塔稍微有点区别,因为它在构造尺度空间时,将这些不同尺度图像分为了多个Octave、每个Octave又分为了多层。下图左侧框内给出了Sift中的高斯金字塔的结构图;

  • 高斯金字塔分为S组(即S个塔、或者称为S个octave),每个塔中有s层;具体有几个塔、每个塔包含几层由输入图像的尺寸决定!对于上图而言:有S=2组,每组由s=5层;
  • 同一塔中图像尺寸相同但尺度不同、不同塔中图像尺寸和尺度都不同(注意:这里的尺寸和尺度概念不同!尺寸对应图像分辨率、尺度为高斯核大小)

    • 每一个塔中图像尺寸确定方法为:第一个塔的尺寸为原图大小,后面每个塔的尺寸为上一个塔的降采样的结果(即长宽分别减半的结果)
    • 每个塔中各层图像的尺度不同,即取值不同,各层之间相差一个值。例如:上图中第一个塔中各层的尺度因子分别为:;而第二个塔中各层的尺度因子分别为:
  • 如何确定相邻层之间的比例因子k呢?下图是同一Octave中不同层和不同Octave之间的尺度大小关系,为了满足尺度变化的连续性,即某一组的最后一层对应的尺度与下一组的第一层对应的尺度应该相差一个k倍,所以应该有,所以,,即,其中,为基础尺度因子。



注1:关于尺度变化的连续性应该就是指:金字塔图像中所有图像之间的尺度因子都相差一个k倍:每个octave中相邻图像之间尺度因子相差一个k,相邻2个octave的最后一层与第一层的图像之间尺度因子相差一个k!
注2:英文Octave是音乐上一个八度的意思,在这里指的是一组图像。这一组图像的分辨率是相同的,但是采用了不同尺度的高斯函数进行滤波,因此从模糊程度上看(或者说从关注的尺度上看)是有区别的。而不同组的图像具有不同的分辨率,在尺度上的差别就更大。


为什么已经使用了不同尺度的高斯函数进行滤波还需要引入高斯金字塔呢?
这是因为SIFT算法希望能具有更高的尺度分辨率(也就是希望相邻尺度的变化比较精细),所以就需要有很多层。如果不用高斯金字塔,都在原始分辨率上靠采用不同的高斯函数实现多尺度检测,那么对于比较粗尺度的特征提取在计算量上就相当浪费。因为在保持图像原始分辨率不变的情况下,提取粗尺度特征需要高斯函数的方差较大,相应的滤波窗口也比较大,计算量会激增,而由于图像在大尺度上的模糊,保持原始分辨率已经没有必要了,这种计算消耗就更是得不偿失。所以采用高斯金字塔是为了高效地提取不同尺度的特征。

不同octave之间的尺度差异靠高斯金字塔在分辨率上的区别实现,同一个octave内部不同层之间的尺度差异靠高斯函数的方差变化来实现。另外SIFT在DOG问题上并不是使用DOG函数直接滤波,而是用相邻两层的高斯滤波结果相减得到的,为什么要这样呢?
也是为了节省计算量。因为如果直接采用DOG函数,为了提取不同的尺度,就必须逐渐扩大DOG函数的窗口,这会引起计算量的增加。在实际操作中,SIFT首先对当前octave对应的分辨率的采样图像用一个窗口相对较小的高斯函数滤波,之后同一个octave的第2层一直到第k层,都是通过对前一层已经滤波过的结果再进行一次高斯滤波。对一副原始图像用方差为的高斯函数连续做两次滤波的结果,相当于对这幅图像直接用一个的高斯函数做一次滤波。所以每次都在前一层的滤波结果基础上进行滤波,跟对原始图像分别用不同窗口大小的高斯函数滤波的结果是一样的,但是因为避免了滤波函数窗口的扩大,可以有效减少计算量。

不同对应的高斯核函数到底有什么作用呢?下面做个小实验,可以发现,不同高斯核尺度会对图像产生不同的平滑效果,尺度因子越大(高斯函数方差越大),对图像的平滑程度越大;

 
  1. %读入图像并将其转换成灰度图像
  2. I=imread('qingdao.jpg');
  3. I=rgb2gray(I);
  4. % 利用尺度为3*3的高斯核进行滤波
  5. w1=fspecial('gaussian',3,0.5);
  6. g1=imfilter(I,w1,'conv','symmetric','same');
  7. % 利用尺度为11*11的高斯核进行滤波
  8. w2=fspecial('gaussian',11,0.5);
  9. g2=imfilter(I,w2,'conv','symmetric','same');
  10. % 显示处理结果
  11. figure;subplot(1,3,1);imshow(I);title('原始图像');
  12. subplot(1,3,2);imshow(g1);title('3*3高斯');
  13. subplot(1,3,3);imshow(g2);title('11*1高斯');
  • matlab中利用fspecial函数产生离散高斯核:H=fspecial('gaussian',hsize,sigma)
  • H是一个矩阵,它是由离散高斯卷积核计算得到的


    • 它是利用二维高斯函数计算得到的
    • 其中的hsize为高斯核的大小,sigma为高斯核的标准偏差,即高斯核的大小

得到了图像的尺度空间后,需要在尺度中间内检测稳定特征点,从而需要比较不同尺度图像之间的差别,实现极值点的检测,实际上,Laplacian of Gaussian和Difference of Gaussian都能够实现这样的目的,但LoG需要大量的计算,而DoG的计算相对简单,并且DoG是对LoG的一个很好的今昔

 

3.1.2 图像差分高斯金字塔(DoG)的建立

对于高斯金字塔中的每一个塔的不同层,可以计算得到相邻层之间的差值,从而可以得到差分高斯,对高斯金字塔中每一个塔都进行同样的操作,从而得到差分高斯金字塔,如下图右侧所示,即显示了由左侧的高斯金字塔构造得到的差分高斯金字塔,该差分高斯金字塔包含2个塔,每个塔都有四层

差分高斯表征了相邻尺度的高斯图像之前的差别,大值表示区别大,小值表示区别小,后续的特征点检测都是差分高斯图像金字塔中进行的!

 

3.1.3 尺度空间中特征点的检测(DoG中极值点的检测)

构造完尺度空间(差分高斯金字塔)后,接下来的任务就是“在尺度中间中检测出图像中的稳定特征点”:

对于DoG中每一个采样点(每一个Octave中每一层),将其与它邻域内所有像素点(8+18=26)进行比较,判断其是否为局部极值点(极大或者极小),更加具体地:如下图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。但要注意:这种相邻层之间的极值点的寻找是在同一Octave中的相邻尺度之间进行寻找的,而不要跨组!

同时,应该注意到一个问题,在极值比较的过程中,每一Octave图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,需要进行一些修正:在高斯金字塔中生成S+3层图像,具体解释如下:假设s=3,也就是每个塔里有3层,则k=21/s=21/3:

  • 那么按照上图可得Gauss Space和DoG space 分别有3个(s个)和2个(s-1个)分量,在DoG space中,1st-octave两项分别是σ,kσ; 2nd-octave两项分别是2σ,2kσ;

  • 由于无法比较极值,我们必须在高斯空间继续添加高斯模糊项,使得DoG中第一个Octave形成σ,kσ,k2σ,k3σ,k4σ,这样就可以选择中间三项kσ,k2σ,k3σ(只有左右都有才能有极值);那么下一octave中(由上一层降采样获得)所得三项即为2kσ,2k2σ,2k3σ,其首项2kσ=24/3。刚好与上一octave末项k3σ=23/3尺度变化连续起来,所以每次要在Gaussian space添加3项,每组(塔)共S+3层图像,相应的DoG金字塔有S+2层图像。


 

3.2 关键点位置及尺度确定

通过拟和“三维二次函数”可以精确确定关键点的位置和尺度(达到亚像素精度),具体方法还未知,可以得到一系列的SIFT候选特征点集合,但由于这些关键点中有些具有较低的对比对,有些输属于不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),所以,为了增强匹配稳定性、提高抗噪声能力,应该将这2类关键点去除,实现对候选SIFT特征点集合的进一步净化:

  • 剔除对比度低的点
  • 剔除边缘点
 

3.3 关键点方向确定

  • 计算关键点的方向,需要利用以该关键点为中心的某邻域窗口内所有像素点的梯度分布特性(目的是为了使的sift算子具备旋转不变性),所以,下面首先给出计算尺度空间中每个像素点的梯度模值和方向的方法,按照下面公式计算:

    • 其中L所用的尺度为每个关键点各自所在的尺度。

  • 接下来,对于每个关键点(假设尺度为sigma),利用直方图统计其相邻窗口内的像素的梯度分布,从而,确定该关键点的方向,具体方法如下:

    • 分别计算以该关键点为中心的相邻窗口中像素点的梯度方向和模值
    • 为该窗口内每一个像素点赋予一个权值:由每个像素点对应的梯度模值和以关键点为中心尺度为1.5sigma的高斯核决定
    • 设定某种规则,开始统计直方图,例如,这里将方向(0~360°)分为8份,那么,梯度方向直方图将有8个柱,窗口内每个像素到底属于哪个柱由该像素点的梯度方向确定(见下图右侧子图所示)


    • 在该关键点对应的梯度方向直方图中,找到包含像素点最多的那个方向作为该关键点的方向,对于上图而言,方向角(0.25π,0.5π)这个区间内的像素点最多,所以,以(0.25π+0.5π)/2 = 0.375π作为该关键点的方向

至此,得到了图像中所有关键点的方向!实际上,关键点方向的确定是为了接下来的特征向量生成中的坐标旋转使用的!

 

3.4 特征向量生成

上面只是得到了每个关键点的方向,接下来,需要确定每个关键点的特征向量,具体方式如下:

  • 将坐标轴旋转到关键点的方向

  • 对于某一个关键点,取其周围窗口,如下图绿色区域所示,其中,窗口内每个小矩形框为一个像素,箭头表示该像素位置的梯度方向和模值

  • 在该窗口对应的4个(称为4个种子点)的小块儿上,分别计算该小块儿包含的16个像素点的梯度直方图(8个柱),并进行累加(每个柱对应的所有像素点的梯度模值累加),每个小块儿可以得到8个特征(8个方向对应的模值的累加),从而,4个种子点将得到关键点的4*8=32个特征,如下图右侧所示,4个种子点,每个种子点产生8个特征

  • 实际中,Lowe建议使用个子块儿(称为16个种子点)进行特征计算,那么,每个关键点将具有16*8=128个特征,如下图所示,此时,需要在特征点周围取的窗口,分割为个子块儿(这样做的目的是为了增强后续匹配的稳健性)。

至此,关键点特征向量完全确定!此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。

 

4.SIFT特征的匹配

现有A、B两幅图像,分别利用上面的方法从各幅图像中提取到了k1个sift特征点和k2个特征点及其对应的特征描述子,即维和维的特征,现在需要将两图中各个scale(所有scale)的描述子进行匹配。

接下来采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。

  • 取图像A中的某个关键点,并找出其与图像B中欧式距离最近的前两个关键点
    • 在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。
    • 利用2个近邻点比较的目的是为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,所以Lowe提出了比较最近邻距离与次近邻距离的方法,距离比率ratio小于某个阈值的认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。Lowe推荐ratio的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。(如果这个地方你要改进,最好给出一个匹配率和ration之间的关系图,这样才有说服力),作者建议ratio的取值原则如下:
      • ratio=0. 4 对于准确度要求高的匹配;
      • ratio=0. 6 对于匹配点数目要求比较多的匹配;
      • ratio=0. 5 一般情况下。
      • 也可按如下原则: 当最近邻距离<200时,ratio=0. 6;反之,ratio=0. 4。ratio的取值策略能排分错误匹配点。

Reference
1. SIFT keypoint detector实现代码:http://www.cs.ubc.ca/~lowe/keypoints/
2. David Lowe个人主页:http://www.cs.ubc.ca/~lowe/home.html
3. David Lowe关于SIFT的论文2004《Distinctive Image Features
from Scale-Invariant Keypoints》pdf版本:http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf
4. http://wenku.baidu.com/link?url=rsMoC8dnNclI54HCm1YDvANsj5h1dsUxGnjVCY5KOsXxdSt0XKP3ix5pgH5W41bJ9RKSn7gsZTtXIur3r8ULfTANuF2o5mCpM2kMP_MI0Pm
5. Rachel-Zhang博客-SIFT特征提取分析. http://blog.csdn.net/abcjennifer/article/details/7639681
6. http://www.zhihu.com/question/19911080
7. http://blog.csdn.net/songzitea/article/details/16986423


 

5.下面是一些参考程序

 

5.1

 
  1. %size为模板大小
  2. %sigma为标准差
  3. size = 3;
  4. sigma =3 ;
  5. %下面的代码其实是从fspecial中摘录出来的,我做了一些更改放到自己写的函数里面便于解释
  6. %计算高斯模板的中心位置
  7. siz = ([size size]-1)/2;
  8. sig = sigma;
  9. %用meshgrid是为了加速,不用for循环
  10. [x y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
  11. %计算exp(-(x^2+y^2)/(2*sig^2))
  12. %我想你肯定有一个疑问,那就是为什么不除以2*pi*sig^2
  13. %因为不除也没有关系,因为最后归一化之后会约掉
  14. arg = -(x.*x+y.*y)./(2*sig*sig);
  15. h = exp(arg);
  16. %不知道它为什么要这样,忘懂得人解释一下
  17. h(h<eps*max(h(:))) = 0;
  18. %求和,用来归一化
  19. sumh = sum(h(:));
  20. %防止求和之后出现为0的情况,然后再归一化一下使高斯,模板为小数
  21. if sumh ~=0
  22. h=h/sumh;
  23. end
  24. %% 绘制二维高斯曲面
  25. u=[-10:0.1:10];
  26. v=[-10:0.1:10];
  27. [U,V]=meshgrid(u,v);
  28. H=1/2/pi/sigma*exp(-(U.^2+V.^2)./2/sigma^2);
  29. mesh(u,v,H); %绘制三维曲面的函数
  30. title('高斯函数曲面');
  31. %% 利用fspecial产生高斯核
  32. hold on;
  33. for i=1:3
  34. for j=1:3
  35. plot3(i-2,j-2,h(j,i),'r*');
  36. end
  37. end
 

5.2

 
  1. clear;clc;close all
  2. %% 输入图像,并归一化到统一的尺寸
  3. row=256;colum=256;
  4. img=imread('lenna.png');
  5. img=imresize(img,[row,colum]);
  6. img=rgb2gray(img);
  7. img=im2double(img);
  8. origin=img;
  9. %% 下面分别利用不同的sigma值对输入图像进行卷积操作
  10. sigma0 = sqrt(2);
  11. level = 3;
  12. for i=1:level
  13. scale=sigma0*sqrt(2)^(1/level)^((i-1)*level+i);
  14. f=fspecial('gaussian',[1,floor(6*scale)],scale);
  15. image_output=conv2(origin,f','same');
  16. figure;imshow(image_output);hold on;
  17. title(['scale = ',num2str(scale),',and size of kernel is ',num2str(size(f,1)),'*',num2str(size(f,2))]);
  18. end
  19. %% 绘制二维高斯曲面
  20. sigma = 3;
  21. u=[-10:0.1:10];
  22. v=[-10:0.1:10];
  23. [U,V]=meshgrid(u,v);
  24. H=1/2/pi/sigma*exp(-(U.^2+V.^2)./2/sigma^2);
  25. mesh(u,v,H); %绘制三维曲面的函数
  26. title('高斯函数曲面');
  27. %% 利用fspecial产生高斯核
  28. f=fspecial('gaussian',[3,3],sigma);
  29. hold on;
  30. for i=1:3
  31. for j=1:3
  32. plot3(i,j,f(j,i),'r*');
  33. end
  34. end
 
 
 
     

    3.Hough变换的优缺点

    优点:

    • 抗噪能力强
    • 对边缘间断不敏感

    缺点:

    • 运算量大:对图像中每一个像素点,都需要计算所有的theta对一个的rho
    • 占用内存多

    Hough变换利用的是一种投票思想


    Reference

    1. stackoverflow=explain hough transformation.http://stackoverflow.com/questions/4709725/explain-hough-transformation
    2. Polar and Cartesian Coordinates. https://www.mathsisfun.com/polar-cartesian-coordinates.html
    3. 百度百科.http://baike.baidu.com/link?url=mSklh9U7fzEEBhsSzfU1rkB4LOKwyptqZREe6KSd1VoNddlX4KVw92d644BVODlklByXHBv2V0fsemww4pD61q
    4. http://www.nabla.hr/Z_MemoHU-015.htm
    5. hough变换是如何检测出直线和圆的? http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/
    6. 现代数字图像处理技术提高及应用案例详解(MATLAB版). 赵小川
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    转自: http://www.bfcat.com/index.php/2012/12/inverting-visualizing-features-object-detection/

     

     

    所有人都知道,计算机视觉是关于看的学问,在调程序的时候,可视化占到了一大部分的地位。当我们使用描述子的时候我们也希望能够看到这个描述字的图案,例如我们很熟悉的SIFT,SURF等描述子的可视化方式。

    很多做目标检测的人都对HoG特征描述子非常熟悉,也经常用到。MIT的Carl Vondrick(老板是Antonio Torralba)公布了一个可以用来可视化HoG算子的代码。这段代码提供了4种可视化HoG算子的方式,和普通的,直接把描述子画在图像上的方式不同,这几种可视化方式更直观的展示了HoG描述子在图像上的响应。好像让研究者戴上“HoG眼镜”来像计算机一样观察世界。

    在我们用HoG算子进行样本训练的时候,可以利用这种可视化来检查为什么一些负样本会导致虚警,也可以检查正样本自己的类内方差。

    最后,作者还和Weinzaepfel et al.设计的SIFT 可视化方式(P. Weinzaepfel, H. Jegou, and P. Perez. Reconstructing an image from its local descriptors. In CVPR, 2011.)进行了对比。

    这个程序以及技术报告的网页在这里:http://mit.edu/vondrick/ihog/index.html#overview

     

    https://github.com/cvondrick/ihog

    Pinned

    1. Generating Videos with Scene Dynamics. NIPS 2016.

       Lua  636  130

    2. SoundNet: Learning Sound Representations from Unlabeled Video. NIPS 2016

       Lua  386  84

    3. Efficiently Scaling Up Video Annotation with Crowdsourced Marketplaces. IJCV 2012

       HTML  471  236

    4. Visualizing Object Detection Features. ICCV 2013

       C++  216  131

    5. Simple starter package for training neural nets in torch7

       Lua  55  17

    6. ffmpeg in torch that is simple and easy to install

       Lua  30  10

     
       

     

     

     

     

    想法:怎么把一些“常识”约束加进来——或者“object 和 ambient things 的关系概率”

    或者检测出来:鸳鸯、水、以及“汽车”之后,再做一轮PK —— 背后的核心思路是说,“汽车”这个物体和周围的从像素到物体的金字塔各层的关联性(共现)要比较好才行~

    pat 点

     

     

     

     

    CNN网络可视化·Visualizing and Understanding Convolutional Networks

    深度学习


     

     

    Matthew D. Zeiler,Rob Fergus. Visualizing and Understanding Convolutional Networks.CVPR2014.论文下载



     

    一、相关理论

    本篇博文主要讲解2014年ECCV上的一篇经典文献:《Visualizing and Understanding Convolutional Networks》,可以说是CNN领域可视化理解的开山之作,这篇文献告诉我们CNN的每一层到底学习到了什么特征,然后作者通过可视化进行调整网络,提高了精度。最近两年深层的卷积神经网络,进展非常惊人,在计算机视觉方面,识别精度不断的突破,CVPR上的关于CNN的文献一大堆。然而很多学者都不明白,为什么通过某种调参、改动网络结构等,精度会提高。可能某一天,我们搞CNN某个项目任务的时候,你调整了某个参数,结果精度飙升,但如果别人问你,为什么这样调参精度会飙升呢,你所设计的CNN到底学习到了什么牛逼的特征?

    这篇文献的目的,就是要通过特征可视化,告诉我们如何通过可视化的角度,查看你的精度确实提高了,你设计CNN学习到的特征确实比较牛逼。这篇文献是经典必读文献,才发表了一年多,引用次数就已经达到了好几百,学习这篇文献,对于我们今后深入理解CNN,具有非常重要的意义。总之这篇文章,牛逼哄哄。

     

    二、利用反卷积实现特征可视化

    为了解释卷积神经网络为什么work,我们就需要解释CNN的每一层学习到了什么东西。为了理解网络中间的每一层,提取到特征,paper通过反卷积的方法,进行可视化。反卷积网络可以看成是卷积网络的逆过程。反卷积网络在文献《Adaptive deconvolutional networks for mid and high level feature learning》中被提出,是用于无监督学习的。然而本文的反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积网络模型,没有学习训练的过程。

    反卷积可视化以各层得到的特征图作为输入,进行反卷积,得到反卷积结果,用以验证显示各层提取到的特征图。举个例子:假如你想要查看Alexnet 的conv5提取到了什么东西,我们就用conv5的特征图后面接一个反卷积网络,然后通过:反池化、反激活、反卷积,这样的一个过程,把本来一张13*13大小的特征图(conv5大小为13*13),放大回去,最后得到一张与原始输入图片一样大小的图片(227*227)。

     

    1、反池化过程

    我们知道,池化是不可逆的过程,然而我们可以通过记录池化过程中,最大激活值得坐标位置。然后在反池化的时候,只把池化过程中最大激活值所在的位置坐标的值激活,其它的值置为0,当然这个过程只是一种近似,因为我们在池化的过程中,除了最大值所在的位置,其它的值也是不为0的。刚好最近几天看到文献:《Stacked What-Where Auto-encoders》,里面有个反卷积示意图画的比较好,所有就截下图,用这篇文献的示意图进行讲解:
    此处输入图片的描述

    以上面的图片为例,上面的图片中左边表示pooling过程,右边表示unpooling过程。假设我们pooling块的大小是3*3,采用max pooling后,我们可以得到一个输出神经元其激活值为9,pooling是一个下采样的过程,本来是3*3大小,经过pooling后,就变成了1*1大小的图片了。而upooling刚好与pooling过程相反,它是一个上采样的过程,是pooling的一个反向运算,当我们由一个神经元要扩展到3*3个神经元的时候,我们需要借助于pooling过程中,记录下最大值所在的位置坐标(0,1),然后在unpooling过程的时候,就把(0,1)这个像素点的位置填上去,其它的神经元激活值全部为0。再来一个例子:
    此处输入图片的描述

    在max pooling的时候,我们不仅要得到最大值,同时还要记录下最大值得坐标(-1,-1),然后再unpooling的时候,就直接把(-1-1)这个点的值填上去,其它的激活值全部为0。

     

    2、反激活

    我们在Alexnet中,relu函数是用于保证每层输出的激活值都是正数,因此对于反向过程,我们同样需要保证每层的特征图为正值,也就是说这个反激活过程和激活过程没有什么差别,都是直接采用relu函数。

     

    3、反卷积

    对于反卷积过程,采用卷积过程转置后的滤波器(参数一样,只不过把参数矩阵水平和垂直方向翻转了一下),这一点我现在也不是很明白,估计要采用数学的相关理论进行证明。

    最后可视化网络结构如下:
    此处输入图片的描述

    网络的整个过程,从右边开始:输入图片-》卷积-》Relu-》最大池化-》得到结果特征图-》反池化-》Relu-》反卷积。到了这边,可以说我们的算法已经学习完毕了,其它部分是文献要解释理解CNN部分,可学可不学。

    总的来说算法主要有两个关键点:1、反池化 2、反卷积,这两个源码的实现方法,需要好好理解。

     

    三、理解可视化

    特征可视化:一旦我们的网络训练完毕了,我们就可以进行可视化,查看学习到了什么东西。但是要怎么看?怎么理解,又是一回事了。我们利用上面的反卷积网络,对每一层的特征图进行查看。

     

    1、特征可视化结果:

    此处输入图片的描述

    总的来说,通过CNN学习后,我们学习到的特征,是具有辨别性的特征,比如要我们区分人脸和狗头,那么通过CNN学习后,背景部位的激活度基本很少,我们通过可视化就可以看到我们提取到的特征忽视了背景,而是把关键的信息给提取出来了。从layer 1、layer 2学习到的特征基本上是颜色、边缘等低层特征;layer 3则开始稍微变得复杂,学习到的是纹理特征,比如上面的一些网格纹理;layer 4学习到的则是比较有区别性的特征,比如狗头;layer 5学习到的则是完整的,具有辨别性关键特征。

     

    2、特征学习的过程。

    此处输入图片的描述

    作者给我们显示了,在网络训练过程中,每一层学习到的特征是怎么变化的,上面每一整张图片是网络的某一层特征图,然后每一行有8个小图片,分别表示网络epochs次数为:1、2、5、10、20、30、40、64的特征图:

    结果:(1)仔细看每一层,在迭代的过程中的变化,出现了sudden jumps;(2)从层与层之间做比较,我们可以看到,低层在训练的过程中基本没啥变化,比较容易收敛,高层的特征学习则变化很大。这解释了低层网络的从训练开始,基本上没有太大的变化,因为梯度弥散嘛。(3)从高层网络conv5的变化过程,我们可以看到,刚开始几次的迭代,基本变化不是很大,但是到了40~50的迭代的时候,变化很大,因此我们以后在训练网络的时候,不要着急看结果,看结果需要保证网络收敛。

     

    3、图像变换。

    从文献中的图片5可视化结果,我们可以看到对于一张经过缩放、平移等操作的图片来说:对网络的第一层影响比较大,到了后面几层,基本上这些变换提取到的特征没什么比较大的变化。

    个人总结:我个人感觉学习这篇文献的算法,不在于可视化,而在于学习反卷积网络,如果懂得了反卷积网络,那么在以后的文献中,你会经常遇到这个算法。大部分CNN结构中,如果网络的输出是一整张图片的话,那么就需要使用到反卷积网络,比如图片语义分割、图片去模糊、可视化、图片无监督学习、图片深度估计,像这种网络的输出是一整张图片的任务,很多都有相关的文献,而且都是利用了反卷积网络,取得了牛逼哄哄的结果。所以我觉得我学习这篇文献,更大的意义在于学习反卷积网络。

    参考文献:

    1、《Visualizing and Understanding Convolutional Networks
    2、《Adaptive deconvolutional networks for mid and high level feature learning
    3、《Stacked What-Where Auto-encoders

    ******************作者:hjimce 时间:2016.1.10 联系QQ:1393852684 原创文章,转载请保留原文地址、作者等信息**********

     
       

    利用pytorch实现Visualising Image Classification Models and Saliency Maps

    素材来源自cs231n-assignment3-NetworkVisualization

    saliency map

    saliency map即特征图,可以告诉我们图像中的像素点对图像分类结果的影响。

    计算它的时候首先要计算与图像像素对应的正确分类中的标准化分数的梯度(这是一个标量)。如果图像的形状是(3, H, W),这个梯度的形状也是(3, H, W);对于图像中的每个像素点,这个梯度告诉我们当像素点发生轻微改变时,正确分类分数变化的幅度。

    计算saliency map的时候,需要计算出梯度的绝对值,然后再取三个颜色通道的最大值;因此最后的saliency map的形状是(H, W)为一个通道的灰度图。

    下图即为例子:

    《利用pytorch实现Visualising Image Classification Models and Saliency Maps》

    上图为图像,下图为特征图,可以看到下图中亮色部分为神经网络感兴趣的部分。

    理论依据

    《利用pytorch实现Visualising Image Classification Models and Saliency Maps》

    《利用pytorch实现Visualising Image Classification Models and Saliency Maps》

    程序解释

    下面为计算特征图函数,上下文信息通过注释来获取。

    1. def compute_saliency_maps(X, y, model):
    2. """
    3. 使用模型图像(image)X和标记(label)y计算正确类的saliency map.
    4. 输入:
    5. - X: 输入图像; Tensor of shape (N, 3, H, W)
    6. - y: 对应X的标记; LongTensor of shape (N,)
    7. - model: 一个预先训练好的神经网络模型用于计算X.
    8. 返回值:
    9. - saliency: A Tensor of shape (N, H, W) giving the saliency maps for the input
    10. images.
    11. """
    12. # Make sure the model is in "test" mode
    13. model.eval()
    14. # Wrap the input tensors in Variables
    15. X_var = Variable(X, requires_grad=True)
    16. y_var = Variable(y)
    17. saliency = None
    18. ##############################################################################
    19. #
    20. # 首先进行前向操作,将输入图像pass through已经训练好的model,再进行反向操作,
    21. # 从而得到对应图像,正确分类分数的梯度
    22. #
    23. ##############################################################################
    24. # 前向操作
    25. scores = model(X_var)
    26. # 得到正确类的分数,scores为[5]的Tensor
    27. scores = scores.gather(1, y_var.view(-1, 1)).squeeze()
    28. #反向计算,从输出的分数到输入的图像进行一系列梯度计算
    29. scores.backward(torch.FloatTensor([1.0,1.0,1.0,1.0,1.0])) # 参数为对应长度的梯度初始化
    30. # scores.backward() 必须有参数,因为此时的scores为非标量,为5个元素的向量
    31. # 得到正确分数对应输入图像像素点的梯度
    32. saliency = X_var.grad.data
    33. saliency = saliency.abs() # 取绝对值
    34. saliency, i = torch.max(saliency,dim=1) # 从3个颜色通道中取绝对值最大的那个通道的数值
    35. saliency = saliency.squeeze() # 去除1维
    36. # print(saliency)
    37. return saliency
    38. 再定义一个显示图像函数,进行图像显示
    39. def show_saliency_maps(X, y):
    40. # Convert X and y from numpy arrays to Torch Tensors
    41. X_tensor = torch.cat([preprocess(Image.fromarray(x)) for x in X], dim=0)
    42. y_tensor = torch.LongTensor(y)
    43. # Compute saliency maps for images in X
    44. saliency = compute_saliency_maps(X_tensor, y_tensor, model)
    45. # Convert the saliency map from Torch Tensor to numpy array and show images
    46. # and saliency maps together.
    47. saliency = saliency.numpy()
    48. N = X.shape[0]
    49. for i in range(N):
    50. plt.subplot(2, N, i + 1)
    51. plt.imshow(X[i])
    52. plt.axis('off')
    53. plt.title(class_names[y[i]])
    54. plt.subplot(2, N, N + i + 1)
    55. plt.imshow(saliency[i], cmap=plt.cm.hot)
    56. plt.axis('off')
    57. plt.gcf().set_size_inches(12, 5)
    58. plt.show()
    59. show_saliency_maps(X, y)

    输出为:

    《利用pytorch实现Visualising Image Classification Models and Saliency Maps》

    另一种梯度的计算法,通过了损失函数计算出来的梯度

    1. out = model( X_var )
    2. loss_func = torch.nn.CrossEntropyLoss()
    3. loss = loss_func( out, y_var )
    4. loss.backward()
    5. grads = X_var.grad
    6. grads = grads.abs()
    7. mx, index_mx = torch.max( grads, 1 )
    8. # print(mx, index_mx)
    9. saliency = mx.data
    10. # print(saliency)

    这中方法的output为:

    《利用pytorch实现Visualising Image Classification Models and Saliency Maps》

    参考资料:

    1、 Karen Simonyan, Andrea Vedaldi, and Andrew Zisserman. “Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps”, ICLR Workshop 2014.
    2、http://cs231n.stanford.edu/syllabus.html

     
       

    卷积神经网络可视化 

    clgo
      clgo 发布于 2017/09/22 10:44
     
    字数 818
     
    阅读 141
     
    收藏 0
       

    可视化可以让我们知道一个神经网络正在学习什么。当我们建立一个神经网络结构来进行图片分类预测时,我们想要解释网络预测的原理,例如,我们想要知道为什么网络会预测一张图片是宇宙飞船。

    论文一:Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps

    论文一为可视化一个正在运行的神经网络提供了两种思路,它们都需要计算输出图片相对于输入图片的梯度。

    分类模型可视化:分类任务是产生一个最具代表性的图片。思考:图片的什么地方看起来更像一艘宇宙飞船?我们会发现当图片I的最大分数是Sc(I) 时,这个图片被归类为c。

    注:得分Sc(I)是卷积神经网络输出经过softmax函数得出的值,并不是预测可能性。

    我们可以开始图片I,使用后向传播算法计算相对于I的梯度,使用梯度上升发现一个更好的I。这个过程是非常相似于优化一个神经网络,不同的是,我们保持权重固定不变,优化图片

    点:有点像E-M?也会存在局部极小点的问题?这个问题可以/值得深入研究?

    图片分类的显著性:这个任务的目标是发现图片中的那些像素对确定为一个类别有着比较大的影响力。思考:图片中的那些像素对把图片分类为宇宙飞船有着比较大的影响力?记下分数Sc相对于输入图片I,然后计算图片I0。

    输入图片说明

    上面的计算会使我们在每个像素点处获得一个标量值,利用标量值进行正则化可以获得图片的显著图。

    输入图片说明

    图片的显著图可以用来定位感兴趣的目标,使用分割算法进行分割。注意分类模型智能给出类别,不能进行定位,被称为弱监督定位

    论文二: Learning Deep Features for Discriminative Localization

    论文二提出了一种不同的方法可视化图片的显著性图,与论文一使用的后向传播算法不同的是,论文二提出修改前向网络结构实现分类和定位。

    网络使用一系列卷积层作为网络的开始,通过一个图片,卷积网络生成K个特征图。每个特征图包含i*j个激活,f(k)(i,j)代表特征图k中的定位点(i,j)。

    输入图片说明

    注:通常情况,图像分类使用卷积层后接全链接层和softmax层,使得输入图片的大小需要一致,论文二采用特征映射的方法使得网络可以处理不同大小的输入,了解更多可以参考Global Average Pooling

    为了使用上面的结构进行分类操作,我们可以获得一个显著图,也叫激活图,对每一个特征图学习一个权重。

    输入图片说明

    论文二的方法可以从激活图中计算分类分数,同时相对于后向优化可以产生更好的可视化效果(?)

    **参考资料:**https://rajpurkar.github.io/mlx/visualizing-cnns/

     

    Pinned

    1. Visually Explore the Stanford Question Answering Dataset

       JavaScript  338  70

    2. A web tool that enables crowds to label lane complexes in the 3D environment around a car.

       JavaScript  4  5

    3. machine learning experiments

       HTML  7  1

    4. Fast javascript implementation of T-SNE with tree-based acceleration

       JavaScript  10  1

     
       

    http://davidlau.me/2018/01/12/cnn-saliency-maps/

    https://huwang.blog.csdn.net/article/details/78519083

     
       

    http://davidlau.me/archives/

     

    Nice! 56 posts in total. Keep on posting.

    2019

    淘宝 oCPC 算法笔记

    graph-embedding

    假设检验

    pCTR

    deep-ctr-models

    贝叶斯定理

    Xavier 初始化方法

    RTB 广告竞价策略

    2018

    Lookalike 算法综述

    量化交易笔记

    CNN 模型压缩方法

    Optical Flow

    Loss Function

    AI 精彩视频剪辑:战术竞技类游戏直播

    视频静态区域检测

    小波变换简介

    CNN:目标检测

    CNN:细粒度分类

    Backprop

    CNN 可视化解释:Saliency Maps

    ResNet 学习笔记

    2017

    生成模型

    无约束最优化问题求解

    iOS 私有 API 调用检测机制探讨

    在线学习方法概述

    GloVe

    GBDT

    Reinforce Learning

    Deep Learning

    Activation

    Factorization Machine

    Matrix Factorization

    尝试改进微信读书个性化推荐:一个基于 CTR 预估的方法

    iOS App 启动必 crash 监控

    R 语言线性回归应用:拟合 iOS 录音波形图

    HTML

    基于word2vec协同过滤推荐

    2016

    微信读书冷启动推荐实战:一种基于用户属性的方法

    学习协同过滤推荐 \w 100行Python代码

    thai-photos

    初学潜水

    微信读书冷启动用户书籍推荐初探:一个借助微信用户画像的方法

    微信读书排版引擎自动化测试

    iOS 启动连续闪退保护方案

    2015

    尝试解决 Xcode7.1 覆盖率测试 GCDA 文件损坏问题

    notes-on-7-concurrency-model-in-7-weeks

    learn-haskell

    五毛和阴谋论

    SCIP学习笔记

    通过Swift学函数式编程

    笔记:软件开发的转折——并发化

    我的马克思主义观是如何崩塌的

    Google Chrome Canary:一个可以慢速调试css动画的浏览器

    2014

    TODO

    每晚睡4.5小时,保持精力充沛的秘诀

    编程珠玑II C12笔记: rand num generator

     

     
     
       

     

    对卷积网络可视化与可解释性相关资料的一些整理,不断更新中~

    目的

    • 可视化网络的关注区域(attention map),理解与分析网络的学习情况
    • 利用可视化的信息引导网络更好的学习

    博客:

    论文:

    代码:

    《Deep learning with python》下载地址​pan.baidu.com

     

    1. Visualizing and Understanding Convolutional Networks
    https://arxiv.org/pdf/1311.2901v3.pdf
    https://neukom.dartmouth.edu/docs/bbat-wacv2016.pdf
    http://cs231n.github.io/understanding-cnn/
    
    2. Net surgery trick
    http://cs231n.github.io/convolutional-networks/#convert
    https://github.com/BVLC/caffe/blob/master/examples/net_surgery.ipynb
    
    https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/image_segmentation.html
    https://arxiv.org/pdf/1502.02766v3.pdf
    https://arxiv.org/pdf/1411.4038v2.pdf
    http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf
    https://arxiv.org/pdf/1605.06211v1.pdf
    
    `convert fully connected layers to their
        equivalent convolutional layers, since the weights are the same and only
        the shapes are different.`
    
    3. Global average pooling layer
    Network In Network
    https://arxiv.org/pdf/1312.4400.pdf
    
    4. Learning Deep Features for Discriminative Localization
    http://cnnlocalization.csail.mit.edu/
    https://github.com/jacobgil/keras-cam
    
    5. Grad-CAM: Gradient-weighted Class Activation Mapping
    https://github.com/ramprs/grad-cam
    http://gradcam.cloudcv.org/
    https://arxiv.org/pdf/1610.02391v2.pdf
    
    6. Is object localization for free? – Weakly Supervised Object Recognition with Convolutional Neural Networks
    http://www.di.ens.fr/willow/research/weakcnn/
    http://www.di.ens.fr/willow/research/cnn/
    

    Additional:

    1. Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps
    https://arxiv.org/pdf/1312.6034v2.pdf
    
    2. Top-down NeuralAttention by Excitation Backprop (c-MWP)
    https://arxiv.org/pdf/1608.00507v1.pdf
    http://cs-people.bu.edu/jmzhang/excitationbp.html
    
    3. Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer
    https://arxiv.org/pdf/1612.03928v1.pdf
    https://github.com/szagoruyko/attention-transfer
    
    4. Visualizing Deep Neural Network Decisions: Prediction Difference Analysis
    https://openreview.net/pdf?id=BJ5UeU9xx
    https://github.com/lmzintgraf/DeepVis-PredDiff
    A New Method to Visualize Deep Neural Networks
    https://icmlviz.github.io/assets/papers/23.pdf
    
    5. Self-Taught Object Localization with Deep Network
    https://arxiv.org/pdf/1409.3964.pdf
    
    6. Shallow and Deep Convolutional Networks for Saliency Prediction
    https://github.com/imatge-upc/saliency-2016-cvpr
    

    Keras codebase:

    https://github.com/raghakot/keras-vis
    
    Oclusion based technique:
    https://github.com/waleedka/cnn-visualization/blob/master/cnn_visualization.ipynb
    
    Net surgery trick:
    https://github.com/heuritech/convnets-keras
    
    GAP-CAM
    https://github.com/alexisbcook/ResNetCAM-keras/
    https://github.com/jacobgil/keras-cam
    https://github.com/tdeboissiere/VGG16CAM-keras
    
    Grad-CAM
    https://github.com/jacobgil/keras-grad-cam
    
    https://raghakot.github.io/keras-vis/visualizations/attention/
    
    https://github.com/mlhy/ResNet-50-for-Cats.Vs.Dogs
    

    Tensorflow codebase:

    GAP
    https://github.com/sjchoi86/tensorflow-101/blob/master/notebooks/gap_mnist.ipynb
    
    GAP-CAM
    https://github.com/jazzsaxmafia/Weakly_detector
    
    Grad-CAM
    https://github.com/Ankush96/grad-cam.tensorflow
    

    PyTorch

    Grad-CAM
    https://github.com/kazuto1011/grad-cam-pytorch
    
    GAP-CAM
    https://github.com/metalbubble/CAM/blob/master/pytorch_CAM.py
    
    SPN
    https://github.com/yeezhu/SPN.pytorch
    
    https://github.com/utkuozbulak/pytorch-cnn-visualizations
    
    https://github.com/jacobgil/pytorch-explain-black-box
    

    Regression Activation Map

    https://github.com/cauchyturing/kaggle_diabetic_RAM
    

    Other

    https://github.com/metalbubble/cnnvisualizer
    
    https://github.com/InFoCusp/tf_cnnvis
    
    https://github.com/ppwwyyxx/tensorpack/tree/master/examples/Saliency
    
    https://github.com/InFoCusp/tf_cnnvis
    
    https://github.com/keplr-io/quiver
    
    https://jacobgil.github.io/deeplearning/vehicle-steering-angle-visualizations
    https://jacobgil.github.io/deeplearning/class-activation-maps
    
    https://jacobgil.github.io/deeplearning/filter-visualizations
    https://jacobgil.github.io/computervision/saliency-from-backproj
    
    https://github.com/CSAILVision/NetDissect
    
    https://medium.com/merantix/picasso-a-free-open-source-visualizer-for-cnns-d8ed3a35cfc5
    
    https://github.com/CSAILVision/NetDissect
    http://netdissect.csail.mit.edu/
    
    https://github.com/imatge-upc/saliency-salgan-2017
    
    http://imatge-upc.github.io/saliency-2016-cvpr/
    https://github.com/imatge-upc/saliency-2016-cvpr
    

    Visualization:

    https://github.com/shaohua0116/Activation-Visualization-Histogram
    

    To look at:

    http://blog.qure.ai/notes/visualizing_deep_learning

     

     

    编辑于 2019-01-09

     

     

     

     
       
       

     

     

     

     

     

     

    易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
    该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!