Just Go with the Flow: Self-Supervised Scene Flow Estimation[CVPR2020 Oral]

Just Go with the Flow: Self-Supervised Scene Flow Estimation[CVPR2020 Oral]_第1张图片
[论文链接]

\qquad 现有的估计场景流的方法都需要有标注的场景流数据去使用监督的方法训练网络。本文作者提出了使用两个自监督损失函数训练(场景流估计)网络的方法,这两个损失函数分别基于最近邻和cycle consistency(不知道该怎么翻译。。。)。自监督的训练方法使得大量没有标注信息的自动驾驶数据集可以用于训练网络。使用本篇文章自监督方法训练的网络,表现与目前最好的使用监督方法学习的网络效果相当。如果使用自监督训练并在小规模标注数据上监督学习,可以得到超越当前最好方法的表现。

\qquad 假定估计的流为 D ^ = { d i ^ } N \hat{\mathcal{D}}=\{\hat{d_i}\}^N D^={ di^}N,真实流为 D ∗ = { d i ∗ } N \mathcal{D}^*=\{d_i^*\}^N D={ di}N。则监督损失函数定义为:
L g t = 1 N ∑ i N ∣ ∣ d i ∗ − d ^ i ∣ ∣ 2 \mathcal{L}_{gt}= \frac{1}{N} \sum_{i}^{N}{||d_i^*-\hat{d}_i||^2} Lgt=N1iNdid^i2
上述的损失函数是有用的,因为它数学等价于终点误差,论文中使用它作为评估度量。合成数据上流的标注很好计算,然而对于真实数据就需要大量的人工标注。而且有标注的场景流数据集很少。已有的工作表明在合成数据上训练,在目标应用域的真数据上fine-tuning可以得到很大的提升。
Just Go with the Flow: Self-Supervised Scene Flow Estimation[CVPR2020 Oral]_第2张图片
\qquad 接下来介绍一下文章提出的两个无监督的loss,假设 X \mathcal{X} X为在时刻t捕捉到的点云, Y \mathcal{Y} Y为在时刻t+1捕捉到的点云, D = { d i } N , d i ∈ R 3 \mathcal{D}=\{d_i\}^N,d_i\in \mathbb{R}^3 D={ di}N,diR3为两帧点云之间的场景流。
\qquad Nearest Neighbor (NN) Loss 在未标注的数据集中,并没有关于 d i ∗ d_i^* di的信息,因此也不能使用上面提到的损失函数。受到ICP算法的启发,这里用变形后点的最近邻 x ^ i ′ = x i + d ^ i \hat{x}'_i=x_i+\hat{d}_i x^i=xi+d^i作为正确对应点的近似。对于每个变形后的点 x ^ i ′ ∈ X ′ ^ \hat{x}'_i\in \hat{\mathcal{X}'} x^iX^,在t+1帧中找到它的最近邻 y i ∈ Y y_i\in \mathcal{Y} yiY并计算他们之间的距离,如下图 ( a ) (a) (a) e N N e_{NN} eNN所示:
L N N = 1 N ∑ i N m i n y i ∈ Y ∣ ∣ x ^ i ′ − y i ∣ ∣ 2 \mathcal{L}_{NN}=\frac{1}{N}\sum_{i}^{N}\underset{y_i\in \mathcal{Y}}{min}||\hat{x}'_i-y_i||^2 LNN=N1iNyiYminx^iyi2
Just Go with the Flow: Self-Supervised Scene Flow Estimation[CVPR2020 Oral]_第3张图片
这个loss可以使得变形的点云与目标点云更加接近。但也有一定的缺点,首先如上图 ( a ) (a) (a)所示,找到的最近邻并不一定是变形点应该正确对应的点。再者,在点云稀疏的情况下,并不一定能找到对应点。以上情况可能导致0 loss的出现。所以提出了如下的 Cycle Consistency Loss。
\qquad Cycle Consistency Loss 为解决上述问题,引入了另一个自监督损失,如上图 ( b ) (b) (b)所示。先估计一个前向的流 D ^ = g ( X , Y ) \hat{\mathcal{D}}=g(\mathcal{X},\mathcal{Y}) D^=g(X,Y),每个点 x i x_i xi的流 d ^ i ∈ D ^ \hat{d}_i\in \hat{\mathcal{D}} d^iD^ 给定了一个在下一帧中估计的点 x ^ i ′ = x i + d ^ i \hat{x}'_i=x_i+\hat{d}_i x^i=xi+d^i。然后从相反的方向估计流:对每个变形的点 x ^ i ′ \hat{x}'_i x^i估计一个流( D ′ ^ = g ( X ′ ^ , X ) \hat{\mathcal{D'}}=g(\hat{\mathcal{X'}},\mathcal{X}) D^=g(X^,X))将其变换回初始的帧中。用反向的流 d i ′ ^ \hat{d'_i} di^变换每个点 x ^ i ′ \hat{x}'_i x^i会得到一个新的点 x ^ i ′ ′ \hat{x}''_i x^i。如果前向和反向的流均正确,那么这个新的点 x ^ i ′ ′ \hat{x}''_i x^i应该和原始点 x i x_i xi相同。这些点之间的误差 e c y c l e e_{cycle} ecycle就是cycle consistency loss:
L c y c l e = ∑ i N ∣ ∣ x ^ i ′ ′ − x i ∣ ∣ 2 \mathcal{L}_{cycle}=\sum_{i}^{N}||\hat{x}''_i-x_i||^2 Lcycle=iNx^ixi2
然而实际上这样实现cycle loss进行自监督训练时并不能得到稳定的结果。原因是估计的流导致变形点云的结构发生畸变,而畸变的点云又作为反向流估计的输入。为了解决畸变问题,文中使用变换点 x ^ i ′ \hat{x}'_i x^i在t+1帧中的最近邻 y i y_i yi作为反向传播的锚点。最近邻 y i y_i yi的使用,可以在循环中稳定变形点云结构的同时保持点的对应关系。效果如下图所示。由于锚点作为循环反向传播的一部分,所以这个loss称作“anchored cycle consistency loss”。
Just Go with the Flow: Self-Supervised Scene Flow Estimation[CVPR2020 Oral]_第4张图片
\qquad 计算反向流的具体过程如下:
( 1 ) \qquad(1) (1) 首先计算前向流 D ^ = g ( X , Y ) \hat{\mathcal{D}}=g(\mathcal{X},\mathcal{Y}) D^=g(X,Y);
( 2 ) \qquad(2) (2) 根据前向流计算变形的点云: x ^ i ′ = x i + d ^ i \hat{x}'_i=x_i+\hat{d}_i x^i=xi+d^i;
( 3 ) \qquad(3) (3) 锚点作为变形点和最近邻的组合来计算: X ′ ˉ = { x ˉ i ′ } N \bar{\mathcal{X'}}=\{\bar{x}'_i\}^N Xˉ={ xˉi}N x ˉ i ′ = λ x ^ i ′ + ( 1 − λ ) y i \bar{x}'_i=\lambda \hat{x}'_i+(1-\lambda)y_i xˉi=λx^i+(1λ)yi,其中 λ \lambda λ在论文中的取值为0.5;
( 4 ) \qquad(4) (4) 用得到的锚点计算反向流,使用上面的方式计算cycle loss;
\qquad cycle consistency loss也会出现 0 loss的情况,但使用anchored cycle consistency loss后可以避免这种情况的出现。最后使用两个loss的和作为真实误差的稳定替代: L = L N N + L c y c l e \mathcal{L}=\mathcal{L}_{NN}+\mathcal{L}_{cycle} L=LNN+Lcycle
\qquad 此外作者还使用了翻转训练集点云序列的方法增强数据集。

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