CMU ,富士通 ,Argo AI
代码地址 : 地址
reference: 链接
本文针对点云配准的问题,提出PointNetLK.
核心思想: 把点云$P_T$和PS通过PointNet网络映射到和ϕ(PT)和ϕ(PS),目标是找出一个刚性变换G使得ϕ(PT)=ϕ(G⋅PS)。
其使用Point Net无序的点云进行“成像”,也就是将配准算法的输入从点云变成了PointNet处理后的K维特征向量。这样点云规模对算法的计算量不会产生影响。
借鉴LK的思想,LK目标是跟踪detector的平移,这里是跟踪整个点云的旋转。
LK是有两个2D图片I1,I2, 由提取出来的I1中的detector,在I2中根据灰度找到I1的detector,算出两者位移。
LK是基于光度不变假设,即I2(x+Δx)=I1(x),解出Δx。
在点云配准问题中是相似的,已知 ϕ(PT)=ϕ(G⋅PS),解出G。这里是迭代求解之后,解出的G~与GT之差产生一个loss,反向传播去训练PointNet,即优化ϕ(⋅)。
算法流程:

两个输入:模板点云Pt,源点云Ps.
两个共享权重的网络:PointNet,去掉了用于对输入点云做变换的T-Net,使用LK算法层作为代替
这里借鉴LK的the Inverse Compositional (IC) formulation(I1 算梯度)(正常LK是用I2算梯度):
定义
error=ϕ(PT)−ϕ(G∗Ps)
则目标函数为最小化该损失:
G~=Gmin21∥∥error∥∥22
由于问题是非线性的,只能迭代求解,使用高斯牛顿法:
ΔG~=minΔG21∣∣error(G+ΔG)∣∣22
使用一阶泰勒公式近似:
ΔG~=[J(G)TJ(G)]−1(−J(G)Terror(G))其中J(G)=∂G∂error
其中G∈SE3,没有加法,导数无法按照正常定义进行计算。所以可以转而对其对应的参数ξ∈SE3进行求导:
J(G)=∂ξ∂error。
接下来按照原本的LK光流法的思路:
J(Gi)=∂ξ∂error=−∂ξ∂ϕ(Gi⋅PS)∣∣∣G=Gi
但是这样的话,需要每迭代一步计算一次迭代后的点云关于参数δ的导数J(Gi),而计算雅各比矩阵非常耗时。因此论文借鉴了反向LK算法的思路:
把error改成:
error=ϕ(G−1⋅PT)−ϕ(PS)
那么在初始时刻有:
J(G0)=∂ξ∂error=−∂ξ∂ϕ(G0−1⋅PT)∣∣∣G=G0
所以在迭代过程中,jacoobin矩阵都不变,即只对模板图像计算一个雅各比矩阵,大大减小了计算量。
每迭代一步,就把ΔG~乘到PS上,PT不动.
现在重新看流程图应该可以看懂了:

n次迭代后得出总的G:
Gest=ΔGn⋅…⋅ΔG1⋅ΔG0
计算用于训练的loss:
∥∥∥(Gest)−1⋅Ggt−I4∥∥∥F
实验结果:
训练的时候是用pointnet在model40上训练好了之后,在联合PointNetLK进行fine-tune。本文的比较对象是ICP。
在ModelNet40上sample出一个Template,然后把template进行旋转平移生成Source,用这样的数据进行train和test,做了1,2,两个实验:
- Train and test on same object categories
- Train and test on different object categories
结果如下:

右边的两组是为了证明在有噪声数据的情况下,pointnet最后的symmetrical function用average pooling比max pooling更加鲁棒
局部可见数据:
3D与2.5D的匹配。使用的方法是:将3D模板点云数据进行可视点采样得到2.5D点(对源点云数据也进行同样操作)然后输入到网络中,每一个迭代都进行一次采样。


计算效率:
O(n),相比之下ICP是O(n^2)

ICP的旋转和平移误差分别为(175.51°0.22),0.36s
Go-ICP为(0.18°10-3),80.78s
PointNetLK(0.2°10-4),0.2s