SpinNet核心优势:
- 提取的点云表面特征具有旋转不变性(由标题便知)。
- 泛化性能好:仅在3DMatch上训练,在ETH上提取特征评估得到的FMR相比其他方法更高。
SpinNet核心构成:
- Spatial Point Transformer (这里的transformer要与NLP中的区分开…)
1.1 Alignment with a Reference Axis
1.2 Spherical Voxelization
1.3 Transformation on the XY-Plane
1.4 Cylindrical Volume Formulation - 特征提取器
2.1 Point-based Layers
2.2 3D Cylindrical Convolutional Layers
整体感知:SpinNet是以一个点 p p p及其空间邻域中的其他点构成一个local patch作为网络输入,其第一部分Spatial Point Transformer的目的是要消除这个patch中的点在XYZ 3个方向上的自由度(为了达到旋转不变性),将local patch转化成canonical representation. 接着应该就是使用一些特殊的神经网络结构构成的特征提取器对local patch提取特征,形成特征向量。
网络流程:
准备输入:给定点云中一个点 p p p,构造一个球形邻域 P s = { p i : ∣ ∣ p i − p ∣ ∣ 2 ≤ R } {P^s} = \{ {p_i}:||{p_i} - p|{|^2} \le R\} Ps={pi:∣∣pi−p∣∣2≤R} 作为一个local patch. 如网络流程图最左端所示。
1.1 Alignment with a Reference Axis ( P s → P r s → P ^ r s {P^s} \to P_r^s \to \hat P_r^s Ps→Prs→P^rs)
首先对
P
s
{P^s}
Ps通过[1]中的方法计算得到一个reference axis
n
p
{n_p}
np,接着通过旋转矩阵
R
z
{R_z}
Rz将此时
P
s
{P^s}
Ps的Z轴旋转至与reference axis
n
p
{n_p}
np重合(对齐)。
P r s = R z P s P_r^s = {R_z}{P^s} Prs=RzPs
这样做是为了首先消除 P s {P^s} Ps在Z轴上的自由度。
再将 P r s P_r^s Prs中所有点减去其中心点 p p p,相当于作一个归一化操作:
P ^ r s = P r s − R z p \hat P_r^s = P_r^s - {R_z}p P^rs=Prs−Rzp
如网络流程图第二、三张小图所示。
1.2 Spherical Voxelization
球形体素化,具体做法是和CGF[2]一致的,在径向radial、轴向elevation、方位角方向Azimuth对
P
^
r
s
\hat P_r^s
P^rs进行等分:
如网络流程图第四个小图所示。
在radial、elevation、azimuth上分别等分成J、K、L份,用 V j k l {V_{jkl}} Vjkl代表每一个voxel体素. v j k l {v_{jkl}} vjkl为每一个体素的中心点。
接着利用体素 V j k l {V_{jkl}} Vjkl对 P ^ r s \hat P_r^s P^rs进行统计查询,或者说将 P ^ r s \hat P_r^s P^rs中的所有点均匀的分布在每一个 V j k l {V_{jkl}} Vjkl体素中。具体做法是统计每一个体素中心 v j k l {v_{jkl}} vjkl邻域的点,对每一个体素 V j k l {V_{jkl}} Vjkl内重新构建一个更小的patch.
P j k l = { p ^ i : ∣ ∣ p ^ i − v j k l ∣ ∣ 2 ≤ R v , p ^ i ∈ P ^ r s } {P_{jkl}} = \{ {\hat p_i}:||{\hat p_i} - {v_{jkl}}|{|^2} \le {R_v},{\hat p_i} \in \hat P_r^s\} Pjkl={p^i:∣∣p^i−vjkl∣∣2≤Rv,p^i∈P^rs}
对于体素 V j k l {V_{jkl}} Vjkl内的 P j k l {P_{jkl}} Pjkl,保留 k v {k_v} kv个点(若多于 k v {k_v} kv则随机取 k v {k_v} kv个点,少于则重复取点直至 P j k l {P_{jkl}} Pjkl内有 k v {k_v} kv个点)
1.3 Transformation on the XY-Plane
接着便是消除XY上的自由度,这里的做法是将所有体素
V
j
k
l
{V_{jkl}}
Vjkl绕Z轴旋转至与YOZ平面对齐,具体做法就是对所有
V
j
k
l
{V_{jkl}}
Vjkl作用一个一个旋转矩阵
R
j
k
l
{R_{jkl}}
Rjkl,如网络流程图第五个小图所示。
这个
R
j
k
l
{R_{jkl}}
Rjkl的含义是一个绕Z轴旋转的矩阵,首先,绕Z轴旋转
θ
\theta
θ的旋转矩阵:
所以可以很显然的看到,
R
j
k
l
{R_{jkl}}
Rjkl的作用就是将所有体素
V
j
k
l
{V_{jkl}}
Vjkl绕Z轴旋转至与YOZ平面对齐。文章中提到此操作消除了
P
^
r
s
\hat P_r^s
P^rs在XY方向上的自由度。
1.4 Cylindrical Volume Formulation
球形体素化 -> 圆柱形体素化(如网络流程图最后一个小图所示)
为什么需要转化成圆柱形,根据文章,圆柱形体素可以使用圆柱卷积,并且是
S
O
(
2
)
SO(2)
SO(2)等价的,并且这样做也保留了圆形体素的拓扑信息。
这一步没有任何操作,只是将原来的 V j k l {V_{jkl}} Vjkl(球形体素)视作圆柱形体素。
至此,Spatial Point Transformer操作已经完成,从输入一个local patch P s {P^s} Ps到生成生成一个由 J × K × L J \times K \times L J×K×L个体素构成的圆柱形 C C C,其中:
C ∈ R J × K × L × k v × 3 C \in {R^{J \times K \times L \times {k_v} \times 3}} C∈RJ×K×L×kv×3.
2.1 Point-based Layers
接着是对 C C C进行特征提取,首先对每个圆柱形体素内根据体素中心 v j k l {v_{jkl}} vjkl构造出来的一个球形邻域 R j k l P j k l {R_{jkl}}{P_{jkl}} RjklPjkl,使用shared MLP(其实就是PointNet对每一个 R j k l P j k l {R_{jkl}}{P_{jkl}} RjklPjkl求一个global feature)进行初始特征提取:
f j k l = A ( M L P s ( R j k l P j k l ) ) {f_{jkl}} = A(MLPs({R_{jkl}}{P_{jkl}})) fjkl=A(MLPs(RjklPjkl))
其中 A ( ⋅ ) A( \cdot ) A(⋅)是max pooling layer.
映射出的初始特征为D维,因此经过此操作后,得到所有的圆柱形体素初始特征:
F ∈ R J × K × L × D F \in {R^{J \times K \times L \times D}} F∈RJ×K×L×D
2.2 3D Cylindrical Convolutional Layers
整个SpinNet比较难理解的就是这里的圆柱形卷积,受到[3]的启发,作者在这里提出了一种圆柱形卷积来进一步对 F ∈ R J × K × L × D F \in {R^{J \times K \times L \times D}} F∈RJ×K×L×D进行高维特征提取,得到final descriptor ∈ R 32 \in {R^{32}} ∈R32.
圆柱形卷积的特点是由于圆柱形的输入是空间连续的,因此不需要显式的padding.
文章中的公式会比较难以理解,这里直接从代码角度来理解:
首先在经过 Cylindrical Convolution之前,网络的输入大小是
F ∈ R B × J × K × L × D F \in {R^{B \times J \times K \times L \times D}} F∈RB×J×K×L×D(多了一个B代表batch size)
,抽象到具体数字,在3DMatch数据集上的默认值是
F ∈ R B × 9 × 40 × 80 × 16 F \in {R^{B \times 9 \times 40 \times 80 \times 16}} F∈RB×9×40×80×16(16是经过PointNet+MaxPooling后的初始特征维度)
这里为了保持与代码中维度一致,以便进行Conv操作,对维度改变顺序:
F ∈ R B × 16 × 9 × 40 × 80 F \in {R^{B \times 16 \times 9 \times 40 \times 80}} F∈RB×16×9×40×80
接着进行以下操作:
可以看到就是普通的Conv3d+Conv2d,而圆柱卷积不需要padding的这个特性是通过主动给输入上下左右进行“伪padding”实现的,示意图如下:
可以看到,为了模仿圆柱形的连续性质(头尾相连),作了以上padding操作。
经过以上连续的Conv3d与Conv2d后,特征维度从输入的 16 → 32 → 64 → 128 → 64 → 32 16 \to 32 \to 64 \to 128 \to 64 \to 32 16→32→64→128→64→32,最终输出维度为 [ B , 32 , K , L ] [B,32,K,L] [B,32,K,L],再在K,L二维上做一个max_pool2d,得到最终的descriptor ∈ [ B , 32 ] \in [B,32] ∈[B,32].
Loss
Loss采用标准的Contrastive Loss,即整体网络是Siamese的,anchor与pos经过特征提取后,由归一化后的特征构成距离矩阵 d i s t s ∈ [ B , B ] {\rm{dists}} \in {\rm{[B,B]}} dists∈[B,B], 取对角线元素作furthest_positive,再在每一行取最小的非对角线元素作closest_negative,两者构成contrastive loss:
L o s s = m a x ( f u r t h e s t Loss = max(furthest Loss=max(furthest_ p o t i v e − p o s potive - pos potive−pos_ m a r g i n , 0 ) + m a x ( n e g margin, 0) + max(neg margin,0)+max(neg_ m a r g i n − c l o s e s t margin - closest margin−closest_ n e g a t i v e , 0 ) negative, 0) negative,0)
Summary
训练过程暂时没跑,但加载了作者的pretrain model作了evaluation,整体感受是SpinNet虽然具有文章中所述的旋转不变性、泛化性好等优势,但整个过程实在是太慢了,整体感受是从准备数据,到提取特征、再到Registration需要花费的时间很多。
印象中对src与tgt各提5000个点的特征,从局部领域的建立到网络前向传播再到RANSAC已经要达到1分钟左右的时间了,且不说SpinNet特征比FPFH好多少,但起码FPFH这种手工特征提5000个点的特征只需要不到1s…
并且在球形体素化过程中,3个方向分别需要等分多少份、步长距离这些都是需要人为设定的超参数,算是比较多的,因此若想将SpinNet应用在真实配准场景,应该还需要大量调参过程。
Reference
[1] Sheng Ao, Yulan Guo, Jindong Tian, Yong Tian, and Dong Li. A Repeatable and Robust Local Reference Frame for 3D Surface Matching. PR, 2020.
[2] Marc Khoury, Qian-Yi Zhou, and Vladlen Koltun. Learning Compact Geometric Features. In ICCV, 2017.
[3] Sunghun Joung, Seungryong Kim, Hanjae Kim, Minsu Kim, Ig-Jae Kim, Junghyun Cho, and Kwanghoon Sohn. Cylindrical Convolutional Networks for Joint Object Detection and Viewpoint Estimation. In CVPR, 2020.