RANSAC算法

RANSAC算法全稱是隨機抽樣一致算法(random sample consensus,RANSAC)RANSAC算法的基本假設是樣本中包含正確數據(inliers,可以被模型描述的數據),也包含異常數據(outliers,偏離正常範圍很遠、無法適應數學模型的數據),即數據集中含有噪聲。這些異常數據可能是由於錯誤的測量、錯誤的假設、錯誤的計算等產生的。同時RANSAC也假設,給定一組正確的數據,存在可以計算出符合這些數據的模型參數的方法。數據分兩種:有效數據(inliers)無效數據(outliers)。偏差不大的數據稱爲有效數據,偏差大的數據是無效數據。如果有效數據佔大多數,無效數據只是少量時,我們可以通過最小二乘法或類似的方法來確定模型的參數和誤差;如果無效數據很多(比如超過了50%的數據都是無效數據),最小二乘法就失效了,我們需要新的算法。

如果一組二位的數據點含有許多噪聲點,直接採用最小二乘法求出的數學模型不夠準確。而比較好的方法就是用RANSAC算法剔除那些噪聲點,獲得最大的支持數據集合,再用最大支持數據通過最小二乘求出最佳數學模型。

首先如果沒有使用RANSAC算法,通過最小二乘法模擬出的數學模型如下圖所示,其中的二位數據是我們隨機生成的包含噪聲點的數據集合。



可以看出,上半部分是誤差較大的點,而通過最小二乘擬合的直線將噪聲點也考慮進去,得到的不是最佳數學模

型。

現在我們採用RANSAC算法剔除一些噪聲點後,在進行最小二乘擬合得到的圖如下所示。

其中紅色的直線是未使用RANSAC算法擬合的直線,藍色的直線是使用RANSAC算法擬合的直線。從中可以看出使用RANSAC算法之後的數學模型更佳。

算法:

僞代碼的算法如下所示:

輸入:

Data       一組觀測數據

Model     適應於數據的模型

       適應於模型的最小數據個數

       算法的迭代次數

        用於決定數據是否適應於模型的閾值

        判定模型是否適用於數據集的數據數目

Best_model  與數據最匹配的模型參數(沒有返回null)

Best_consensus_set 估計出模型的數據點

Best_error   跟數據相關的估計出的模型錯誤

iterations 0

best_model null

best_consensus_set null

best_error 無窮大

while iterations )

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


這次的模擬實驗是使用matlab實現的,詳細代碼可在此處下載點擊打開鏈接





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章