RANSAC簡介
RANSAC是 RANdom SAmple Consensus 的縮寫,中文翻譯叫隨機采樣一致。它可以從一組觀測數據中,找出符合某些數學模型的樣本集,並且估計出這個數學模型的參數。舉個例子,如下圖所示,這些點是觀測數據,給定的數學模型是圓形和直線,我們想從這些觀測數據中找出圓形和直線,並且估計出它們的幾何參數。
RANSAC算法
下面介紹一下RANSAC算法:
輸入:觀測數據data,數學模型models;輸出是匹配data的數學模型match_models和對應的樣本集sub_data
1. 隨機采樣data中的一些樣本sub_data
2. 用數學模型match_model去匹配樣本集sub_data,估計出數學模型的參數
3. 評價估計出來的match_model,如果可以接受,則把它放入match_models,並且從原始觀測數據中剔除對應的樣本集sub_data
4. 迭代步驟1-3,直到估計出了所有的數學模型,或者迭代次數到了最大值
RANSAC算法是一類模式識別方法的框架,算法步驟里的具體內容是需要根據實際情況來實例化的。
三維點雲基本圖元檢測
下面我們介紹一個RANSAC算法的應用,檢測三維點雲的基本圖元。基本圖元包括:平面,球面,圓柱面和圓錐面。如下圖所示,紅色-平面;綠色-圓柱面;黃色-球面;藍色-圓錐面。
輸入:三維點雲;數學模型是四類基本圖元,它們的參數分別是:
- 平面:平面上一個點 + 法線
- 球面:球心 + 半徑
- 圓柱面:圓心 + 半徑 + 主軸方向
- 圓錐面:錐心 + 錐面角 + 主軸方向
1. 隨機采樣點雲中的三個點,做為一個樣本集。
2. 用這三個點分別估計出四類圖元的參數。
3. 評價估計出的圖元:計算圖元的支撐集,也就是點雲里有多少個點在圖元上。取最大支撐集對應的圖元類型,並且評估它是否可接受
4. 迭代步驟1-3,直到檢測出了所有的圖元集,或者迭代步驟到達了最大值
下面討論一下這個算法:
- 采樣方法:步驟一采用的是隨機采樣,可能均勻采樣會更加好一些。另外這三個點如何去采?三個點如果距離太近,會使得圖元參數估計不穩定;距離太遠的話,可能它們就分布在不同的圖元上了。
- 圖元參數的估計:三個帶法線的點,確實可以估計出圖元的參數。但是通常估計出來的參數是不准確的,因為點雲一般是有噪音的。如何從三個點出發,穩定的估計出高質量的圖元參數,也是一個問題。
- 評估圖元是否可接受:一個采樣樣本估計出了一個候選圖元,那么到底是否該接受它呢?舉個例子,比如一個圓柱面。我們知道曲面可以用平面去分片逼近。假設我們用一個平面擬合了圓柱的部分點,那么這個平面是否可接受?如果圓柱面占點雲的面積比足夠大,那么這個局部平面的支撐集面積也不會小。在不知道圓柱面的情況下,我們如何去判斷這個平面是否可接受?我們可以創建一個候選集,每次有了候選圖元,就把它放入候選集,如果候選圖元足夠好的話,就接受它。過早的接受圖元,可能會導致誤判;那如果一直增加候選集,推遲判斷的話,會影響算法的性能,因為接受圖元后可以減少點雲數據,使得后續的迭代性能增加。
- 迭代次數:理論上采樣點越多,算法的穩定性越好,但是性能會下降。所以采樣數和性能需要做一個平衡。另外采樣策略也可以做一些調整,比如先少量的均勻采樣一些樣本來考察,如果運氣好,可以接受一些面積大的圖元,這樣就可以減少后續迭代的數據規模。
總之,RANSAC提供了一種很好的算法框架。算法的具體內容和策略,是需要根據實際情況來設計的,需要綜合平衡各種因素,比如算法的穩定性,性能,質量等。
有興趣的讀者,歡迎參考視頻版本