FlowNet3D - Learning Scene Flow in 3D Point Clouds[CVPR2019]

FlowNet3D - Learning Scene Flow in 3D Point Clouds[CVPR2019]_第1张图片
[论文链接] | [代码链接]
FlowNet3D - Learning Scene Flow in 3D Point Clouds[CVPR2019]_第2张图片
\qquad 本文作者提出了一个端到端估计场景流的网络结构——FLowNet3D。在FLowNet3D中引入了两个新的点云学习层:(1)学习联系两帧点云的flow embedding层;(2)学习将特征从一个点集传播到另一个点集的set upconv层。
FlowNet3D - Learning Scene Flow in 3D Point Clouds[CVPR2019]_第3张图片
\qquad FlowNet3D主要包含以上三个模块:(1)set conv层学习点云中点的特征,并对点云进行下采样;(2)flow embedding层学习两帧点云的几何联系以预测流;(3)set upconv层对点云进行上采样并使用学习的方式传播点特征。
FlowNet3D - Learning Scene Flow in 3D Point Clouds[CVPR2019]_第4张图片
\qquad FlowNet3D的结构如上图所示。首先是对点云的特征进行分层学习,这部分网络与PointNet++的结构类似。输入为 n n n个点的点云: p i = { x i , f i } p_i=\{x_i,f_i\} pi={ xi,fi} x i ∈ R 3 x_i \in \mathbb{R}^3 xiR3为点坐标, f i ∈ R c   ( i = 1 , . . . , n ) f_i \in \mathbb{R}^c\ (i=1,...,n) fiRc (i=1,...,n)为点特征。输出为 n ′ n' n个点的点云: p j ′ = { x j ′ , f j ′ } p'_j=\{x'_j,f'_j\} pj={ xj,fj}。首先用FPS算法从输入点云采样 n ′ n' n个区域(以某个点为中心,以某个半径划定的范围),然后对每个区域使用如下的方法学习局部特征:
f j ′ = M A X { i ∣   ∣ ∣ x i − x j ′ ∣ ∣ ⩽ r } { h ( f i , x i − x j ′ ) } . f'_j=\underset{\{i|\ ||x_i-x'_j||\leqslant r\}}{MAX}\{h(f_i,x_i-x'_j)\}. fj={ i xixjr}MAX{ h(fi,xixj)}.
h : R c + 3 → R c ′ h:\mathbb{R}^{c+3}\rightarrow\mathbb{R}^{c'} h:Rc+3Rc是一个非线性函数,用一个多层感知机实现,MAX是逐元素的最大池化。

\qquad 然后使用flow embedding层混合两个点云并计算场景流。由于点云的无序性,所以论文采用的方法是先在t+1帧中找到多个soft对应点再对其加权平均。这样可以聚合几何特征相似性和点的空间联系来编码点的运动。flow embedding层的输入为一对点云: { p i = ( x i , f i ) } i = 1 n 1 \{p_i=(x_i,f_i)\}_{i=1}^{n_1} { pi=(xi,fi)}i=1n1 { q j = ( y j , g j ) } j = 1 n 2 \{q_j=(y_j,g_j)\}_{j=1}^{n_2} { qj=(yj,gj)}j=1n2。该层对第一帧的每个点学习一个flow embedding: { e i } i = 1 n 1 ,   e i ∈ R c ′ \{e_i\}_{i=1}^{n_1},\ e_i \in \mathbb{R}^{c'} { ei}i=1n1, eiRc。每个点的原始坐标也被传递到输出,flow embedding层的最终输出为: { o i = ( x i , e i ) } i = 1 n 1 \{o_i=(x_i,e_i)\}_{i=1}^{n_1} { oi=(xi,ei)}i=1n1

\qquad 计算 e i e_i ei的操作与set conv层类似,对于第一帧的点 p i p_i pi,首先找到第二帧中所有在 p i p_i pi某个半径范围内的点 q i q_i qi。该点流的embedding的计算过程如下:
e i = M A X { j ∣   ∣ ∣ y j − x i ∣ ∣ ⩽ r } { h ( f i , g j , y j − x i ) } e_i=\underset{\{j|\ ||y_j-x_i||\leqslant r\}}{MAX}\{h(f_i,g_j,y_j-x_i)\} ei={ j yjxir}MAX{ h(fi,gj,yjxi)}
这里利用MLP h h h来学习权重,加权所有潜在流向量 d i j = y j − x i d_{ij}=y_j-x_i dij=yjxi。另外一个可行的方案是通过计算特征距离( d i s t ( f i , g j ) dist(f_i,g_j) dist(fi,gj))来关联点的特征,再通过MLP学习,但在消融实验中证明第一个方法具有更好的效果。计算的flow embedding还会利用一些set conv层下采样,这样可以使得结果在空间上有更好的平滑性。

\qquad 最后,在set upconv层利用中间点将flow embedding上采样插值回原始点云。这一步过程与set conv类似,假设源点云为 { p i = { x i , f i } ∣ i = 1 , . . , n } \{p_i=\{x_i,f_i\}|i=1,..,n\} { pi={ xi,fi}i=1,..,n},目标点云为 { x j ′ ∣ j = 1 , . . , n ′ } \{x'_j|j=1,..,n'\} { xjj=1,..,n}。对于目标点云的每个点 x j ′ x'_j xj,其特征由它在源点云 p i p_i pi中邻近点的特征聚合得到。这里用MLP学习如何对源点云中邻近点的特征进行加权,得到目标点云中点的特征。

\qquad 最终FLowNet3D的结构包含4个set conv层,一个flow embedding层,四个set upconv层和一个线性流回归层。对于set upconv层,使用skip connection来连接set conv层的特征。每个可学习层使用MLP和Linear-BatchNorm-ReLU层实现函数 h h h,网络的详细结构如下表:
FlowNet3D - Learning Scene Flow in 3D Point Clouds[CVPR2019]_第5张图片

你可能感兴趣的:(Deep,Learning,for,point,cluod,deep,learning,point,cloud,scene,flow)