BOW模型学习历程

首先简介一下BOW:

词袋模型,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。最近词袋模型也被应用在电脑视觉领域  。

词袋模型被广泛应用在文件分类,词出现的频率可以用来当作训练分类器的特征。

关于"词袋"这个用字的由来可追溯到泽里格·哈里斯于1954年在Distributional Structure的文章

(原谅我直接抄于百度百科)

图像分类总体步骤概述:

        我们先对图像的特征进行向量表示,即用特征向量来表示一幅图像,其中涉及到SIFT,Dense SIFT此类算法的应用,输入是整幅图像,输出是表示图像的SIFT特征向量(维度一般是128维,个数根据特征点(SIFT)或者子图像的个数(Dense SIFT))。

        而后,我们将特征向量应用聚类算法,例如分300类,输入是上一步我们得到所有的图像的SIFT特征向量,输出是300个簇以及300个码子(即簇的均值中心用来代表分簇),这300个码子就相当于字典,就是我们所有输入图像的图像字典,而码子,就相当于字典里面A,B,C,D的索引。

        下一步我们分别统计每幅图像中的SIFT特征向量与码子之间的欧式距离,以300个码子作为直方图横坐标,即维度,得到与距离特征向量最近的码子,统计码子在每幅图像中的出现频数并进行归一化作为直方图的幅值,即我们把每幅图像表示成一个300维的向量,查了一下相关资料此过程好像被称为向量量化编码、硬量化编码、硬投票编码(出处:向量量化编码只在最近的视觉单词上响应为 1,因而又称为硬量化编码、硬投票编码),此步输入为码子与SIFT特征向量,输出是图像的特征向量(特征直方图),此时我们是在整幅图像中进行量化编码,而这样优缺点也很明显,对于缺点,我们又引入空间金字塔模型,即把图像分别分块,例如1图是原图,2图是将原图平均2*2分块,3图是将原图平均16*16分块等等,分别计算每幅图像的子图(分块后的每个小图像)特征向量并赋予不同的权重,直接将每幅图像得到的特征向量串联起来得到总特征向量来表示图像,而后每幅图像的特征向量我们也已经得知了。

        后续就是训练分类器以分类我们的目标图像,我们使用SVM,得到训练好的分类线性函数,以及核函数,松弛变量后,我们将目标图像的特征向量给SVM处理,我们就会得到目标图像的预测标签,我们再利用预测标签和已知的真实标签即可得到分类准确度,此过程输入先是样本图像的特征向量,以得到训练分类器的分类线性函数,以及核函数,松弛变量,而后输入目标图像的特征向量,输出是分类预测标签。

具体步骤:

一:(1)SIFT算法

1.首先,我们拿到一幅图像,我们需要去把它转换成高斯金字塔模型,即通过降采样等,形成一个金字塔状的很多层图像,最底层,也就是最宽的那一层,是我们原图的一倍?然后依次减小分辨率,一般是减半,然后我们用不同σ(尺度空间参数)的高斯函数对每一层的图像进行卷积,所以在每一层中,又得到很多组不同尺度空间的图像,即得到高斯金字塔模型。

2.我们需要得到DOG金字塔,其实我们需要LOG金字塔,但DOG可以近似LOG,且操作简便,故求DOG金字塔,我们将高斯金字塔模型进行差分,即每层中每组图像之间进行相减,即可得到DOG(高斯差分)金字塔模型。

3.得到DOG金字塔模型后,我们需要求每层每组中的每张图像中的像素极值,因为极大值极小值相较于其他特征提取函数可以获得最稳定的图像特征,此步我们不仅需要比较每张图像中一个像素及其邻域内的像素大小,还需要比较上一张,下一张的图像,此时还涉及到第一张最后一张无法比较的问题以后再说,比较出来后得到后,因为像素是离散值,我们又需要进行二阶泰勒修正,点边缘去除,低对比度去除等进行精确极值求解

4.得到极值之后,我们又称之为特征点,可以得到其坐标(x,y),以及其原图被高斯卷积的高斯函数的σ,我们以特征点的中心,以3*3/2σ为半径,画一个圆,圆内所有的像素求解其梯度幅值以及幅角,把幅角划分为10*36或者8*45个区间,作为直方图的横坐标,即维度,以梯度幅值相加作为直方图幅值,将此区域所有像素的梯度进行统计,直方图最高的幅值对应的幅度定为特征点的主方向,大于80%作为副方向,大小即为直方图对应的幅值,因此我们可以得到特征点的坐标(x,y),其原图被高斯卷积的高斯函数的σ,以及方向,若有多个方向,处理时分别处理即可

5.经过坐标转换(将坐标X轴转为特征点的方向),此目的是为了实现旋转不变性,又会得到一样的圆内不一样的圆内像素的梯度幅值与幅角,此时,我们以此特征点为中心,16*16像素划定一个矩形邻域,分别计算邻域内像素的梯度幅值与幅角,并且以4*4作为一个小图像块,直方图统计梯度幅值与幅角(以8作为维度,8*45度作为区间),得到种子点,所以我们可以得到16个种子点,每个种子点为8个方向,8个对应的直方图幅值,即8维向量,所以一个特征点,我们此时就会将其表示为8*16=128维向量。

(2)Dense SIFT算法

1. Dense SIFT与SIFT结论

图像识别问题大多用Dense-SIFT,而图像检索总是用SIFT(利用了检测子)。dense-SIFT在图像检索上的性能不如SIFT检测子的性能好。

2.区别

SIFT 是一种局部特征提取算法,它可以在图像中自动检测出关键点,并计算这些关键点的局部特征描述子,这些局部特征描述子具有旋转和尺度不变性,可以被用于图像匹配、物体识别、三维重建等应用。

Dense SIFT 是在 SIFT 算法基础上的改进,它在图像的每个像素位置上计算特征描述子,而不是仅仅在选定的关键点处计算。这种方法可以提高图像的密度特征,增加图像的表达能力。

因此,SIFT 和 Dense SIFT 的主要区别在于特征提取密度不同。SIFT 算法提取密度较低,而 Dense SIFT 算法提取密度较高。在不同应用场景下,可以根据需要选择不同的算法。

3.Dense SIFT具体步骤

至于Dense SIFT,是先用滑动窗口(从上到下,从左至右)对整图进行分块,分成一块块的子图,也就是一块块图像块,例如子图像为16*16大小,图像共分成576个子图像,然后对于每一块图像块,提取其特征,即进行SIFT的一些子步骤,首先计算出每个图像块内包含的每个像素梯度幅值以及幅角(即方向与大小),并将幅角投射到8*45的方向上,将每个图像块又继续细分成4*4子子图像块(原谅我自己这么定义),以子子图像块的中心作为中心点(特征点),计算其内像素到中心点的距离,并以此为权重,关于8个角度分别统计子子图像中包含的所有像素点所对应(的角度)的梯度大小,也就是会形成SIFT的种子点,因为子图像是16*16大小,且子子图像是4*4大小,所以我们会得到16个种子点,这块与SIFT基本一致,而每个种子点是8个方向,即8维向量,大小则为梯度幅值,共得到16*8=128维特征向量,即每个子图像会得到128维向量,而整幅图像则会得到576个128维特征向量。

二:聚类

我们采用K-means算法(很简单的算法,最基础的聚类算法,聚类算法中的“hello,world”),选取300个均值中心,以此分簇所有图像里面所有的特征点,均值中心则也同特征点向量一样,为128维向量,相当于把我们输入的向量进行自分组,并得到分组之后各组的均值,通俗一点,就是把图像的特征向量比较相似的分为一组,相差大的分为不同的组,并且得到相似的一组中能够代表这一组的向量(均值向量),我们将这300个聚类均值中心作为码子,而码子又组成码本,此时我自己的理解是,码本就相当于图像特征字典,码子就相当于字典中A B C D 等索引。

三:

我们计算每幅图像中每个特征点距离码子的距离,以使特征点进入到相应的簇中,此时做直方图,维度为300个码子,也是对应300个簇(簇内相似度高,簇间相似度低),幅值为若有1个特征点对应相应的簇,码子(簇)即加1,后进行归一化,此时每幅图像就被表示为一个300维向量(图像的特征化)

四:

在此中又会涉及到全局与局部处理,因为以上内容为全局图像处理,会限制了图像表示方法的表示性能丢失,故又需要引入图像金字塔模型,即将图像分为3个等级(Level),第一个等级将图像划分为4*4=16个子图,第二个等级是将图像划分为2*2=4个子图,第三个等级是原图1*1=1。每个子图分别用上述300维向量表示,并赋予不同的权重。第一个等级BOW向量的维度为4*4*300=4800,权重为0.5,第二个等级BOW向量的维度为2*2*300=1200,权重为0.25,第三个等级BOW向量的维度为1*1*300=300,权重为0.25。将三个等级的BOW向量直接串联起来,形成4800+1200+300=6300维的向量作为图像的特征向量用于表示图像。

五:

SVM,我们知道,至于线性的分类,我们使用线性分类器即可,对于非线性的分类,我们就需要核函数加松弛变量来先将非线性映射到高纬度寻求线性的分类,在这里SVM的作用,我自己的理解是分类目标图像,我们需要用样本图像来进行训练得出合适的线性分类器的线性分类函数(如果线性的话)、核函数以及松弛变量(如果非线性的话),然后对测试图像进行测试,得到测试图像的预测标签,利用预测标签和已知的真实标签得到分类准确度。

SVM自我理解,首先是线性分类器,即求线性函数(超平面)y=wx+b(我喜欢成为分类函数,即把样本值分类),若y(x)>=1,则为一类,y(x)<=-1则为另一类(我们作为分两类先说),其中x与w为n维向量,并非一元自变量,我们需要求其中的w与b,其实就是求w,因为b可以求出w后带入样本值xi即可求解,至于求w,又会产生新的知识,首先是,我们需要知道间隔与几何间隔的意义,间隔就是g(x)=y(wx+b)即y的绝对值,我们将g(x)归一化,即除以||w||,得到几何间隔,此时我们由几何距离的定义可以看到,几何间隔就是被分类的样本值中距离线性函数(超平面)的欧式距离,我们定义几何间隔是被分类的样本值中距离线性函数(超平面)的欧式距离此时最小的距离,然后我们做平行于线性函数(超平面)的新线性函数(超平面),为了便于搞清楚,我把线性函数(超平面)叫做N,新线性函数(超平面)叫做N1,N2(因为两类样本值所以有两条),很显然,N1,N2穿过(包含被分类的样本值中距离线性函数(超平面)最近的样本值),且一部分样本值将在N1与无穷远处,而另一部分则处在N2与无穷远处,即N1,N2作为样本所在的直线且距离线性函数(超平面)最近,N1,N2上的样本,被称为支持变量,之所以如此关心几何间隔这个东西,是因为几何间隔与样本的误分次数间存在关系:几何间隔越大,样本的误分次数将越低,所以我们的任务变成使几何间隔越大,而几何间隔又是g(x)归一化,即除以||w||,所以我们又可以得到,我们要小化||w||,所以此时,我们求w就有了目标,但也很显然,||w||为0的时候,是||w||最小的时候,但此时,由于我们一般规定把间隔固定为1,这是指把所有样本点中间隔最小的那一点的间隔定为1(这也是集合的间隔的定义,有点绕嘴),也就意味着集合中的其他点间隔都不会小于1,按照间隔的定义,满足这些条件就相当于让下面的式子总是成立:

    yi[(w·xi)+b]≥1 (i=1,2,…,l) (l是总的样本数)

,但如果||w||为0,则N1,N2将距离N无穷远,这是几何间隔定义式得到的,所以此时,样本点都将处在N1,N2之间,将令我们拒绝分类,所以我们需要附加上式以作为条件,此时就会变成条件极值,即目标函数||w||,条件yi[(w·xi)+b]-1≥0 (i=1,2,…,l),为了方便求导(高数条件极值的求解需要求导),所以我们把目标函数改为1/2||w||²,故我们已经可以求得w,故线性函数(超平面)y=wx+b得以求解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值