【点云处理之论文狂读前沿版2】——Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis

摘要

本文解决的问题是如何用特征更精确地描述3D形状地几何结构,提出的方法是在点云中聚合假定的curves

  1. 连接点(curves)序列最初通过在点云中进行引导walks分组
  2. 然后再重新聚合起来,增加点与点之间的特征描述。
  3. 所提出的聚合策略有着高效的实施策略,包括曲线分组器和曲线聚合器
  4. 代码详见https://curvenet.github.io/

1. 引言

  1. Local feature aggregation:PointNet++那种类型的,根据当前点寻找邻居点,尽管在一定程度上可以学习局部特征,但是大范围点间的联系还是不够紧密。
  2. Non-local aggregation:Transfomer那种类型的,没详细说,只是说特征提取能力还是不够。
  3. Curve aggregation:将一组点云看作是无向图,每个点看作vertex,点与点相连的看作edge,curve就相当于在图中进行walk得到的结果。可以看到这种形状描述的方法的优势在于,以前要从飞机尾翼处感知到灯要通过不断下采样,局部结构扩大感受野才能实现,而现在在浅层网络中,飞机尾翼就通过curve和灯处的点发生了联系。

本文的贡献如下:

  1. Curve grouping operator + Curve aggregation operator
  2. 研究了grouping loops的潜在缺点,并提出了解决办法。
  3. 提出了一个动态编码方法,保证curves包含丰富信息的同时还抑制潜在的crossovers
  4. 将curve模型整合到网络中,得到CurveNet,可以在object classification, normal estimation, object part segmentation任务中得到好的应用。

2. 相关工作

点云的采样方法

  1. GS-Net
  2. PointASNL
  3. PAT
  4. RandLA-Net
  5. 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,,slsF}。我们考虑了一个在同构图 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)fjN)}).

其中 Φ ( f , f j ) = f − f j \Phi\left(\mathbf{f}, \mathbf{f}^{j}\right)=\mathbf{f}-\mathbf{f}^{j} Φ(f,fj)=ffj表示两个点特征间的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\} {pApAj} { p B − p B j } \left\{\mathbf{p}_{\mathrm{B}}-\mathbf{p}_{\mathrm{B}}^{j}\right\} {pBpBj}很有可能得到相同的值。

从上图右侧可以看到,椅子的靠背和座板有着相似的特征,在浅层下更为明显。

一种能够丰富 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<=iZ+<=l

在这里,我们不采用确定的walk策略, 而是 提出一种可学习的策略 π ( ⋅ ) \pi(\cdot) π(),通过主干网络来优化这个策略:

  1. 对于状态 s \mathbf{s} s,对状态描述子 h s ∈ R 2 ∥ s ∥ \mathbf{h}_{\mathbf{s}} \in \mathbb{R}^{2\|\mathbf{s}\|} hsR2s进行MLPs操作得到下一步。
  2. 特征描述子是通过点特征 s i \mathbf{s}_{i} si 和Curve描述子 r i \mathbf{r}_{i} ri拼接得到的。
  3. N s N_{\mathrm{s}} Ns中所有相邻点的选择逻辑值(应该是权值吧) α \alpha α都可以通过MLPs学习。
  4. 然后将 α \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(hsjsjNs)}π(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()操作不可导,无法求得梯度,所以需要寻求其他替代的方法:

  1. 通过使用gumbel-softmax 为scoring function,生成一个hard one-hot style score vector α \alpha α,输出的值可以被转换为基于 arg ⁡ max ⁡ ( ) \arg \max() argmax()索引的one-hot 向量。
  2. 通过复制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)=1k( 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([ri1,si])),=βri1+(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会导致出现太多相同的顶点,需要抑制。

  1. 构造一个支持向量 c → i = s i − r i − 1 \overrightarrow{\mathbf{c}}_{i}=\mathbf{s}_{i}-\mathbf{r}_{i-1} c i=siri1 表示在第 i i i步当前Curve的大体方向。
  2. 对于每一个搜寻的相邻点和Curve头都计算候选向量 q → i j = s i j − s i \overrightarrow{\mathbf{q}}_{i}^{j}=\mathbf{s}_{i}^{j}-\mathbf{s}_{i} q ij=sijsi
  3. 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:

  1. C C C:特征通道
  2. P P P:点的数量
  3. 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内的关系:

  1. 通过沿着不同轴对 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
  2. 点特征 F \mathbf{F} F f intra  f_{\text {intra }} fintra  f inter  f_{\text {inter }} finter  输入到单独的 bottleneck MLPs以减少特征的维度。
  3. 通过减少维度后的 F \mathbf{F} F 分别与 减少维度后的 f intra  f_{\text {intra }} fintra  f inter  f_{\text {inter }} finter 矩阵相乘学习curve-point映射。Softmax functions被用于计算分数。
  4. 另外一个分支中,减少维度后的 f intra  f_{\text {intra }} fintra  f inter  f_{\text {inter }} finter 进一步使用两个额外的MLPs进行转换,然后分别通过矩阵乘法与计算出的映射分数进行融合。
  5. 最终 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中是一个基础的特征传播算子。

  1. 首先将相对点坐标编码为 [ p , p k , p k − p ] \left[\mathbf{p}, \mathbf{p}^{k}, \mathbf{p}^{k}-\mathbf{p}\right] [p,pk,pkp],其中 p k \mathbf{p}^{k} pk p \mathbf{p} p的一个相邻点。
  2. 采用了一个额外的MLP来更好地传播元素集成特征
  3. Average pooling layer放在最后对每个领域进行聚合

一开始的时候用一个简化版的LPFA block学习点云的局部空间编码。

3.3.2 Curve Intervention Convolution (CIC)

CIC中包含了Curve Grouping operator (CG)和Curve Aggregation operator (CA)模块,保证了特征更好地传播。CIC采用了bottleneck的设计:

  1. 在开始的时候先用一个MLP将输入的特征降维,以降低计算复杂度
  2. 然后使用KNN算法在欧式距离上对特征进行分组,注意,此时KNN算法还是对原始点云进行得到分组!
  3. 使用top-k selection method确定始发点
  4. Curve Grouping
  5. Curve Aggregation
  6. 残差+降维后的特征
  7. LPFA
  8. 再通过一个MLP增加特征的维度
  9. 残差+输入特征

如果有采样需求的话,先在最开始的地方使用FPS算法,这个FPS是再ball query上进行的。

3.3.3 Task-Specified Head (TSH)

Classification:

  1. 首先使用一个MLP将输入特征升维
  2. 分别进行max pool和average pool,并将最后的结果拼接
  3. 最后经过两个带有Dropout的全连接层

Segmentation:

  1. 将已经编码的特征放入上采样层
  2. 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

论文写作亮点

  1. isomorphic adj. 同构的

本文写的有点晦涩,有些话真的很难看懂,模型很复杂,并没有讲的很透彻,建议看代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值