SECOND算法解析

在这里插入图片描述

1.前言

在AVOD的论文解析中,我们提到了AVOD(2018)其实是MV3D(2017)论文的升级版。

相似地,本文要介绍的SECOND(2018)其实就是VoxelNet(2017)论文的升级版。

SECOND的全称是Sparsely Embedded Convolutional Detection。
论文的地址
代码的地址

论文提出的主要动机为:

(1)考虑到VoxelNet论文在运算过程中运算量较大,且速度不佳。作者引入了稀疏3D卷积去代替VoxelNet中的3D卷积层,提高了检测速度内存使用

(2)VoxelNet论文有个比较大的缺点就是在训练过程中,与真实的3D检测框相反方向的预测检测框会有较大的损失函数,从而造成训练过程不好收敛。

顺带着动机,作者又提出了一些其他的创新点:

(1)比如数据增强这块,作者使用了数据库采样的操作;

(2)对于正负样本数量的极度不平衡问题,作者借鉴了RetinaNet中采用的Focal Loss。

这篇文章有关稀疏卷积部分稍微有些难懂,我找遍了全网有关SECOND的解读,大家都跳过了稀疏卷积这块,这确实让人头大。
关于稀疏卷积

2. 网络的结构

考虑到VoxelNet通过Feature Learning Network后获得了稀疏的四维张量,而采用3D卷积直接对这四维的张量做卷积运算的话,确实耗费运算资源。SECOND作为VoxelNet的升级版,用稀疏3D卷积替换了普通3D卷积

这里我们直接给出VoxelNet的结构图,然后再此基础上进行修改,获得SECOND的网络结构图,分别如下两张图所示。
在这里插入图片描述

图1 VoxelNet网络结构

在这里插入图片描述

图2 SECOND 网络结构
这么一看,大家就很容易看的出来两者之间的**共性**和**差异**了。接下来以我自己不成文的见解,简单聊聊**稀疏卷积**。

2.1 稀疏卷积

作者在VoxelNet的Convolutional Middle Layers的基础上引入了Sparse Convolutional Middle Layers,稀疏卷积就用在这个模块里面。

作者在论文中提到:

We need to gather the necessary input to construct the matrix, perform GEMM, and then scatter the data back. In practice, we can gather the data directly from the original sparse data by using a preconstructed input–output index rule matrix.

如下图所示,可以归纳为:

  • 将稀疏的输入特征通过gather操作获得密集的gather特征
  • 然后使用GEMM对密集的gather特征进行卷积操作,获得密集的输出特征
  • 通过预先构建的输入-输出索引规则矩阵,将密集的输出特征映射到稀疏的输出特征。

这个输入-输出索引规则矩阵很明显就是稀疏卷积的关键所在了。
在这里插入图片描述

图3 稀疏卷积操作

这里简单说一下输入-输出索引规则矩阵的生成规则。作者在原文中提到:

A more direct approach to rule generation is to iterate over the input points to find the outputs related to each input point and store the corresponding indexes into the rules. During the iterative process, a table is needed to check the existence of each output location to decide whether to accumulate the data using a global output index counter.

大致的意思就是:

  • 迭代输入点以获取每个输入点对应的输出,并将对应的索引存储到规则中
  • 迭代过程中,建立一个表来检查每个输出位置是否真实存在

作者在SECOND中是这样实现的:

  1. 收集输入索引(input indexes)和相关的空间索引(associated spatial indexes),并复制输出位置(Duplicate output locations);
  2. 在空间索引上执行unique parallel算法,获得输出索引(output indexes)和对应的空间索引(associated spatial indexes)。
  3. 生成一个与稀疏数据的相同空间维度的缓冲区,用于查找表
  4. 最后,对规则进行迭代,并使用存储的空间索引来获得每个输入索引对应的输出索引

具体的伪代码实现如下(我按照上面的步骤进行了一一对应):
在这里插入图片描述
至此,我对作者在原文中提到的稀疏卷积的解释就到此结束了。这个稀疏卷积结合submanifold convolutional layer实现了Sparse Convolutional Middle Layers,具体结果图如下:
在这里插入图片描述

图4 Sparse Convolutional Middle Layers
## 2.2 方向回归 上面聊完了稀疏卷积后,SECOND中还有一个重要的创新,就是对**物体方向估计**进行了重新的建模。

这里,作者在最后的RPN层(原来是两个分支,用来物体分类和位置回归)多引入了一个分支(如下图5所示),用来对物体方向进行分类。为什么是分类不是回归呢?
在这里插入图片描述

图5 RPN简图

这里我们简单聊聊在VoxelNet中是如何训练模型以达到确定方向的目的的。

在VoxelNet中,一个3D BBox被建模为一个7维向量表示,分别为 ( x c , y c , z c , l , w , h , θ ) (x_c,y_c,z_c,l,w,h,θ) xc,yc,zc,l,w,h,θ 训练过程中,对这7个变量采用Smooth L1损失进行回归训练。

这会造成什么问题呢?

大家设想下,当同一个3D检测框的预测方向恰好与真实方向相反的时候,上述的7个变量的前6个变量的回归损失较小,而最后一个方向的回归损失会很大,这其实并不利于模型训练。

**原因:**损失函数的改进主要是对这个差值进行的对称化,你可以理解成预测的一个角度是1°,但另一个预测的角度是359°,如果真值是0°的话,那么预测角度减去真值角的差值在这两种情况下就会很大,但实际他俩个都是只差了1°就预测准了,所以要利用sin来解决这个问题

为了解决这个问题,作者引入了对方向角的回归损失,定义如下:

L θ = S m o o t h L 1 ( s i n ( θ p − θ t ) ) L_θ = SmoothL1(sin(θ_p-θ_t)) Lθ=SmoothL1(sin(θpθt))

θ p θ_p θp 为预测的方向角, θ t θ_t θt 为真实的方向角。

那么当 θ p = θ t ± π θ_p = θ_t ± π θp=θt±π的时候,该损失趋向于0,这样更利于模型训练

这时候大家可能会问了,那这样的话,模型预测方向很可能与真实方向相差180度呀。

这时候作者提出了另一种解决方法(也就是RPN中的direction classifer分支),作者将车头是否区分正确直接通过一个softmax loss来进行约束。如果 θ > 0 θ>0 θ>0则为正, θ < 0 θ<0 θ<0则为负。那么这就是个简单的二分类问题了,也就是结构图中direction classifer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值