Walk in the Cloud:Learning Curves for Point Clouds Shape Analysis
摘要
本文解决的问题是如何用特征更精确地描述3D形状地几何结构,提出的方法是在点云中聚合假定的curves。
- 连接点(curves)序列最初通过在点云中进行引导walks分组
- 然后再重新聚合起来,增加点与点之间的特征描述。
- 所提出的聚合策略有着高效的实施策略,包括曲线分组器和曲线聚合器。
- 代码详见https://curvenet.github.io/。
1. 引言
- Local feature aggregation:PointNet++那种类型的,根据当前点寻找邻居点,尽管在一定程度上可以学习局部特征,但是大范围点间的联系还是不够紧密。
- Non-local aggregation:Transfomer那种类型的,没详细说,只是说特征提取能力还是不够。
- Curve aggregation:将一组点云看作是无向图,每个点看作vertex,点与点相连的看作edge,curve就相当于在图中进行walk得到的结果。可以看到这种形状描述的方法的优势在于,以前要从飞机尾翼处感知到灯要通过不断下采样,局部结构扩大感受野才能实现,而现在在浅层网络中,飞机尾翼就通过curve和灯处的点发生了联系。
本文的贡献如下:
- Curve grouping operator + Curve aggregation operator
- 研究了grouping loops的潜在缺点,并提出了解决办法。
- 提出了一个动态编码方法,保证curves包含丰富信息的同时还抑制潜在的crossovers
- 将curve模型整合到网络中,得到CurveNet,可以在object classification, normal estimation, object part segmentation任务中得到好的应用。
2. 相关工作
点云的采样方法
- GS-Net
- PointASNL
- PAT
- RandLA-Net
- MeshWalker
3. 方法
定义1:点云中的Curves
给定 P , F \mathbf{P}, \mathbf{F} P,F和同构图 G = ( F , E ) \mathbf{G}=(\mathbf{F}, \mathbf{E}) G=(F,E) ,其中 P = { p } \mathbf{P}=\{\mathbf{p}\} P={p}为点云, F = { f } \mathbf{F}=\{\mathbf{f}\} F={f}为点云的特征, E \mathbf{E} E为点云中通过KNN计算的连接边。在特征空间中长度为 l l l的Curve c \mathbf{c} c是通过序列 F \mathbf{F} F产生的,即 c = { s 1 , ⋯ , s l ∣ s ∈ F } \mathbf{c}=\left\{\mathbf{s}_{1}, \cdots, \mathbf{s}_{l} \mid \mathbf{s} \in \mathbf{F}\right\} c={s1,⋯,sl∣s∈F}。我们考虑了一个在同构图 G \mathbf{G} G 上的walk策略 π \pi π,从开始点 s 1 \mathbf{s}_{1} s1 walk l l l步对Curves进行分组。
3.1 Rethinking Local Feature Aggregation
KNN是主要的分组算法,分组完就可以聚合:
g = pooling ( { MLP ( Φ ( f , f j ) ∣ f j ∈ N ) } ) . \mathbf{g}=\text { pooling }\left(\left\{\operatorname{MLP}\left(\Phi\left(\mathbf{f}, \mathbf{f}^{j}\right) \mid \mathbf{f}^{j} \in N\right)\right\}\right) . g= pooling ({MLP(Φ(f,fj)∣fj∈N)}).
其中 Φ ( f , f j ) = f − f j \Phi\left(\mathbf{f}, \mathbf{f}^{j}\right)=\mathbf{f}-\mathbf{f}^{j} Φ(f,fj)=f−fj表示两个点特征间的Manhattan距离,这样相对位置间的编码是最常用的。
但是,我们认为这种编码方式并不会提供太多的相对信息,原因是点云中的 g \mathbf{g} g 在相同的特征通道中包含了相同的信息,特别是在浅层更为明显。
考虑最极端的情况 P = F \mathbf{P}= \mathbf{F} P=F,从上图左上方可以看到, { p A − p A j } \left\{\mathbf{p}_{\mathrm{A}}-\mathbf{p}_{\mathrm{A}}^{j}\right\} {pA−pAj} 和 { p B − p B j } \left\{\mathbf{p}_{\mathrm{B}}-\mathbf{p}_{\mathrm{B}}^{j}\right\} {pB−pBj}很有可能得到相同的值。
从上图右侧可以看到,椅子的靠背和座板有着相似的特征,在浅层下更为明显。
一种能够丰富 g \mathbf{g} g 信息的解决办法就是使用更多的相对编码规则。本文采用从Curves中聚合特征和局部特征 g \mathbf{g} g 相结合的方法解决上述问题,每条Curve都在点云编码几何信息中创建了一条独特的路径,能够进一步提升点云特征的多样性。
3.2 Curve Grouping
Curve的始发点对分组质量至关重要。为了同时分成 n n n 组,始发点必须提前确定好。
借鉴 top-k selection method,使用sigmoid gated MLP学习每个点特征的选择分数。始发点就是排名前 n n n 个点。为了便于梯度回传,得分会乘上 F \mathbf{F} F,实现一个self-attention,形成新的点特征。
Walk
W
\mathcal{W}
W 从始发点
s
1
\mathbf{s}_{1}
s1 出发,走
l
l
l 步,被遍历到的点分组为Curve
c
\mathbf{c}
c。假定我们在第
i
i
i 步时到达了Curve的中间状态
s
i
\mathbf{s}_{i}
si, 需要找到一种walk策略
π
(
s
i
)
\pi\left(\mathbf{s}_{i}\right)
π(si) 来确定Curve的下一步
i
+
1
i+1
i+1 的状态:
s
i
+
1
=
π
(
s
i
)
,
1
<
=
i
∈
Z
+
<
=
l
\mathbf{s}_{i+1}=\pi\left(\mathbf{s}_{i}\right), 1<=i \in \mathbb{Z}^{+}<=l
si+1=π(si),1<=i∈Z+<=l
在这里,我们不采用确定的walk策略, 而是 提出一种可学习的策略 π ( ⋅ ) \pi(\cdot) π(⋅),通过主干网络来优化这个策略:
- 对于状态 s \mathbf{s} s,对状态描述子 h s ∈ R 2 ∥ s ∥ \mathbf{h}_{\mathbf{s}} \in \mathbb{R}^{2\|\mathbf{s}\|} hs∈R2∥s∥进行MLPs操作得到下一步。
- 特征描述子是通过点特征 s i \mathbf{s}_{i} si 和Curve描述子 r i \mathbf{r}_{i} ri拼接得到的。
- N s N_{\mathrm{s}} Ns中所有相邻点的选择逻辑值(应该是权值吧) α \alpha α都可以通过MLPs学习。
- 然后将 α \alpha α再输入到scoring function(softmax),在[0,1]范围内为每个相邻点分配一个基于分数的乘子。
用数学语言表示为:
α
=
{
MLP
(
h
s
j
∣
s
j
∈
N
s
)
}
π
(
s
)
=
F
[
arg
max
(
softmax
(
α
)
)
]
,
\begin{gathered} \alpha=\left\{\operatorname{MLP}\left(\mathbf{h}_{\mathbf{s}^{j}} \mid \mathbf{s}^{j} \in N_{\mathbf{s}}\right)\right\} \\ \pi(\mathbf{s})=\mathbf{F}[\arg \max (\operatorname{softmax}(\alpha))], \end{gathered}
α={MLP(hsj∣sj∈Ns)}π(s)=F[argmax(softmax(α))],
其中 h s j \mathbf{h}_{\mathbf{s}^{j}} hsj 是 相邻点 s j \mathbf{s}^{j} sj状态描述子。
在前向传播的过程中,上式通过计算到的 α \alpha α得到下一步的状态。但是,反向传播时, arg max ( ) \arg \max() argmax()操作不可导,无法求得梯度,所以需要寻求其他替代的方法:
- 通过使用gumbel-softmax 为scoring function,生成一个hard one-hot style score vector α \alpha α,输出的值可以被转换为基于 arg max ( ) \arg \max() argmax()索引的one-hot 向量。
- 通过复制one-hot向量的方法乘以搜寻点的特征,最后相加得到下一个状态:
π ( s ) = ∑ 1 k ( gumbel-softmax ( α ) ⋅ N s ) ) \pi(\mathbf{s})=\sum_{1}^{k}\left(\text { gumbel-softmax }(\alpha) \cdot N_{\mathbf{s}}\right)) π(s)=1∑k( gumbel-softmax (α)⋅Ns))
将 s \mathbf{s} s和相邻点 s j \mathbf{s}^{j} sj直接拼接得到状态描述子 h s j \mathbf{h}_{\mathbf{s}^{j}} hsj会导致回路(loops),那么寻找下一个状态的过程就会被无限循环。
Dynamic momentum
避免回路的关键就在于动态地对状态描述子进行编码时考虑当前Curve的过程:
β
=
softmax
(
MLP
(
[
r
i
−
1
,
s
i
]
)
)
,
r
i
=
β
r
i
−
1
+
(
1
−
β
)
s
i
,
\begin{aligned} \beta &=\operatorname{softmax}\left(\operatorname{MLP}\left(\left[\mathbf{r}_{i-1}, \mathbf{s}_{i}\right]\right)\right), \\ \mathbf{r}_{i} &=\beta \mathbf{r}_{i-1}+(1-\beta) \mathbf{s}_{i}, \end{aligned}
βri=softmax(MLP([ri−1,si])),=βri−1+(1−β)si,
其中[.]表示拼接操作, β \beta β是动态调整的, 每个查找邻域点和关键点之间的状态描述子 h s j \mathbf{h}_{\mathbf{s}^j} hsj可以通过 s i j \mathbf{s}_i^j sij和 r i \mathbf{r}_{i} ri拼接得到。
Crossover suppression
少量的Crossover不会影响结果,还有可能会提升性能,但是太多的Crossover会导致出现太多相同的顶点,需要抑制。
- 构造一个支持向量 c → i = s i − r i − 1 \overrightarrow{\mathbf{c}}_{i}=\mathbf{s}_{i}-\mathbf{r}_{i-1} ci=si−ri−1 表示在第 i i i步当前Curve的大体方向。
- 对于每一个搜寻的相邻点和Curve头都计算候选向量 q → i j = s i j − s i \overrightarrow{\mathbf{q}}_{i}^{j}=\mathbf{s}_{i}^{j}-\mathbf{s}_{i} qij=sij−si。
- c → \overrightarrow{\mathbf{c}} c和 p → \overrightarrow{\mathbf{p}} p之间的角度 θ \theta θ决定这Curve是要走直线还是要拐弯,通过调整具有较大 θ \theta θ相邻点的 α j \alpha^j αj来抑制Crossovers。
θ \theta θ通过余弦相似性进行计算,范围为[-1, 1]。-1表示两个向量处于相反的方向,1表示相同的方向。考虑到有边界的因素,所以Curve前进的方向不一定全是直线,因此人为设置了一个角度阈值 θ ˉ \bar{\theta} θˉ,大于 θ ˉ \bar{\theta} θˉ才会被抑制。通过将余弦相似性移动并剪裁为[0,1]来构造交叉抑制乘子,通过对 α j \alpha^j αj缩放 d j \mathbf{d}^{j} dj倍来抑制潜在的Crossover。
3.3 Curve Aggregation and CurveNet
Curve Aggregation的目的是丰富相对编码 ϕ \phi ϕ的通道内特征信息,最终为 g \mathbf{g} g提供更好的描述。
Notation:
- C C C:特征通道
- P P P:点的数量
- AP: Attentive-Pooling operator
在AP中,输入特征 ∈ R C × ∗ \in \mathbb{R}^{C \times *} ∈RC×∗在自注意力下被处理,然后沿着 ∗ * ∗ 维度相加,得到 R C × 1 \mathbb{R}^{C \times 1} RC×1。
给定分好组的Curves C = { c 1 , ⋯ , c n } ∈ \mathbf{C}=\left\{\mathbf{c}_{1}, \cdots, \mathbf{c}_{n}\right\} \in C={c1,⋯,cn}∈ R C × n × l \mathbb{R}^{C \times n \times l} RC×n×l,为了聚合特征,考虑各个Curves间的关系,以及每个Curves内的关系:
- 通过沿着不同轴对 C \mathbf{C} C 使用 AP 学习Curves间的特征向量 f inter ∈ R C × l f_{\text {inter }} \in \mathbb{R}^{C \times l} finter ∈RC×l 和Curves内的特征向量 f intra ∈ R C × n f_{\text {intra }} \in \mathbb{R}^{C \times n} fintra ∈RC×n
- 点特征 F \mathbf{F} F, f intra f_{\text {intra }} fintra 和 f inter f_{\text {inter }} finter 输入到单独的 bottleneck MLPs以减少特征的维度。
- 通过减少维度后的 F \mathbf{F} F 分别与 减少维度后的 f intra f_{\text {intra }} fintra 和 f inter f_{\text {inter }} finter 矩阵相乘学习curve-point映射。Softmax functions被用于计算分数。
- 另外一个分支中,减少维度后的 f intra f_{\text {intra }} fintra 和 f inter f_{\text {inter }} finter 进一步使用两个额外的MLPs进行转换,然后分别通过矩阵乘法与计算出的映射分数进行融合。
- 最终 f intra ′ f_{\text {intra }}^{\prime} fintra ′ 和 f inter ′ f_{\text {inter }}^{\prime} finter ′都是相同的形状 R C × P \mathbb{R}^{C \times P} RC×P,将 f intra ′ f_{\text {intra }}^{\prime} fintra ′ 和 f inter ′ f_{\text {inter }}^{\prime} finter ′沿着特征轴拼接后,送入最终的MLP。
Curve aggregation的输出是残差加上原始输入。
Curve Grouping (CG) block + Curve Aggregation (CA) block = Curve Intervention Convolution (CIC) block
我们堆叠了8个CIC block构建了CurveNet。CurveNet最开始通过Local Point-Feature Aggregation (LPFA) block 学习输入点坐标的相对局部编码,将相对偏差投影到更高维。最后通过Task-Specified Head (TSH)对不同的点云处理任务进行预测。对于点云分类任务,提取的特征首先被池化,然后通过两个全连接层。对于分割任务,使用attention U-Net对来自编码器的拼接attentive shortcut connections进行解码。
3.3.1 Local Point-Feature Aggregation (LPFA)
LPFA在CurveNet中是一个基础的特征传播算子。
- 首先将相对点坐标编码为 [ p , p k , p k − p ] \left[\mathbf{p}, \mathbf{p}^{k}, \mathbf{p}^{k}-\mathbf{p}\right] [p,pk,pk−p],其中 p k \mathbf{p}^{k} pk 是 p \mathbf{p} p的一个相邻点。
- 采用了一个额外的MLP来更好地传播元素集成特征
- Average pooling layer放在最后对每个领域进行聚合
一开始的时候用一个简化版的LPFA block学习点云的局部空间编码。
3.3.2 Curve Intervention Convolution (CIC)
CIC中包含了Curve Grouping operator (CG)和Curve Aggregation operator (CA)模块,保证了特征更好地传播。CIC采用了bottleneck的设计:
- 在开始的时候先用一个MLP将输入的特征降维,以降低计算复杂度
- 然后使用KNN算法在欧式距离上对特征进行分组,注意,此时KNN算法还是对原始点云进行得到分组!
- 使用top-k selection method确定始发点
- Curve Grouping
- Curve Aggregation
- 残差+降维后的特征
- LPFA
- 再通过一个MLP增加特征的维度
- 残差+输入特征
如果有采样需求的话,先在最开始的地方使用FPS算法,这个FPS是再ball query上进行的。
3.3.3 Task-Specified Head (TSH)
Classification:
- 首先使用一个MLP将输入特征升维
- 分别进行max pool和average pool,并将最后的结果拼接
- 最后经过两个带有Dropout的全连接层
Segmentation:
- 将已经编码的特征放入上采样层
- MLP和Dropout层用于最后的上采样和给出以点为单位的预测结果
3.3.4 CurveNet structure details
4. 实验
Dropout = 0.5
Backbone sub-network activation function = LeakyReLU
Task-specific heads activation function = ReLU
θ
ˉ
\bar{\theta}
θˉ = 90°
Classification:
Optimizer = SGD with momentum 0.9
Neighbors in KNN = 20
segmentation:
Neighbors in KNN <= 32
Loss function = cross entropy loss
Object classification
Dataset:ModelNet 10/40
Points = 1024
Scaling multiplier = [0.66, 1.5]
Translation = [-0.2, 0.2]
Epochs = 200
Initial lr = 0.1 ——> cosineannealling scheduled to 0.001
Batch_size_training = 32
Batch_size_validation = 16
Object part segmentation
Dataset:ShapeNetPart
Points = 2048
Epochs = 200
Batch_size = 32
Initial lr = 0.05 ——> decayed by 0.1 at the 140th and 180th epoch
Momentum = 0.9
Weight decay = 0.0001
又加了一些SE、one-hot,global feature vector乱七八糟的东西。
Object normal estimation
Dataset:ModelNet40
Initial lr = 0.05 ——> 0.0005
消融实验
Dataset:ModelNet40
LPFA ——> common local feature aggregation
Dynamic momentum ——> disable
Crossover suppression ——> disable
Curve Aggregation ——> vanilla non-local module (i.e. intra-relations and inter-relations are not separated)
Sparser input points and noisy testing points
5. 结论
curve grouping + curve aggregation
论文写作亮点
- isomorphic adj. 同构的
本文写的有点晦涩,有些话真的很难看懂,模型很复杂,并没有讲的很透彻,建议看代码。