简介
基于Point Pair Features(PPF)的6D姿态估计方法PPF,Drost et al., 2010,是在机器视觉领域应用广泛的一种物体位姿提取方法。大名鼎鼎的Halcon,其Surface Matching 模块就是在这种方法的基础上做的优化。(Halcon有一份technique notes 专门讲该模块的使用)。
这种方法具有什么优势呢?
- 在工业场景中,有大量缺少表面纹理或局部曲率变化很小的物体,无法利用局部特征提取匹配点对,因此基于局部特征点匹配的姿态估计方法无法使用
- 该方法的输入,model(物体模型)与scene(场景)均为点云;随着3D传感器技术的发展,市场上出现了很多极具性价比的工业级3D传感器,获取高质量点云的成本越来越低
原理
该法的原理,有篇文章珠玉在前PPF原理,对原论文讲解很详细,这里不再重复,我想强调几个点:
-
一个高度概括:原论文的标题,"Model Globally, Match Locally"高度概括了该法的优点;所谓Model Globally,是指对model中所有的点对(任取两个点组成一个点对,遍历所有可能的组合)都计算了PPF描述子,以描述子为key,以这两个点为value构建hash table, 该hash table可以看作是对model 的一个global的描述; 在使用scene进行匹配的时候,同样要对scene中所有点对计算PPF描述子,然后在hash table中进行查找;
-
一种思想:广义霍夫变换是一种2D 形状匹配方法,早已于上世纪80年代提出。PPF可以看作该法的3D推广。基于Hough Voting思想,PPF描述子可以看成是一种“去中心化”的特征描述子。什么是“去中心化”?就是说两个点到底匹不匹配,不像传统的局部特征描述子,依赖点的局部信息,而是要靠其他的点来投票。尽管会有噪声影响,但是正确的匹配一定会在投票过程中被“群众”突显出来,取得最高票数。由于PPF采取了Hough Voting的思想,因此继承了其优缺点:
- 优点:
- 对于轻微形变、遮挡鲁棒性好
- 抗噪声能力强
- 可一次提取出多个目标(对比Ransac与Hough Voting, 两者都是做model fitting的经典方法,但是Hough voting在这一点上胜过Ransac)
- 缺点:
- 参数空间维度高,空间复杂度和时间复杂度都很高;
- 优点:
-
一个Intuition: 直观理解一下原文中做姿态估计的过程。两个点云如何align到一起?找到一对匹配点,先将这两个匹配点align到一起,并且他们的法向量方向也要一致;剩下只差一个绕着法向量的旋转角度。这个Intuition决定了在什么样的参数空间进行Hough Voting: 参数空间有两个维度,原文中为 ( m r , α ) (m_r,\alpha) (mr,α), m r m_r mr代表了在model中,scene中 s r s_r sr的匹配点; α \alpha α代表了绕法向量的旋转角度;
优化
2017年的文章:Going Further with Point Pair Features 对PPF进行了优化, 取得了很好的效果。这篇文章指出Drost提出的原算法(以下称为Drost-PPF)及其变种中的问题:
- sampling schemes of pairs of 3D points 被长期忽视,导致方法效率低下
- 传感器噪声的影响:影响了quantization过程,而整个算法的加速正是靠quantization
- 杂乱背景的影响:影响了算法中投票的过程
针对这几个问题,作者采取的优化措施有以下几条:
-
Pre-processing: 点云的降采样的策略。降采样可以加速计算,并且避免一些很接近的点(空间距离近的点往往法向量也很接近)产生的不具有区分性的PPF features。Drost-PPF中的降采样策略比较简单,作者认为会丢失部分有用信息,所以,即使两个点的距离够近,但如果法向量角度偏差超过30度,也会予以保留。
-
Smart Sampling: 对scene中的 s i s_i si和 s r s_r sr的距离 d d d进行限制,即对于每一个 s i s_i si, 与其配对的 s r s_r sr只在以 s i s_i si为球心,以 d d d为半径的球(作者称为voting ball)内选取。 因为两个点显然应该在同一个物体上。但是如果直接限制 d d d为物体的外接球直径也不好,这不能很好的处理物体较扁的情形。
作者的策略是这样的, 使用一大一小两个voting ball做两轮投票, 小的半径为 R min = d min 2 + d med 2 R_{\min }=\sqrt{d_{\min }^{2}+d_{\text {med }}^{2}} Rmin=dmin2+dmed 2 ( d min d_{\min } dmin是bouding box 最短边, d med d_{\text {med }} dmed 是中等长度的边, R m i n R_{min} Rmin是物体的smallest observation expansion),大的半径 R m a x = d o b j R_{max}=d_{obj} Rmax=dobj(外接球直径)
第一轮投票只使用小球内的点,有助于最大限度的降低背景噪声的干扰
第二轮投票则使用了在大球内而在小球外的点, 可以对上一轮投票做补充(比如一些很扁的物体)
如何快速找到半径为 d d d 的voting ball 内的点呢?可以为scene中的点建立一个spatial look up table。具体的做法是将空间分为多个size为 d d d 的voxel,每个voxel保存了落在该voxel中的点的indices,而每个点也保存着自己所在的voxel的index。Build这个look up table 的时间复杂度为 O ( n ) O(n) O(n).然后对于 s i s_i si, 只需要在 s i s_i si所属的voxel和其相邻的voxel中查找距离小于 d d d的点就可以了。
这种做法大大减少了需要考虑的 s r s_r sr的数目,将原算法 O ( n 2 ) O(n^2) O(n2)的复杂度降为 O ( n k ) O(nk) O(nk), k k k通常比 n n n小一个量级。
-
Sensor noise: 噪声的影响主要在于会改变PPF Features的discretization bin,导致feature无法正确匹配。 解决的方法是feature spread, 即:
- 在建立model hash table的过程中, ( m r , α ) (m_r,\alpha) (mr,α)不仅被存储在自己的PPF feature vector f f f所对应的value,同样要在 f f f相邻的feature vector (4维向量的话,相邻的向量有80个)的value中保存一份。(?????尝试下能否再加速一波)
- 在投票过程中,对quantized rotation angle采取同样的策略,即不仅给rotation angle α \alpha α投票,也要给 α \alpha α的邻居们投票。(???指的哪步,投票不是( m r m_r mr和 α \alpha α一起投吗)。指的是 α s c e n e \alpha_{scene} αscene吧)
但是,同时使用quantization和spread 是有缺点的,考虑 s r s_r sr和一组 s i s_i si, 如果这组 s i s_i si距离很近的话,quantization得到的 α s c e n e \alpha_{scene} αscene是相同的, f e a t u r e v e c t o r feature\ vector feature vector也很可能是相同的,从而在投票空间造成bias。
作者在这里使用了一个bit mask table来减少这种bias。比如对于上图所示情形,三组point pair只允许投一票。具体做法是对每一个 s r s_r sr, 初始化一个size 跟model hash table的size相同的bit mask table,table的每个元素为32bit的mask (每个bit对应一个 q u a n t i z a t i o n α s c e n e quantization\ \alpha_{scene} quantization αscene),每个bit均初始化为0。当一对 ( s r , s i ) (s_r,s_i) (sr,si)计算得到 f e a t u r e v e c t o r feature\ vector feature vector和 q u a n t i z a t i o n α s c e n e quantization\ \alpha_{scene} quantization αscene之后, 对应的bit被置为1。对其他的 s i s_i si,检查对应的bit mask是否为1,为1则不再参与投票(spread 得到的feature也要检查)。
-
根据投票结果生成pose。 Drost-PPF 使用了一种贪心策略(评价的标准是投票空间的投票数)来做pose cluster。本文作者发现这种策略在有噪声和背景干扰的情况下并不鲁棒,投票数也不是一个可靠的标准。
作者采用了一种自底向上的聚类方法(????哪种),允许每个pose同时属于不同的cluster。需要保存每个pose相关联的model point。 pose A可以为其cluster投票,但是是有条件的,如果存在另一个pose B,pose B关联的model point与pose A相同,且已经为该cluster投过票,则pose A不再参与投票。这避免了repetitive geometric structures (比如平面)引起的bias。
下面几个后处理也是比较重要的:
-
Refine:使用了projective ICP (???)来做pose refine。只选择了两个voting ball中排名前四的cluster 来做refine。
-
Occulation check: 根据pose将物体虚拟投影到2D图上,检查对应像素的深度值,同虚拟投影相比,原深度图有多少距离相机更近,有多少更远,如果更近的像素比例过大(大于总像素数的10%),这个pose显然是有问题的,拒绝这个pose。
-
Silhouette check: 同样根据pose将物体虚拟投影到2D图上,得到轮廓。同时计算场景点云中深度和法向量变化剧烈的区域, 检查轮廓是否被这些区域cover了。如果有大于10%的轮廓没有被cover,拒绝这个pose
实验结果:
作者在两个数据集上进行了测试,ACCV DataSet,Occlusion DataSet, 评价标准是Recogniton rate (定义在Learning Analysis-by-Synthesis for 6D Pose Estimation in RGB-D Images)
计算时间在0.1~0.8s之间(640x 480 depth map)
-
Tips
- 背景及其他杂物尽量提前移除, 在工业应用场景这是比较好实现的
- 在投票过程中, scene上的 s r s_r sr选取可以进一步降采样,实现提速的目的
- 可以尝试使用2D实例分割+PPF的两阶段方法,代表工作来自MVTec的A Hybrid Approach for 6DoF Pose Estimation