1. 程式人生 > >目標識別:Bag-of-words表示影象

目標識別:Bag-of-words表示影象

BOW (bag of words) 模型簡介

Bag of words模型最初被用在文字分類中,將文件表示成特徵向量。它的基本思想是假定對於一個文字,忽略其詞序和語法、句法,僅僅將其看做是一些詞彙的集合,而文字中的每個詞彙都是獨立的。簡單說就是講每篇文件都看成一個袋子(因為裡面裝的都是詞彙,所以稱為詞袋,Bag of words即因此而來),然後看這個袋子裡裝的都是些什麼詞彙,將其分類。如果文件中豬、馬、牛、羊、山谷、土地、拖拉機這樣的詞彙多些,而銀行、大廈、汽車、公園這樣的詞彙少些,我們就傾向於判斷它是一篇描繪鄉村的文件,而不是描述城鎮的。舉個例子,有如下兩個文件:

文件一:Bob likes to play basketball, Jim likes too.

文件二:Bob also likes to play football games.


基於這兩個文字文件,構造一個詞典:

Dictionary = {1:”Bob”, 2. “like”, 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模型的缺點之一,不過瑕不掩瑜甚至在此處無關緊要)。

為什麼要用BOW模型描述影象

SIFT特徵雖然也能描述一幅影象,但是每個SIFT向量都是128維的,而且一幅影象通常都包含成百上千個SIFT向量,在進行相似度計算時,這個計算量是非常大的,通行的做法是用聚類演算法對這些向量資料進行聚類,然後用聚類中的一個簇代表BOW中的一個視覺詞,將同一幅影象的SIFT向量對映到視覺詞序列生成碼本,這樣每一幅影象只用一個碼本向量來描述,這樣計算相似度時效率就大大提高了。

 


構建BOW碼本步驟:
1. 假設訓練集有M幅影象,對訓練圖象集進行預處理。包括影象增強,分割,影象統一格式,統一規格等等。

2、提取SIFT特徵。對每一幅影象提取SIFT特徵(每一幅影象提取多少個SIFT特徵不定)。每一個SIFT特徵用一個128維的描述子矢量表示,假設M幅影象共提取出N個SIFT特徵。

3. 用K-means對2中提取的N個SIFT特徵進行聚類,K-Means演算法是一種基於樣本間相似性度量的間接聚類方法,此演算法以K為引數,把N個物件分為K個簇,以使簇內具有較高的相似度,而簇間相似度較低。聚類中心有k個(在BOW模型中聚類中心我們稱它們為視覺詞),碼本的長度也就為k,計算每一幅影象的每一個SIFT特徵到這k個視覺詞的距離,並將其對映到距離最近的視覺詞中(即將該視覺詞的對應詞頻+1)。

完成這一步後,每一幅影象就變成了一個與視覺詞序列相對應的詞頻向量。


設視覺詞序列為{眼睛 鼻子 嘴}(k=3),則訓練集中的影象變為:

第一幅影象:[1 0 0]

第二幅影象:[5 3 4]......

 
2. 構造碼本。碼本向量歸一化因為每一幅影象的SIFT特徵個數不定,所以需要歸一化。如上述例子,歸一化後為[1 0 0],1/12*[5 3 4].測試影象也需經過預處理,提取SIFT特徵,將這些特徵對映到為碼本向量,碼本向量歸一化,最後計算其與訓練碼本的距離,對應最近距離的訓練影象認為與測試影象匹配。

 
當然,在提取sift特徵的時候,可以將影象打成很多小的patch,然後對每個patch提取SIFT特徵。

 
總結一下,整個過程其實就做了三件事,首先提取對 n 幅影象分別提取SIFT特徵,然後對提取的整個SIFT特徵進行k-means聚類得到 k 個聚類中心作為視覺單詞表,最後對每幅影象以單詞表為規範對該幅影象的每一個SIFT特徵點計算它與單詞表中每個單詞的距離,最近的+1,便可得到該幅影象的碼本。實際上第三步是一個統計的過程,所以BOW中向量元素都是非負的。Yunchao Gong 2012年NIPS上有一篇用二進位制編碼用於影象快速檢索的文章就是針對這類元素是非負的特徵而設計的編碼方案。