查看原文
其他

开发者说|自动驾驶激光点云3D目标检测VoxelNet论文简述

Frank909 Apollo开发者社区 2022-07-29


下面是由社区开发者—Frank909提供的文章,本文主要分析 自动驾驶激光点云3D目标检测VoxelNet 


    ENJOY THE FOLLOWING  


摄像头对环境进行测量,产生的一般是RGB格式图片,图片上的一个像素通常有rgb3个颜色通道的数据。一般来说图像数据是稠密的。图像上的目标检测大多是2D的bbox。激光点云数据做3D检测,效果如下图:



激光雷达也需对环境进行测量,产生的是点云数据,所谓点云就是一个坐标有(x,y,z,r)这样的数据,xyz代表3维坐标,r代表信号反射强度,一般来说点云数据是稀疏的。 单论像素数量,一张分辨率为1920*1080的图片有200多万像素点,一个128线的激光雷达1s 内大概传输300多万个点云数据,单论数量区分稀疏和稠密并无道理,可能与空间密度有关。



这张图片可以看到有些地方点云很稠密,有些地方点云很稀疏,甚至没有。而图片因为是像素排列,所以不存在稀疏的情况,透明或者黑色都是有相应的RGB数据进行存储的。但点云不同,点云数据分布不均。这就引出了一点问题: 用于激光点云处理的CNN模型必定和图像处理的模型有些不同。 不同的地方来自于点云数据的前期处理。



图片是2维的,单个点叫做像素。点云是3维的,所有的点形成点云,但可以想像用一个大的长方体能够把所有的点云装载进去。点云是稀疏的,为了更高效处理这些数据,VoxelNet运用了一种前期的处理手段那就是:Voxel Partition

前文讲到可以想像用一个长方体装载所有点云,为了更精细化处理,voxel partition将长方体进行了切割,以固定的单元大小进行切割。假设所有的点云就装载在一个盒子里,盒子沿XYZ轴的尺寸分别是WHD,假设要进行voxel partition操作,最小单元大小是



最终会产生一个3D网络,尺寸可以通过数学公式求得。


D=D/vd,H=H/vh,W=W/vw


一个最小的单元称为一个体素(voxel),体素中可能有点云,也可能没有点云,所以应对这种状态,最好的方法是对每个voxel中的点云进行编码和特征学习。



VoxelNet是一个端到端的网络模型,特征学习是第一步,共分为3大部分:

  • 特征学习网络

  • 中间卷积层

  • RPN


特征学习网络


VoxelNet特征学习分为5个过程:

  • Voxel Partition

  • Grouping

  • Random Sampling

  • Stacked Voxel Feature Encoding

  • Sparse 4D Tensor


Grouping


前面讲到Voxel Partition,也讲到一个Voxel中点云数量不一的问题,数量不一的原因可能是因为距离、遮挡、相对位姿等。
Grouping是将一个Voxel中的所有点云先进行一个简单的聚合。


Random Sampling


一帧点云的数量在10W上,同时处理众多数据,硬件开销很大,最好的方式是采样。VoxelNet采用随机采样,每个Voxel固定采集T个数量的点云,T是超参数,在实际业务中可能根据点云数量会有不同。Random Sampling除了能减少计算量外,还能有效降低因每个voxel点云数据不均而带来的信息偏差,提高训练效率。


Stacked Voxel Feature Encoding


Voxel Feature Encoding简称VFE,是VoxelNet中的核心思想,主要目的是对点云进行特征编码。

Stacked Voxel Feature Encoding是一系列堆栈式的编码层,核心思想是产生多个层次的特征表示。



第1级层次是点云级的输入



一个非空的Voxel中会取样T个点云,VoxelNet作者设定了如下表达式:



i代表Voxel中取样的T个点云中的第i个。x,y,z 是点云位置信息,r 是反射率

有了表达式后,首先要计算质心,质心用(vx,vy,vz)表示。

通过计算每个点云和质心的偏移量,得到点云的增广表达式。


Vin={p^i=[xi,yi,zi,xivx,yivy,zivz]TR7}i=1...t


由原始输入的4维扩展到7维。
每个pi要经过一个FCN全连接处理转换到特征空间。 

fi代表特征空间中每个向量,它能从Voxel中获取到形状信息。


上文讲的是点云级别,接下来处理元素级别。思路也很简单,就是通过Maxpooling得到Voxel中的一些局部聚合特征(locally aggregated feature),用f表示。

最后,每个Point-wise Feature和Locally Aggregated Feature进行拼接,得到最终的feature,表示如下:



上文讲的是单个Voxel的编码操作,其它Voxel操作步骤是一样的,所有的Voxel对应同一个FCN。前面表述的是VFE1,而VoxelNet中划分了许多个Voxel,每个Voxel都有对应的VFE,VFEi(Cin,Cout)表示。


in代表输入input_feature的通道数,out 表示编码后的通道数量。其中,经过线性变换中需要学习一个Matrix,尺寸是Cin(Cout/2)。

通过Maxpooling操作补齐out数量,具体操作参见VFE-1分析过程。


Sparse Tensor Representation


因为划分Voxel时,90%的Voxel都是空的,所以VoxelNet只处理非空Voxel能有效节省计算量。


Voxel编码后可以用4D Tensor表示,
尺寸是:CDHW′。


如图所示:



常规卷积层(Convolutional Middle Layers)


VFE编码后的数据会送到一系列常规的卷积层当中,作为中间过程。


ConvMD(cin,cout,k,s,p)表示卷积操作。M代表卷积维度,K是卷积核尺寸 ,S是卷积当中的Stride ,P是卷积当中的Pading。


一个卷积中间层格式是:Conv3D->BN Layer->Relu Layer


RPN


RPN这个概念来源于Faster R-CNN系列,VoxelNet中也运用到RPN,但经过了改良。



RPN中的FCN网络分为3块


每一块都会实现2x效果的下采样率。同时又实现了向上采样,将倒数3块上采样到固定的尺寸,然后拼接起来。


最终,由上采样拼接后的卷积引出2个目标分支:

  • 分支 1:概率图

  • 分支2:回归图


尺寸需要注意,概率图通道数是2,代表正负Anchor的概率,这个概率应通过Softmax 处理。
回归图的通道数是7,代表一个Anchor的3D信息(x,y,z,l,w,h,theta)。


Loss Function


除神经网络模型外,Loss Function的设定成为最重要的事情。因为有Anchor的存在,要计算3D框的信息就会引入Offset,VoxelNet对于Anchor有正负之分,Loss也离不开 GroundTruth。


VoxelNet中GroundTruth表示如下:



Anchor正样本表示如下:



θ是3D目标的偏航角,用u代表残差:


这里不是单纯的残差,x,y,z 的残差经过归一化操作。



分母是Da,也就是Anchorbox的对角线长度。求l,w,h的残差时,先求比例,在进行Log 函数缩放。求Theta角是真正意义上的残差.


 Loss Function 定义如下:


Loss 由 2 部分组成:

  • 分类 Loss

  • 回归 Loss


分类Loss计算的是Anchorbox的正样本概率和负样本概率的二分交叉熵,α和β用来平衡。回归当中的Loss只计算正样本,采用Smoth Loss L1 方法。 μi代表前面RPN的输入,μ是 Groundtruth和正样本的残差。


高效处理


GPU处理稠密数据时非常有效,但点云数据是很稀疏的,所以要高效处理就需要做一些数据处理。


VoxelNet 给出的答案是复用缓存。



缓存的尺寸是K × T × 7K代表最大数量的非空Voxel,T代表一个Voxel中最多点云数量,7是编码后的尺寸.


核心思想就是类HashTable的形式。

  • 如果一个Voxel未初始化,需先初始化,再插入点云

  • 如果一个Voxel已经初始化就复用,在小于T的情况下插入点云

  • 如果一个Voxel已经初始化,但其中点云数量等于T,则不插入新点云


经过缓存处理后,稀疏的点云能够变成稠密的数据,再经过中间卷积层和RPN处理,GPU能够更加高效。

训练相关


VoxelNet相关训练是以KITTI数据集为基础的,涉及到2大类别子数据集合

  • 汽车

  • 行人和自行车


两种子数据集对应的Voxel size是一样的,DHW分别是0.4x0.2x0.2但因为汽车、行人、自行车的尺寸不同,所以Anchor的尺寸也不同。Anchor尺寸本质就是现实世界中某一类别的平均尺寸。
  • 汽车 anchor size: l,w,h[3.9,1.6,1.56]

  • 行人 anchor size:l,w,h[0.8,0.6,1.73]

  • 自行车 anchor sizel,w,h[1.76,0.6,1.8]


为了捕捉更丰富的信息,每种大类Voxel中T的数量是不同的。

  • 汽车 T = 35

  • 行人自行车 T= 45

IOU的计算是针对鸟瞰图而言的,汽车和行人阈值也不同。

  • 汽车,> 0.6 正样本,< 0.45 负样本,其它忽略

  • 行人自行车,> 0.5 正样本,< 0.35 负样本,其它忽略


本质上是因为类别尺寸不同。


数据增强


数据增强的核心思想是提出一种“pertutation"的操作。

  • 将 3D box 绕 Z 轴旋转一定角度,然后 xyz 施加随机范围内的偏移量。

  • 对所有的点云施加全局的缩放效果。

  • 对所有点云施加全局的旋转效果。


第一个操作是增加数据,后面2个是为了提高网络的鲁棒性表现。


性能表现


细节需要注意,在TitanX显卡上,VoxelNet跑一帧需要225ms

对比图像目标检测的模型,Yolo系列能轻松达到17ms的推断时间,VoxelNet 不算快。

即使不与YOLO比,这225ms推断时间也无法说明其与实时性有任何关系。



VoxelNet非常优秀,值得好好学习,它的价值体现在以下4 点:

  • 提出了一种 end-to-end 的点云处理网络模型;

  • 有效表达了点云数据,形成了一种稀疏的数据到稠密数据的处理能力;

  • 改良并融合了 RPN,提升了目标检测的性能。


*Frank909 微信公众号

https://mp.weixin.qq.com/s/HhzNVgpjQweej_FKeqseRg


以上是"自动驾驶激光点云 3D 目标检测 VoxelNet 论文简述"的全部内容,更多话题讨论、技术交流可以扫描下方二维码添加『Apollo小哥哥』为好友,进开发者交流群。

 


©️著作权归作者所有,如需转载,请注明出处,否则将追究法律责任。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存