Beyond bags of features: Spatial Pyramid Matching 文章的笔记

 研一一年,都在做图像分类的实验,之前一直苦于无法重复出论文中的结果,今天和博士讨论,发现对SPM这篇文章有一个地方理解有偏差,现在重新整理下思路,把自己对文章的理解写出来,以后再看时也能快速捡起来。SPM是对BoW模型的一个扩展,其核心是解决:两个集合的比较问题,这两个集合中所含特征个数不同,且特征之间是无序。盗用下图说明,对于X,Y图片来说,其中m和n通常不等,另X,Y中的各个点都是D维空间中的,没有顺序。下面详细介绍之。


图1 图像特征表示

代码实现如下:https://github.com/xinedison/Image_classification.git

论文原文如下:

Beyond Bags of Features: Spatial Pyramid Matching for Recognizing Natural Scene Categories
链接http://web.engr.illinois.edu/~slazebni/
文章思量来源与pyramid match kernel
论文链接http://www.cs.utexas.edu/~grauman/research/projects/pmk/pmk_projectpage.htm
开源代码http://people.csail.mit.edu/jjl/libpmk/

目前应该所有的分类文章都会使用到该文献做一个图像表达,来达到较高的分类准确率。

我们首先来回顾一下图片分类常用Bag-of-Words(BOW)模型,见http://blog.csdn.net/v_JULY_v/article/details/6555899,其来源于文本分类时使用的BoW模型,分类器使用SVM,通俗介绍见:http://www.blogjava.net/zhenandaci/category/31868.html?Show=All

对于图片分类,通常需要经历四个步骤:

(1)特征提取。通常使用dense-SIFT,就是在图片上撒一个网格,每个网格中心点都计算一个SIFT(128维)的表达,此步骤既是将每幅图片图片表示成一堆SIFT的集合;

(2)字典训练。通常使用K-Means,因为从上一步得到的SIFT每个都不一样,加入X图有520(m=520)个,Y图有480(n=480)个,那么对于图片来说就总共有1000个词了,两个东西没法比较,因此使用一个训练词典的步骤,将这些点都聚到K个中心点上;

(3)特征量化。得到了K-Means的中心点(既词典),假设有400个,现在将每一个图片都量化到刚才的这些中心点之上,那么我们就将原来每幅图中繁多的N个图片特征(每个都是孤立的),变成了N个1-400的量化值(每个原始特征对应一个量化值,此处当然是离字典中哪个距离近,就量化成哪个了),而量化到同一个值上的两个特征就可以认为是相同的。同时此时就可以计算图片的直方图表达式了。

(4)图片表达。在上一步得到每个特征的量化结果后,对于X图片,相当于是520个1-400的数,Y图片则是480个1-400的数,我们就可以对这两组数做直方图,此时,得到的直方图就是图片的表达(通常需要加入正则化,既除以特征总数),该表达为传统BoW。

对于SPM来说,使用Pyramid kernel,在BoW上加入了一个空间金字塔的概念。盗图如下:


图2 SPM表示

其核心思想就是,本来我们两组图片集经过量化后,对于传统的BoW,只要是量化到了K-Means的同一个词条上,则不管该特征出现在图像的哪个位置,都算是相互匹配上了。而现在不同,我们更倾向于认为那些落在不同图片同样一个小区域上的特征是比配得更好,这个小区域的半径越大,这两个特征比配度就应该越小,尽管他们都已经量化到了同一个词条上。详细来说,即是,在不同层次上,先对图片做一个分割,右边两个图,在该层次上,只有落在同一个分割小区域内的两个相同的特征,才算彼此匹配上。这里所谓两个相同的特征,就是指图片中的点,方块或者加号,对于我们得到的词典而言,则是指K-Means的聚类中心,量化到不同聚类中心的两个点是不能相互匹配的,就像圆点和方块不匹配一样(这不是废话吗?)。而由于较大尺度的匹配包含了较小尺度的匹配集合,最右边匹配上的点在中间都匹配上,在左边的最大尺度更不用说。这样,就需要对较大尺度匹配上的数做一个惩罚,既上面的两个1/4,而较小尺度上的应该鼓励,图中的1/2,如果搞清楚了这个系数,论文中有详细公式,就基本理解这篇文章了。

上面还是有点费解,因为SPM从pyramid kernel引申,pyramid kernel是为了得到最优匹配的一个近视值。下面就以图片特征是1维的的情况来对pyramid kernel做一个说明。X,Y是两个一维的点集,现在计算他们的最优匹配数为:


图3 最优匹配


使用pyramid kernel可以实现上述最优匹配的近似结果:

   

    图4 pyramid kernel匹配

盗用pyramid kernel的PPT图片,此时得到的pyramid匹配数(1x2+1/2x4+1/4x5)与最优化匹配数4近似,因此pyramid kernel具有较好效果。

而对于SPM来说,其将原始的特征空间中不同特征的匹配,转化到了图像坐标空间中(因为图像里已经对特征集做了一个聚类表达了),如果是特征空间,则要划分特征空间中的每一个维度,SIFT是128维,这样的计算量无法承受的。通过SPM转化,将原始的图像BOW表达转化成了SPM表达,实际就是把图2的21(1+4+16)个直方图乘以其中系数后,再连在一起。

说了那么多,最后其实就是对于传统的SVM实现代码,需要加入自己计算距离的过程,如果使用LIBSVM,则要自定义核函数,用如下语句:

model = svmtrain(train_label,[(1:tr_num)',tr_tr_kernel_mat],'-t 4');

其中tr_tr_kernel_mat 是每个训练样本的距离矩阵,在计算时数据i对数据j的距离时,matlab仅是一句:kernel_mat(i,j) = sum(min(data1(i,:),data2(j,:)));

测试时同样要提前计算每个测试样本和训练样本的距离,然后调用:[predict_label,accuracy,dec_values] = svmpredict(test_label,[(1:ts_num)',ts_tr_kernel_mat],model);

就此搞定,终于可以做出论文中差不多的结果了,虽然不是一个很难的工作,可是毕竟纠结了好久,现在甚是欣慰。

最后要多谢王博士的指导!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值