点云序列时序特征提取方法整理


对于连续的点云序列,点云在空间上是无序的,但在时间上是有序的。由于空间上的无序性,传统卷积无法直接应用于原始点云,因此时序点云特征提取方法可以分为

  1. 基于体素分割的方法
  2. 基于原始点云的方法

基于体素的方法通常是将每一帧的点云划分为多个有序区域,在每个区域内部提取特征后经过pooling操作将无序点云转换为有序点云,之后就可以使用传统卷积的方法进一步进行特征编码。

基于原始点云的方法通常首先进行点云的下采样,之后对每个采样点提取局部特征。
本文对一些论文中点云时空特征提取方法做出一些总结。

1. 基于原始点云的方法

1.1 PSTNET

标题:PSTNET: POINT SPATIO-TEMPORAL CONVOLUTION ON POINT CLOUD SEQUENCES

作者:Hehe Fan, Xin Yu, Yuhang Ding, Yi Yang & Mohan Kankanhalli

代码:https://github.com/hehefan/Point-Spatio-Temporal-Convolution

仿照传统3D卷积的概念提出了适用于连续点云的时空4D卷积。在空间上为通过相对坐标产生卷积核。输入tensor C × L × N C \times L\times N C×L×N输出tensor C ′ × L ′ × N ′ C'\times L'\times N' C×L×N,其中 L L L 为序列长度, N N N 为每帧点点云中点的数量。

对于t时刻的点 ( x , y ) (x,y) (x,y),可以通过3D卷积来提取时空局部特征,过程可以用下式描述
F t ′ ( x , y ) = ∑ k = − ⌊ l / 2 ⌋ ⌊ l / 2 ⌋ ∑ i = − ⌊ h / 2 ⌋ ⌊ h / 2 ⌋ ∑ j = − ⌊ w / 2 ⌋ ⌊ w / 2 ⌋ W k ( i , j ) ⋅ F t + k ( x + i , y + j ) F^{'(x,y)}_t=\sum_{k=-\lfloor l/2\rfloor}^{\lfloor l/2\rfloor}\sum_{i=-\lfloor h/2\rfloor}^{\lfloor h/2\rfloor}\sum_{j=-\lfloor w/2\rfloor}^{\lfloor w/2\rfloor} W_k^{(i,j)}\cdot F_{t+k}^{(x+i,y+j)} Ft(x,y)=k=l/2l/2i=h/2h/2j=w/2w/2Wk(i,j)Ft+k(x+i,y+j)
传统3D卷积:输入tensor: C × L × H × W C\times L\times H\times W C×L×H×W,输出tensor: C ′ × L ′ × H ′ × W ′ C'\times L'\times H'\times W' C×L×H×W
PSTNET的方法:

在这里插入图片描述

图1

如上图,有5帧连续点云。首先根据时间滑动步长 s t = 2 s_t=2 st=2,选择出第1,2,3帧点云作为采样帧。其次在每个采样帧中采样 N ′ = 2 N'=2 N=2 个点(anchor points)。根据时间卷积核的大小 l l l,将每个采样点转换到前后相邻帧中。为每个采样点在本帧以及前后相邻帧中以 r r r 为半径搜索邻域点,构造出“point tube”。之后通过空间卷积提取每个采样点的空间局部特征 R L ′ × l × N ′ × C m \mathbb R^{L'\times l\times N'\times C_m} RL×l×N×Cm。之后时间卷积将每个滑动串口内的 l l l 帧的空间特征编码成时间特征 R L ′ × N ′ × C ′ \mathbb R^{L'\times N'\times C'} RL×N×C

参数:

  • l = 3 l=3 l=3:时间卷积核大小
  • s t = 2 s_t=2 st=2:时间卷积滑动步长
  • r r r:空间邻域半径

时空点云卷积:

由于点云在空间上是无序而不规则的,且空间和时间维度是正交的。因此可以将时间和空间解耦,先在空间上卷积,再在时间上卷积。

空间卷积
F t ′ ( x , y , z ) = ∑ k = − ⌊ l / 2 ⌋ ⌊ l / 2 ⌋ T k ⋅ ∑ ∣ ∣ ( δ x , δ y , δ z ) ∣ ∣ ≤ r S ( δ x , δ y , δ z ) ⋅ F t + k ( x + δ x , y + δ y , z + δ z ) F^{'(x,y,z)}_t=\sum_{k=-\lfloor l/2\rfloor}^{\lfloor l/2\rfloor}T_k\cdot \sum_{||(\delta_x,\delta_y,\delta_z)||\le r} S^{(\delta_x,\delta_y,\delta_z)}\cdot F^{(x+\delta_x,y+\delta_y,z+\delta_z)}_{t+k} Ft(x,y,z)=k=l/2l/2Tk∣∣(δx,δy,δz)∣∣rS(δx,δy,δz)Ft+k(x+δx,y+δy,z+δz)
空间上的不规则性导致我们无法直接定义空间卷积核,因此PSTNET通过相对坐标来产生卷积核。
∑ ∣ ∣ ( δ x , δ y , δ z ) ∣ ∣ ≤ r S ( δ x , δ y , δ z ) ⋅ F t ( x + δ x , y + δ y , z + δ z ) = ∑ ∣ ∣ ( δ x , δ y , δ z ) ∣ ∣ ≤ r f ( ( δ x , δ y , δ z ) ; θ ) ⋅ F t ( x + δ x , y + δ y , z + δ z ) \sum_{||(\delta_x,\delta_y,\delta_z)||\le r}S^{(\delta_x,\delta_y,\delta_z)}\cdot F^{(x+\delta_x,y+\delta_y,z+\delta_z)}_t =\sum_{||(\delta_x,\delta_y,\delta_z)||\le r}f((\delta_x,\delta_y,\delta_z);\theta)\cdot F^{(x+\delta_x,y+\delta_y,z+\delta_z)}_t ∣∣(δx,δy,δz)∣∣rS(δx,δy,δz)Ft(x+δx,y+δy,z+δz)=∣∣(δx,δy,δz)∣∣rf((δx,δy,δz);θ)Ft(x+δx,y+δy,z+δz)

f ( ( δ x , δ y , δ z ) ; θ ) = θ d ⋅ ( δ x , δ y , δ z ) T ⋅ 1 ⊙ θ s f((\delta_x,\delta_y,\delta_z);\theta)=\theta_d\cdot (\delta_x,\delta_y,\delta_z)^T\cdot 1 \odot \theta_s f((δx,δy,δz);θ)=θd(δx,δy,δz)T1θs

其中 θ d ∈ R C m × 3 \theta_d \in \mathbb R^{C_m\times 3} θdRCm×3 θ s ∈ R C m × C \theta_s \in \mathbb R^{C_m\times C} θsRCm×C 1 = ( 1 , . . . , 1 ) ∈ R 1 × C 1=(1,...,1) \in \mathbb R^{1\times C} 1=(1,...,1)R1×C

f f f 为每一个相对坐标都产生一个不同的空间卷积核。

时间卷积

T ∈ R C ′ × C m × l T \in \mathbb R^{C'\times C_m\times l} TRC×Cm×l

缺点:除非增大邻域搜索半径,否则无法通过堆叠更多的层获得空间上更大的感受野。

1.2 PointRNN

标题:PointRNN: Point Recurrent Neural Network for Moving Point Cloud Processing

作者:Hehe Fan, Yi Yang

代码:https://github.com/hehefan/PointRNN

传统的RNN通过将此时刻的输入和上一时刻的状态concat在一起来融合之前时间步的信息。但是无法直接用于点云。point-rnn的目标就是根据点的坐标融合过去和现在的点云特征。即给定点云坐标及特征 ( P t , X t ) (P_t,X_t) (Pt,Xt) ( P t − 1 , S t − 1 ) (P_{t-1},S_{t-1}) (Pt1,St1)。对于 P t P_t Pt 中的第i个点 P t i P_t^i Pti,首先找到该点在前一帧点云 P t − 1 P_{t-1} Pt1k个近邻。设 P t − 1 j P_{t-1}^j Pt1j 是其中一个邻居点。将第i个点的特征 X t i X_t^i Xti、邻居点上个时间的状态 S t − 1 j S^j_{t-1} St1j、邻居点到第i个点的位移向量 P t i − P t − 1 j P_t^i-P_{t-1}^j PtiPt1j concatenate在一起,通过FC层融合。之后通过在k这个维度pooling,得到一个单独的特征表示,为第t个时间步的状态 S t S_t St

n × d ( P t , X t ) → n × k × ( d + d ′ + 3 ) → F C n × k × d ′ → p o o l i n g n × d ′ n\times d(P_t,X_t) \rightarrow n\times k\times (d+d'+3) \mathop{\rightarrow}\limits_{FC} n\times k\times d' \mathop{\rightarrow}\limits_{pooling} n\times d' n×d(Pt,Xt)n×k×(d+d+3)FCn×k×dpoolingn×d

因此,PointRNN中,在第 t t t 个时间步的状态更新由下式描述:
S t = p o i n t − r n n ( ( P t , X t ) , ( P t − 1 , S t − 1 ) ; W , b ) = { p o o l i n g j ∣ P t − 1 j ∈ N ( P t i ) { W ⋅ [ X t i , S t − 1 i , P t i − P t − 1 j ] + b } } i ∈ { 1 , . . . , n } S_t=point-rnn((P_t,X_t),(P_{t-1},S_{t-1});W,b)=\left\{ \mathop{pooling}\limits_{j|P_{t-1}^j\in \mathcal{N}(P_t^i) } \left\{W\cdot \left [X_t^i,S_{t-1^i},P_t^i-P_{t-1}^j\right ]+b \right\} \right\}_{i\in \{1,...,n\}} St=pointrnn((Pt,Xt),(Pt1,St1);W,b)={jPt1jN(Pti)pooling{W[Xti,St1i,PtiPt1j]+b}}i{1,...,n}

1.3 MoNet

标题:MoNet: Motion-based Point Cloud Prediction Network

作者:Fan Lu, Guang Chen, Yinlong Liu Zhijun Li, Sanqing Qu, Tianpei Zou

代码:https://github.com/ispc-lab/MoNet

MoNet用于点云预测,主要分为两部分:Embedding和Inference。其中Embedding用于提取特征,分为 Content encoder和 Motion encoder。分别提取点云帧内容特征和点云帧间运动特征。

在这里插入图片描述

图2

在这里插入图片描述

图3

Content encoder

给定时刻t、第 l − 1 l-1 l1 层的点云坐标 X t l − 1 X_t^{l-1} Xtl1 和特征 E t l − 1 E_t^{l-1} Etl1,首先使用 Furthest Point Sampling(FPS)从 X t l − 1 X_t^{l-1} Xtl1 采样出 N l N_l Nl 个点 X t l X_t^l Xtl。对于 X t l X_t^l Xtl 中的每一点 x i x_i xi,在 X t l − 1 X_t^{l-1} Xtl1 中使用KNN方法找出它的k个邻居点 { x i 1 , x i 2 , . . . , x i k } \{x_i^1,x_i^2,...,x_i^k \} {xi1,xi2,...,xik},相对坐标 { x i 1 − x i , x i 2 − x i , . . . , x i k − x i } \{x_i^1-x_i,x_i^2-x_i,...,x_i^k-x_i \} {xi1xi,xi2xi,...,xikxi}以及相对距离 { ∣ ∣ x i 1 − x i ∣ ∣ , . . . , ∣ ∣ x i k − x i ∣ ∣ } \{ ||x_i^1-x_i||,...,||x_i^k-x_i||\} {∣∣xi1xi∣∣,...,∣∣xikxi∣∣}。将以上三种特征和这k个点的内容特征 { e i 1 , . . . , e i k } \{e_i^1,...,e_i^k\} {ei1,...,eik} concat在一起产生一个点的空间局部融合特征。之后将所有点的空间局部融合特征输入到MLP中,pooling得到第 l l l 层的内容特征 E t l E_t^l Etl

Motion encoder

用于提取连续两帧点云的运动信息。输入为 ( X t l , E t l ) (X_t^l,E_t^l) (Xtl,Etl) ( X t + 1 l , E t + 1 l ) (X_{t+1}^l,E_{t+1}^l) (Xt+1l,Et+1l)。对于 X t l X_t^l Xtl 中的每一点 x i x_i xi,在 X t + 1 l X_{t+1}^l Xt+1l 中使用KNN方法找出它的k个邻居点 { x i 1 , x i 2 , . . . , x i k } \{x_i^1,x_i^2,...,x_i^k \} {xi1,xi2,...,xik}。使用与Content encoder相似的策略来提取两帧之间的运动特征。之后输入到MLP中,pooling得到第 l l l 层的运动特征 M t l M_t^l Mtl

1.4 MeteorNet

标题:MeteorNet: Deep Learning on Dynamic 3D Point Cloud Sequences

作者:Xingyu Liu, Mengyuan Yan, Jeannette Bohg

代码:https://github.com/xingyul/meteornet

文章中关键模块是Meteor Module,输入是序列点云 S = ( S 1 , S 2 , . . . , S T ) S=(S_1,S_2,...,S_T) S=(S1,S2,...,ST),输出是S中每个点 p i ( t ) p_i^{(t)} pi(t)的特征向量 h ( p i ( t ) ) h(p_i^{(t)}) h(pi(t))。第一步是找到点 p i ( t ) p_i^{(t)} pi(t) 在第t帧和附近帧的邻居点来构成一个时空局部区域 N ( p i ( t ) ) \mathcal N(p_i^{(t)}) N(pi(t))。假设 p j ( t ′ ) p_j^{(t')} pj(t)是其中一个邻居,点 p i ( t ) p_i^{(t)} pi(t) 的时空局部特征论文中有两个版本:

  • 当帧之间对应关系比较重要时,将两个点的特征两个点时空位置的差异concat之后输入进MLP ζ \zeta ζ

h ( p i ( t ) ) = M A X p j ( t ′ ) ∈ N ( p i ( t ) ) { ζ ( f j ( t ′ ) , f i ( t ) , X j ( t ′ ) − X i ( t ) , t ′ − t ) } h(p_i^{(t)})=\mathop{MAX}\limits_{p_j^{(t')}\in \mathcal N(p_i^{(t)})}\{\zeta (f_j^{(t')},f_i^{(t)},X_j^{(t')}-X_i^{(t)},t'-t) \} h(pi(t))=pj(t)N(pi(t))MAX{ζ(fj(t),fi(t),Xj(t)Xi(t),tt)}

  • 当帧之间对应关系不重要时(如语义分割),将 p j ( t ′ ) p_j^{(t')} pj(t) 的特征两个点时空位置的差异concat之后输入进MLP ζ \zeta ζ
    h ( p i ( t ) ) = M A X p j ( t ′ ) ∈ N ( p i ( t ) ) { ζ ( f j ( t ′ ) , X j ( t ′ ) − X i ( t ) , t ′ − t ) } h(p_i^{(t)})=\mathop{MAX}\limits_{p_j^{(t')}\in \mathcal N(p_i^{(t)})}\{\zeta (f_j^{(t')},X_j^{(t')}-X_i^{(t)},t'-t) \} h(pi(t))=pj(t)N(pi(t))MAX{ζ(fj(t),Xj(t)Xi(t),tt)}

对于局部区域 N \mathcal N N 也有两种构建方式:

在这里插入图片描述

图4
  • Direct grouping

    直接使用半径 r r r 来构建邻域,半径 r r r 随帧的差异 ∣ t − t ′ ∣ |t-t'| tt 增大而增大。

  • Chained-flow grouping

    通过scene flow的方法估计出第t帧的点 p i ( t ) p_i^{(t)} pi(t) 在第t-1, t-2, … 帧的位置 X i ′ ( t − 1 ) , X i ′ ( t − 2 ) , . . . X_i^{'(t-1)}, X_i^{'(t-2)},... Xi(t1),Xi(t2),...,分别以每帧的估计位置为中心以半径 r r r 构建邻域。

1.5 Point Spatial-Temporal Transformer( P S T 2 PST^2 PST2)

标题:Spatial-Temporal Transformer for 3D Point Cloud Sequences

作者:Yimin Wei, Hao Liu, Tingting Xie, Qiuhong Ke, Yulan Guo

代码:无

P S T 2 PST^2 PST2 主要包含了两个模块:

  • Spatio-Temporal Self-Attention(STAT)
  • Resolution Embedding(RE)

在这里插入图片描述

图5

P S T 2 PST^2 PST2 采用了encoder-decoder的结构。encoder包含了一个backbone、一个RE模块和一个STSA模块。decoder包含了多个Feature Propagation(PointNet++)层。

输入为点云序列 [ S 1 , S 2 , . . . , S T ] [S_1,S_2,...,S_T] [S1,S2,...,ST],首先使用FPS在 S 1 S_1 S1 中采样m个种子点。在 [ S 1 , S 2 , . . . , S T ] [S_1,S_2,...,S_T] [S1,S2,...,ST]上用一定半径 r r r 搜索这m个种子点的邻居点。之后使用两个 Set Abstraction(PointNet++)层来提取局部特征 h i ( t ) ∈ R s × d h_i^{(t)}\in \mathbb R^{s\times d} hi(t)Rs×d

Resolution Embedding(RE)

RE模块用于提高每帧中点的分辨率,主要包含一个feature block和一个resolution block。feature block用于进一步提取语义特征,resolution block用于进一步提取空间邻域信息。

在这里插入图片描述

图5
  • Feature block

    h i ( t ) h_i^{(t)} hi(t) 再用一个Set Abstraction 层得到 n i ( t ) ∈ R s / 2 × d n_i^{(t)}\in \mathbb R^{{s/ 2}\times d} ni(t)Rs/2×d

  • Resolution block

    h i ( t ) h_i^{(t)} hi(t) 在空间维度上分为 m 1 ( t ) m_1^{(t)} m1(t) m 2 ( t ) m_2^{(t)} m2(t),再将它们再特征维度上concat得到 g i ( t ) ∈ R s / 2 × 2 d g_i^{(t)}\in \mathbb R^{{s/ 2} \times 2d} gi(t)Rs/2×2d。之后通过MLP进一步提取特征 k i ( t ) ∈ R s / 2 × d k_i^{(t)}\in \mathbb R^{{s/ 2} \times d} ki(t)Rs/2×d

Feature block 和 Resolution block 的结果通过MLP和softmax产生注意力权重 a 1 , a 2 a_1, a_2 a1,a2,最终特征为二者加权和 I i ( t ) ∈ R s / 2 × d I_i^{(t)}\in \mathbb R^{{s/ 2} \times d} Ii(t)Rs/2×d
I i ( t ) = a 1 ⋅ k i ( t ) + a 2 ⋅ n i ( t ) I_i^{(t)}=a_1\cdot k_i^{(t)}+a_2\cdot n_i^{(t)} Ii(t)=a1ki(t)+a2ni(t)

Spatio-Temporal Self-Attention(STSA)

STSA模块用于融合帧间特征并且捕获时空邻域信息。将第i帧的空间特征 I i ( t ) I_i^{(t)} Ii(t) 分成若干个patch后输入进 Self-Attention(这一部分讲得不是很清楚)。

未完待续。。。

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值