【论文笔记】点云配准 PointNetLK: Robust & Efficient Point Cloud Registration using PointNet CVPR 2019
PointNetLK: Robust & Efficient Point Cloud Registration using PointNetCVPR 2019 论文笔记CMU ,富士通 ,Argo AI代码地址 : 地址reference: 链接本文针对点云配准的问题,提出PointNetLK.**核心思想:**把点云$P_T$和PSP_SPS通过PointNet网络映射到和ϕ(PT)和
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)=ϕ(G⋅PS)。
其使用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)=ϕ(G⋅PS),解出 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)−ϕ(G∗Ps)
则目标函数为最小化该损失:
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~=Gmin21∥∥error∥∥22
由于问题是非线性的,只能迭代求解,使用高斯牛顿法:
Δ
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ΔG21∣∣error(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)=∂G∂error
其
中
G
∈
S
E
3
,
没
有
加
法
,
导
数
无
法
按
照
正
常
定
义
进
行
计
算
。
所
以
可
以
转
而
对
其
对
应
的
参
数
ξ
∈
S
E
3
进
行
求
导
:
其中G \in SE3,没有加法,导数无法按照正常定义进行计算。\\ 所以可以转而对其对应的参数\xi \in SE3进行求导:
其中G∈SE3,没有加法,导数无法按照正常定义进行计算。所以可以转而对其对应的参数ξ∈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=−∂ξ∂ϕ(Gi⋅PS)∣∣∣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=ϕ(G−1⋅PT)−ϕ(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=−∂ξ∂ϕ(G0−1⋅PT)∣∣∣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)−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
更多推荐
所有评论(0)