CMU ,富士通 ,Argo AI

代码地址 : 地址

reference: 链接

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

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

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

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

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

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

算法流程:

在这里插入图片描述

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

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

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

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

把error改成:
e r r o r = ϕ ( G − 1 ⋅ P T ) − ϕ ( P S ) error=\phi (G^{-1} \cdot P_{T})-\phi ( P_{S}) error=ϕ(G1PT)ϕ(PS)
那么在初始时刻有:
J ( G 0 ) = ∂ e r r o r ∂ ξ = − ∂ ϕ ( G 0 − 1 ⋅ P T ) ∂ ξ ∣ G = G 0 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}} J(G0)=ξerror=ξϕ(G01PT)G=G0
所以在迭代过程中,jacoobin矩阵都不变,即只对模板图像计算一个雅各比矩阵,大大减小了计算量。

每迭代一步,就把 Δ G ~ \Delta \tilde{G} ΔG~乘到 P S P_{S} PS上, P T P_T PT不动.

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

在这里插入图片描述

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

实验结果:

训练的时候是用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

结果如下:

在这里插入图片描述

右边的两组是为了证明在有噪声数据的情况下,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

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐