SECOND 算法
date
Dec 20, 2021
Last edited time
Mar 27, 2023 09:03 AM
status
Published
slug
SECOND算法
tags
DL
CV
3D
summary
转载
type
Post
origin
Field
Plat
second.pytorch
traveller59 • Updated Aug 30, 2023
前言
本文要介绍的SECOND(2018)其实就是VoxelNet(2017)论文的升级版。
SECOND的全称是Sparsely Embedded Convolutional Detection。
动机
- 考虑到VoxelNet论文在运算过程中运算量较大,且速度不佳。作者引入了稀疏3D卷积去代替VoxelNet中的3D卷积层,提高了检测速度和内存使用;
- VoxelNet论文有个比较大的缺点就是在训练过程中,与真实的3D检测框相反方向的预测检测框会有较大的损失函数,从而造成训练过程不好收敛。
其他创新点
- 数据增强中,作者使用了数据库采样的操作;
- 对于正负样本数量的极度不平衡问题,作者借鉴了RetinaNet中采用的Focal Loss。
网络结构
考虑到VoxelNet通过Feature Learning Network后获得了稀疏的四维张量,而采用3D卷积直接对这四维的张量做卷积运算的话,确实耗费运算资源。SECOND作为VoxelNet的升级版,用稀疏3D卷积替换了普通3D卷积。
这里我们直接给出VoxelNet的结构图,然后再此基础上进行修改,获得SECOND的网络结构图,分别如下两张图所示。
稀疏卷积结构
作者在VoxelNet的Convolutional Middle Layers的基础上引入了Sparse Convolutional Middle Layers,稀疏卷积就用在这个模块里面。
流程为:
- 将稀疏的输入特征通过gather操作获得密集的gather特征;
- 然后使用GEMM对密集的gather特征进行卷积操作,获得密集的输出特征;
- 通过预先构建的输入-输出索引规则矩阵,将密集的输出特征映射到稀疏的输出特征。
这个输入-输出索引规则矩阵很明显就是稀疏卷积的关键所在了。
具体实现的方法这里就不多说了, 可以自己去查.
方向回归
上面聊完了稀疏卷积后,SECOND中还有一个重要的创新,就是对物体方向估计进行了重新的建模。
这里,作者在最后的RPN层(原来是两个分支,用来物体分类和位置回归)多引入了一个分支(如下图5所示),用来对物体方向进行分类。为什么是分类不是回归呢?
这里我们简单聊聊在VoxelNet中是如何训练模型以达到确定方向的目的的。
在VoxelNet中,一个3D BBox被建模为一个7维向量表示,分别为 .
训练过程中,对这7个变量采用Smooth L1损失进行回归训练。
大家设想下,当同一个3D检测框的预测方向恰好与真实方向相反的时候,上述的7个变量的前6个变量的回归损失较小,而最后一个方向的回归损失会很大,这其实并不利于模型训练。为了解决这个问题,作者引入了对方向角的回归损失,定义如下:
其中 为预测的方向角, 为真实的方向角。
那么当 的时候,该损失趋向于0,这样更利于模型训练。
这样的话,模型预测方向很可能与真实方向相差180度, 对此, 作者提出了另一种解决方法(也就是RPN中的direction classifer分支),作者将车头是否区分正确直接通过一个softmax loss来进行约束。如果theta>0则为正,theta<0则为负。那么这就是个简单的二分类问题了,也就是结构图中direction classifer。