VoxelNet: 基于点云的三维目标检测的端到端学习网络
一,简介
VoxelNet: 一种通用的三维检测网络,将特征提取以及边界框预测集成在一个阶段,是一种端到端的可训练的深层网络。
具体而言,VoxelNet将点云划分为间隔相等的三维体素,并通过新引入的体素特征编码层(VFE),将每个体素内的一组点转换为一个统一的特征表示。点云被编码成描述性的体积表述,然后连接到RPN(Region Proposal Network)去生成检测结果。
(图片来源于论文VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection)
二,要解决的问题
RPN是一个有效的物体检测的高度优化算法。然而,这种方法要求数据必须是密集的,需要是张量结构,(例如,照片,视频),这种属性不是传统雷达点云数据所拥有的。这篇文章的任务就是通过VoxelNet解决这个问题,以及解决手绘特征表示的局限性。
三,核心思路总结
(图片来源于论文VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection)
基本流程:特征学习网络以原始点云作为输入,将空间划分为体素,并将每个体素内的点转换为向量表示特征形状信息。空间表示为稀疏的四维张量。卷积中间层处理四维张量,最后,通过RPN生成三维检测。
3.1特征学习网络内部结构:
∙
\bullet
∙ 三维点云空间数据栅格化
主要实现将点云数据所占的空间(
D
×
W
×
H
D\times W\times H
D×W×H)分割为多个栅格,即构造三维栅格网。
∙
\bullet
∙ 点云数据分组
将栅格化的点云数据分组,一个栅格一个分组,即为一个体素。每个点云体素中的点的数量是不同的。(体素大小为
v
D
×
v
W
×
v
H
v_D\times v_W\times v_H
vD×vW×vH)
∙
\bullet
∙ 随机抽样
对于体素中的点进行处理。设置阈值T,当体素中的点大于T时,进行随机采样,使得体素中只保留T个点;当体素中的点小于等于T时,保留体素中的点数不变。
最后得到的体素集合中,每个集合内的点数为t,t<=T。
(这样做的目的:由于雷达测试点云数据量大,全部处理将会是比较大的运算量;而且雷达点云数据空间密度分布高度可变,可能对检测造成偏见)
∙
\bullet
∙ 堆叠体素特征编码
(图片来源于论文VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection)
通过级联的VFE-Layer实现点特征和局部聚合特征的逐步级联结合:
作者以一个VFE层为例,说明体素特征编码层工作原理:
1,对体素中的每个点 ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi)进行去中心化处理,得到 ( x i − v x , y i − v y , z i − v z ) (x_i-v_x,y_i-v_y,z_i-v_z) (xi−vx,yi−vy,zi−vz),和点的接受反射率 r i r_i ri一起构成7维向量,作为VFE-Layer1的输入,即Point-wise Input。
2,将逐点输入,通过全连接网络,得到逐点特征。
3,对逐点特征进行逐点Max-pool运算,获得局部聚合特征。
4,将局部聚合特征与逐点特征,逐点拼接在一起,得到新的逐点拼接特征。
(对于堆叠体素特征编码层的一些思考:作者论文中并没有说明堆叠次数到几次为止,在实验部分作者只经过了两次VFE层。针对这一点的理解是,固然堆叠体素特征编码层能够增加特征维数,使准确率提高,但是经过VFE次数过多,可能会导致过拟合,所以堆叠次数”恰当“就好。)
5,将逐点拼接特征,经过Max-pool运算,得到一个逐体素特征(Voxel-wise Feature)。
∙ \bullet ∙每个体素经过特征学习网络后,得到一个 ( C × D ′ × H ′ × W ′ ) (C\times D'\times H'\times W') (C×D′×H′×W′)的四维张量,其中C表示逐元素特征的维数,D‘,H’, W’分别为点云栅格化后三维坐标上的个数 ( D ′ = D v D , H ′ = H v H , W ′ = W v W ) (D'=\frac{D}{v_D},H'=\frac{H}{v_H},W'=\frac{W}{v_W}) (D′=vDD,H′=vHH,W′=vWW)
3.2 中间卷积层
对于特征学习网络输出的稀疏四维张量特征,在卷积中间层,采用三维卷积层,BN层和ReLU层,通过逐渐扩大的感受域内聚合体素的特征,为形状描述增加更多内容。
作者使用 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)表示卷积操作,其中, c i n , c o u t c_{in},c_{out} cin,cout分别表示卷积操作前的维度和卷积操作后的维度。 k k k表示卷积核的大小(即 k × k × k k\times k\times k k×k×k), s s s表示卷积的步长, p p p表示填充的元素值。
(对于中间卷积层的内容,这篇论文没做详细介绍)
3.3 候选区域网络(Region Proposal Network)
(图片来源于论文VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection)
区域候选网络的输入是:由卷积中间层提供的特征图;输出是概率评分图以及回归图。
RPN的架构:1)三个卷积层块,进行下采样,每个块的第一层通过步长为2的卷积将特征图采样一半,第二层步长为1 的卷积序列()。2)将每个块的卷积结果采样到一个固定的大小并串联构造高分辨率的特征图;3)该特征图被映射到期望的学习目标。
RPN网络不断将特征结果抽样,再丰富,最后抽取2维,14维特征作为概率评分图以及回归图结果。RPN过程,原理在这篇论文没具体体现,后面继续学习。
3.4损失函数
设定两个anchor,一个正一个负。
1){
a
i
p
o
s
a_i^{pos}
aipos} ,
i
=
1
,
2
,
.
.
.
,
N
p
o
s
i=1,2,...,N_{pos}
i=1,2,...,Npos为正样本集合
2){
a
i
n
e
g
a_i^{neg}
aineg} ,
i
=
1
,
2
,
.
.
.
,
N
n
e
g
i=1,2,...,N_{neg}
i=1,2,...,Nneg为负样本集合
3)
(
x
c
g
,
y
c
g
,
z
c
g
,
l
c
g
,
w
c
g
,
h
c
g
,
θ
c
g
,
)
(x_c^g,y_c^g,z_c^g,l_c^g,w_c^g,h_c^g,\theta_c^g,)
(xcg,ycg,zcg,lcg,wcg,hcg,θcg,)表示ground truth
4)
(
x
c
a
,
y
c
a
,
z
c
a
,
l
c
a
,
w
c
a
,
h
c
a
,
θ
c
a
,
)
(x_c^a,y_c^a,z_c^a,l_c^a,w_c^a,h_c^a,\theta_c^a,)
(xca,yca,zca,lca,wca,hca,θca,)表示正样品框
定义训练网络的回归目标如下:
其中,
损失函数:
其中,
L
c
l
s
L_{cls}
Lcls表示交叉熵,
博客详细介绍了交叉熵损失函数:https://blog.csdn.net/weixin_37567451/article/details/80895309
L
r
e
g
L_{reg}
Lreg为
s
m
o
o
t
h
L
1
smooth_{L1}
smoothL1函数
其中
u
i
,
u
∗
u_i,u^*
ui,u∗分别表示神经网络的正样例的输出的标记框和ground truth标注框。
这个函数相当于是在小于1的部分使用2范数(更smooth,且求导方便),在大于1的部分使用1范数(避免梯度爆炸,同时减少outlier的影响)
四,实验结果
(图片来源于论文VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection)
这篇论文没有开源,这篇博客只记录了对于论文原理的理解,最后给出论文中的实验结果图。