重新ICP,在没有Matlab的日子里
沒時間寫文字,先貼幾張圖:(Google spreadsheets鏈接,可能需FQ)
=======================================
沒想到在我沒有加任何文字說明的情況下,這個帖子竟然在閱讀數上列第一。 這也能看懂?我還是解釋一下好了。這里所要探討的是不同范數下的點云對齊問題。
ICP是Iterative Closest Point的縮寫,更一般地也可以作為Iterative Corresponding Point的縮寫,是處理點云對齊(或稱點云匹配、配準,英語Pointcloud Registration)問題的方法。關于點云對齊和ICP,先上一些參考文獻:?
[1] Paul J. Besl and Neil D. Mckay. A method for registration of 3-d shapes. IEEE Transactions on Pattern Analysis and Machine Intelligence, 14(2):239–256, 1992.
[2] Yang Chen and Gérard Medioni. Object modelling by registration of multiple range images. Image Vision Comput., 10(3):145–155, 1992.
[3] Szymon Rusinkiewicz and Marc Levoy. Ef?cient variants of the ICP algorithm. In Third International Conference on 3D Digital Imaging and Modeling (3DIM), 2001.
[4] Timothée Jost. Fast Geometric Matching for Shape Registration. PhD thesis, Université de Neuchatel, 2002.?
[5] Helmut Pottmann, Qi-Xing Huang, Yong-Liang Yang, and Shi-Min Hu. Geometry and convergence analysis of algorithms for registration of 3D shapes. Int. J. Computer Vision, 67(3):277–296, 2006.
再上一篇最新的,其中探討了1范數在曲面擬合和點云對齊中的應用。我就是看了這篇,有了寫這個帖子的想法。
[6] S. Fl?ry and M. Hofer. Surface Fitting and Registration of Point Clouds using Approximations of the Unsigned Distance Function. Computer Aided Geometric Design (CAGD), 27(1): 60-77, 2010.?
這些文章在谷歌上就可以搜到并下載,不需要任何商業數據庫。
在點云對齊中,每個點到對齊目標都存在偏差,所有的偏差可組成一向量,不妨稱作偏差向量。最常規的想法就是使偏差的平方和最小,如使用最小二乘法解回歸問題,以前對點云對齊問題就是如此處理。用向量范數的語言來講,這也就是令偏差向量的2范數最小。那么探討其它范數的意義何在呢?基于1范數的優化有更好的穩健性,可以參看維基中的“Least absolute deviations”詞條和文獻[6]。而無窮大范數指示的是最大偏差絕對值,有重要的意義,例如在形位公差的評價中。
點到對齊目標的偏差有兩種常用的評價方法:點到對應點的距離和點到對應點的切平面的距離。后一種通常有更快的收斂速度,但需要切平面的信息。在以點到點的距離為偏差評價的情形,基于1范數和無窮大范數的優化可轉化為二次錐規劃(Second-Order Cone Programming,SOCP)問題。而在以點到點的距離為偏差評價的情形,基于1范數和無窮大范數的優化可轉化為線性規劃(Linear Programming,LP)問題。文獻[6]中有將基于1范數的優化進行轉化的方法,而這方法很容易應用到無窮大范數的情況。之所以要這樣轉化,將無約束優化問題轉為約束優化問題,我理解這是為了光滑性。原本基于1范數和無窮大范數的優化是非光滑的,轉化后則成為光滑的約束優化問題。盡管增加了變量數,又加上了約束,但這都是值得的,可見光滑性在優化中有多重要。此外,我還實現了另兩種方法:基于1范數的優化還有一種近似的解法,就是使用Huber函數來作1范數的近似,然后用LBFGS來求解這一優化問題;而對于更一般的基于p范數優化,可以用IRLS方法來近似求解。
我的開發環境是gVim+TDM-MinGW。各種工具包的選取如下,矩陣處理用的是Eigen,最近點搜索使用ANN,LP求解使用Glpk for Windows。SOCP求解似乎只有商業化工具,我試了一下Mosek,不過它給出的解真是詭異,可能是我的能力還不夠吧。試了幾種方法之后,還是用了一種笨辦法:將SOCP轉為SDP(Semi-Definite Programming,半正定規劃),將相關數據寫出為sparse SDPA格式的文件,再調用CSDP來求解。基于Huber函數的優化中用的LBFGS方法采用的是libLBFGS。是如果在Matlab下,問題就會簡單些(推斷,我也沒實際驗證),矩陣處理自不必說。最近點搜索方面,ANN依然可用(ANN MATLAB Wrapper),我還用過這個。優化方面,Matlab本身就可解LP,而SOCP可用SeDuMi。
用一個小點云(約1400點)做了下測試,談不上驗證了什么。考慮了三種范數,所以有三張收斂圖。作為縱座標的指標,1范數用的是平均絕對誤差,2范數用的是均方根誤差,無窮大范數用的是最大絕對誤差(也就是無窮大范數本身)。圖中各種方法名稱的意義如下:
分為兩大類,以P 開頭的表示以點到點的距離為偏差評價方法,而以PL 開頭的表示以點到平面的距離為偏差評價方法。后面的符號中,1表示1范數,2表示2范數,i表示無窮大范數,1H表示使用Huber函數近似的1范數,RW(Re-Weighted)表示用IRLS計算p范數優化,RW后跟的數字就是p的值。此外,以P 開頭的方法中還有2T和RWT兩種變體,它們在求解最優變換時不是采用的閉合解方法,而是像以點到平面的距離為目標時使用的無窮小變換(也就是用切空間,所以用T來標明這類變體)。其實倒不如說P2和PRW兩個是另類,因為只有它們有閉合解方法。
然后是看圖說話。基于1范數的優化是為了穩健性而提出的,但是計算量是個大問題。如果只是為了穩健性,使用加權的最小二乘法可能更好,因為不僅更快也更靈活。而使用Huber函數來近似1范數正是為了減少計算量。在以點到點的距離為偏差評價的情況下,實驗顯示這一方法很成功,兩者的收斂曲線是重合的(在圖上找不到P1的曲線,因為它正好被P1H的給蓋住)。但在以點到平面的距離為偏差評價的情況下,兩者的收斂曲線不一致,而且PL1H的收斂比較糟糕,LBFGS搜索幾乎都不成功。具體的原因我不清楚,不過我推測還是光滑性不夠。基于無窮大范數的優化收斂速度則實在太慢。它對于對應性的要求應是很高的。在點云和目標距離還比較大時可以考慮先采用2范數進行迭代,后面再使用窮大范數。最后,很有趣的一點,在基于IRLS的p范數優化中,使用高于2的p值常能獲得比2范數優化更快的收斂速度。PRW3就明顯快于P2,而PLRW5更是在前幾個迭代步一騎絕塵,遠超其它方法。不過PLRW5穩定性不夠,最后沒能收斂到0,而且之所以用5而不是3或4,正是這兩種穩定性太糟。采用加權的ICP,以前的文獻,如[3,4]中也介紹過了,但其中的加權方法大抵是對匹配性更好的點對以較高的權值。可在基于IRLS的p范數(p>2)優化中則相反,對匹配性較差的點對(點之間距離更大者)以較高的權值。而實驗顯示這樣可以加速收斂,但會減少穩定性。其中的原理我覺得可以這樣解釋:匹配性較差的點更需要改善其匹配性,使用較高的權值可以令這些點更快地接近目標曲面,從而更快地改善匹配性;另一方面,利用匹配性較差的點對計算的最優變換可能是不“正確”的,進而使整個算法的結果不能正確地收斂。這說明在權值的選取上其實是存在著一個速度與穩定性的權衡,而這一點似乎前人并未提到。
?
源代碼
轉載于:https://www.cnblogs.com/wildabc/archive/2009/11/22/1608065.html
總結
以上是生活随笔為你收集整理的重新ICP,在没有Matlab的日子里的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight 4 Beta正式
- 下一篇: opera9.6 的一个顽固的bug