基于体素的方法通常是将每一帧的点云划分为多个有序区域,在每个区域内部提取特征后经过pooling操作将无序点云转换为有序点云,之后就可以使用传统卷积的方法进一步进行特征编码。
基于原始点云的方法通常首先进行点云的下采样,之后对每个采样点提取局部特征。
本文对一些论文中点云时空特征提取方法做出一些总结。
标题: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/2⌋∑⌊l/2⌋i=−⌊h/2⌋∑⌊h/2⌋j=−⌊w/2⌋∑⌊w/2⌋Wk(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的方法:
如上图,有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′。
参数:
由于点云在空间上是无序而不规则的,且空间和时间维度是正交的。因此可以将时间和空间解耦,先在空间上卷积,再在时间上卷积。
空间卷积
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/2⌋∑⌊l/2⌋Tk⋅∣∣(δx,δy,δz)∣∣≤r∑S(δ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)∣∣≤r∑S(δx,δy,δz)⋅Ft(x+δx,y+δy,z+δz)=∣∣(δx,δy,δz)∣∣≤r∑f((δ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)T⋅1⊙θs
其中 θ d ∈ R C m × 3 \theta_d \in \mathbb R^{C_m\times 3} θd∈RCm×3, θ s ∈ R C m × C \theta_s \in \mathbb R^{C_m\times C} θs∈RCm×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} T∈RC′×Cm×l
缺点:除非增大邻域搜索半径,否则无法通过堆叠更多的层获得空间上更大的感受野。
标题: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}) (Pt−1,St−1)。对于 P t P_t Pt 中的第i个点 P t i P_t^i Pti,首先找到该点在前一帧点云 P t − 1 P_{t-1} Pt−1 的k个近邻。设 P t − 1 j P_{t-1}^j Pt−1j 是其中一个邻居点。将第i个点的特征 X t i X_t^i Xti、邻居点上个时间的状态 S t − 1 j S^j_{t-1} St−1j、邻居点到第i个点的位移向量 P t i − P t − 1 j P_t^i-P_{t-1}^j Pti−Pt−1j 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)FC→n×k×d′pooling→n×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=point−rnn((Pt,Xt),(Pt−1,St−1);W,b)={j∣Pt−1j∈N(Pti)pooling{W⋅[Xti,St−1i,Pti−Pt−1j]+b}}i∈{1,...,n}
标题: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。分别提取点云帧内容特征和点云帧间运动特征。
给定时刻t、第 l − 1 l-1 l−1 层的点云坐标 X t l − 1 X_t^{l-1} Xtl−1 和特征 E t l − 1 E_t^{l-1} Etl−1,首先使用 Furthest Point Sampling(FPS)从 X t l − 1 X_t^{l-1} Xtl−1 采样出 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} Xtl−1 中使用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 \} {xi1−xi,xi2−xi,...,xik−xi}以及相对距离 { ∣ ∣ x i 1 − x i ∣ ∣ , . . . , ∣ ∣ x i k − x i ∣ ∣ } \{ ||x_i^1-x_i||,...,||x_i^k-x_i||\} {∣∣xi1−xi∣∣,...,∣∣xik−xi∣∣}。将以上三种特征和这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。
用于提取连续两帧点云的运动信息。输入为 ( 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。
标题: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) 的时空局部特征论文中有两个版本:
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),t′−t)}
对于局部区域 N \mathcal N N 也有两种构建方式:
Direct grouping
直接使用半径 r r r 来构建邻域,半径 r r r 随帧的差异 ∣ t − t ′ ∣ |t-t'| ∣t−t′∣ 增大而增大。
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′(t−1),Xi′(t−2),...,分别以每帧的估计位置为中心以半径 r r r 构建邻域。
标题: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 主要包含了两个模块:
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。
RE模块用于提高每帧中点的分辨率,主要包含一个feature block和一个resolution block。feature block用于进一步提取语义特征,resolution block用于进一步提取空间邻域信息。
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)=a1⋅ki(t)+a2⋅ni(t)
STSA模块用于融合帧间特征并且捕获时空邻域信息。将第i帧的空间特征 I i ( t ) I_i^{(t)} Ii(t) 分成若干个patch后输入进 Self-Attention(这一部分讲得不是很清楚)。
未完待续。。。