没时间写文字,先贴几张图:(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. Efficient 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 Neuchâtel, 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的日子里相关推荐

  1. 【转载】OI生涯结束……在逸夫楼那些的日子里

    OI生涯结束--在逸夫楼那些的日子里终于,结束了,我的OI生涯----什么都不想说,因为没有成功,我不想说原因,因为有太多太多无奈--这世界本就不是平等的,所以---两年,玩过,学过,笑过,苦过--一 ...

  2. 在那些打磨汉芯的日子里[转贴]

    这两天充斥网络的重磅级新闻,无外乎汉芯造假案了.震惊与愤怒之余,也有些许轻松与幽默. 在那些打磨汉芯的日子里 我永远不会忘记,那些打磨汉芯的日日夜夜,是我最荣耀的岁月. 那是2002年的一个炎热的夏天 ...

  3. 在没有DOM操作的日子里,我是怎么熬过来的(终结篇)

    前言 在我写终结篇的日子里,Vue版本稳定在2.5.10.当我摸清Vue的脉络之后,以一个爬坑无数的亲历者的身份,谈谈我在MVVM时代里遇到的那些事儿. 接下来,正文从这开始~ 好多童鞋学习Vue都有 ...

  4. 三千繁华,感情在日子里

    三千繁华,感情在日子里生了烟,以为爱情就是浪漫了才会幸福,却不曾了解爱情是朵岁月的花,有花开也 有花落.花期的长短每对爱人有每对爱人不同的时间.或许这浪漫在幸福的日子里头起着决定性的因素. 岁月是一场 ...

  5. 只有那些不断充实自己的人,才有机会在往后的日子里持续地被雇用

    Only those who constantly retool themselves stand a chance of staying employed in the years ahead. 只 ...

  6. 三十六 我在软件园的那些日子里

    来人正是九爷.九爷在村里很有威望,时不时来当和事老,调节矛盾,牛二笑脸相迎,直冲着九爷傻笑.   "回来脚刚着地,就拿毛娃寻乐子啊?"看来九爷有些微怒,牛二心里有些打鼓.看来学好三 ...

  7. 填坑之PHP的yield和协程在一起的日子里

    首先是,这是我第一次把公众号文章复制粘贴到github来. 其次是,很久很久之前,我挖了一个yield的一个坑,自己挖的坑自己填,不然迟早会把自己埋掉. 最后是,如果想看之前那个坑,请发送" ...

  8. 愿在以后的日子里,即使单枪匹马也能勇往直前

    这周末发生的事情只能用不可思议来形容了,我明了念念不忘,必有回响. 感谢每个阶段不同的自己!希望以后的日子里眼里是阳光.笑里全是坦荡!幸福快乐.不负众望!愿从此生活多一点幸运!未来美好的岁月里.愿家人 ...

  9. MATLAB修改Figure里图例的名称

    MATLAB修改Figure里图例的名称 参考代码 参考代码 figure; hold on; plot(waterHeatOpenDegreeData,'r'); plot(eHeat1OpenDe ...

最新文章

  1. WheelView实现省市区三级联动(数据库实现版本号附带完整SQL及数据)
  2. JS数组方法(forEach()、every()、reduce())
  3. CCNP OSPF协议详解
  4. 枚举是如何实现的?(枚举的线程安全性及序列化问题)
  5. 根据地址形式分辨scala的一维数组和二维数组
  6. scanf( )函数的返回值
  7. 不做冤大头!大数据“杀熟”最高罚5000万!
  8. i7-9700与E5 2667 V2空载功耗对比
  9. linux部署rabbit mq,Linux安装rabbitmq遇到的问题
  10. Json.stringify()的用法
  11. python代码加密解密_Python实现对字符串的加密解密方法示例
  12. 微信技巧:教你几招导出微信小视频
  13. 什么是应用分发?应用分发是什么?
  14. Python将普通视频变成动漫视频,这就是知识的力量~
  15. C++笔记: 函数_Hammond‘s blog
  16. 来看一个费解而有趣的c++现象
  17. Win10电脑清除运行窗口的历史记录
  18. Java之访问修饰符
  19. 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)
  20. ajax常用的api测试

热门文章

  1. python代码加密cython_利用Cython对python代码进行加密
  2. http 文件服务器 性能测试,Http File Server
  3. 嘉兴学院计算机专业最低录取分,嘉兴学院南湖学院计算机类专业2015年在广西理科高考录取最低分数线...
  4. java中堆与栈的区别_java中堆和栈的区别分析
  5. python在哪些控制结构中使用else保留字_python的程序控制结构-循环结构与random库使用和圆周率案例--pyt...
  6. c++string替换指定位置字符_Lua 字符串
  7. 老司机们都是怎么学习STM32的?
  8. 【高速接口-RapidIO】Xilinx SRIO IP 核详解
  9. 计算机可移动磁盘无法显示图片,手机插电脑不显示可移动磁盘的详细解决方法...
  10. 哈夫曼编译器c语言程序,哪位大牛有哈夫曼编码的C语言源程序,麻烦帮帮忙啦!...