目录
- 概述
- 细节
- 网络结构
- 视锥候选框
- 3D实例分割
- 边界框参数回归
- 损失函数
概述
首先本文是基于图像和点云的,属于早期的模态融合的成果,是串行的算法,而非并行的,更多的是考虑如何根据图像和点云这两个模态的数据进行3D目标检测。
提出动机与贡献1:
以往基于点云的算法,要么是将点云进行编码成规则结构如体素、体柱,然后进行处理,要么是将点云转换成图片类型(鸟瞰图),然后进行处理,这些方法都会损失原始点云的信息。因此直接基于原始点云进行目标检测能够更加有效的利用3D的信息,这方面比较经典的工作就是PointNet类的算法,它们能进行分类和分割,并没有进行目标检测,因此作者提出了一种方法将PointNet用到了目标检测当中。
提出动机与贡献2:
以往基于点云的算法基本都是使用RPN网络生成3D候选框的,但是基于原始点云的话,RPN不好做啊,因为不好设置3D anchor了就。因此作者就将2D候选框和3D实例分割等操作结合起来生成候选框。
ps:
2D目标检测中ancho:
两阶段算法中,anchor用于候选框的生成,单阶段算法中anchor用于最终边界框的生成,他们都是需要对anchor的偏移参数进行预测,然后将偏移参数作用到anchor上得到我们想要的结果(候选框或者边界框),那怎么得到参数的预测结果呢?一般都是得到一个全局的特征,然后用
1
∗
1
1*1
1∗1卷积调整通道数。比如我们将全局特征通过
1
∗
1
1*1
1∗1卷积得到了
7
∗
7
∗
(
4
∗
k
)
7*7*(4*k)
7∗7∗(4∗k)的结果,就代表着原图中设置了
7
∗
7
=
49
7*7=49
7∗7=49个位置,每个位置放置了
k
k
k个anchor,每个anchor对应4个偏移调整参数。这个位置怎么选择呢?可以将结果特征图中的点按照一定的规则映射到原图中,也可以采用什么别的方式,接着以这个位置为中心,放置不同长宽比例、不同大小的矩形框作为先验也就是anchor。
视锥:
视锥就是下图中有颜色的部分(立体梯形),相机中图像成的像就是视锥中的内容。因此我们可以通过图像以及相机的内置参数得到视锥。
细节
网络结构
整体流程:
- 首先使用2D目标检测器在图像中得到候选框并进行分类
- 借助相机的内参将2D候选框转换为得到3D视锥(frustum)
- 对3D视锥内的点进行3D实例分割,得到每个点的类别
- 基于分割的结果,1个PointNet的变体(T-Net)回归中心点坐标,另一个PointNet的变体回归尺寸和航向角。
视锥候选框
首先使用2D目标检测器在图像中得到候选框并进行分类,然后借助相机的内参(投影矩阵)将2D候选框转换为得到3D视锥,视锥内的点就构成了视锥点云。但是对于不同的2D候选框,视锥可能会朝向很多不同的方向,点云的分布很不稳定,所以作者对视锥中的点做了几何变换
,(下图a)使得z轴指向视锥的中心,那么视锥中的点的分布就很稳定了。
注:
1、因为候选框只会包含一个目标,所以理论上每个视锥中也仅包含一个目标。
3D实例分割
我们现在已经有了2D候选区域以及它对应的视锥点云,接下来就是从中得到3D边界框。一个直接的思路
就是将视锥点云转换成2D候选区域的深度图,然后使用CNN处理,但是其中会存在物体遮挡和背景杂乱的问题。这个问题在2D中是很难处理的,但是在3D中是比较容易处理的,因为3D空间中物体是自然分离的。因此作者
使用PointNet对视锥点云中的所有点进行2分类(目标点云以及非目标点云),得到目标点云。
上面说了视锥中的目标主体只有一个,也就是和2D候选框中的类别一致的,因此我们可以将之前预测到的2D候选框类别作为额外的特征或者说是先验知识,加到视锥中的点上,方便分割。
分割结束之后,得到目标点云,再做一次几何变换
注:
为什么作者根据2D候选框生成视锥,然后做3D分割而不是直接使用2D分割昌盛视锥呢?就像前面说的,2D分割难度大,效果差;3D分割难度小,效果好。
边界框参数回归
实验中发现目标点云的中心距离边界框的中心依旧比较远,因此作者单独使用T-Net回归边界框的中心点坐标,这里的回归指的是目标点云的质心相对于边界框中心的偏移。再使用一个PointNet的变体(Amodal 3D Box Estimation PointNet)实现边界框的尺寸(h,w,l)以及航向角的回归,输出维度是 3 + 4 ∗ N S + 2 ∗ N H 3+4*NS+2*NH 3+4∗NS+2∗NH,其中3是边界框中心点的坐标偏移, N S NS NS是不同尺寸的anchor个数,4是长宽高以及置信度, N H NH NH是不同朝向的anchor,2是置信度以及航向角。
注:这里的T-Net类似于PointNet中的T-Net,但是它不学习旋转矩阵,而是实现边界框中心点坐标的回归,因此它是有监督的。
损失函数
损失主要包含四部分:3D分割的损失,两次几何变换的损失、边界框相关的损失以及最后的角损失。
具体:
L
s
e
g
L_{seg}
Lseg是分割损失、
L
c
1
−
r
e
g
L_{c1-reg}
Lc1−reg是两次几何变换的损失、
L
c
2
−
r
e
g
L_{c2-reg}
Lc2−reg是中心点回归的损失、
L
h
−
c
l
s
L_{h-cls}
Lh−cls和
L
h
−
r
e
g
L_{h-reg}
Lh−reg是航向角分类和回归的损失、
L
s
−
c
l
s
L_{s-cls}
Ls−cls和
L
s
−
r
e
g
L_{s-reg}
Ls−reg是各个尺寸分类和回归的损失。
上面公式写的很多,相当于是各个参数都单独预测了,但是他们应该是一起起作用得到边界框的,所以引入了8个角的损失。