視覺SLAM之詞袋(bag of words) 模型與K-means聚類算法淺析(1)


在目前實際的視覺SLAM中,閉環檢測多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又運用了數據挖掘的K-means聚類算法,筆者只通過bag of words 模型用在圖像處理中進行形象講解,並沒有涉及太多對SLAM的閉環檢測的應用。

1.Bag-of-words模型簡介

Bag-of-words模型是信息檢索領域常用的文檔表示方法。在信息檢索中,BOW模型假定對於一個文檔,忽略它的單詞順序和語法、句法等要素,將其僅僅看作是若干個詞匯的集合,文檔中每個單詞的出現都是獨立的,不依賴於其它單詞是否出現。 也就是說,文檔中任意一個位置出現的任何單詞,都不受該文檔語意影響而獨立選擇的。舉個例子就好理解:

例如有如下兩個文檔:

1:Bob likes to play basketball, Jim likes too.

2:Bob also likes to play football games.

基於這兩個文本文檔,構造一個詞典:

Dictionary = {1:”Bob”, 2. “likes”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”, 8. “games”, 9. “Jim”, 10. “too”}。

這個詞典一共包含10個不同的單詞,利用詞典的索引號,上面兩個文檔每一個都可以用一個10維向量表示(用整數數字0~n(n為正整數)表示某個單詞在文檔中出現的次數):

1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]

2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]

向量中每個元素表示詞典中相關元素在文檔中出現的次數。不過,在構造文檔向量的過程中可以看到,我們並沒有表達單詞在原來句子中出現的次序。

 

Bag-of-words模型應用於圖像表示:

為了表示一幅圖像,我們可以將圖像看作文檔,即若干個“視覺詞匯”的集合,同樣的,視覺詞匯相互之間沒有順序。

 

 

視覺詞典的生成流程:

 

 

由於圖像中的詞匯不像文本文檔中的那樣是現成的,我們需要首先從圖像中提取出相互獨立的視覺詞匯,這通常需要經過三個步驟:(1)特征檢測,(2)特征表示,(3)單詞本的生成。  下圖是從圖像中提取出相互獨立的視覺詞匯:

 

 

 

通過觀察會發現,同一類目標的不同實例之間雖然存在差異,但我們仍然可以找到它們之間的一些共同的地方,比如說人臉,雖然說不同人的臉差別比較大,但眼睛, 嘴,鼻子等一些比較細小的部位,卻觀察不到太大差別,我們可以把這些不同實例之間共同的部位提取出來,作為識別這一類目標的視覺詞匯。

構建BOW碼本步驟:

利用K-Means算法構造單詞表。用K-means對第二步中提取的N個SIFT特征進行聚類,K-Means算法是一種基於樣本間相似性度量的間接聚類方法,此算法以K為參數,把N個對象分為K個簇,以使簇內具有較高的相似度,而簇間相似度較低。聚類中心有k個(在BOW模型中聚類中心我們稱它們為視覺詞),碼本的長度也就為k,計算每一幅圖像的每一個SIFT特征到這k個視覺詞的距離,並將其映射到距離最近的視覺詞中(即將該視覺詞的對應詞頻+1)。完成這一步后,每一幅圖像就變成了一個與視覺詞序列相對應的詞頻矢量。

假定我們將K設為4,那么單詞表的構造過程如下圖所示:

 

 

 

第三步:

利用單詞表的中詞匯表示圖像。利用SIFT算法,可以從每幅圖像中提取很多個特征點,這些特征點都可以用單詞表中的單詞近似代替,通過統計單詞表中每個單詞在圖像中出現的次數,可以將圖像表示成為一個K=4維數值向量。將這些特征映射到為碼本矢量,碼本矢量歸一化,最后計算其與訓練碼本的距離,對應最近距離的訓練圖像認為與測試圖像匹配。請看下圖:

 

 

 

我們從人臉、自行車和吉他三個目標類圖像中提取出的不同視覺詞匯,而構造的詞匯表中,會把詞義相近的視覺詞匯合並為同一類,經過合並,詞匯表中只包含了四個視覺單詞,分別按索引值標記為1,2,3,4。通過觀察可以看到,它們分別屬於自行車、人臉、吉他、人臉類。統計這些詞匯在不同目標類中出現的次數可以得到每幅圖像的直方圖表示:

人臉:  [3,30,3,20]
自行車:[20,3,3,2]
吉他:  [8,12,32,7]

其實這個過程非常簡單,就是針對人臉、自行車和吉他這三個文檔,抽取出相似的部分(或者詞義相近的視覺詞匯合並為同一類),構造一個詞典,詞典中包含4個視覺單詞,即Dictionary = {1:”自行車”, 2. “人臉”, 3. “吉他”, 4. “人臉類”},最終人臉、自行車和吉他這三個文檔皆可以用一個4維向量表示,最后根據三個文檔相應部分出現的次數畫成了上面對應的直方圖。一般情況下,K的取值在幾百到上千,在這里取K=4僅僅是為了方便說明。

總結一下步驟:

第一步:利用SIFT算法從不同類別的圖像中提取視覺詞匯向量,這些向量代表的是圖像中局部不變的特征點;

第二步:將所有特征點向量集合到一塊,利用K-Means算法合並詞義相近的視覺詞匯,構造一個包含K個詞匯的單詞表;

第三步:統計單詞表中每個單詞在圖像中出現的次數,從而將圖像表示成為一個K維數值向量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM