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一樣是拼接的梯度特徵,這裏是拼接的是檢測關鍵點)利用詞袋模型再加以聚類分析可以更高效的利用這些特徵,因此採用這種方法是最爲合理的。
對應的流程圖爲:


有了上面的理論知識,下面就可以動手實現代碼了,比較好的是這個博客,可以參考其代碼:點擊打開鏈接
代碼中部分函數是之前的,但是其基本思想可以借鑑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章