1 解决的问题
体素化的方式处理点云
2 文章内容
2.1 Feature Learning Network
Voxel Partition:将3D空间D×H×W划分为D'×H'×W',假设设置的voxel的大小为vD,vH,vW,那么D'=D/vD,H'=H/vH,W'=W/vW; 假设是整数倍;
Grouping:由于距离、遮挡、目标相对姿态和不均匀采样等因素,点云在空间中是稀疏且高度不均匀的,因此分组后的体素内的点云数量是不一致的;
Random Sampling:“Directly processing all the points not only imposes increased memory/efficiency burdens on the computing platform, but also highly variable point density throughout the space might bias the detection.”于是需要控制每个voxel内包含的最大点数T,选取T的规则:(1)计算内存;(2)“decreases the imbalance of points between the voxels which reduces the sampling bias, and adds more variation to training.”
Stacked Voxel Feature Encoding:
作者使用VFE-i(cin,cout)表示第i层VFE,cin、cout分别是VFE的输入长度和输出长度,SVFE是VFE的叠加,下图是VFE结构。
经过前面步骤后,每个非空Voxel里会有多个point,Voxel可以表示为
每个voxel里的point数量不超过T,xyz是点坐标,r是反射强度。tensor为(N,35,4),N为非空体素个数
1.预处理:找出V里面的质心点(vx,vy,vz),计算其他点对质心的偏移offset,将V更新为Vin ,tensor从(N,35,4)变成了(N,35,7);
2.point-wise input:把Vin中的每个点pi^送至fully connected network(FCN)中提取特征,实际上做了个升维操作,原本pi^长度为7,升维后变成了长度为C1,自此点也就变成了特征fi,tensor也从(N,35,7)变成了(N,35,C1);
3.element-wise maxpool:经过FCN只是对每个point的操作,point之间的信息没有发生交互,所以对同一个voxel内所有fi做最大池化,选出一个locally aggregated feature f~;
4.point-wise concatenate:将3得到f~和2中的fi做简单concat获得最终的feature
于是,VFE模块的输出是
V里面的元素由原来的一个个p变成了一个f。tensor变成(N,35,2C),C=2×C1,所有非空voxel的点在FCN共享参数。
Sparse Tensor Representation:
划分后的3D空间中,90%的voxel是空的,所以输入就变成了一个稀疏的4维tensor——C×D'×H'×W',有一大部分C=0。
2.2 Convolutional Middle Layers
使用ConvMD(cin, cout, k, s, p)来表示一个M-dimension卷积操作,依次为(输入通道数,输出通道数,卷积核大小,卷积步长,padding大小),每一层middle layer都是3D卷积,BN layer和ReLU layer的组合。每一层middle layer都会聚集体素信息并且扩大感受野(跟2D卷积一个意思)。
2.3 Region Proposal Network
RPN architecture先是3个 fully 2D convolutional middle layers block,每个block的第一层会通过一个stride为2的卷积将feature map的大小减半,随着是一系列stride为1的卷积。同样的,在每次卷积之后都有BN和ReLU。类似FPN的操作,每一个block之后再上采样到同样大小之后concat得到high resolution的feature map,大小是H'/2 × W'/2 × 768。然后这个feature map分别1×1卷积得到probability score 和 regression 两个feature map。
2.4 Loss function
损失函数包含三项,前两项是cls loss(分为正样本positive和负样本negative),最后一项是reg loss。
其中,α和β是正常数平衡系数。