KNN算法和Dense SIFT

KNN算法和Dense SIFT

摘要:

  1. KNN
  2. Dense Sift
1.KNN算法

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
KNN关键的一个参数就是K了
对下面这组参数:

n=400
class_1 = 0.8 * randn(n,2)
r = 0.8 * randn(n,1) + 5
angle = 3*pi * randn(n,1)
class_2 = hstack((r*cos(angle),r*sin(angle)))
labels = hstack((ones(n),-ones(n)))

当把K修改为150时:
在这里插入图片描述
当K=5时,分类的图像为:
在这里插入图片描述
当把K改成1时:
在这里插入图片描述
可见对于该类型的数据,K越小分类效果越好。但是K过于小的话,会对噪声过于敏感。
像对下面这两组数据,KNN算法完全无法分类

#右图
class_1 = 5.6 * randn(n,2)
class_2 = 3 * randn(n,2) + array([-5,5])
#左图
class_1 = 5.6 * randn(n,2)
class_2 = 3 * randn(n,2) + array([15,5])

在这里插入图片描述在这里插入图片描述

2.Dense Sift

dense sift和sift的差别:
dense SIFT是提取我们感兴趣的patches中的每个位置的SIFT特征。而通常做特征匹配的SIFT算法只是得到感兴趣区域或者图像上若干个稳定的关键点的SIFT特征。
根据这个特性,一般dense sift用于图像识别,而sift用于图像检索。

dense SIFT提取的做法是,拿一个size固定的掩模或者bounding box,以一定的步长(stepsize)在图像上自左向右、从上到下提取dense SIFT的patch块。

x,y = meshgrid(range(steps,m,steps),range(steps,n,steps))#生成采样点的网格,step为步长
scale = size/3.0#scale就是bounding box的大小
xx,yy = x.flatten(),y.flatten()
frame = array([xx,yy,scale*ones(xx.shape[0]),zeros(xx.shape[0])])#生成bounding box提取特征值
dsift.process_image_dsift('gesture/hand.jpg','hand.dsift',90,40,True)#调用函数,其中90是size,40是step

对手势进行dense sift 特征提取:
在这里插入图片描述在这里插入图片描述
把步长变小之后step=20(图左),再把size变小size=20(图右):
在这里插入图片描述在这里插入图片描述

我们可以通过调整这两个值,来观察他们对识别精确率的影响:

dsift.process_image_dsift(filename,featfile,5,2,resize=(50,50))

使用的测试集是有加入训练集没有的数据,包括自己拍的:

filelist_train = get_imagelist('gesture/train')#训练集
filelist_test = get_imagelist('gesture/test')#测试集
  1. 当我们把这两个参数的值调整到,size=5,step=2的时候,对于手势的训练集的识别精确率为:86.93%。
  2. size不变,增加步长step=10(size=5,step=10),准确率为:89.44%
  3. size不变,继续增加步长到step=20(size=5,step=20),准确率降为83.41%
  4. 这时候让step不变,增加size=20(size=20,step=20),发现准确率更低了,为73.86%
  5. 接下来,把step调整到之前准确率最高的10,降低size=2(size=2,step=10),发现准确率为83.41%。比之前的5和10的组合更低了。
  6. 当我们把size调整到比step更大的时候(size=18,step=5),准确率只有51.25%了。

所以可以得出结论,size和step对于精确度的影响不是一个线性上升和线性下降的过程。

  • 相对于step较大的情况,step较小的时候整个识别准确率是更高的。但是当step过于小的,会出现过拟合的现象,识别率反而会下降。
  • size的值不宜过大,如果size的值接近于step或者大于step,就会像上面的左图一样,每个扫描过去的patch块都和周围的其他patch有很大面积的重复,并且过大的size对细节的提取肯定是模糊的。所以当size形成的bounding box的边长比step更大的时候,正确率会降到只有50%。
  • 同样的size也不宜过小,如上图的右图,过于小的size和比它更大的step会使在扫描的过程中遗漏一些特征。也不利于识别的正确率。

用我们上面测试出正确率最高的step和size组合来对自己拍的图片进行识别:
test1:
在这里插入图片描述在这里插入图片描述
test2:
在这里插入图片描述在这里插入图片描述
test3:
在这里插入图片描述在这里插入图片描述
从上面的结果来看,对于自己拍摄的图片识别正确率并不高,可能是因为背景比较杂对特征提取造成了影响。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值