假设给定一个有向图
G
=
(
ν
,
ϵ
)
G = (\nu, \epsilon)
G=(ν,ϵ),用来表示点云的局部结构,其中顶点为
ν
=
{
1
,
.
.
.
,
n
}
\nu = \{1,...,n\}
ν={1,...,n},而边则为
ϵ
∈
ν
×
ν
\epsilon \in \nu \times \nu
ϵ∈ν×ν。在最简单地情况下,我们建立一个KNN图G。假设距离点
x
i
x_i
xi最近的点
x
j
i
1
x_{j_{i1}}
xji1, …,
x
j
i
k
x_{j_{ik}}
xjik包含许多有向边缘
(
i
,
j
i
1
)
,
.
.
.
,
(
i
,
j
i
k
)
(i, j_{i1}), ..., (i, j_{ik})
(i,ji1),...,(i,jik)。
我们定义边缘特征为:
e
i
j
=
h
Θ
(
x
i
,
x
j
)
e_{ij} = h_{\Theta}(x_i, x_j)
eij=hΘ(xi,xj),其中
h
Θ
:
R
F
×
R
F
→
R
F
′
h_{\Theta}: \mathbb{R}^F \times \mathbb{R}^F \rightarrow \mathbb{R}^{F^{'}}
hΘ:RF×RF→RF′,是一些使用一些可学习的参数
Θ
\Theta
Θ构成的非线性函数。
最后在EdgeConv操作上添加一个通道级的对称聚合操作
□
\square
□,完整公式为:
x
i
′
=
□
j
:
(
i
,
j
)
∈
ϵ
h
Θ
(
x
i
,
x
j
)
x_i^{'} = \square_{j:(i, j)\in \epsilon} h_{\Theta} (x_i, x_j)
xi′=□j:(i,j)∈ϵhΘ(xi,xj)。
关于公式中的
h
h
h和
□
\square
□有四种可能的选择:
h
Θ
(
x
i
,
x
j
)
=
θ
j
x
j
h_{\Theta}(x_i, x_j) = \theta_j x_j
hΘ(xi,xj)=θjxj,聚合操作采用求和操作:
x
i
′
=
∑
j
:
(
i
,
j
)
∈
ϵ
θ
j
x
j
x_i^{'} = \sum_{j:(i, j)\in \epsilon} \theta_j x_j
xi′=∑j:(i,j)∈ϵθjxj。
h
Θ
(
x
i
,
x
j
)
=
h
Θ
(
x
i
)
h_{\Theta}(x_i, x_j) = h_{\Theta}(x_i)
hΘ(xi,xj)=hΘ(xi),只提取全局形状信息,而忽视了局部领域结构。这类网络实际上就是PointNet,因此PointNet中可以说使用了特殊的EdgeConv模块。
h
Θ
(
x
i
,
x
j
)
=
h
Θ
(
x
j
−
x
i
)
h_{\Theta}(x_i, x_j) = h_{\Theta}(x_j - x_i)
hΘ(xi,xj)=hΘ(xj−xi)。这种方式只对局部信息进行编码,在本质上就是将原始点云看做一系列小块的集合,丢失了原始的全局形状结构信息。
第四种,也是文中采用的,
h
Θ
(
x
i
,
x
j
)
=
h
Θ
(
x
i
,
x
j
−
x
i
)
h_{\Theta}(x_i, x_j) = h_{\Theta}(x_i, x_j - x_i)
hΘ(xi,xj)=hΘ(xi,xj−xi),这样的结构同时结合了全局形状信息以及局部领域信息。
2.2.2、动态图CNN
假设第l层的输出为
X
l
=
{
x
1
l
,
.
.
.
,
x
n
l
}
⊆
R
F
l
X^l = \{ x_1^l, ..., x_n^l \} \subseteq \mathbb{R}^{F_l}
Xl={x1l,...,xnl}⊆RFl,而
X
0
X^0
X0就是输入点云。
每一层都会得到一个不同的图
G
l
=
(
ν
l
,
ϵ
l
)
G^l = (\nu^l, \epsilon^l)
Gl=(νl,ϵl)。
每一层的边缘特征为
(
i
,
j
i
1
)
,
.
.
.
,
(
i
,
j
i
k
)
(i, j_{i1}), ..., (i, j_{ik})
(i,ji1),...,(i,jik),取决于点
x
i
l
x_i^l
xil的
k
l
k_l
kl个最近邻的点
x
j
i
1
l
x_{j_{i1}}^l
xji1l, …,
x
j
i
k
l
x_{j_{ik}}^l
xjikl。
更新公式:
x
i
l
+
1
=
□
j
:
(
i
,
j
)
∈
ϵ
l
h
Θ
l
(
x
i
l
,
x
j
l
)
x_i^{l+1} = \square_{j:(i, j)\in \epsilon^l} h_{\Theta}^l (x_i^l, x_j^l)
xil+1=□j:(i,j)∈ϵlhΘl(xil,xjl)。
2.2.3、实现细节
网络结构见下图:
整体的网络结构与PointNet的很类似,都使用了一个空间变换单元,最后计算了一个全局信息。
分类网络中包含了两个EdgeConv层,后面接上了一个池化操作和3个全连接层,然后得到分类结果。
分割网络使用了三个EdgeConv层,后面接上了三个全连接层,最后每个点都会输出一个预测分数。
对于每个EdgeConv模块,我们都是用共享边缘函数:
h
l
(
x
i
l
,
x
j
l
)
=
h
(
x
i
l
,
x
j
l
−
x
i
l
)
h^l(x_i^l, x_j^l) = h(x_i^l, x_j^l-x_i^l)
hl(xil,xjl)=h(xil,xjl−xil),而这个函数是用一个多层感知机实现的,聚合操作
□
=
m
a
x
\square=max
□=max即为最大池化。
KNN图中的K值是一个超参,分类网络中K=20,而在分割网络中K=30。
2.3、与其他方法比较
主要跟两类方法做对比:一个是PointNet系列,一个是图CNN系列。
PointNet是我们的网络的一种特殊情况,即取KNN图的K=1,即图中的边都为空。PointNet中的边缘特征函数为
h
(
x
i
,
x
j
)
=
h
(
x
i
)
h(x_i, x_j) = h(x_i)
h(xi,xj)=h(xi),仅仅考虑了全局几何信息而丢弃了局部信息。PointNet中的聚合操作
□
=
m
a
x
\square=max
□=max(或者
∑
\sum
∑),其实就相当于全局最大池化(或平均池化)。
PointNet++试着通过在局部区域使用PointNet来提取点云的局部结构信息。PointNet++的边缘特征函数也是
h
(
x
i
,
x
j
)
=
h
(
x
i
)
h(x_i, x_j) = h(x_i)
h(xi,xj)=h(xi),聚合操作也是最大池化。