基於Bag of words模型的圖像檢索系統的設計與實現

論文代碼:

https://download.csdn.net/download/qq_42233538/12498761

 

簡介:

該系統將Bag of words 模型用於大批量圖像檢索,基於OpenCV C 語言庫提取圖像的SIFT 特徵,然後使用Kmeans 算法進行聚類,再將其表示成 Bag of words 矢量並進行歸一化,實現大批量圖像檢索,並用 caltech256 數據集進行實驗。實驗表明,該系統該系統採用的方法是有效的。

1 Bag of words模型概述

Bag of words 模型最初被用在文本分類中將文檔表示成特徵矢量。它的基本思想是假定對於一個文本,忽略其詞序和語法、句法,僅僅將其看做是一些詞彙的集合,而文本中的每個詞彙都是獨立的。

簡單說就是將每篇文檔都看成一個袋子(因爲裏邊裝的都是詞彙,所以稱爲詞袋,Bag of words 即由此來),然後看這個袋子裏裝的都是些什麼詞彙,將其分類。如果文檔中豬、馬、牛、羊、山谷、土地、拖拉機這樣的詞彙多些,而銀行、大廈、汽車、公園這樣的詞彙少些,我們就傾向於判斷它是一篇描述鄉村的文檔,而不是描述城鎮的。

與之類似,我們也可以將圖像當成一些圖像片段(image patch—本文中用SIFT 特徵來描述)的集合。譬如構成一幅人臉圖像的圖像片段必定傾向於描述人的眼睛、鼻子、耳朵、嘴巴這些事物(我們稱這些事物爲視覺詞彙)。

現在假設要使用Bag of words 模型從一批訓練圖像中檢索出與測試圖像最相似的圖像,我們要做的工作主要都有哪些呢?

首先要對訓練圖像集進行預處理。包括圖像增強、分割、圖像同一格式、同一規格的處理等等。

其次提取圖像的SIFT 特徵。即將每一幅圖像劃分成很多個圖像片段,每一個圖像片段都用一個128 維的SIFT 描述子矢量來表示。

再次聚類生成視覺詞,構建碼本。一幅圖像的碼本是由兩部分組成的,視覺詞以及與其對應的 SIFT 描述子矢量的數目,即詞頻。假設碼本包含k 個視覺詞序列,將上步中所有的SIFT 描述子矢量用Kmeans 聚類生成k 個簇,最終這k 個簇中心即爲碼本的k 個視覺詞。然後計算每幅圖像中每個SIFT 描述子到這些視覺詞的距離,若其距離某個視覺詞最近,就將其映射到該視覺詞,並將該視覺詞對應的詞頻數增1。直至將所有的SIFT 描述子都映到碼本中,將每幅圖像都用一個與視覺詞序列相對應的詞頻矢量來描述,這個詞頻矢量即爲相似度檢索時所要使用的圖像的Bag of words 特徵矢量,另外,由於每幅圖像所包含的SIFT 矢量的數目是不確定的,還需要對Bag of words 特徵矢量進行歸一化。

最後計算圖像距離相似度進行檢索。測試圖像也要經過預處理,提取SIFT 特徵,生成碼本矢量並進行歸一化的過程,然後計算其與訓練碼本的距離,並將此距離相似度按升序排列。

2 圖像特徵提取

2.1 SIFT特徵提取

SIFT 算法由D.G.Lowe 在1999 年[4]提出,並於2004 年完善總結。SIFT 算法是一種提取局部特徵的算法,在尺度空間尋找極值點,提取位置,尺度,旋轉不變量,從而使其對旋轉、尺度縮放保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性。

高斯卷積核是實現尺度變換的唯一線性核,於是一副二維圖像 I(x,y) 的尺度空間定義:

(x,y) 是空間座標,反映像素的位置;σ 是尺度座標,決定圖像的平滑程度。

爲了在尺度空間檢測到穩定的關鍵點,需要計算高斯差分尺度空間(DOG scale-space):

DOG 算子計算簡單,是尺度歸一化的LOG 算子的近似。

在檢測極值時,需要跟其周圍鄰域同一尺度的8 個像素和相鄰尺度對應位置的9×2 個像素進行比較,以確保在尺度空間和二維圖像空間都檢測到局部極值。

關鍵點的方向參數是利用關鍵點鄰域像素的梯度方向分佈特性爲其指定的。以關鍵點爲中心在其鄰域窗口內採樣,並用直方圖統計鄰域像素的梯度方向,直方圖的峯值就作爲該關鍵點的主方向。如圖1,圖2 所示。

         

圖1 關鍵點主方向示意圖                        圖2 一幅測試圖像

特徵描述子生成時,選取以特徵點爲中心的16*16 鄰域作爲採樣窗口,將採樣點與特徵點的相對方向通過高斯加權後歸入包含8 個bin 的方向直方圖,最後獲得4*4*8(128 維)的特徵描述子。

2.2 Bag of words特徵表示

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

Kmeans 算法是數據挖掘技術中基於分裂法的一個經典的聚類算法,因其理論可靠、算法簡單、收斂速度快而被廣泛應用。

該算法採用迭代更新的思想,常規的思路是先將要參與聚類的特徵數據載入內存,然後隨機選擇 K 個對象對聚類中心初始化c1,c2 ,c3 ,...,cK--初始化過程,再對剩下的每個對象 xi( i =1,2,3,…,n)根據其與各個簇中心的距離(本文取歐氏距離)將它賦給最近的簇(m 是特徵數據的維數)--映射過程:

然後重新計算每個簇的均值作爲下一次迭代的聚類中心—更新類中心:

即Kmeans 算法需要進行初始化,映射和更新類中心3 個過程,其中後兩個過程要不斷重複,直到所有類中心都不再變化爲止,最後得到的類中心就是Bag of words 模型所需要的視覺詞(visual words)。然後將每幅圖像中的每個SIFT 描述子都映射到某個視覺詞,得到的詞頻序列就是該幅圖像的碼本矢量。

MiniBatchKMeans 是 KMeans 算法的一個變種,它使用小批量(mini-batches)來減少計算時間,而這多個批次仍然嘗試優化相同的目標函數。小批量是輸入數據的子集,在每次訓練迭代中隨機抽樣。這些小批量大大減少了收斂到局部解所需的計算量。 與其他降低 k-means 收斂時間的算法不同,小批量 k-means 產生的結果通常只比標準算法略差。

2.3 KD-tree檢索系統

爲了解決效率低下的暴力計算方法,已經發明瞭大量的基於樹的數據結構。總的來說, 這些結構試圖通過有效地編碼樣本的 aggregate distance (聚合距離) 信息來減少所需的距離計算量。 基本思想是,若 點距離 點非常遠, 點距離 點非常近, 可知 點與 點很遙遠,不需要明確計算它們的距離。 通過這樣的方式,近鄰搜索的計算成本可以降低爲 或更低。 這是對於暴力搜索在大樣本數 中表現的顯著改善。

KD 樹是一個二叉樹結構,它沿着數據軸遞歸地劃分參數空間,將其劃分爲嵌入數據點的嵌套的各向異性區域。 KD 樹的構造非常快:因爲只需沿數據軸執行分區, 無需計算 -dimensional 距離。 一旦構建完成, 查詢點的最近鄰距離計算複雜度僅爲

3 系統實現

本軟件主要採用python語言開發,基於cv2庫提取圖像的SIFT 特徵,使用Bag of words 模型將它表示成特徵矢量,建立KD-tree實現圖像快速檢索。

函數train:讀取圖像,獲取每張圖像的sift特徵向量,通過MiniBatchKMeans進行聚類,最後保存模型;
函數query_data:通過圖像的sift特徵向量,進行分類預測,最後生成三個文件index_words.npy:用來保存文件名稱與圖像序號對應的文件;idf.npy:用來保存圖像的idf值;words.npy:用來保存圖像的特徵向量;
函數train_kdtree:根據圖像向量建立檢索樹;
函數query:每類查詢5張圖像,每張圖像檢索10張圖像計算AP值,最後計算mAP值;

4 實驗及分析

本文使用caltech-256 數據集,測試時隨機選取5 幅圖像做實驗,提取SIFT,並映射到視覺詞序列生成碼本,分別計算這些碼本到訓練圖像碼本的距離,按升序進行排列,並查詢圖像標號與路徑索引表,最終得到5 幅圖像的AP和mAP得分如表1 所示。

american-flag

baseball-glove

bear

 

birdbath

 

cactus

 

AP

0.95

0.45

0.62

0.68

0.67

mAP

0.71

5 結論

經過以上分析,我們可以看到,將Bag of words 模型應用於大批量圖像檢索的思路是正確的,不僅計算量大大減小,而且得到了比較滿意的檢索效果。但是如果要進一步優化系統性能,還需要做更深入的研究,比如聚類要聚成幾類纔是最合適的,這個決定最終碼本矢量維數的數據對系統性能的影響是可以想見的;另外聚類過程中的時間開銷非常大,雖然是在線下運行的,但是有沒有可能讓時間花費更少一點,讓其聚類效果更精確一點呢。

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