OpenCV新增描述子BEBLID:提高圖像匹配精度,減少執(zhí)行時間
點擊下方卡片,關(guān)注“新機器視覺”公眾號
視覺/圖像重磅干貨,第一時間送達
本文轉(zhuǎn)載自:當(dāng)SLAM遇見小王同學(xué),文章僅用于學(xué)術(shù)分享。
在前不久發(fā)布的OpenCV4.5中更新了很多新特性:
從4.5版本開始,OpenCV將正式使用Apache2協(xié)議,從而避免專利算法帶來的潛在糾紛 SIFT專利到期,代碼被移到主庫 對RANSAC算法進行了改進 新增了實時單目標(biāo)跟蹤算法SiamRPN++
還有其他重要更新,這里就不再敘述。值得一提的是,BELID描述子也被添加進去了。


BEBLID全稱是Boosted Efficient Binary Local Image Descriptor,多項實驗證明能夠提高圖像匹配精度,同時減少執(zhí)行時間。
# Comment or uncomment to use ORB or BEBLID
descriptor = cv.xfeatures2d.BEBLID_create(0.75)
# descriptor = cv.ORB_create()
kpts1, desc1 = descriptor.compute(img1, kpts1)
kpts2, desc2 = descriptor.compute(img2, kpts2)
更多細節(jié)可以參考:
https://towardsdatascience.com/improving-your-image-matching-results-by-14-with-one-line-of-code-b72ae9ca2b73
https://github.com/iago-suarez/beblid-opencv-demo/blob/main/demo.ipynbCODE: https://github.com/iago-suarez/BEBLID.git
PDF: http://www.dia.fi.upm.es/~pcr/publications/PRL_2020_web_BEBLID.pdf
這里說一下結(jié)論吧,經(jīng)過這個作者測試,將ORB描述符替換為BEBLID,就可以將這兩個圖像的匹配結(jié)果提高14%.
下面詳細介紹一下這個BEBLID描述子.
“作者提出了一種有效的圖像描述符BELID。其有效性的關(guān)鍵是對一組圖像特征進行有區(qū)別的選擇,且計算量要求非常低。實驗是在電腦和智能手機上進行,BELID的精確度與SIFT相似,執(zhí)行時間與最快的算法ORB相當(dāng)。
”
介紹
局部圖像是用于匹配存在強烈外觀變化的圖像,如光照變化或幾何變換。它們是許多計算機視覺任務(wù)的基本組成部分,如3D重建、SLAM、圖像檢索、位姿估計等。它們是最流行的圖像表示方法,因為局部特征是獨特的,視點不變的。
為了產(chǎn)生一個局部圖像表示,我們必須檢測一組顯著的圖像結(jié)構(gòu),并為每個結(jié)構(gòu)提供描述。對于各種如角、線和區(qū)域,有大量非常有效的檢測器,它們可以用實數(shù)或二進制描述符來描述。目前SIFT描述子仍然被認為是“黃金標(biāo)準”技術(shù)。

本文給出了一種有效的描述子。特征使用積分圖像來有效地計算一對圖像正方形區(qū)域的平均灰度值之間的差。作者使用一個增強算法來區(qū)分地選擇一組特征,并將它們組合起來產(chǎn)生強描述。實驗結(jié)果表明,該方法提高了計算速度,執(zhí)行時間接近ORB,精度與SIFT相似,它能夠為手頭的任務(wù)選擇最佳的特征。
BELID
在本節(jié)中,作者提出了一種描述圖像局部區(qū)域的有效算法,其速度和SIFT一樣快。其速度的關(guān)鍵是使用少量、快速和選擇性的特征。描述子使用一組使用BoostedSCC算法選擇的K個特征,該算法是對AdaBoost的改進。
設(shè)是由一對對圖像patches組成的訓(xùn)練集,標(biāo)記{?1,1}。其中= 1表示兩個patch對應(yīng)相同的顯著性圖像結(jié)構(gòu),=?1表示不同的顯著性圖像結(jié)構(gòu).
訓(xùn)練過程將損失降到最低

其中,它依賴于特征提取函數(shù)f: X→R和一個閾值T.給定f和T,通過含T的f(x)來定義weak learner,

1. 閾值平均盒弱學(xué)習(xí)者
效率的關(guān)鍵是選擇一個f(x),它既具有判別性,又能快速計算。我們定義特征提取函數(shù)f(x)

I(t)是像素的灰度值t和R (p, s)是大小的正方形盒子集中在帶有尺寸s的像素p。因此,f計算像素的平均灰度值之間的差異(, s)和R(,s)。圖2中的紅色和藍色方塊代表,分別(, s)和R (, s)。加快f的計算,作者使用積分圖像的輸入圖像。一旦S可用,方框中的灰度和可以通過4次內(nèi)存訪問和4次算術(shù)運算來計算。

檢測器通常計算局部結(jié)構(gòu)的方位和尺度。為了BEBLID描述符不受歐幾里得變換的影響,作者用底層的局部結(jié)構(gòu)來定位和縮放我們的測量值。
2. 優(yōu)化弱學(xué)習(xí)者權(quán)值
BoostedSCC算法選擇K個弱學(xué)習(xí)者及其相應(yīng)的權(quán)值。等式1中BoostedSCC優(yōu)化的損耗函數(shù)可以看作是一種度量學(xué)習(xí)方法,其中度量矩陣a是對角的

其中h(w)是K個弱學(xué)習(xí)者對圖像patch的w響應(yīng)向量。在這種情況下,不考慮不同弱學(xué)習(xí)者響應(yīng)之間的依賴關(guān)系。此時,給定圖像patch w的BELID-U(未優(yōu)化)描述符計算為,其中使=
進一步,通過對特征之間的相關(guān)性進行建模,估計整個矩陣A可以改善相似函數(shù)。FP-Boost估計最小值

采用隨機梯度下降法估計對稱的a和是一項困難的工作。因此,該算法從K個弱學(xué)習(xí)器和由BoostedSCC找到的α開始。第二個學(xué)習(xí)步驟非常快,因為所有弱學(xué)習(xí)者的反應(yīng)都可以預(yù)先計算出來
在未優(yōu)化的描述符的情況下,必須分解相似函數(shù)s(x,y)來計算x和y的獨立描述子。假設(shè)A是一個對稱矩陣,可以使用它的特征分解來選擇特征值最大的D個特征向量

實驗
不同的場景:巴黎圣母院,約塞米蒂國家公園和紐約的自由女神像。在SIFT檢測到的局部結(jié)構(gòu)周圍裁剪PATCH。
作者用三種方法來比較性能:
FPR-95.: 這是一個PATCH驗證問題中95%的召回誤報率。當(dāng)開發(fā)BEBILD描述符時,作者希望能夠匹配大部分的局部結(jié)構(gòu),比如說95%的召回率,但是有盡可能少的誤報。因此,在PATCH驗證問題中,描述符的FPR-95越低越好。 AUC: PATCH驗證問題中ROC曲線下的面積。它提供了一個良好的整體測量,因為它考慮了曲線上的所有操作點,而不是像FPR-95案例中只有一個。 mAP.: 在PATCH驗證、圖像匹配和PATCH檢索這三個任務(wù)中,每個任務(wù)的平均精度,在HPatches基準中定義。
作者已經(jīng)在Python中實現(xiàn)了BoostedSCC、FP-Boost和閾值平均盒弱學(xué)習(xí)者的學(xué)習(xí)和測試部分。為了優(yōu)化A矩陣,使用了固定學(xué)習(xí)率為10 - 8和批量2000個樣本的隨機梯度下降算法。同時也在c++中實現(xiàn)了使用OpenCV處理輸入圖像。作者使用這個實現(xiàn)來測量BELID在不同平臺上的執(zhí)行時間。
1. PATCH驗證實驗
在這里,首先探索維度數(shù)的影響。在圖3中,顯示了AUC和FPR-95值作為維數(shù)(“N維”)的函數(shù)。在BELID的例子中,使用K = 512,并計算B從512維減少到圖中給出的一個。

首先運行BoostedSSC來選擇512個弱學(xué)習(xí)者。通過從這個初始集合中移除最后的弱學(xué)習(xí)者,作者改變了圖3中BELID- u曲線的維數(shù)。對于BELID,丟棄了B的最后一列,它們對應(yīng)于與最小特征值相關(guān)的縮放特征向量

從圖3可以看出,boosting過程選擇的特征最多只在一點上對最終判別有貢獻。在128個弱學(xué)習(xí)者之后,每個新特征提供的改進非常小。在256之后,沒有得到任何改進,這意味著最后一個是多余的。優(yōu)化后的BELID性能優(yōu)于BELIDU,BELID得分最低FPR-95有128個尺寸。
2. Hpatches數(shù)據(jù)集實驗

圖5顯示了用HPathces工具獲得的各種BELID配置和其他競爭方法的結(jié)果.作者得到了與之前實驗相同的情況,所有的BELID配置都比SIFT好,69.57 vs 63.35,比ORB好得多。
然而,在另外兩個任務(wù)中,BEBILD描述子落后于SIFT。這是一個預(yù)期的結(jié)果,因為作者沒有為這些任務(wù)優(yōu)化描述子??傊?,BELID在所有任務(wù)中提供的結(jié)果接近SIFT,并優(yōu)于ORB。
3. 不同平臺的執(zhí)行時間
在最后的實驗中,作者測試了c++實現(xiàn)的BELID處理圖像的時間,呈現(xiàn)了由來自8個不同場景的48張800×640圖像組成的Mikolajczyk數(shù)據(jù)集的執(zhí)行時間。
作者將執(zhí)行時間與OpenCV庫中的其他相關(guān)描述子進行比較。為此運行ORB ,、SIFT 、 LBGM和BinBoost。結(jié)果在表1中。

就速度而言,BELID-U與ORB相當(dāng)。事實上,BELID-U在桌面環(huán)境下和ORB一樣快(0.41 ms vs 0.44 ms),在有限的CPU環(huán)境下更快(2.54 ms vs 6.49 ms)。這是意料之中的,因為兩者都使用一組灰度值差異作為特征。LBGM使用與BELID相同的特征選擇算法,但具有較慢的特征。因此,這個描述符需要與桌面設(shè)置中的SIFT相同的處理時間(19.77 ms vs 22.22 ms),但FPR-95稍好。
在桌面CPU上,BELID-128只需要3.08毫秒,大約是BELID-U和ORB的7倍。在智能手機CPU中,BELID128的時間也比BELID-U慢7倍左右。
結(jié)論
本文提出了一種有效的圖像描述符BELID。在實驗中,作者證明了它有非常低的計算要求,在準確度方面,BELID優(yōu)于ORB,接近SIFT。
—版權(quán)聲明—
僅用于學(xué)術(shù)分享,版權(quán)屬于原作者。
若有侵權(quán),請聯(lián)系微信號:yiyang-sy 刪除或修改!
