概述
首先,本文是基于点云,并且将点云处理成体素 的3D目标检测网络,提出的SECOND可以看做是VoxelNet的升级版。 提出动机与贡献
- VoxelNet计算量比较大,速度比较慢(训练和推理),作者引入稀疏卷积代替朴素的3D卷积
- VoxelNet编码偏航角的方法是直接预测,但直接预测会导致一个问题,也就是当预测bbox的偏航角与gt box的偏航角差异为
±
π
\pm \pi
±π的时候,损失会比较大,但是这个bbox其实与真实的边界框已经很相似了。因为作者对于偏航角使用了一个新的损失函数,并且设计了一个方向分类器。
- 提出了一种新的数据增广方式
细节
网络结构
第一张图是本文的网络结构,第二张图是VoxelNet的网络结构。我们对比一下可以发现,SECOND是VoxelNet的升级版,大体上是一样的,只是SECOND将中间卷积层的3D卷积操作换成了稀疏卷积操作,并且最终的输出多了一个方向分类的结果。
稀疏卷积
首先推荐一篇讲的超级好的笔记:通俗易懂的解释Sparse Convolution过程
目标: 对稀疏的输入数据尽可能高效的进行卷积操作,所以只对有用的元素做卷积,而不是滑动窗口遍历所有可能。
概述: 如果把稀疏卷积当成黑盒的话,它的输入输出和标准卷积是一致的(形状一致,子流形稀疏卷积输出值不一致,但原始稀疏卷积输出值是一致的)。
两种稀疏卷积: 一种是现在常用的子流形稀疏卷积(3D Semantic Segmentation with Submanifold Sparse Convolutional Networks中提出的),只有卷积核的中心覆盖有用元素的时候才得到对应的输出;另一种是原始稀疏卷积(Spatially-sparse convolutional neural networks),就像普通的卷积一样,只要卷积核覆盖(卷积核中任意元素)一个有用元素,就计算输出。PS: 子流形稀疏卷积出现的背景是作者发现,原始稀疏卷积会使得数据的稀疏性指数下降,从而提出了一种保持数据的稀疏性的方法。但是如果只用子流形稀疏卷积,卷积核的感受野会限制在一定范围内,所以本文作者将两者混合在一起用了。
稀疏卷积思想:
- 将输入的稀疏数据中的有效元素的位置用hash表存起来,根据对有用元素卷积的规则得到有用元素对应的输出数据位置,将这个位置也使用hash表存起来。(
PS: 上述的两种稀疏卷积的最大差别就是这个有用元素卷积的规则,即哪种情况下才能得到输出,原始稀疏卷积的规则和标准卷积一样,而子流形稀疏卷积的规则就会严格一点) - 构建 Rulebook,也就是将有用元素和卷积核中哪个位置的元素相乘再相加得到对应的输出(算法是对每个有用元素单独考虑的,所以就相当于除了当前有用元素,其他位置就是0)这一个过程形式化地表示出来,主要包含输入hash表中的key,输出hash表中的key以及对应的卷积核元素位置。迭代上面的步骤,我们就将卷积的操作表示在了Rulebook中。
- 根据Rulebook得到计算结果,并将结果放到对应的位置,得到正确的稀疏输出。
接着看一下SECOND的3D特征提取网络:白色的子流形稀疏卷积+黄色的原始稀疏卷积+红色的结果处理层(将稀疏张量转换成密集张量,应该和VoxelNet一样,将特征维度C和深度维度D合并,得到鸟瞰图)
方向分类
首先是一个背景,也就是VoxelNet中,当预测bbox的偏航角与gt box的偏航角差值为
π
\pi
π的时候,损失会比较大,但是这个bbox其实与真实的边界框已经很相似了。因此作者为偏航角设计了一个新的损失函数
L
θ
=
S
m
o
o
t
h
L
1
(
s
i
n
(
θ
p
?
θ
t
)
)
L_{\theta}=SmoothL1(sin(\theta_p-\theta_t))
Lθ?=SmoothL1(sin(θp??θt?)),其中
θ
p
\theta_p
θp?是预测的偏航角
θ
t
\theta_t
θt?是真实的偏航角。对比原来的公式
L
θ
=
S
m
o
o
t
h
L
1
(
θ
p
?
θ
t
)
L_{\theta}=SmoothL1(\theta_p-\theta_t)
Lθ?=SmoothL1(θp??θt?),我们可以发现其实就是给角度的差包了一层sin函数,要是这个差值是
±
π
\pm \pi
±π的时候,这部分的损失是0。
那么问题就来了,这样做的话,模型是能够得到很好的训练了,但是不符合真实场景呀。一种可能的结果是,前面的车子向你冲来了,你却以为人家在倒车(方向判断错了)。作者给出的一个弥补方案就是模型同时做一个方向分类,也就是,判断目标是正向的还是逆向的,这是一个简单的二分类。
损失函数
损失主要是三部分:bbox的分类损失、7个参数的回归损失(偏航角和6个坐标)以及车的方向分类损失。
|