文章的内容主要是我个人在学习论文的过程中按模块对论文进行了粗略的翻译并且加入了一定的理解,其中对于一些我不太了解的额外知识进行了一个补充,欢迎大家指正。
LiDAR(激光雷达)获取到的点云数据存在存在很高的随机点密度,这是由非均匀的3D空间采样,对一系列有效的传感器的遮盖和相关的动作。为了解决解决这个问题,很多方法采用人为手工制作点云的特征表现来用于3D物体识别。
然而手工的方法在获取3D类型信息和获取侦测任务所需的不变信息中会产生瓶颈
Region Proposal Network,用于生成候选区域(Region Proposal)
训练阶段:
预测阶段:
当我们已经得到锚框(anchor boxes)后,需要完成以下两项任务:
(1)anchor box 中是否包含识别物体,foreground/background,二分类问题
(2)如果 anchor box 包含物体,怎么调整,才能使得 anchor box 与 ground truth 更接近。
简而言之,RPN 只挑选出了可能包含物体的区域(rpn_rois)以及其包含物体的概率(rpn_roi_probs)。在后续处理中,设定一个阈值 threshold,通过比较包含物体的概率和阈值的大小关系来判断是忽略还是进行类别判定。
首先将点云分割成等量大小的空间,假设点云涵盖了三维空间,其范围为D、H、W,分别沿Z、Y、X轴分布,因此我们将每一个体素的大小定义为 v D , v H 和 v W v_D,v_H和v_W vD,vH和vW所以最后每一个3D体素的大小是 D ′ = D / v D D^′= D/v_D D′=D/vD, H ′ = H / v H H^′= H/v_H H′=H/vH和 W ′ = W / v W W^′=W/v_W W′=W/vW
根据点所在的体素进行分组,因为各种原因LiDAR获得的点在不同空间中的密度是不同的,因此经过分组之后每一个体素中会含有不同数量的点
因为一个高清晰度的LiDAR每次采样都会大量的点,因此采用随机采样的方法。设定一个阈值T,从包含数据点数大于T的体素中进行随机采样。这样做包含两个原因:一是可以计算的saving,二是减少不同体素间点数量上的不平衡
这个模型的关键创新是一系列的VFE层
假设 V = { p i = [ x i , y i , z i , r i ] T ∈ R 4 } i = 1... t V=\{p_i = [x_i ,y_i ,z_i ,r_i ]^T∈R^4 \}_{i=1...t} V={pi=[xi,yi,zi,ri]T∈R4}i=1...t是一个非空且包含t
首先用V中所有点的均值作为所有点的中心,然后得到一个包含每个点和中心偏移量的新的点集 V = { p i = [ x i , y i , z i , r i , x i − v x , y i − v y , z i − v z ] T ∈ R 7 } i = 1... t V=\{p_i = [x_i ,y_i ,z_i ,r_i,x_i−v_x ,y_i−v_y ,z_i −v_z ]^T∈R^7 \}_{i=1...t} V={pi=[xi,yi,zi,ri,xi−vx,yi−vy,zi−vz]T∈R7}i=1...t
之后每一个 p i p_i pi通过一个全连接层(Fully Connected Layer)转换进一个特征空间 f i ∈ R m f_i∈ R^m fi∈Rm。其中FCN包括了线性层、Batch Normalization Layer和ReLU Layer。
之后过一个MaxPooling来获得局部聚合的特征 f ~ ∈ R m \widetilde{f}∈ R^m f ∈Rm之后将 f i 和 f ~ f_i和\widetilde{f} fi和f 连接起来形成 f i o u t = [ f i , f ~ ] T ∈ R 2 m f^{out}_i= [f_i,\widetilde{f}]_T ∈ R^{2m} fiout=[fi,f ]T∈R2m之后我们就获得了输出 V o u t = { f i o u t } i . . . t V_{out}=\{f^{out}_i\}_{i...t} Vout={fiout}i...t所有的非空体素都用相同的共享权重的FCN方式进行Encode
其它的VFE层和这个类似
因为输出特征同时包含了基于点的特征和局部聚合特征,VFE层编码了点在体素中的相互作用,并且允许最后的特征表达能够学习到描述性的类型信息
一系列通过刚刚对非空体素集合的处理,我们获得了一列表的体素特征,每一个都独一无二的对应一个非空体素的空间坐标。这一系列的体素特征可以通过一个4D的系数张量表示 ( C × D ′ × H ′ × W ′ ) (C\times D^′ \times H^′ \times W^′) (C×D′×H′×W′)这也是算法高效的核心所在。
C o n v M D ( c i n , c o u t , k , s , p ) ConvMD(c_{in},c_{out},k,s,p) ConvMD(cin,cout,k,s,p)来表达M维度的卷积操作。其中cin和cout是输入和输出channels数量
这一块用在RPN输入之前,用于获取基于体素的特征,输入是Sparse Tensor Representation的四维tensor,输出是一个三维的tensor,在training detail中的三维tensor的大小为 ( C × H ′ × W ′ ) (C × H^′ × W^′ ) (C×H′×W′) C o n v M D ( c i n , c o u t , k , s , p ) ConvMD(c_{in},c_{out},k,s,p) ConvMD(cin,cout,k,s,p)来表达M维度的卷积操作。其中cin和cout是输入和输出channels数量
RPN的输入层是convolutional middle layers提供的一个特征图。
RPN网络由三块卷积层组成,第一层中每一个Conv2D通过设置stride为2来进行下采样,紧接着是一系列stride为1的卷积。每一个卷积层之后都会有Batch Normalization和ReLU激活函数。
最终我们对每一个block进行上采样到一个固定的大小,之后将其合并去构建一个高分辨率的特征图。这个特征图会被映射到两个目标图中,一个是概率分数图(Probability Score map),一个是回归图(Regression map)。
其中 d a = ( l a ) 2 + ( w a ) 2 d^a=\sqrt{(l^a)^2+(w^a)^2} da=(la)2+(wa)2是box底部的对角线
L = α 1 N p o s ∑ i L c l s ( p i p o s , 1 ) + β 1 N n e g ∑ j L c l s ( p j n e g , 0 ) + 1 N p o s ∑ i L r e g ( u i , u i ∗ ) L=\alpha\frac{1}{N_{pos}}\sum_iL_{cls}(p^{pos}_i,1)+\beta\frac{1}{N_{neg}}\sum_jL_{cls}(p^{neg}_j,0)+\frac{1}{N_{pos}}\sum_iL_{reg}(u_i,u^*_i) L=αNpos1i∑Lcls(pipos,1)+βNneg1j∑Lcls(pjneg,0)+Npos1i∑Lreg(ui,ui∗)
直接工作存在的问题是点的分布是很稀疏的且每个体素有不同数量的点。因此我们设计一个可以将点云转换为tensor的结构,利用GPU使得堆叠的VFE层可以并行处理
首先初始化一个 K × T × 7 K\times T\times 7 K×T×7来存储体素输入特征缓冲,其中K表示非空体素数量的最大值,T是一个体素中所含有的点数的最大值,7是每个点的encoding dimension。所有点在处理前会先随机分组
对于在点云中的每一个点,我们会检测相关的体素是否已经存在了,这种检测主要靠的是hash算法,其中体素的坐标用作keys。如果体素已经存在切其中点的数量小于T,我们将该点插入进去,否则忽略该点。
如果体素还没有创建,则创建该体素,将其坐标加入hash算法的keys中,然后将点插入其中。体素输入特征和坐标缓冲区可以通过对点列表的一次传递来构建。
定义 M = { p i = [ x i , y i , z i , r i ] T ∈ R 4 } i = 1... t M=\{p_i = [x_i ,y_i ,z_i ,r_i ]^T∈R^4 \}_{i=1...t} M={pi=[xi,yi,zi,ri]T∈R4}i=1...t作为点云的全集,定义一个3D bonding box b i = ( x c , y c , z c , l , w , h , θ ) b_i=(x_c,y_c,z_c,l,w,h,θ) bi=(xc,yc,zc,l,w,h,θ)其中 x c , y c , z c x_c,y_c,z_c xc,yc,zc表示中心点坐标, l , w , h l,w,h l,w,h表示box的长宽高, θ θ θ表示在Z轴上的旋转 Ω i = { p ∣ x ∈ [ x c − l / 2 , x c + l / 2 ] , y ∈ [ y c − w / 2 , y c + w / 2 ] , z ∈ [ z c − h / 2 , z c + h / 2 ] , p ∈ M } Ω_i=\{p|x∈[x_c−l/2,x_c+l/2],y∈[y_c−w/2,y_c+w/2],z∈[z_c−h/2,z_c+h/2],p∈M\} Ωi={p∣x∈[xc−l/2,xc+l/2],y∈[yc−w/2,yc+w/2],z∈[zc−h/2,zc+h/2],p∈M}作为包含在 b i b_i bi中的全部点
第一种augmentation方法
第一种augumentation的方法是对真实标记的3D box和其中的point运用一个独立的扰动(perturbation),其中 ∆ θ ∆θ ∆θ在一个符合均匀分布范围内随机抽取, ( ∆ x , ∆ y , ∆ z ) (∆x,∆y,∆z) (∆x,∆y,∆z)通过均值为0方法为1的高斯分布在 Ω i Ω_i Ωi中的每一个点进行独立的抽取。最后为了避免出现从物理层面上不可能的点,对任意两个box使用了碰撞检测,如果出现问题则回复到最初始的样子。采用这种方法可以大幅度的增加可以学习的变量
第二种augmentation方法
对所有的ground truth box b i b_i bi和整个点云M应用全局缩放。具体来说,我们将XYZ三个维度大小和每个 b i b_i bi的三个维度,以及M中所有点的XYZ坐标与一个从均匀分布[0.95,1.05]中抽取的随机变量相乘。这样可以提高图分类和检查任务的鲁棒性
第三种augmentation方法
对点云M和所有的ground truth box进行在Z轴上的一个小范围的扰动,扰动的大小取决于一个小范围的均匀分布。通过旋转点云,模拟了自行车的转弯。
大部分现有的方法在基于雷达的3D检测任务重用的是手工录入的特征表示,而本文移除了因为人工处理而产生的瓶颈并提出了VoxelNet:一个全新的端到端的可以训练的基于点云的3D检测的深度结构。
本文提出的方法可以直接对离散的3D点云数据进行处理并且有效的获取到3D物体的类型信息。本文还介绍了VoxelNet的有效实现,它得益于点云的稀疏性和体素网格的并行处理。
我们在KITTI汽车检测任务上的实验表明,VoxelNet比最先进的基于LiDAR的三维检测方法有很大优势。在更具挑战性的任务中,如行人和骑车人的三维检测,VoxelNet也显示出令人鼓舞的结果,表明它提供了更好的三维表现。未来的工作包括将VoxelNet扩展为基于LiDAR和图像的端到端三维检测,以进一步提高检测和定位的准确性。
我们在KITTI汽车检测任务上的实验表明,VoxelNet比最先进的基于LiDAR的三维检测方法有很大优势。在更具挑战性的任务中,如行人和骑车人的三维检测,VoxelNet也显示出令人鼓舞的结果,表明它提供了更好的三维表现。未来的工作包括将VoxelNet扩展为基于LiDAR和图像的端到端三维检测,以进一步提高检测和定位的准确性。