通讯作者:Gim Hee Lee
第一作者:Zi Jian Yew
研究机构:新加坡国立大学
代码链接:https://github.com/yewzijian/RPMNet
解决了点云刚性配准任务中,对初始刚性变换和噪声/离群点敏感的问题。
迭代最近点法(ICP)分两步迭代求解刚性点云配准问题:
然而,基于空间距离的最近点对应的硬赋值对初始刚性变换和离群点敏感,往往导致ICP收敛到错误的局部极小值。
Robust Point Matching (RPM)算法:
本文提出的RPM网络,一种对初始化不敏感的基于深度学习的刚性点云配准方法则解决了ICP的问题。
与某些现有方法不同,RPM网络可以处理缺少的对应关系和部分可见性的点云。实验结果表明,与现有的非深度学习和最新的深度学习方法相比,本文的RPM网络达到了SOTA。
RPM算法是一种使用退火和软对应方式的配准算法。ICP算法在迭代计算时利用距离最近原则来产生待配准点对,而RPM算法利用软对应方式为任意点对赋予0到1之间的值,并最终收敛到0或1,如果是1则代表这两个点是配准点对。RPM算法最终计算得到的配准点对是一一映射的,而ICP算法通常不是。
a r g m i n M , R , t ∑ j = 1 J ∑ k = 1 K m j k ( ‖ R x j + t − y k ‖ 2 2 − α ) arg min_{M,R,t}\sum^J_{j=1}\sum^K_{k=1}m_{jk}(‖Rx_j+t−y_k‖_2^2−α) argminM,R,tj=1∑Jk=1∑Kmjk(‖Rxj+t−yk‖22−α)
RPM算法想要找到一个刚性变换{R,t}以及配准矩阵M,使得X能够与Y匹配。
配准矩阵的元素初始化: m j k ← e − β ( ‖ R x j + t − y k ‖ 2 2 − α ) m_{jk}←e^{−β(‖Rx_j+t−y_k‖^2_2−α)} mjk←e−β(‖Rxj+t−yk‖22−α)
其中$\alpha \ \beta $分别为判定异常值的阈值和每次迭代后需要增加的退火参数
模型对RPM做了两个修改:
在第i次迭代i时:
对于任意点云x_c,其混合特征:
F x c = f θ ( x c , { ∆ x c , i } , { P P F ( x c , x i ) } ) F_{x_c}=f_θ(x_c,\{∆x_{c,i}\},\{PPF(x_c,x_i)\}) \\ Fxc=fθ(xc,{∆xc,i},{PPF(xc,xi)})
其中:
f θ 为 特 征 提 取 网 络 P o i n t N e t , 网 络 参 数 θ x i ∈ N ( x c ) , N ( x c ) 为 x c 领 域 内 的 点 云 ∆ x c , i = x i − x c f_θ为特征提取网络PointNet,网络参数\theta \\ x_i\in N(x_c), N(x_c)为x_c领域内的点云\\ ∆x_{c,i}=x_i−x_c\\ fθ为特征提取网络PointNet,网络参数θxi∈N(xc),N(xc)为xc领域内的点云∆xc,i=xi−xc
4D点对特征:(以旋转不变的方式描述质心点x_c与相邻的点x_i之间的曲面)
P P F ( x c , x i ) = ( ∠ ( n c , ∆ x c , i ) , ∠ ( n i , ∆ x c , i ) , ∠ ( n c , n i ) , ‖ ∆ x c , i ‖ 2 ) 其 中 n c n i 为 点 云 x c x i 的 法 向 量 PPF(x_c,x_i) = (∠(n_c,∆x_{c,i}),∠(n_i,∆x_{c,i}),∠(n_c,n_i),‖∆x_{c,i}‖_2)\\其中n_c \ n_i 为点云x_c \ x_i 的法向量 \\ PPF(xc,xi)=(∠(nc,∆xc,i),∠(ni,∆xc,i),∠(nc,ni),‖∆xc,i‖2)其中nc ni为点云xc xi的法向量
在RPM算法中,退火参数$\alpha \ \beta $是需要手动设置的。RPM网络中,由于这些参数取决于学习的特征,因此很难手动设置。
将X、Y两个点云连接起来形成一个(J+K,3)的矩阵,用包含0或1的第四列对其进行扩充(X为0,Y为1),并将其输入PointNet,输出得到参数$\alpha \ \beta $
为了确保预测的α和β为正,在最后一层使用softplus激活函数
配准矩阵预测值得到后,最后一步就是预测刚性变换,即根据X计算对应的坐标 Y ^ \hat Y Y^
y j ^ = 1 ∑ k K m j k ∑ k K m j k ⋅ y k \hat{y_j}=\frac{1}{\sum^K_km_{jk}}\sum^K_km_{jk}·y_k yj^=∑kKmjk1k∑Kmjk⋅yk
然后使用SVD分解计算刚性变换。
由于不是每个X都有对应的Y,所以在计算刚性变换时,所以用 w j = ∑ k K m j k w_j=\sum^K_km_{jk} wj=∑kKmjk来衡量每个对应关系(xj,ˆyj)
L r e g = 1 J ∑ j J ∣ ( R g t x j + t g t ) − ( R p r e d x j + t p r e d ) ∣ L i n l i e r = − 1 J ∑ j J ∑ k K m j k − 1 K ∑ k K ∑ j J m j k L t o t a l = L r e g + λ L i n l i e r , L_{reg}=\frac{1}{J}\sum^J_j|(R_{gt}x_j+t_{gt})−(R_{pred}x_j+t_{pred})|\\L_{inlier}=−\frac{1}{J}\sum^J_j\sum^K_km_{jk}−\frac{1}{K}\sum^K_k\sum^J_jm_{jk}\\L_{total}=L_{reg}+λL_{inlier}, Lreg=J1j∑J∣(Rgtxj+tgt)−(Rpredxj+tpred)∣Linlier=−J1j∑Jk∑Kmjk−K1k∑Kj∑JmjkLtotal=Lreg+λLinlier,
每次 迭代都计算一次Loss,但是需要加权,前面的loss权值小,后面的大
使用带有内环的递归神经网络实现。尽管梯度可以从一个迭代流到另一个迭代,但在实践中,这并不能提高性能并导致训练不稳定,因此采用了一种简单的方法,在每个迭代开始时停止{R,t}梯度。具体结构如下图: