1.背景
2018 CVPR VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection
一种one-stage 端到端的3D目标检测网络。
移除了人为特征方法,直接操作点云并提取点云的形状信息。
2.VFE介绍
1)VoxelNet将3D空间转化为等间隔的体素voxels;假设3D空间中D*H*W分别为z,y,x轴的范围。
定义每个voxel size 为vD,vH,vW,——>得到将3D空间划分为D'*H'*W'个体素。
2)分组就是把每个体素中的点分为一组;
3)随机采样就是在体素中的点数量>T时,采样固定数量T个点。
4)如图中一个体素中含有3个点,每个点包含7个维度,则得到输入特征集Vin,
随后输入到全连接层(包含线性层+BN层+ReLU层)中 ,获得逐点特征point-wise feature表示(各自特征)。再使用逐元素最大池化element-wise maxpooling 得到局部聚合特征。最后,逐点拼接point-wise feature和局部聚合特征,得到输出特征集。
多个 VFE 层堆叠在一起,最终对输出的每个点进行 max 操作获得一个精确代表此体素的特征向量。
3.VoxelNet结构
特征学习层——卷积中间层——RPN层
以car检测为例:
1)特征提取层:
3D空间划分为D'*H'*W'个体素,每个体素中包含一些点,用VEF层堆叠提取每个体素的特征,得到4Dtensor:C*D'*H'*W'.
Z,Y,X轴的范围是[−3, 1] × [−40, 40] × [0, 70.4];体素大小是vD = 0.4, vH = 0.2, vW = 0.2;得到3D空间D′ = 10, H′ = 400, W′ = 352.即10*400*352个体素。
用VEF-1(7,32)和VEF-2(32,128)堆叠,得到输出特征集为128*10*400*352
2)卷积中间层
(conv3D(Cin 输入通道,Cout 输出通道,k kernel 大小,s 步长,padding))
使用3个三维卷积:
Conv3D(128, 64, 3, (2,1,1), (1,1,1)),
Conv3D(64, 64, 3, (1,1,1), (0,1,1)),
and Conv3D(64, 64, 3, (2,1,1), (1,1,1))
——>得4Dtensor:64*2*400*352——>reshape:128*400*352
3)RPN介绍(Region Proposal Network)
——最早再Faster R-CNN中提出,用于生成proposal
RPN是由三块全卷积层组成,每块得第一层由步长为2的卷积进行特征图下采样,高宽减半,通道数不变,第二层是一个步长为1的卷积。然后每个块上采样到固定尺寸并拼接成高分辨率768*H'/2*W'/2的特征图。最后得到预测结果:
概率图: 通道数为2,代表正负anchor的概率,用softmax处理;
回归图:7个通道数*2box,代表anchor的3D信息(x,y,z,l,w,h,theta)
4.损失函数
3D ground truth box的参数为 ( ,
,
,
,
,
,
)
正anchor的参数为( ,
,
,
,
,
,
),
残差包含7个回归值:
LOSS=交叉熵分类损失(正负样本都考虑)和L1 回归损失(回归 7 个量)
是指anchor正样本(正、负 anchor:IOU<0.45为负样本,IOU>0.6 为正样本)
回归的时候输出 14 通道,但是损失函数中只对正样本的的那个 box 进行计算
5.补充
将稀疏的点云转化为密集结构,因为RPN只能用于密集结构。
点云稀疏不均匀,用哈希表查询法检查点云中每个点对应的体素是否存在。当体素已初始化时,若体素中少于T个点,则将该点插入,否则忽略该点。当体素没有初始化时,将初始化一个新体素,将坐标储存在体素坐标缓冲区,并将点插入到这个体素位置中。???