最近看到數據挖掘中的K-Means算法,想到它經常和圖像分類中的BOF算法結合,恰好自己最近在做圖像檢索方面的研究,就試着實現了一下,代碼資源我會在文後附上鍊接
BOF(Bag of Features)算法實際上就是BOW(Bag of Words)算法在圖像領域的應用。可以參考下圖:
圖片來源 Bag of Features (BOF)圖像檢索算法
BOF算法的主要操作步驟如下:
- 視覺單詞提取:首先我們先提取圖片庫中所有圖片的圖片特徵,這裏圖片特徵可以是SIFT,SURF,MSER特徵等等,我在實現時使用的SIFT特徵. BOW算法中是以“詞”爲單位形成詞袋的,BOF算法中我們以每個特徵作爲一個patch,相當於一個視覺單詞。
- 視覺詞典構建:以一定的算法對所有的圖片特徵進行分類,K-Means和SVM算法均可,但是K-Means算法最爲常用。比如K=500時,我們可以把所有的特徵按照相似度量分成500個聚類,每個聚類有一個類心,那麼這500個類心就相當於詞袋中的500個基本詞彙。
- 圖像表示:統計每張圖片在每個聚類中的特徵個數,這樣每個圖片就可以由一個分佈直方圖表示,或者說用一個K維的向量表示,向量第i維的值爲該圖片在第i個聚類中的特徵個數。那麼每個圖像都可以由基本詞彙表示。
- 圖像檢索:對於一個待檢索的圖像,我們先提取該圖像的圖像特徵,併產生該圖像的分佈直方圖,即或者一個K維向量。然後,根據餘弦相似定理,計算該向量與圖片庫中每個圖像的餘弦夾角。夾角越小,相似度越大,夾角越大,相似度越小。
或者需要詳細的BOF講解可以參考這個鏈接:Bag of Features (BOF)圖像檢索算法
本實驗中採用SIFT特徵,K-means聚類算法,初始類心隨機選擇,圖片庫圖片數量625。
最後實驗表明,BOF算法的檢索效果確實很不錯,好的時候查準率可以達到90%,最差情況下也能滿足50%左右的查準率。
在實驗中,我總結了一些需要注意的地方:
- 圖片庫大有利於特徵聚類,當圖片數量較少,圖像特徵不多的情況下,每個聚類的中特徵點個數也就幾十個。這對於統計分類來說,結果不夠可信,誤差也較大。
- 圖片庫特徵點個數(至少20萬個)較多情況下,聚類個數多一些檢索效果較好,但是也不能太多,不然會出現上面的情況。一般都是成百上千個。
- 初始類心的選擇對結果有一定的影響,不同初始類心的選擇可能導致查準率有較大的波動。一般來說圖片越多,它的影響就會越小。也可以通過指定初始類心,使得結果更優。
- 帶檢索圖片的特徵點個數太少,檢索結果會比較差,但也不是越多越好。
- TF-IDF算法是用來在信息檢索中確定關鍵字權值,也常和BOF算法結合使用,用來確定每個類心的權值,理論上會對實驗結果有一定的提高。我在實驗中沒有使用,苦於沒有找到合適的參考方法,TF-IDF怎麼統計並確定每個類心的權值?以及這種權值對於求餘弦相似度的影響是怎樣的?如果有明白的同學,希望能夠告訴我具體方法,謝謝了。
對K-Means算法和TF-IDF算法不太熟悉的同學可以參考一下這個鏈接,裏面會有說明數據挖掘經典算法概述以及詳解鏈接