SIFT+词袋+SVM的深入理解

为什么这么做,而不是直接像是HOG那样输入到svm中直接进行分类?

首先了解一下返回的参数是什么样子和形式的:

import cv2

img = cv2.imread(r'C:\Users\Pictures\Camera Roll/xxy.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# one SIFT
#sift = cv2.xfeatures2d.SIFT_create()
#kp1 = sift.detect(gray,None)
#img1=cv2.drawKeypoints(gray,kp1,img)
#cv2.imshow("sift_Image", img1)
#cv2.imwrite(r'C:\Users\Pictures\Camera Roll/sift_test.jpg',img1)

#Compare four alogorithms

#Another SIFT
sift = cv2.xfeatures2d.SIFT_create(120)
(kps, descs) = sift.detectAndCompute(gray, None)
img1=cv2.drawKeypoints(gray, kps, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SIFT_Algorithm', img1)

# SURF
surf = cv2.xfeatures2d.SURF_create()
(kps2, descs2) = surf.detectAndCompute(gray, None)
img2=cv2.drawKeypoints(gray, kps2, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SURF_Algorithm', img2)

在SIFT算法中,我加了一个120,用于指定我取前120个最好的keypoint(检测关键点),通过spyder可以看到kps和descs(描述子)
可见描述子的矩阵为120*128,其中120为120个检测关键点,128为每个检测关键点所对应的特征的值(也就是每一个检测关键点用一个128*1的向量表示的(128是固定的,但是kps如若不指定大小的话,不同的图像会有不同的值))

*注:我们使用的是decs矩阵,kps不包含特征值,只包括检测关键点

对于词袋模型的建立来自这篇博客:
其中对应这篇博客中的图片,我们可以理解其中的鼻子,眼睛等局部特征就是我们的检测关键点,这样就一一对应上了。

我们最后想要使用SVM进行分类,所以最后我们要输入一个向量,但是呢,SIFT特征提取出来的是一个矩阵,我们不能直接把这个矩阵展开了,(直接展开一是向量就太大的,二是就相当于把鼻子对用的向量接到嘴对应的向量后面,等等,不像是hog一样是拼接的梯度特征,这里是拼接的是检测关键点)利用词袋模型再加以聚类分析可以更高效的利用这些特征,因此采用这种方法是最为合理的。
对应的流程图为:


有了上面的理论知识,下面就可以动手实现代码了,比较好的是这个博客,可以参考其代码: 点击打开链接
代码中部分函数是之前的,但是其基本思想可以借鉴。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值