SIFT(ASIFT) Matching with RANSAC
十來天沒上來寫東西了,在實(shí)踐試錯(cuò)的過程中,有太多東西沒來得及總結(jié),忙著填BoW的坑,忙著投簡(jiǎn)歷(工作碗里來)。盡管這樣,還是抽了點(diǎn)空把這十來天自己在完善Bag of Words cpp實(shí)現(xiàn)(stable version 0.01)重排過程中做的一些東西總結(jié)一下,希望也能對(duì)后來者有些許幫助,好了進(jìn)入正題。
一般在詞袋模型中,為了提高檢索的精度,你可以通過很多的trick來提高其精度(mAP),其中一個(gè)廣泛使用的技巧就是對(duì)返回的圖像進(jìn)行重排,重排有很多種方法,比如對(duì)多特征在分?jǐn)?shù)層(決策層)進(jìn)行融合也是一種重排方式,不過這里要做的是通過剔除查詢圖像與候選圖像錯(cuò)配點(diǎn)對(duì)的方式進(jìn)行重排,剔除錯(cuò)配點(diǎn)一般采用的是RANSAC算法,關(guān)于RANSAC原理可以閱讀RANSAC算法做直線擬合這篇文章,或者采用類RANSAC算法。作為初級(jí)階段的實(shí)踐,這里從兩幅圖像的匹配逐步深入。
代碼下載:下面貼圖的結(jié)果的代碼都可以sift(asift)-match-with-ransac-cpp下載。
1NN匹配
“1NN匹配”(勿wiki,自創(chuàng)的一個(gè)詞匯),講起來比較順口,而且從字面也應(yīng)該可以猜測(cè)出點(diǎn)意思來,所以就這么寫在這里了。所謂的“1NN”匹配,即是對(duì)于圖像im1中的某個(gè)SIFT特征點(diǎn)point1,通過在im2圖像上所有SIFT關(guān)鍵點(diǎn)查找到與point1最近的SIFT關(guān)鍵點(diǎn),重復(fù)這個(gè)過程,即可得到圖像im1中所有的特征點(diǎn)在im2中的匹配點(diǎn)(最近鄰,1NN)。這種匹配方法,會(huì)出現(xiàn)很多的錯(cuò)配點(diǎn),下面是采用1NN匹配的結(jié)果:從上圖可以看到,1NN匹配的方法出現(xiàn)了很多的錯(cuò)配點(diǎn),而這些錯(cuò)配點(diǎn)對(duì)無論是對(duì)圖像檢索中的重排,還是圖像拼接等,都是不希望看到的,所以得進(jìn)一步對(duì)其中的錯(cuò)配點(diǎn)對(duì)進(jìn)行剔除,下面采用“1NN/2NN<0.8”的方法進(jìn)行錯(cuò)配點(diǎn)對(duì)剔除。
1NN/2NN<0.8
"1NN/2NN<0.8",不要詫異你未見過這樣一種說法,沒錯(cuò),自己瞎創(chuàng)的一種表述。對(duì)上面1NN方法理解了,這個(gè)水到渠成。所謂“1NN/2NN<0.8”,即對(duì)于圖像im1中的某個(gè)SIFT特征點(diǎn)point1,通過在im2圖像上所有SIFT關(guān)鍵點(diǎn)查找到與point1最近的SIFT關(guān)鍵點(diǎn)point21(記該關(guān)鍵點(diǎn)point21到point1的距離為dis1)和次近的關(guān)鍵點(diǎn)point22(記該關(guān)鍵點(diǎn)point22到point1的距離為dis2),如果dis1/dis2<0.8,則我們將其視為正確匹配的點(diǎn)對(duì),否則則為錯(cuò)配的點(diǎn)對(duì)予以剔除。這種尋找匹配的方法,由Lowe在其Distinctive image features from scale-invariant keypoints中有說明,當(dāng)然,0.8這個(gè)閾值是可以調(diào)整的,不過一般都采用0.8。下面是采用該方法進(jìn)行匹配后的結(jié)果:可以看到,經(jīng)過該方法匹配后,相比與“1NN”匹配方法,相比于“1NN”,這種方法進(jìn)行匹配時(shí)有了很大的改善,不過正配點(diǎn)相比與1NN有部分損失。下面再探討用RANSAC方法對(duì)這兩種情況進(jìn)行錯(cuò)配點(diǎn)剔除。
1NN+RANSAC
回到前面的“1NN”匹配的點(diǎn)對(duì),我們?cè)俨捎肦ANSAC方法對(duì)其進(jìn)行錯(cuò)配點(diǎn)剔除,RANSAC方法的原理前面已有相關(guān)文章RANSAC算法做直線擬合,這里不再重復(fù),相關(guān)的代碼請(qǐng)看utils.cpp中findInliers函數(shù),調(diào)用的是OpenCV中的cv::findFundamentalMat函數(shù)計(jì)算其變換矩陣,下面是“1NN”經(jīng)過RANSAC剔除錯(cuò)配點(diǎn)對(duì)的結(jié)果:可以看到,經(jīng)過RANSAC后,“1NN”中的很多錯(cuò)配點(diǎn)對(duì)差不多剔除得比較好了,不過還有錯(cuò)配的點(diǎn)對(duì)沒有剔除掉,圖中用紅色矩形框標(biāo)出了未剔除的錯(cuò)配點(diǎn)對(duì)。我們?cè)趤砜纯磳?duì)“1NN/2NN<0.8”進(jìn)行RANSAC后會(huì)是怎樣的結(jié)果呢?
1NN/2NN<0.8+RANSAC
在看匹配結(jié)果前,我們可以先做一個(gè)大概的預(yù)測(cè),因?yàn)椤?NN/2NN<0.8”得到的很多點(diǎn)就是正確匹配的點(diǎn)對(duì),所以將其放入RANSAC中后,能夠得到很好的擬合模型,所以其剔除錯(cuò)配點(diǎn)對(duì)效果也應(yīng)該更好。為了驗(yàn)證這一預(yù)測(cè),我們看一下“1NN/2NN<0.8+RANSAC”具體的效果,如下圖所示:可以看到,已經(jīng)完全沒有錯(cuò)配點(diǎn)了,從這一點(diǎn)來說,其效果是非常好的。不過,從正配點(diǎn)對(duì)數(shù)目來看,“1NN+RANSAC”的結(jié)果更密集,也就是說“1NN+RANSAC”包含了更多的正配點(diǎn)對(duì),“1NN/2NN<0.8+RANSAC”正配點(diǎn)對(duì)要稍微少些。在大多數(shù)情況下,我們會(huì)選擇完全剔除了錯(cuò)配點(diǎn)對(duì)的模型。
上面分別介紹了兩種匹配方法,分別是“1NN”和“1NN/2NN<0.8”匹配方法,以及對(duì)它們采用RANSAC剔除錯(cuò)配點(diǎn)對(duì)的方法。有時(shí)候,如果要求經(jīng)過RANSAC匹配后保留更多的正配點(diǎn)對(duì),這時(shí)候,我們可以采用Affine-SIFT,簡(jiǎn)稱ASIFT,具體可以閱讀ASIFT: An Algorithm for Fully Affine Invariant Comparison這篇文章,作者提供了ASIFT的C++代碼和匹配算法,可以在ASIFT下載得到,我大概跑了一下里面的demo,相比與SIFT,ASIFT可以提取到很多的關(guān)鍵點(diǎn),對(duì)旋轉(zhuǎn)等變換具有更好的不變性,不過缺點(diǎn)也很明顯,速度實(shí)在太慢,很難做到實(shí)時(shí),所以要使用的話,一般應(yīng)用在對(duì)實(shí)時(shí)性不做要求的場(chǎng)合。我那個(gè)代碼里有OpenCV的實(shí)現(xiàn),你也可以試一下其效果,該OpenCV代碼實(shí)現(xiàn)來源于OPENCV ASIFT C++ IMPLEMENTATION,OpenCV自帶其Python實(shí)現(xiàn),使用比較方便,就是速度太慢,所以自己在圖像檢索在寫的項(xiàng)目中,也不打算用它了。
對(duì)于怎么將上面介紹的這些匹配方法應(yīng)用到圖像檢索重排中,后面會(huì)再做整理介紹,今天就到這里了,明天阿里筆試,亞歷山大。
from:?http://yongyuan.name/blog/SIFT(ASIFT)-Matching-with-RANSAC.html
總結(jié)
以上是生活随笔為你收集整理的SIFT(ASIFT) Matching with RANSAC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015年部分互联网公司笔试综合题及答案
- 下一篇: Bag of Words cpp实现(s