http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html
作者:王先榮
本文翻譯自維基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英語不錯,建議您直接查看原文。
RANSAC是「RANdom SAmple Consensus(隨機抽樣一致)」的縮寫。它可以從一組包含「局外點」的觀測數據集中,通過迭代方式估計數學模型的參數。它是一種不確定的算法——它有一定的概率得出一個合理的結果;為了提高概率必須提高迭代次數。該算法最早由Fischler和Bolles於1981年提出。
RANSAC的基本假設是:
(1)數據由「局內點」組成,例如:數據的分布可以用一些模型參數來解釋;
(2)「局外點」是不能適應該模型的數據;
(3)除此之外的數據屬於噪聲。
局外點產生的原因有:噪聲的極值;錯誤的測量方法;對數據的錯誤假設。
RANSAC也做了以下假設:給定一組(通常很小的)局內點,存在一個可以估計模型參數的過程;而該模型能夠解釋或者適用於局內點。
本文內容
1 示例
2 概述
3 算法
4 參數
5 優點與缺點
6 應用
7 參考文獻
8 外部鏈接
一、示例
一個簡單的例子是從一組觀測數據中找出合適的2維直線。假設觀測數據中包含局內點和局外點,其中局內點近似的被直線所通過,而局外點遠離於直線。簡單的最小二乘法不能找到適應於局內點的直線,原因是最小二乘法盡量去適應包括局外點在內的所有點。相反,RANSAC能得出一個僅僅用局內點計算出模型,並且概率還足夠高。但是,RANSAC並不能保證結果一定正確,為了保證算法有足夠高的合理概率,我們必須小心的選擇算法的參數。
左圖:包含很多局外點的數據集 右圖:RANSAC找到的直線(局外點並不影響結果)
二、概述
RANSAC算法的輸入是一組觀測數據,一個可以解釋或者適應於觀測數據的參數化模型,一些可信的參數。
RANSAC通過反復選擇數據中的一組隨機子集來達成目標。被選取的子集被假設為局內點,並用下述方法進行驗證:
1.有一個模型適應於假設的局內點,即所有的未知參數都能從假設的局內點計算得出。
2.用1中得到的模型去測試所有的其它數據,如果某個點適用於估計的模型,認為它也是局內點。
3.如果有足夠多的點被歸類為假設的局內點,那麼估計的模型就足夠合理。
4.然後,用所有假設的局內點去重新估計模型,因為它僅僅被初始的假設局內點估計過。
5.最後,通過估計局內點與模型的錯誤率來評估模型。
這個過程被重復執行固定的次數,每次產生的模型要麼因為局內點太少而被舍棄,要麼因為比現有的模型更好而被選用。
三、算法
偽碼形式的算法如下所示:
輸入:
data —— 一組觀測數據
model —— 適應於數據的模型
n —— 適用於模型的最少數據個數
k —— 算法的迭代次數
t —— 用於決定數據是否適應於模型的閥值
d —— 判定模型是否適用於數據集的數據數目
輸出:
best_model —— 跟數據最匹配的模型參數(如果沒有找到好的模型,返回null)
best_consensus_set —— 估計出模型的數據點
best_error —— 跟數據相關的估計出的模型錯誤
iterations = 0
best_model = null
best_consensus_set = null
best_error = 無窮大
while ( iterations < k )
maybe_inliers = 從數據集中隨機選擇n個點
maybe_model = 適合於maybe_inliers的模型參數
consensus_set = maybe_inliers
for ( 每個數據集中不屬於maybe_inliers的點 )
if ( 如果點適合於maybe_model,且錯誤小於t )
將點添加到consensus_set
if ( consensus_set中的元素數目大於d )
已經找到了好的模型,現在測試該模型到底有多好
better_model = 適合於consensus_set中所有點的模型參數
this_error = better_model究竟如何適合這些點的度量
if ( this_error < best_error )
我們發現了比以前好的模型,保存該模型直到更好的模型出現
best_model = better_model
best_consensus_set = consensus_set
best_error = this_error
增加迭代次數
返回 best_model, best_consensus_set, best_error
RANSAC算法的可能變化包括以下幾種:
(1)如果發現了一種足夠好的模型(該模型有足夠小的錯誤率),則跳出主循環。這樣可能會節約計算額外參數的時間。
(2)直接從maybe_model計算this_error,而不從consensus_set重新估計模型。這樣可能會節約比較兩種模型錯誤的時間,但可能會對噪聲更敏感。
四、參數
我們不得不根據特定的問題和數據集通過實驗來確定參數t和d。然而參數k(迭代次數)可以從理論結果推斷。當我們從估計模型參數時,用p表示一些迭代過程中從數據集內隨機選取出的點均為局內點的概率;此時,結果模型很可能有用,因此p也表征了算法產生有用結果的概率。用w表示每次從數據集中選取一個局內點的概率,如下式所示:
w = 局內點的數目 / 數據集的數目
通常情況下,我們事先並不知道w的值,但是可以給出一些魯棒的值。假設估計模型需要選定n個點,wn是所有n個點均為局內點的概率;1 − wn是n個點中至少有一個點為局外點的概率,此時表明我們從數據集中估計出了一個不好的模型。 (1 − wn)k表示算法永遠都不會選擇到n個點均為局內點的概率,它和1-p相同。因此,
1 − p = (1 − wn)k
我們對上式的兩邊取對數,得出
值得注意的是,這個結果假設n個點都是獨立選擇的;也就是說,某個點被選定之後,它可能會被後續的迭代過程重復選定到。這種方法通常都不合理,由此推導出的k值被看作是選取不重復點的上限。例如,要從上圖中的數據集尋找適合的直線,RANSAC算法通常在每次迭代時選取2個點,計算通過這兩點的直線maybe_model,要求這兩點必須唯一。
為了得到更可信的參數,標准偏差或它的乘積可以被加到k上。k的標准偏差定義為:
五、優點與缺點
RANSAC的優點是它能魯棒的估計模型參數。例如,它能從包含大量局外點的數據集中估計出高精度的參數。RANSAC的缺點是它計算參數的迭代次數沒有上限;如果設置迭代次數的上限,得到的結果可能不是最優的結果,甚至可能得到錯誤的結果。RANSAC只有一定的概率得到可信的模型,概率與迭代次數成正比。RANSAC的另一個缺點是它要求設置跟問題相關的閥值。
RANSAC只能從特定的數據集中估計出一個模型,如果存在兩個(或多個)模型,RANSAC不能找到別的模型。
六、應用
RANSAC算法經常用於計算機視覺,例如同時求解相關問題與估計立體攝像機的基礎矩陣。
七、參考文獻
- Martin A. Fischler and Robert C. Bolles (June 1981). "Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography". Comm. of the ACM 24: 381–395. doi:10.1145/358669.358692.
- David A. Forsyth and Jean Ponce (2003). Computer Vision, a modern approach. Prentice Hall. ISBN 0-13-085198-1.
- Richard Hartley and Andrew Zisserman (2003). Multiple View Geometry in Computer Vision (2nd ed.). Cambridge University Press.
- P.H.S. Torr and D.W. Murray (1997). "The Development and Comparison of Robust Methods for Estimating the Fundamental Matrix".International Journal of Computer Vision 24: 271–300. doi:10.1023/A:1007927408552.
- Ondrej Chum (2005). "Two-View Geometry Estimation by Random Sample and Consensus". PhD Thesis.http://cmp.felk.cvut.cz/~chum/Teze/Chum-PhD.pdf
- Sunglok Choi, Taemin Kim, and Wonpil Yu (2009). "Performance Evaluation of RANSAC Family". In Proceedings of the British Machine Vision Conference (BMVC). http://www.bmva.org/bmvc/2009/Papers/Paper355/Paper355.pdf.
八、外部鏈接
- RANSAC Toolbox for MATLAB. A research (and didactic) oriented toolbox to explore the RANSAC algorithm in MATLAB. It is highly configurable and contains the routines to solve a few relevant estimation problems.
- Implementation in C++ as a generic template.
- RANSAC for Dummies A simple tutorial with many examples that uses the RANSAC Toolbox for MATLAB.
- 25 Years of RANSAC Workshop
九、後話
本文在翻譯的過程中參考了沈樂君的文章《隨機抽樣一致性算法RANSAC源程序和教程》。Ziv Yaniv已經用C++實現了RANSAC,您可以點擊這裡下載源程序。
不過,如果時間允許的話,我打算自己動手用C#去實現RANSAC算法,原因有兩個:
(1)熟悉算法的最佳途徑是自己去實現它;
(2)方便使用.net的同志們利用RANSAC。
感謝您耐心看完我的蹩腳翻譯,希望對您有所幫助。