作者:Yue Wang, Justin M. Solomon
研究机构:MIT
代码链接:代码
使用概率的方法可以得到soft的结果从而保证了可微性。
目标任务:点云配准,输入两个点云数据,寻找点云数据之间的刚性变换,输出点云之间的变换矩阵和点云的对应关系。
本文提出基于深度学习的单步(无需迭代)点云配准方法Deep Closest Point,性能SOTA,提取的点云特征在未见类别和目标上获得了很好的泛化性,以及证明了局部特征对于点云配准的促进作用。
现有方法有ICP以及其变种方法,即通过迭代优化点云对应关系和变换矩阵来得到最终的最优解。但是这种方法由于目标函数是非凸函数,倾向于陷入局部最小值,在点云初始对应距离过大时甚至会得到伪最优。加入启发式的ICP变种方法速度满,且精度没有很大提升。
此外还有基于深度学习的配准方法PointNetLK,精度也不是很高。
Deep Closest Point 分为三个部分:(输入为两个点云X,Y)
- 点云特征提取网络,得到点云特征
- 基于注意力的点云匹配预测,得到点云之间的预测matching
- 可微的SVD模块,得到点云XY之间的刚性变换
下面逐个介绍:
1.特征提取网络:
输入:点云X,Y
输出:特征 F x , F y F_x,F_y Fx,Fy
这里作者选择了PointNet和DGCNN作为特征提取器。
其中DGRCNN相比于PointNet额外编码了局部几何信息,作者认为这将有助于配准精度。
在实验阶段,作者验证了两个网络之间的性能差别,结果符合预期。
2.注意力模块
论文提出每个点云的特征不应当独立的提取,而是联合两个输入点云进行提取,使得最终得到的两个特征适用于特定的任务(即配准)。
由于求解两个点云之间的对应关系与NLP领域中的sequence-to-sequence问题很相近,作者引入了Transformer作为注意力函数
ϕ
\phi
ϕ,将注意力输出作为残差项修正原来的特征
F
x
,
F
y
F_x,F_y
Fx,Fy,得到最终的特征:
Φ
X
=
F
X
+
ϕ
(
F
X
,
F
Y
)
Φ
Y
=
F
Y
+
ϕ
(
F
Y
,
F
X
)
\Phi_X = F_X + \phi(F_X , F_Y ) \\ \Phi_Y = F_Y + \phi(F_Y , F_X )
ΦX=FX+ϕ(FX,FY)ΦY=FY+ϕ(FY,FX)
进而得到匹配关系(一个概率向量):
m
(
x
i
,
Y
)
=
s
o
f
t
m
a
x
(
Φ
Y
Φ
x
i
T
)
m(x_i,Y) = softmax(\Phi_Y\Phi_{x_i}^T)
m(xi,Y)=softmax(ΦYΦxiT)
可将其视为点x_i到Y中各个点的软指针。
3.SVD模块
使用软指针生成平均意义下的(即注意力机制)每个x_i对应的Y中的点:
y
i
^
=
Y
T
m
(
x
i
,
Y
)
∈
R
3
\hat{y_i} = Y^Tm(x_i, Y) ∈ R^3
yi^=YTm(xi,Y)∈R3
其中Y为NX3的矩阵表示点云Y中的所有点云。
得到两个点云之间的匹配关系
(
x
i
,
y
i
^
)
(x_i, \hat{y_i})
(xi,yi^)后,使用SVD分解得到从X到Y的变换矩阵
R
X
Y
R_{XY}
RXY 和平移向量
t
X
Y
t_{XY}
tXY:
首
先
计
算
两
个
点
云
的
中
心
:
x
ˉ
=
1
N
∑
i
=
1
N
x
i
,
y
ˉ
=
1
N
∑
i
=
1
N
y
i
各
个
点
对
之
间
的
互
协
方
差
矩
阵
:
H
=
∑
i
=
1
N
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
S
V
D
分
解
:
H
=
U
S
V
T
变
换
矩
阵
:
R
X
Y
=
V
U
T
,
t
X
Y
=
−
R
X
Y
x
ˉ
+
y
ˉ
首先计算两个点云的中心:\bar x =\frac1N\sum_{i=1}^N x_i,\ \bar y =\frac1N\sum_{i=1}^N y_i \\ 各个点对之间的互协方差矩阵: H = \sum_{i=1}^N (x_i − \bar x)(y_i − \bar y)\\ SVD分解:H = USV^T \\ 变换矩阵:R_{XY} = VU^T \ \ ,\ \ t_{XY} = −R_{XY}\bar x + \bar y
首先计算两个点云的中心:xˉ=N1i=1∑Nxi, yˉ=N1i=1∑Nyi各个点对之间的互协方差矩阵:H=i=1∑N(xi−xˉ)(yi−yˉ)SVD分解:H=USVT变换矩阵:RXY=VUT , tXY=−RXYxˉ+yˉ
其中SVD 分解在tensorflow和pytorch中都有实现。
LOSS函数
直接使用变换矩阵与真值之间的偏差作为损失:
L
o
s
s
=
∣
∣
R
X
Y
T
R
X
Y
G
−
I
∣
∣
2
+
∣
∣
t
X
Y
−
t
X
Y
G
∣
∣
2
+
λ
∣
∣
θ
∣
∣
2
Loss = ||R_{XY}^TR_{XY}^G-I||^2 + ||t_{XY}-t_{XY}^G||^2 + \lambda||\theta||^2
Loss=∣∣RXYTRXYG−I∣∣2+∣∣tXY−tXYG∣∣2+λ∣∣θ∣∣2
两个版本V1、V2:无注意力机制的为V1
在未见点云上进行测试:
在未见类别的点云上进行测试:
鲁棒性测试:使用有噪声的输入
速度测试:ICP很快,可以看出其复杂度不高于线性,DCP在4096之前都很快,但是到4096突然变慢了10倍,复杂度应该高于线性。
PointNet 与 DGCNN的对比:选择DGRCNN没错
MLP与SVD分解的对比: MLP是一个通用逼近器,因此与SVD做了一下对比:选择SVD没错
PointNet作者指出特征维度对模型的精度是有很大影响的,越大越好,但是
高于阈值之后就影响甚微了。实验结果显示1024维优于512维度。这里作者并没有找到最优阈值,个人觉得用grid search找到最佳阈值然后再测试精度可能更好?
最后作者提使用ICP作为后优化策略,即 使用DCP+ICP 可以得到更好的结果,但是只给出了示意图没有误差结果。