1. 程式人生 > >特徵匹配-NNDR策略,kd樹,BBF演算法

特徵匹配-NNDR策略,kd樹,BBF演算法

特徵匹配需要考慮匹配策略和如何更快的完成匹配。

一:以歐式距離為度量,有三種匹配策略:固定閾值、最近鄰、最近鄰距離比率(NNDR)

固定閾值:就是設定一個閾值,當距離大於閾值,判為不匹配,否則判為匹配。但是一個問題是,閾值很難設定。隨著移動到特徵空間的不同部分時,閾值的有效範圍會變化很大,即沒有通用的閾值。

最近鄰:找最近的那個。

最近鄰距離比率:定義為最近鄰距離和次近鄰距離的比值。

        最近鄰和NNDR策略改善了匹配效果。

——————————————————————————————————————

————————————更詳細的介紹————————————————————

參考:結合NNDR與霍夫變換的匹配方法。

在建立兩幅影象之間區域性特徵的匹配關係時,需要滿唯一性、相似性、連續性三個基本約束條件,即物體表面任意一點到觀察點距離是唯一的,因此其視差是唯一的,給定一副影象中的一點,其在另一幅影象中對應的匹配點最多隻有一個;對應的特徵應有相同的屬性,在某種度量下,同一物理特徵在兩幅影象中具有相似的描述符;與觀測點的距離相比,物體表面因凹凸不平引起的深度變化是緩慢的,因而視差變化是緩慢的,或者說視差具有連續性。

目前常用的目標匹配策略有兩種:1、是距離閾值法,即待匹配目標與模型之間的距離小於某個閾值,則認為匹配上了,改方法非常簡單,但是閾值的確定非常困難,而且目標很容易匹配上多個模型,從而產生大量的誤匹配;2、最小距離法,即目標只匹配與其距離最近的模型,實際應用中一般還需要滿足距離小於某個閾值的條件,該方法只有一個最佳的匹配結果,相對於距離閾值法來說,正確率要高。

由於影象的內容千差萬別,加上場景中運動物體,不重疊內容以及影象質量等因素的存在,一副影象中的區域性特徵並不一定能夠在另一幅影象中找到相似的特徵,這就需要採取措施剔除那些產生干擾的噪聲點。

3、通過對SIFT特徵的研究表明,可以通過比較最近鄰特徵和次近鄰特徵的距離有效的甄別區域性特徵是否正確匹配。這就是最近鄰距離比值法。該方法的理論來源是,如果一個特徵在一副影象中與兩個特徵的距離都很相似,那麼該特徵的區分度較低,會對影象相似度的判斷產生干擾。

——————————————————————————————————————

——————————————————————————————————————

二:高效完成匹配

選定匹配策略,下面要做的就是在潛在的候選中高效地進行搜尋。

1、用窮舉法搜尋最近鄰點以及次緊鄰點,即在每對潛在的匹配影象中將特徵和其他所有特徵進行一一匹配。想法簡單自然,並且可以得到最精確的結果,但是由於特徵空間一般都高達128維以上,加之複雜影象的區域性特徵數量比較多,搜尋演算法的效率是整個系統的一個瓶頸。

2、匯出一個索引結構,來快速尋找一個給定特徵的鄰近的特徵。廣泛使用的索引結構是多維搜尋樹,這裡介紹最著名的k-d樹,

因為實際資料一般都會呈現簇狀的聚類形態,因此我們想到建立資料索引,然後再進行快速匹配。索引樹是一種樹結構索引方法,其基本思想是對搜尋空間進行層次劃分。k-d 樹是索引樹中的一種典型方法。

2-1、k-d樹

    是對資料點在k維空間中劃分的一種資料結構。k-d樹實際上是一種二叉樹。

----------------------------------------------------------------------------------------------------------------------------

k-d樹的節點組成集合為樣本集,每個結點表示一個樣本點。根據分裂結點的分割超平面將樣本空間分為兩個子空間。左子空間中的樣本點集合由左子樹表示,右空間中的樣本點集合由右子樹表示。分割超平面是一個通過分裂點並且垂直於分割序號所指示的方向軸的平面。

----------------------------------------------------------------------------------------------------------------------------

一個簡單例子說明分割:在二維的情況下,一個樣本點可以由二維向量(x,y)表示,其中令x維的序號為0,y維的序號為1.假設分裂結點為(7,2),垂直於分割超平面的方向軸序號為0,那麼分割超平面就是x=7,他垂直於x軸且過點(7,2)如下所示:


(紅線代表分割超平面)

於是其他資料點的x維如果小於7,則被分配到左子空間;若大於7,則被分配到右子空間。如(5,4)被分配到左子空間,(9,6)被分配到右子空間。

所以可看出k-d樹本質上是一種二叉樹。

---------------------------------------------------------------------------------------

分裂結點的選擇通常有多種方法,最常用的一種方法:對於所有的樣本點,統計他們在每個維上的方差,挑選出方差中的最大值,對應的維就是垂直於分割超平面的方向軸,如x軸上方差最大則分割超平面垂直於x軸畫出。資料方差最大表明沿該維度資料點分散的比較開,這個方向進行資料分割可以獲得最好的解析度。然後再將所有樣本點在以上方向軸方向進行排序。。

---------------------------------------------------------------------------------------

一個例子來說明:

假設樣本集為{(2,3),(5,4)(9,6)(4,7)(8,1)(7,2)}。構建k-d樹的過程如下:

1、確定split域。6個數據點在x,y維度上的資料方差分別為39,28.63。所以在x軸上方差最大,所以split閾值為0(x維的序號為0)

2、確定分裂結點,根據x維上的值將資料排序,則6個數據點在排序後位於中間的那個資料點為(7,2),該結點就是分割超平面就是通過(7,2)並垂直於split=0即x軸的直線x=7;

3、左子空間和右子空間,分割超平面x=7將整個空間分為兩部分,x<=7的部分為左子空間,包含3個數據點{(2,3)(5,4)(4,7)}另一部分為右子空間,包含2個數據點{(9,6)(8,1)}

4、分別對左子空間中的資料點和右子空間中的資料點重複上面的步驟構建左子樹和右子樹直到經過劃分的子樣本集為空。


————————————————————————————————————————

————————————————————————————————————————

k-d樹的最近鄰搜尋演算法:

在k-d樹中進行資料的k近鄰搜尋是特徵匹配的重要環節,其目的是檢索在k-d樹中與待查詢點距離最近的k個數據點。

最近鄰搜尋是k近鄰的特例,即1近鄰。最近鄰搜尋的思路很簡單:首先通過二叉樹搜尋(比較待查詢結點和分裂結點的分裂維的值,小於等於則進入左分支,大於就進入右分支直到葉子結點),順著“搜尋路徑”很快能找到最近鄰的近似點,也就是與待查查詢點處於同一個子空間的葉子結點;然後再回溯搜尋路徑,並判斷搜尋路徑上的 結點的其他子節點空間中是否可能有距離查詢點更近的資料點,如有可能,則需要跳到其它子結點空間中去搜索(將其他子結點加入到搜尋路徑)。重複這個過程直到搜尋路徑為空。

——————————————————————————————————————————————

舉例說明最近鄰搜尋演算法:

假設根據之上步驟樣本集{(2,3)(5,4)(9,6)(4,7)(8,1)}建立了k-d樹。,將上面的圖轉換成樹形圖如下:

我們查詢點(2.1,3.1),在(7,2)點測試到達(5,4),在(5,4)點測試到達(2,3),然後搜尋路徑中的結點為<(7,2)(5,4)(2,3)>,從搜尋路徑中取出(2,3)作為當前最佳結點nearest,距離dist為0.141.

然後回溯到(5,4),以(2.1,3.1)為圓心,以dist=0.141為半徑畫一個圓,並不和超平面y=4相交,如下圖,所以不必跳到結點(5,4)的右子空間去搜索,因為右子空間中不可鞥有更近樣本點了。

於是在回溯到(7,2),同理以(2.1,3.1)為圓心,以dist=0.141為半徑畫一個圓並不和超平面x=7相交,所以不必跳到結點(7,2)的右子空間去搜索。

至此,search_path為空,結束整個搜尋,返回nearest(2,3)作為(2.1,3.1)的最近鄰點,最近距離為0.141。

然而有時有些複雜情況。如查詢點(2,4.5),在(7,2)處測試到達(5,4),在(5,4)處測試到達(4,7)。然後搜尋路徑search_path中的結點為<(7,2)(5,4)(4,7)>,從搜尋路徑search_path中取出(4,7)作為當前最佳結點nearest,距離dist=3.202.

然後回溯到(5,4),以(2,4.5)為圓心,以dist=3.202為半徑畫一個圓與超平面y=4相交。如下圖,所以需要跳到(5,4)的左子空間去搜索。所以要將(2,3)加入到搜尋路徑search_path中,所以現在search_path中的結點為<(7,2)(2,3)>;又因為(5,4)與(2,4.5)的距離為3.04小於距離dist=3.202所以將(5,4)付給nearest並且dist=3.04.

回溯至(2,3),(2,3)是葉子節點,直接判斷(2,3)是否離(2,4.5)更近,計算得到距離為1.5,所以nearest更新為(2,3),dist更新為1.5.

回溯至(7,2),同理,以(2,4.5)為圓心,以dist=1.5為半徑畫一個圓並不和超平面x=7相交,所以不用跳到結點(7,2)的右子空間去搜索。

至此,search_Path為空,結束整個搜尋,返回nearest(2,3)作為(2,4.5)的最近鄰點。最近鄰距離為1.5

上面兩次搜尋返回的最近鄰點雖然是一樣的,但是搜尋(2,4.5)的過程要複雜的多,因為(2,4.5)更接近超平面。研究表明當查詢點的鄰域與分割超平面兩側的空間都產生交集時,回溯的次數大大增加。由於大量回溯會導致k-d樹最近鄰搜尋的效能大大下降,因此提出了一些改進方法,比較著名的就是Best--Bin--First (BBF演算法)。他通過設定優先順序佇列和執行超時限定來獲取

2-2 BBF演算法

 BBF演算法是KD樹的改進方法,從上述標準的KD樹的查詢過程可以看出其搜尋過程中的“回溯”是由“查詢路徑”決定的,並沒有考慮查詢路徑上一些資料點本身的一些性質。一個簡單的改進思路就是將“查詢路徑”上的結點進行排序,如按各自分割超平面(也稱bin)與查詢點的距離排序,也就是說,回溯檢查總是從優先順序最高(best bin)的樹結點開始。

BBF演算法是針對高維資料提出的一種近似演算法,此演算法能確保優先檢索包含最近鄰點可能性較高的空間,此外,BBF還設定了一個執行超時限定機制。

————————————————————————————————————————————————

一個例子說明,還是查詢(2,4.5)搜尋演算法流程為:

1、將(7,2)壓入優先佇列中;

2、提取優先佇列中(7,2),由於(2,4.5)位於(7,2)分割超平面的左側,所以檢索其左子節點(5,4)。同時,根據BBF機制“搜尋左/右子樹,就把相應這一層的兄弟結點即右/左結點存進佇列”,將其(5,4)對應的兄弟結點即右子節點(9,6)壓入優先佇列中,此時優先佇列為{(9,6)},最佳點為(7,2);然後一直檢索到葉子節點(4,7),此時優先佇列為{(2,3)(9,6)},最佳點則為(5,4)

3、提取優先順序最高的結點(2,3),重複步驟2,直到優先佇列為空。

參考整理自: