CMU ,富士通 ,Argo AI

代码地址 : 地址

reference: 链接

本文针对点云配准的问题,提出PointNetLK.

核心思想: 把点云$P_T$和PSP_S通过PointNet网络映射到和ϕ(PT)ϕ(PS)\phi(P_T)和\phi(P_S),目标是找出一个刚性变换G使得ϕ(PT)=ϕ(GPS)\phi (P_{T})=\phi (G\cdot P_{S})

其使用Point Net无序的点云进行“成像”,也就是将配准算法的输入从点云变成了PointNet处理后的K维特征向量。这样点云规模对算法的计算量不会产生影响。

借鉴LK的思想,LK目标是跟踪detector的平移,这里是跟踪整个点云的旋转。

LK是有两个2D图片I1,I2I_{1},I_{2}, 由提取出来的I1I_1中的detector,在I2I_2中根据灰度找到I1I_1的detector,算出两者位移。
LK是基于光度不变假设,即I2(x+Δx)=I1(x)I_{2}(\boldsymbol{x}+\Delta \boldsymbol{x})=I_{1}(\boldsymbol{x}),解出Δx\Delta \boldsymbol{x}

在点云配准问题中是相似的,已知 ϕ(PT)=ϕ(GPS)\phi (P_{T})=\phi (G\cdot P_{S}),解出GG。这里是迭代求解之后,解出的G~\tilde{G}与GT之差产生一个loss,反向传播去训练PointNet,即优化ϕ()\phi (\cdot)

算法流程:

PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019 论文笔记

两个输入:模板点云Pt,源点云Ps.

两个共享权重的网络:PointNet,去掉了用于对输入点云做变换的T-Net,使用LK算法层作为代替

这里借鉴LK的the Inverse Compositional (IC) formulation(I1I_{1} 算梯度)(正常LK是用I2I_{2}算梯度):

定义
error=ϕ(PT)ϕ(GPs) error = \phi(P_T) - \phi(G*P_s)
则目标函数为最小化该损失:
G~=minG12error22 \tilde{G}=\min_{G}\frac{1}{2}\begin{Vmatrix} error \end{Vmatrix}_{2}^{2}
由于问题是非线性的,只能迭代求解,使用高斯牛顿法:
ΔG~=minΔG12error(G+ΔG)22 \Delta \tilde G = min_{\Delta G}\frac12||error(G+\Delta G)||_2^2
使用一阶泰勒公式近似:
ΔG~=[J(G)TJ(G)]1(J(G)Terror(G))J(G)=errorG \Delta \tilde{G}=[J(G)^{T}J(G)]^{-1}(-J(G)^{T}error(G))\\其中J(G)=\frac{\partial error}{\partial G}
GSE3ξSE3其中G \in SE3,没有加法,导数无法按照正常定义进行计算。\\ 所以可以转而对其对应的参数\xi \in SE3进行求导:
J(G)=errorξ J(G)=\frac{\partial error}{\partial \xi }。
接下来按照原本的LK光流法的思路:
J(Gi)=errorξ=ϕ(GiPS)ξG=Gi J(G_{i})=\left.\begin{matrix} \frac{\partial error}{\partial \xi }=-\frac{\partial \phi (G_{i}\cdot P_{S})}{\partial \xi} \end{matrix}\right|_{G=G_{i}}
但是这样的话,需要每迭代一步计算一次迭代后的点云关于参数δ\delta的导数J(Gi)J(G_{i}),而计算雅各比矩阵非常耗时。因此论文借鉴了反向LK算法的思路:

把error改成:
error=ϕ(G1PT)ϕ(PS) error=\phi (G^{-1} \cdot P_{T})-\phi ( P_{S})
那么在初始时刻有:
J(G0)=errorξ=ϕ(G01PT)ξG=G0 J(G_{0})=\left.\begin{matrix} \frac{\partial error}{\partial \xi }=-\frac{\partial \phi (G_{0}^{-1}\cdot P_{T})}{\partial \xi} \end{matrix}\right|_{G=G_{0}}
所以在迭代过程中,jacoobin矩阵都不变,即只对模板图像计算一个雅各比矩阵,大大减小了计算量。

每迭代一步,就把ΔG~\Delta \tilde{G}乘到PSP_{S}上,PTP_T不动.

现在重新看流程图应该可以看懂了:

PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019 论文笔记

n次迭代后得出总的G:
Gest=ΔGnΔG1ΔG0 \mathbf{G}_{e s t}=\Delta \mathbf{G}_{n} \cdot \ldots \cdot \Delta \mathbf{G}_{1} \cdot \Delta \mathbf{G}_{0}
计算用于训练的loss
(Gest)1GgtI4F \left\|\left(\mathbf{G}_{e s t}\right)^{-1} \cdot \mathbf{G}_{g t}-\mathbf{I}_{4}\right\|_{F}

实验结果:

训练的时候是用pointnet在model40上训练好了之后,在联合PointNetLK进行fine-tune。本文的比较对象是ICP。

在ModelNet40上sample出一个Template,然后把template进行旋转平移生成Source,用这样的数据进行train和test,做了1,2,两个实验:

  1. Train and test on same object categories
  2. Train and test on different object categories

结果如下:

PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019 论文笔记

右边的两组是为了证明在有噪声数据的情况下,pointnet最后的symmetrical function用average pooling比max pooling更加鲁棒

局部可见数据:

3D与2.5D的匹配。使用的方法是:将3D模板点云数据进行可视点采样得到2.5D点(对源点云数据也进行同样操作)然后输入到网络中,每一个迭代都进行一次采样。

PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019 论文笔记

PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019 论文笔记

计算效率:

O(n),相比之下ICP是O(n^2)

PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019 论文笔记

ICP的旋转和平移误差分别为(175.51°0.22),0.36s

Go-ICP为(0.18°10-3),80.78s

PointNetLK(0.2°10-4),0.2s

相关文章:

  • 2022-01-07
  • 2021-08-16
  • 2021-11-18
  • 2021-11-19
  • 2021-11-28
  • 2021-12-30
  • 2021-04-02
  • 2021-10-20
猜你喜欢
  • 2021-06-12
  • 2022-01-04
  • 2021-11-12
  • 2021-06-25
  • 2021-07-23
  • 2021-11-07
  • 2021-04-06
相关资源
相似解决方案