1. 程式人生 > >【CV】ORB演算法原理

【CV】ORB演算法原理

2011年, Rublee, 在ICCV上,發表《ORB: an efficient alternative to SIFT or SURF》,用於實現快速的特徵點提取和匹配,可作為SIFT、SURF的一種替代方案。

ORB = Oriented Fast + Rotated BRIEF

Oriented Fast : Orientation Features from  Accelerated Segment Test,用於檢測特徵點.

Rotated BRIEF : 旋轉因子+Binary Robust IndependentElementary Features,用於提取特徵描述符

效能:據說,ORB演算法的速度是sift的100倍,是surf的10倍。

一、OFast特徵提取:

原理:在使用FAST提取出特徵點之後,給其定義一個特徵點方向,以此來實現特徵點的旋轉不變形。

Fast提取特徵點方法:

步驟一:粗提取。該步能夠提取大量的特徵點,但是有很大一部分的特徵點的質量不高。下面介紹提取方法。從影象中選取一點P,如上圖1。我們判斷該點是不是特徵點的方法是,以P為圓心畫一個半徑為3pixel的圓。圓周上如果有連續n個畫素點的灰度值比P點的灰度值大或者小,則認為P為特徵點。一般n設定為12。為了加快特徵點的提取,快速排出非特徵點,首先檢測1、9、5、13位置上的灰度值,如果P是特徵點,那麼這四個位置上有3個或3個以上的的畫素值都大於或者小於P點的灰度值。如果不滿足,則直接排出此點。

備註:每個小方格代表一個畫素,方格內的顏色只是為了便於區分,不代表該畫素點的顏色。

步驟二:機器學習的方法篩選最優特徵點。簡單來說就是使用ID3演算法訓練一個決策樹,將特徵點圓周上的16個畫素輸入決策樹中,以此來篩選出最優的FAST特徵點。

步驟三:非極大值抑制 去除 區域性較密集特徵點。使用非極大值抑制演算法去除臨近位置多個特徵點的問題。為每一個特徵點計算出其響應大小。計算方式是特徵點P和其周圍16個特徵點偏差的絕對值和。在比較臨近的特徵點中,保留響應值較大的特徵點,刪除其餘的特徵點。【響應閾值?】

Get Features with Harris Corner response value

步驟四:特徵點的尺度不變形。構造金字塔,來實現特徵點的多尺度不變性。即利用步驟1-3策略,在每層金字塔上採用Fast演算法提取特徵點/採用,按角點響應值排序,選取前N個特徵點。

具體首先設定一個比例因子scaleFactor(opencv預設為1.2)和金字塔的層數nlevels(pencv預設為8)。將原影象按比例因子縮小成nlevels幅影象。縮放後的影象為:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的影象提取特徵點總和作為這幅影象的oFAST特徵點。

【Orientation by Intensity Centroid】

!!!步驟五:計算關鍵點的角點方向,描述特徵點的旋轉不變性。ORB演算法提出使用灰度質心法/矩(moment)法來確定FAST特徵點的方向。也就是說通過矩來計算特徵點以r為半徑範圍內的質心,特徵點座標到質心形成一個向量作為該特徵點的方向。矩定義如下:

其中,I(x,y)為影象灰度表示式。該矩的質心為:

假設角點座標為O,則向量的角度即為該特徵點的方向。計算公式如下:

【Compute Feature Descriptors,涉及到旋轉】

二、 rBRIEF特徵描述

原理:是在BRIEF特徵描述的基礎上加入旋轉因子改進的,用一種貪婪學習演算法篩選具有高variance和高不相關的steered brief結果。

BRIEF計算出來的結果是一個二進位制串的特徵描述符。計算方式:

在一個特徵點的鄰域內(SxS,一般取31),選擇n對畫素點pi、qi(i=1,2,…,n)。然後比較每個點對的灰度值的大小。如果I(pi)> I(qi),則生成二進位制串中的1,否則為0。所有的點對都進行比較,則生成長度為n的二進位制串。一般n取128、256或512,opencv預設為256。

注意:為了增加特徵描述符的抗噪性,演算法首先需要對影象進行高斯平滑處理。在ORB演算法中,在這個地方進行了改進,在使用高斯函式進行平滑後,又用了其他操作,使其更加的具有抗噪性。

論文中提到,在特徵點SxS的區域內有5種選取點對的方法:

1)在影象塊內平均取樣;

2)p和q都符合(0,S2/25)的高斯分佈;

3)p符合(0,S2/25)的高斯分佈,而q符合(0,S2/100)的高斯分佈;

4)在空間量化極座標下的離散位置隨機取樣;

5)把p固定為(0,0),q在周圍平均取樣。

五種取樣方法的示意圖如下:

論文指出,在旋轉不是非常厲害的影象裡,第二種方法可以取得較好的匹配結果。用BRIEF生成的描述子的匹配質量非常高,作者測試的大多數情況中都超越了SURF。

但在旋轉大於30°後,BRIEF的匹配率快速降到0左右。

BRIEF的耗時較SURF少的多。

steered BRIEF(旋轉不變性改進)

假設原始的BRIEF演算法在特徵點Patch(SxS,一般S取31)鄰域內選取n對點集。

ORB在使用oFast演算法計算出的特徵點中包括了特徵點的方向角度θ。在選擇點對集之前,經過旋轉角度θ旋轉,得到新的點對

在新的點集位置上比較點對的大小形成二進位制串的描述符。

注意:在使用oFast演算法是在不同的尺度上提取的特徵點。因此,在使用BRIEF特徵描述時,要將影象轉換到相應的尺度影象上,然後在尺度影象上的特徵點處取SxS鄰域,然後選擇點對並旋轉,得到二進位制串描述符。

rBRIEF-改進特徵點描述子的相關性

使用steeredBRIEF方法得到的特徵描述子具有旋轉不變性,但是卻在另外一個性質上不如原始的BRIEF演算法。是什麼性質呢,是描述符的可區分性,或者說是相關性。這個性質對特徵匹配的好壞影響非常大。

描述子是特徵點性質的描述。描述子表達了特徵點不同於其他特徵點的區別。我們計算的描述子要儘量的表達特徵點的獨特性。如果不同特徵點的描述子的可區分性比較差,匹配時不容易找到對應的匹配點,引起誤匹配。

圖2 特徵描述子的均值分佈.X軸代表距離均值0.5的距離,y軸是相應均值下的特徵點數量統計

由上圖:

BRIEF演算法落在0上的特徵點數較多,因此BRIEF演算法計算的描述符的均值在0.5左右,每個描述符的方差較大,可區分性較強。

steeredBRIEF演算法失去了這個特性。

至於為什麼均值在0.5左右,方差較大,可區分性較強的原因,這裡大概分析一下。這裡的描述子是二進位制串,裡面的數值不是0就是1,如果二進位制串的均值在0.5左右的話,那麼這個串有大約相同數目的0和1,那麼方差就較大了。

用統計的觀點來分析二進位制串的區分性,如果兩個二進位制串的均值都比0.5大很多,那麼說明這兩個二進位制串中都有較多的1時,在這兩個串的相同位置同時出現1的概率就會很高。那麼這兩個特徵點的描述子就有很大的相似性。這就增大了描述符之間的相關性,減小之案件的可區分性。

對於rBRIEF,在計算特徵點第二個步驟選擇點對時,使用統計學習的方法來重新選擇點對集合,而非BRIEF中的5種之一。具體步驟如下:

建立300k個特徵點測試集。對於測試集中的每個點,考慮其31x31鄰域。

先對影象進行高斯平滑。

使用鄰域中的某個點的5x5鄰域灰度平均值來代替某個點對的值,進而比較點對的大小。使得特徵值更具備抗噪性。

在31x31的特徵點Patch鄰域內,共有(31-5+1)x(31-5+1)=729個這樣的子視窗,那麼從這些視窗中,選取點對的方法共有M=265356種,我們就要在這M種方法中選取256種取法,選擇的原則是這256種取法之間的相關性最小。

從N個視窗中隨機選兩個做比較即構成描述子的一個bit,論文中採用M=205590種可能的情況。

具體選取方法:

1)在300k特徵點的每個31x31鄰域內按M種方法取點對,比較點對大小,形成一個300kxM的二進位制矩陣Q。矩陣的每一列代表300k個點按某種取法得到的二進位制數。

2)對Q矩陣的每一列求取平均值,按照平均值到0.5的距離大小重新對Q矩陣的列向量排序,形成矩陣T。

3)將T的第一列向量放到R中。

4)取T的下一列向量和R中的所有列向量計算相關性,如果相關係數小於設定的閾值,則將T中的該列向量移至R中。

5)按照4)的方式不斷進行操作,直到R中的向量數量為256。

通過這種方法就選取了這256種取點對的方法。這就是rBRIEF演算法。

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

        1.對所有樣本點,做M種測試,構成M維的描述子,每個維度上非1即0;

        2.按均值對M個維度排序(以0.5為中心),組成向量T;

        3.貪婪搜尋:把向量T中第一個元素移動到R中,然後繼續取T的第二個元素,與R中的所有元素做相關性比較,如果相關性大於指定的閾值Threshold,           拋棄T的這個元素,否則加入到R中;

        4.重複第3個步驟,直到R中有256個元素,若檢測完畢,少於256個元素,則降低閾值,重複上述步驟;

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

三、特徵點的匹配:

例如特徵點A、B的描述子如下。

A:10101011

B:10101010

我們設定一個閾值,比如80%。當A和B的描述子的相似度大於80%時,我們判斷A,B是相同的特徵點,即這2個點匹配成功。在這個例子中A,B只有最後一位不同,相似度為87.5%,大於80%。則A和B是匹配的。

我們將A和B進行異或操作就可以輕鬆計算出A和B的相似度。而異或操作可以借組硬體完成,具有很高的效率,加快了匹配的速度。

四、OPencv中計算方法

1.首先構造尺度金字塔;

   金字塔共n層,與SIFT不同,每層僅有一副影象;

   第s層的尺度為,Fator初始尺度(預設為1.2),原圖在第0層;

   第s層影象大小:

2.在不同尺度上採用Fast檢測特徵點;

    在每一層上按公式計算需要提取的特徵點數n,在本層上按Fast角點響應值排序,提取前2n個特徵點,然後根據Harris角點響應值排序,取前n個特徵點,作為本層的特徵點;

3.計算每個特徵點的主方向(質心法):computeOrientation()

4.旋轉每個特徵點的Patch到主方向,採用上述步驟3的選取的最優的256對特徵點做τ測試,構成256維描述子,佔32個位元組;n=256.

4.採用漢明距離做特徵點匹配;

細節:

Opencv定義中,描述子佔用的位元組數,預設32位元組;描述子型別,8位整形數  

nfeatures:需要的特徵點總數;

scaleFactor:尺度因子;

nlevels:金字塔層數;

edgeThreshold:邊界閾值;

firstLevel:起始層;

WTA_K:描述子形成方法,WTA_K=2表示,採用兩兩比較;

scoreType:角點響應函式,可以選擇Harris或者Fast的方法;

patchSize:特徵點鄰域大小;

ORB::operator()

特徵提取及形成描述子:通過這個函式對影象提取Fast特徵點或者計算特徵描述子。

_image:輸入影象;

_mask:掩碼影象;

_keypoints:輸入角點;

_descriptors:如果為空,只尋找特徵點,不計算特徵描述子;

_useProvidedKeypoints:如果為true,函式只計算特徵描述子;

(1)提取角點:computeKeyPoints(…)

輸入引數imagePyramid:即構造好的金字塔,其它引數。

(2)為每個角點計算主方向,質心法:computeOrientation()

輸入引數:圖片,角點,patchsize等。

(3)計算特徵點描述子:computeDescriptors()

總結:

關鍵點:

ORB演算法的特徵匹配實現較穩定的尺度不變性:通過構建不同高斯金字塔(即對影象進行縮放)分別進行特徵檢測。

ORB演算法的特徵匹配實現較穩定的旋轉不變性:為每個特徵點增加角度特徵。

ORB演算法在尺度方面效果較差,在增加演算法的尺度變換的情況下仍然沒有取得較好的結果。

ORB是一種快速的特徵提取和匹配的演算法。它的速度非常快,但是相應的演算法的質量較差。和sift相比,ORB使用二進位制串作為特徵描述,這就造成了高的誤匹配率。

參考文章: