1. 程式人生 > >基於詞彙樹的影象檢索(一):詞彙樹

基於詞彙樹的影象檢索(一):詞彙樹

從今天起準備把我的畢設的實現細節寫到部落格裡面,一方面寫一遍加深記憶,另一方面如果哪天忘記了查起來也方便

畢設題目是基於詞彙樹的無序影象集檢索和支撐結構生成,其實提出詞彙樹那篇文章(Scalable Recognition with a Vocabulary Tree[1])已經是2006年的了,算是很老的文章,但是在大規模二三維重建的過程中快速的影象檢索還是有意義的。

今天算是把整個程式怎麼寫徹底想通了,果然不能沒有徹底相同就開始寫程式碼。用力過猛容易閃著腰【高三暑假TAT

這個程式大概是這麼個流程:(記錄一下,無論是實驗室寢室還是公司都可以查,不用老是帶著那張草稿紙了)

1. 所有影象提特徵(已經實現)

2. 建樹(輸入:所有特徵,特徵個數) (已經實現)

3. 將訓練集影象轉換成TF-IDF向量  (最麻煩的部分,正在寫)

    (1) 計算樹中每個節點的IDF值 (輸入:所有特徵,一個記錄每張圖有多少特徵的一位陣列)

    (2) 計算每張圖的TF-IDF向量 (輸入:指向起始特徵的指標,特徵數目)

    (3) 將TF-IDF向量和對應的影象路徑寫入資料結構 (輸入:TF-IDF向量和影象路徑)

4. 查詢 

    (1) 計算查詢影象的TF-IDF向量 (輸入:查詢影象路徑)

    (2) 找到距離最近的資料庫影象 (已經實現)

今天先說下什麼叫做詞彙樹。

首先介紹一個概念叫做視覺單詞,視覺單詞的提出是基於bag of words模型的。首先對於資料集的影象提取sift特徵。sift特徵在影象描述方面是應用最為廣泛的一種特徵,由David Lowe在1999年提出,於2004年完善。sift特徵得到的結果是,對於影象上的每一個興趣點都得到一個128維的描述向量(圖上有多少興趣點,興趣點的分佈都由演算法本身決定)。然後通過kmeans聚類得到k個聚類中心,這些聚類中心就是我們所說的視覺單詞,因為這些聚類中心代表了一類具有共同特點的特徵。描述一張圖上的視覺單詞的分佈也是描述這張圖的方法之一。如果某隻想看更加詳細的解釋可以參考http://blog.csdn.net/abcjennifer/article/details/7639681(sift)   http://www.cnblogs.com/v-July-v/archive/2011/06/20/2091170.html(bag of words模型)


sift特徵示意圖,來源:http://blog.csdn.net/abcjennifer/article/details/7639681

之前我也寫過基於視覺單詞的影象檢索,其實就是聚類出來很多視覺單詞,然後對於每張影象計算這些視覺單詞出現頻率的直方圖,然後計算直方圖之間的距離來比較影象之間的相似度(具體的細節我會在之後的博文中繼續更)。實驗結果表明隨著視覺單詞個數的增加檢索的結果會變好,詞彙樹的思路其實就是盡力增加視覺單詞的個數。我當時寫的是隻有1000個單詞的影象檢索,但是詞彙樹將節點數增加到了10^6這個數量級。

詞彙樹的基本思想是利用層次kmeans得到儘可能多的特徵。層次kmeans的意思是將空間中的點用普通kmeans得到k個聚類中心,每個點都屬於一個聚類中心代表的類。對於一類中的所有點,再遞迴的進行kmeans,直到獲得我們想要的聚類中心個數。這樣的聚類方法相比普通kmeans聚類可以得到更多的聚類中心,同時花費的時間更加少。原文中和我實現的kmeans聚類中k=10,一共進行6層聚類,這樣可以得到10的6次方個聚類中心。這樣的聚類實際上得到了一個6層的10叉樹,這棵樹中儲存了視覺單詞,所以我們叫他詞彙樹。

詞彙樹的示意圖(圖來自於原文,k = 3,也就是一層聚類僅僅聚類出3箇中心點)


引用文獻:

[1]Nister, David, and Henrik Stewenius. "Scalable recognition with a vocabulary tree." CVPR,2006

[2]Lowe, David G. "Object recognition from local scale-invariant features."Computer vision, 1999. The proceedings of the seventh IEEE international conference on. Vol. 2. Ieee, 1999.

[3]Lowe, David G. "Distinctive image features from scale-invariant keypoints."IJCV,2004