1 概述

FlowNet3D 这篇文章研究场景流(scene flow)估计的问题。场景流的用处很多,诸如物体分割,动作识别,相机位姿估计(object segmentation, action recognition, camera pose estimation)等问题。但场景流估计虽然为3D问题,但之前的很多方法都是在2D层面上研究的,而且也很少有直接在3D的point cloud上面直接对点操作的(有少量工作,但并不是利用深度学习方法做的)。

FlowNet3D 是基于PointNet和PointNet++基础上做的,文章说可以实现同时学习点云的分级特征和点云的运动。

文章贡献点:①对于两帧连续的点云,可以实现端到端的场景流估计;②提出了两个新的结构层:flow embedding 层和 set upconv 层,分别用于学习两个点云之间的联系和点云内传播 feature(上采样);③在KITTI数据集上测试,效果强于传统方法。

2 网络结构

FlowNet3D论文学习笔记
网络由三个子模块构成,point feature learningpoint mixtureflow refinement,这三个子模块又有三个基础层flow embedding 层、set convset upconv 层构成。三个层结构如下所示:
FlowNet3D论文学习笔记

2.1 set conv层

set conv 层在PointNet++中叫做 set abstraction ,分为 samplinggroupingpointnet等步骤:
FlowNet3D论文学习笔记
其目的是提取点云的 feature,假设点云中有n个点,每个点的特征用 pi={xi,fi}p_{i}=\left\{x_{i}, f_{i}\right\}表示,第一项为点XYZ的坐标,第二项为点云的自带feature。其中xiR3x_{i} \in \mathbb{R}^{3} f^iRc(i=1,,n)\hat{f}_{i} \in \mathbb{R}^{c}(i=1, \ldots, n)set conv 层开始时利用最远点采样进行降采样中心点,然后进行grouping操作,再利用pointnet进行feature提取,提取函数见下方。最终可以得到形式为:pj={xj,fj}p_{j}^{\prime}=\left\{x_{j}^{\prime}, f_{j}^{\prime}\right\}nn^’个点。(详情请见PointNet++论文,挺复杂)

fj=MAX{ixixjr}{h(fi,xixj)} f_{j}^{\prime}=\operatorname{MAX}_{\left\{i |\left\|x_{i}-x_{j}^{\prime}\right\| \leq r\right\}}\left\{h\left(f_{i}, x_{i}-x_{j}^{\prime}\right)\right\}
函数 h:Rc+3Rch : \mathbb{R}^{c+3} \rightarrow \mathbb{R}^{c^{\prime}} 是多层感知机。

2.2 flow embedding层

flow embedding 层用于寻找两帧点云每个点相对应的 correspondence,假设两帧点云中的点分别为:{pi=(xi,fi)}i=1n1 和 {qj=(yj,gj)}j=1n2\left\{p_{i}=\left(x_{i}, f_{i}\right)\right\}_{i=1}^{n_{1}} \text { 和 }\left\{q_{j}=\left(y_{j}, g_{j}\right)\right\}_{j=1}^{n_{2}},目标是找到相对于第一帧点云中每个点所对应的 {ei}i=1n1\left\{e_{i}\right\}_{i=1}^{n_{1}},其中eiRce_{i} \in \mathbb{R}^{c^{\prime}}。最后此层输出为{oi=(xi,ei)}i=1n1\left\{o_{i}=\left(x_{i}, e_{i}\right)\right\}_{i=1}^{n_{1}}(将第一帧点云中的坐标 concatenate 进来),eie_i由下方函数计算(形式上有点类似前面提 feature 的公式):ei=MAX{jyjxir}{h(fi,gj,yjxi)} e_{i}=\operatorname{MAX}_{\left\{j |\left\|y_{j}-x_{i}\right\| \leq r\right\}}\left\{h\left(f_{i}, g_{j}, y_{j}-x_{i}\right)\right\}
首先设置一个半径,拿第一帧中的点在第二帧中半径内的点(图中蓝色的点)。如果,我们能知道第一帧点云中该点对应于下一帧点云中的哪点,那么 场景流 很容易由 yxiy^{*}-x_{i}算出,但事实上我们并不知道,所以我们设计一个上述函数利用对半径内每个点进行投票来确定最大可能是哪个点。文章中说,其实这个函数中输入变量也可以替换成算 feature 距离的函数而不是简单的直接把两帧点云的 feature 输入进去,但这种方法没有直接输入效果好(消融实验中验证了)。

2.3 set upconv 层

此层为上采样层,我的理解是有点类似CNN中的decoder,把学习到的东西进行放大。本层将 flow embedding 层中的点上采样回原来输入网络的个数,每个输出代表该点的场景流。(具体实现应该要看代码。。。)

3 策略

3.1 Loss 函数

感觉loss函数比较有意思,其中有个元素叫 cycle-consistency regularization,没查到相关资料,但是看公式可以感觉出个大概:
L(P,Q,D,Θ)=1n1i=1n1{didi+λdi+di} L\left(\mathcal{P}, \mathcal{Q}, \mathcal{D}^{*}, \Theta\right)=\frac{1}{n_{1}} \sum_{i=1}^{n_{1}}\left\{\left\|d_{i}-d_{i}^{*}\right\|+\lambda\left\|d_{i}^{\prime}+d_{i}\right\|\right\}
第一项就是一个普通的 L1 的loss,第二项是 cycle-consistency 正则化。
给定一帧点云:P={xi}i=1n1\mathcal{P}=\left\{x_{i}\right\}_{i=1}^{n_{1}},和下一帧点云:Q={yj}j=1n2\mathcal{Q}=\left\{y_{j}\right\}_{j=1}^{n_{2}},网络预测的场景流为:D=F(P,Q;Θ)={di}i=1n1 \mathcal{D}=F(\mathcal{P}, \mathcal{Q} ; \Theta)=\left\{d_{i}\right\}_{i=1}^{n_{1}}
根据预测的场景流那么下一帧点云应该为:P={xi+di}i=1n1\mathcal{P}^{\prime}=\left\{x_{i}+d_{i}\right\}_{i=1}^{n_{1}}。那么如果反过来(逆场景流)预测的话,表达式应该为:{di}i=1n1=F(P,P;Θ) \left\{d_{i}^{\prime}\right\}_{i=1}^{n_{1}}=F\left(\mathcal{P}^{\prime}, \mathcal{P} ; \Theta\right)
理论上,如果预测的足够好,{di}i=1n1\left\{d_{i}^{\prime}\right\}_{i=1}^{n_{1}}应该和{di}i=1n1\left\{d_{i}\right\}_{i=1}^{n_{1}}是一一互为相反的向量,所以di+di\left\|d_{i}^{\prime}+d_{i}\right\|应为0;但实际上由于预测的不够精确,会导致有一些差异,这一项应该能保证 forward flowbackward flow 尽量准一些,使预测有可逆性。

3.2 重复采样

由于set conv层是降采样会给预测带来噪声,重复采样则可以降低噪声所带来的影响,但重复采样并不能带来质的提升,只能提升一两个点。

4 实验

训练数据使用了叫做 FlyingThings3D 的数据集进行训练,拿KITTI的进行了fine-tuning,在KITTI上进行了测试。

感觉实验部分应该看论文,论文做了好多消融实验和对比实验,看完给人一种很温馨的感觉,作者想的很细致,做的很仔细。

5 说明

对于场景流估计以及场景流的task调研还在进行中,欢迎各位小伙伴一起交流探讨,或者推荐大佬来一起交流~~本人想利用场景流做3D的tracking,或者直接进行激光slam的相关工作(如果可行的话),希望志同道合的小伙伴们一起玩耍~

相关文章:

  • 2021-07-07
  • 2021-10-16
  • 2021-09-17
  • 2021-05-07
  • 2021-04-21
  • 2021-05-05
  • 2021-07-02
  • 2021-05-07
猜你喜欢
  • 2021-08-15
  • 2021-12-05
  • 2021-06-22
  • 2021-05-12
  • 2021-10-22
  • 2021-04-09
  • 2021-08-05
相关资源
相似解决方案