首先,本文是基于点云,但不是将点云处理成体素,而是体柱!
提出动机与贡献:
比较主流的一种方式
就是将点云编码成体素,但是这就使得后面需要使用3D卷积进行特征提取,开销比较大(哪怕SECOND中引入了稀疏卷积,计算量还是比2D卷积大);另外一种思路
就是从俯视角度将点云数据进行处理,得到伪图片的数据,之后使用2D卷积处理,开销小了,但是得到伪图片的过程中,丢失了很多信息。因此作者
在一定程度上融合了这两种方法的思想,提出了一种新的点云编码方式,在这种方式下,仅仅使用2D卷积就可以实现端到端的3D目标检测。
这种编码方式的优点:
注:
转成鸟瞰图的优点:
没有尺度模糊性(啥意思??),没有遮挡
转成鸟瞰图的缺点:
会导致鸟瞰图很稀疏,而标准卷积比较适合处理稠密的图像。所以一个常见的处理思路
就是将平面划分为若干个网格,然后聚合网格内点的特征作为当前网格的特征。(点云稀疏,所以将点云划分为体素,两者不能说是十分相似,只能说是一模一样)
流程:
详细表述:
假设点云中的点 l l l有 D = 4 D=4 D=4个特征 x , y , z , r x,y,z,r x,y,z,r,我们将平面空间划分为若干个网格,接着将点云中的点按照 x 、 y x、y x、y坐标分配到对应网格中,得到一系列的体柱,假设非空体柱的个数是 P P P,非空体柱内的点数阈值是 N N N。和体素化时候的处理一样,如果体柱内的点超过了 N N N就只采样 N N N个点,不足 N N N就用0填充。接下来给体柱中的点添加额外的5个特征,分别是 x c , y c , z c , x p , y p x_c,y_c,z_c,x_p,y_p xc,yc,zc,xp,yp,前三者表示的是体柱中点的几何平均值(相当于是质心),后两者表示的是当前点与质心的相对偏移,这样的话,每个点的特征D就从4变为了9。
我们知道体素是稀疏的,虽然体柱在体素的基础上放宽了一定的限制,但体柱也还是稀疏的(作者的配置下,KITTI上的稀疏性大概是97%)。通过超参数的调整,我们可以使得张量 ( D , P , N ) (D,P,N) (D,P,N)相对稠密(这个张量表示当前有P个非空体素,每个体素内有N个点,每个点有D个对应的特征)。接着使用一个简单版本的PointNet的结构,进行点级的特征提取得到一个 ( C , P , N ) (C,P,N) (C,P,N),然后通过一个max pool操作得到体柱的特征 ( C , P ) (C,P) (C,P)(P个体素,每个体素用C个特征表示),接着将它映射到原始的体柱空间,得到稀疏的伪图片数据 ( C , H , W ) (C,H,W) (C,H,W),其中H、W就是原始体柱空间的宽和高。
概述:
数据流变化:输入点云数据 ( p o i n t s − n u m , 4 ) (points-num,4) (points−num,4),将平面划分成 H ∗ W H*W H∗W个网格,每个网格就是一个体柱,将点云中的点放到对应的体柱中,取出其中非空的体柱构成张量 ( 9 , P , N ) (9,P,N) (9,P,N),接下来通过类似pointNet的结构得到一个高纬的表示 ( C , P , N ) (C,P,N) (C,P,N),然后是一个max pool操作得到非空体柱的特征 ( C , P ) (C,P) (C,P),接着将它映射回原体柱空间中得到最终的稀疏张量 ( C , H , W ) (C,H,W) (C,H,W)
对比VoxelNet:
数据流变化:输入点云数据 ( p o i n t s − n u m , 4 ) (points-num,4) (points−num,4),将空间划分成 D ∗ H ∗ W D*H*W D∗H∗W个体素,将点云中的点放到对应的体素中,取出其中非空的体素构成张量 ( 7 , P , N ) (7,P,N) (7,P,N),接下来通过类似pointNet的结构(VFE)得到一个高纬的表示 ( C , P , N ) (C,P,N) (C,P,N),然后是一个max pool操作得到非空体素的特征 ( C , P ) (C,P) (C,P),接着将它映射回原体素空间中得到最终的稀疏张量 ( C , D , H , W ) (C,D,H,W) (C,D,H,W)
对比的一个感受:
在获得点云的特征表示的过程中,两者的流程以及中间的过程是一样的,区别主要就在于编码点云的方式,是采用体素的形式编码还是采用体柱的方式编码。
刚才我们说了,基于体柱的点云特征表示是一个伪图像的数据,对于这种3维的张量我们就可以使用2D卷积处理,这里处理的过程类似于VoxelNet的2D特征提取网络。
对比VoxelNet:
VoxelNet采用3D卷积+2D卷积做特征提取,而PointPillars只使用2D卷积
使用SSD作检测头
本文的损失函数与SECOND中使用的损失函数是一模一样的。