分类 默认分类 下的文章

CVPR 2018

Abstract

在之前的工作中,为了将LiDAR的稀疏点云与RPN相结合,通常采用的方法是对点云进行手工的特征提取。然而手工提取的特征往往较弱,不能取得很好的性能。本文提出了一种end-to-end的3D检测网络VoxelNet,去除了手工提取特征的过程。VoxelNet包含三个步骤:首先将点云按照空间位置划分成voxels;然后对每个voxel中的点进行特征提取,得到点云的volumetric representation;最后使用RPN的到检测结果。

Introduction

由于LiDAR采样时不同空间位置的采样密度不同,因此点云数据具有很强的稀疏性,即空间中大部分区域是没有点的。针对这一问题,之前的工作主要包括以下几种思路:1. 将点云投影到平面上,然后使用image-based方法;2. 将点云转化为voxels,然后对每个voxels进行手工提取特征,之后使用3D CNN或其它方法。但是,这些方法都没有充分利用点云中包含的信息,效果都不理想。

PointNet/PointNet++直接将点云作为输入,对整个点云进行处理,是一种深度点云特征学习的方法。但是,这两个模型在验证时只是用了ModelNet等小规模数据集,点云相对较小。LiDAR数据通常包含近10万个点,而这两个模型的计算量和内存开销都非常大,难以匹配。如何利用深度模型对大规模点云数据进行处理,这本文解决的主要挑战

VoxelNet

VoxelNet将深度点云特征学习与RPN进行了结合,实现了一种end-to-end的3D检测框架。VoxelNet分为三个部分:Feature Learning Network、Convolutional Middle Layers和RPN。

image.png

2.1 VoxelNet Architecture

2.1.1 Feature Learning Network

Voxel Partition + Grouping + Random Sampling

给定一个点云,VoxelNet首先对点云的空间划分成均匀分割的voxel,每个voxel中包含的点被用来对该voxel进行特征学习。但是,由于点云的空间分布非常不均匀,超过90%的voxel中没有点,而另一些voxel中的点非常多,而且个数各不相同。因此,作者对于每个点数超过T的voxel中随机采样了T个点用于特征学习。这样做有两个好处:一是减少计算量,二是防止过拟合。

Stacked Voxel Feature Encoding

对于每个voxel,VoxelNet使用了Voxel Feature Encoding layer(VFE)来对其进行特征提取。VFE其实是一种小型的PointNet,每个点的输入有7维:$(x_i, y_i, z_i, r_i, x_i-v_x, y_i-v_y, z_i-v_z)$,其中ri是反射值,$(v_x, v_y, v_z)$是voxel中所有点坐标的中点。VFE层的结构如Fig.3所示,FCN包括Linear-BN-ReLU。对voxel进行特征提取的过程有若干个VFE层组成,记号VFE-i($C_{in}$, $C_{out}$)表示第i个VFE层的输入是cin维,输出是cout维,而Linear层的输出是$\frac{C_{out}}{2}$维。最终voxel中所有点的feature vector通过maxpool得到最终的voxel feature representation。

image.png

2.1.2 Convolutional Middle Layers

在Feature Learning Network之后,VoxelNet通过一系列的Conv3d来对空间特征进行提取。Conv3d-block为Conv3d-BN-ReLU。

2.1.3 RPN

在Convolutional Middle Layers之后,假设特征图为$(C, D, H, W)$,此时会将C和D两维进行合并,将特征图转化为$(C \times D, H, W)$,其中D为上下,H和W是地面上的两个维度。通过将C和D合并作为channel维,特征图就转化为了地面上的2维特征图,RPN时生成的就相当于鸟瞰anchor。实际上,在网络结构设计时,depth维很小,在Convolutional Middle Layers之后只有2维。整个RPN的结构如Fig.4所示。

image.png

2.2 Loss Function

分类loss使用cross-entropy。回归loss使用smooth-l1。每个box被参数化为7维$(x_c^g,y_c^g,z_c^g,l^g,w^g,h^g,\theta^g)$,anchor参数化为$(x_c^a,y_c^a,z_c^a,l^a,w^a,h^a,\theta^a)$。回归的target设置为:

image.png

其中$d^a=\sqrt{(l^a)^2+(w^a)^2}$。整体的loss为:

image.png

2.3 Efficient Implementation

如前文所述,非空的voxel通常非常少,所以作者提出进行VFE的计算时,可以讲非空的voxel合并起来处理。方法为,假设有K个非空voxel,每个voxel采样点的最大个数为T,那么所有的voxel可以组成一个$(K, T, 7)$的tensor。这个tensor可以用VFE进行同时处理。对于点数不足T的voxel,将其中的值补0,因为网络中只是用了maxpool,这些0对最终的特征没有影响。

Training Details

3.1 Network Details

image.png

Learning rate: 0.01 for first 150 epochs, 0.001 for last 10 epochs
Batch size: 16 point clouds

3.2 Data augmentation

作者使用了三种augmentation的方法:

第一种是local pertubation。对于每个box和box中的点,进行:沿z轴旋转、随机平移、冲突检测。
第二种是global scaling。
第三种是global rotation。对整个点云和ground truth沿z轴和原点分别旋转。

Experiments

image.png

image.png

NIPS 2017

Abstract

PointNet在设计之初没有考虑shape的局部特征,这限制了其在复杂场景下的细粒度分类能力。本文基于PointNet,提出了一种分层的网络结构,其在输入point cloud的嵌套划分上迭代的使用PointNet,从而对不同上下文尺度的局部特征进行学习。同时,point cloud在采样时通常会出现采样密度上的不一致性,当网络模型在相同的采样密度上进行训练时性能并不理想。针对这一问题,本文提出了一种density adaptive PointNet layer,以在采样密度不同时进行多尺度的特征融合。结合了上述两种设计的网络模型称为PointNet++。

注:作者所有的分析都是从测度空间的角度来进行分析的,具有很强的数学性。

PointNet++

image.png

PointNet++以一种分层的形式来对point cloud进行处理:首先,PointNet++将point cloud分成若干个区域,在每个区域中使用PointNet对区域特征进行提取。之后小区域合并成大区域,再使用PointNet进行提取,依次类推,直至对整个point cloud进行特征提取。这样,PointNet++面临着两个问题:

  1. 如何对point cloud进行划分?
  2. 如何对划分好的区域进行局部特征的提取?

对于第二个问题,PointNet++使用了PointNet作为local feature learner。对于第一个问题,PointNet++进行了如下设计。

Hierarchical Point Set Feature Learning

PointNet++将对整个point cloud的特征提取过程分成了若干个set abstraction levels(SAL)。每个SAL包含三个步骤,分别为Sampling Layer,Grouping Layer和PointNet Layer。每个SAL接受一个$N\times(d+C)$维的输入,Sampling Layer找到$N′$个centroid,Grouping Layer为每个region partition组合出$N′\times K_i \times (d+C)$维的特征,然后PointNet Layer提取出$N′ \times (d+C′)$维的特征。其中,C是附加特征的数量,$N′$是每个region partition中的点数。下一个SAL的输入只有上一个SAL的centroid。

  1. Sampling Layer从输入point cloud中选择出一些点作为每个region partition的centroid。此时在采样时PointNet++使用了farthest point sampling(FPS)。与随机采样相比,FPS可以获得更好的收敛。其中第一个点随机选取。
  2. Grouping Layer找出每个centroid的neighbor point,并组成region partition。在选择neighbor point时,PointNet++使用了ball query(Euclidean distance)而不是kNN,因为作者发现这样泛化性能更好。二者的区别在于:kNN有且仅有k个point,而ball query将radius范围内的全部包含,个数不确定。
  3. PointNet Layer为每个region partition提取特征。注意的是,每个点的坐标信息转化为相对于centroid的相对坐标,这有利于编码point-to-point的关系。

image.png

Robust Feature Learning under Non-Uniform Sampling Density

在point cloud采样时,不同区域的采样密度不同时非常常见的情况。如果模型在训练时采用相同的scale,那么会导致提取到的特征与区域密度的不匹配。在密集数据上学到的特征无法很好的泛化到稀疏的数据上去,导致在稀疏数据上无法对细节特征进行有效的建模。此时,需要在更大的scale上进行特征提取。为了解决这个问题,PointNet++提出了density adaptive PointNet layers,通过将不同尺度的区域的特征进行融合,来应对采样密度不一致的问题。

image.png

PointNet++使用了两种方式:

  1. Multi-scale grouping(MSG):每个SAL使用不同scale的grouping layer和PointNet layer提取特征,并将特征concat起来,作为最后的feature vector。
  2. Multi-resolution grouping(MRG):在第L个SAL,使用L-1的subregion的特征和该region所有point cloud点的分别做grouping layer和PointNet layer,并concat起来。

在实际应用中,MSG效果更好,MRG速度更快。

image.png

PointNet还提出了一种random input dropout,即先从[0, p]中随机一个𝜃,在从[0, 𝜃]中随机dropout的概率。

image.png

Point Feature Propagation for Set Segmentation

在分割问题中,之前的网络结构通过region partition进行了下采样。为了解决这一问题,PointNet++提出了一种利用空间插值进行上采样的方法,整体结构类似Encoder-Decoder。插值算法如下图:

image.png

Experiment

image.png

image.png

在非刚体shape的分类中,作者发现non-Euclidean distance和传统的intrinsic features非常重要。作者在这里使用了geodesic distance:连接两点的最短路径的边数。

image.png

文章链接

Abstract

3D视觉中通常采用point cloud或者mesh的形式来存储数据,而传统用于解决3D视觉问题的CNN模型选择将point cloud转化为voxel来处理,这个量化过程会导致精度上的损失和偏差。作者提出的PointNet直接将point cloud作为输入,从而可以有效的处理point cloud数据。

PointNet

image.png

PointNet直接将point cloud数据的3个坐标作为输入,因此结构非常简单高效。作者基于PointNet设计了分类子网络和分割子网络,分别用于解决分类和分割(part segmentation,semantic segmentation)问题。分割问题的结果还被用于解决3D object detection问题。

Point cloud的性质

  1. Unordered
  2. Interaction among points:point直接不是隔离的,而是相互联系的
  3. Invariance under transformation:point cloud整体经过某些变换(旋转、平移等),其所表示的label不发生改变。

PointNet Architecture

PointNet的结构包括了3个核心因素:

1. 用于处理无序输入的对称函数。

PointNet使用了maxpool来实现这个对称函数,用来消除输入序列的顺序对结果的影响。用于处理无序输入的常用方法有三种:排序、不处理+MLP、RNN。排序方法本身具有不稳定的特点,很多序列是无法进行稳定的排序的;不处理+MLP也难以学习到point cloud直接的无序关系;输入序列的顺序也对RNN的结果有重要的影响。作者提出的对称函数的key idea如下:

image.png

其中h函数将N-d的输入转化为K-d的特征,g是一个对称函数,用来得到一个全局的feature vector。对应到网络中,h是maxpool之前的一系列mlp,g是maxpool。

image.png

2. Local and Global Information Aggregation

在解决per point问题时,如segmentation等,仅仅使用global feature是不够的。PointNet将point feature和global feature进行了concat,并用于segmetation问题。

3. Joint Alignment Network

Point cloud的语义标签对某些几何变换具有不变性,因此,通过PointNet学习到的representation也应该具有这种不变形。因此,在point cloud进入PointNet之前,设计了一个affine transformation network用于进行坐标变换。相同的思想也用于feature space,PointNet在网络中间部分使用了feature transformation network用于进行特征维度的变换。但是,FTN维度较高,因此难以训练,作者又加入了一个regularization term,将feature transformation matrix限制为一个正交矩阵:

image.png

ATN和FTN的模型设计:
ATN: MLP(64, 128, 1024) + maxpool + MLP(512, 256, 3x3)
FTN: MLP(64, 128, 1024) + maxpool + MLP(512, 256, 64x64)

image.png

实际上ATN和FTN都没什么用。

理论分析

image.png

定理1说明了,对于Hausdorff距离上的任意连续集合函数f,PointNet在maxpool层有足够多的神经元的条件下都可以进行有效的拟合。

image.png

定理2(a)说明了如果Cs中的点都被保留,那么f(S)的值不会随输入点的减少而变化;如果只有Ns的点被加入到输入中,那么f(S)的值也不会随输入点的增多而变化。Cs是critical point set,Ns是upper-bound shapes。
定理2(b)说明了Cs的大小不超过maxpool中的神经元个数K。

Experiment

image.png
image.png
image.png

本周Paper List:

  1. PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
  2. PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
  3. PointSIFT: A SIFT-like Network Module for 3D Point Cloud Semantic Segmentation
  4. PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud
  5. VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection