论文背景
为了克服图像单独提供空间信息的不足,点云数据在三维应用中变得越来越重要。点云数据包含精确的深度信息,可以由LiDAR或RGB-D相机生成。
VoxelNet:首先将点云数据分组成体素,然后在将体素转换成密集的3D张量用于区域提议网络(RPN)之前,逐体素应用线性网络。
在处理点云激光雷达数据时,基于体素的三维卷积网络已经被用于增强信息的保留,然而推理速度慢和方位估计性能低。
论文工作
1.将稀疏卷积算法应用于激光雷达目标检测中,大大提高了训练和推理的速度。
2.提出了一种改进的稀疏卷积方法,使其运行速度更快。
3.提出了一种新颖的角度损失回归方法,比其他方法更好的方向回归性能。
4.介绍了一种新的数据增强方法,可大大提高激光雷达学习问题的收敛速度和性能 。
论文结构
SECOND detector 包括三个部分:
1.一个体素特征提取器;
2.一个稀疏卷积中间层;
3.一个 RPN。
SECOND detector 以原始点云为输入,将其转换为体素特征和坐标,并应用两个 VFE(voxel feature encoding) 层和一个线性层。 然后,应用稀疏CNN。 最后,RPN产生检测。
点云分组(体素化)
这里,遵循 VoxelNet 中描述的简单过程来获得点云数据的体素表示 :首先根据指定的体素数量限制预分配缓冲区; 然后,迭代点云,将点分配给它们相关联的体素,并保存体素坐标和每个体素的点数。
在迭代过程中,基于哈希表检查体素的存在性。 如果与一个点相关的体素还不存在,在哈希表中设置相应的值。否则,将体素的数量增加 1。 一旦体素数量达到指定的限制,迭代过程将停止。
最后,得到所有的体素,它们的坐标和每个体素的点数为实际的体素数。
对car每个体素网格最多对应35个点,对人每个网格最多对应45个点(由于行人和骑自行车的人相对较少,因此需要更多的点来进行体素特征提取)。
体素特征提取器
使用体素特征编码(VFE)层,来提取体素特征。 VFE层将同一体素中的所有点作为输入,并使用由线性层、批归一化(BatchNorm)层和校正线性单元(RELU)层组成的全连接网络(FCN)来提取逐点特征。然后,利用元素最大池化(max pooling)获取每个体素的局部聚集特征。 最后,对得到的特征进行平铺,并将平铺后的特征与逐点特征连接在一起。
使用 V F E ( C o u t ) VFE(C_{out}) VFE(Cout)来表示将输入特征转换为 c o u t c_{out} cout维输出特征的 VFE 层。 类似地, F C N ( c o u t ) FCN(c_{out}) FCN(cout) 表示一个 Linear-BatchNorm-Relu 层,它将输入特征转换为 c o u t c_{out} cout维的输出特征。 作为一个整体,体素特征提取器由多个VFE层和一个FCN层组成。
稀疏卷积中间提取器
稀疏卷积算法
首先考虑二维稠密卷积算法。用 W u , v , l , m W_{u,v,l,m} Wu,v,l,m 表示过滤元素, D u , v , l D_{u,v,l} Du,v,l 表示图像元素,其中 u , v u,v u,v 为空间位置指标, l l l 表示输入通道, m m m 表示输出通道。函数 P ( x , y ) P(x,y) P(x,y) 生成给定输出位置需要计算的输入位置。 因此, Y x , y , m Y_{x,y,m} Yx,y,m 的卷积输出由下式给出: Y x , y , m = ∑ w , v ∈ P ( x , y ) ∑ l W u − u 0 , v − v 0 , l , m D u , v , l (1) \tag 1 Y_{x,y,m} = \sum_{w,v \in P(x,y)}\sum_l W_{u-u_0,v-v_0,l,m}D_{u,v,l} Yx,y,m=w,v∈P(x,y)∑l∑Wu−u0,v−v0,l,mDu,v,l(1) 其中 x x x 和 y y y 是输出空间索引, u − u 0 u-u0 u−u0 和 v − v 0 v-v0 v−v0 表示内核偏移量 u u u 和 v v v 坐标。 基于通用矩阵乘法(GEMM)的算法(也称为基于IM2COL的算法[30])可用于收集构造矩阵 D ˜ P ( x , y ) , l \~D_{P(x,y),l} D˜P(x,y),l,l所需的所有数据,然后执行GEMM本身: Y x , y , m = ∑ l W ∗ , l , m D ˜ P ( x , y ) , l (2) \tag2 Y_{x,y,m} = \sum_l W_{*,l,m}\~D_{P(x,y),l} Yx,y,m=l∑W∗,l,mD˜P(x,y),l(2) 这里 W ∗ , l , m W_{*,l,m} W∗,l,m 对应 W u − u 0 , v − v 0 , l , m W_{u-u_0,v-v_0,l,m} Wu−u0,v−v0,l,m 但是在GEMM形式下。对于稀疏数据 D i , j ′ D_{i,j}^{'} Di,j′ 和关联的输出 Y j , m ′ Y_{j,m}^{'} Yj,m′,直接计算算法可写为: Y j , m ′ = ∑ i ∈ P ′ ( j ) ∑ l W k , l , m D i , l ′ (3) \tag3 Y_{j,m}^{'} = \sum_{i \in P^{'}(j)}\sum_l W_{k,l,m}D_{i,l}^{'} Yj,m′=i∈P′(j)∑l∑Wk,l,mDi,l′(3) P ′ ( j ) P^{'}(j) P′(j) 是一个用于获取输入索引 i i i 和滤波器器偏移量的函数。下标 k k k 是对应于等式(1)中的 u − u 0 u-u0 u−u0 和 v − v 0 v-v0 v−v0 的1D核偏移量,下标 i i i 对应于等式(1)中的 u u u 和 v v v。 式(3)基于gemm的版本为: Y j , m ′ = ∑ l W ∗ , l , m D ˜ P ′ ( j ) , l ′ (4) \tag4 Y_{j,m}^{'} = \sum_{l}W_{*,l,m}\~D_{P^{'}(j),l}^{'} Yj,m′=l∑W∗,l,mD˜P′(j),l′(4)稀疏数据的聚合矩阵 D ˜ P ′ ( j ) , l ′ \~D_{P^{'}(j),l}^{'} D˜P′(j),l′ 仍然有许多 不需要计算的 0。为了解决这个问题,将公式(3)重写为: Y j , m ′ = ∑ k ∑ l W k , l , m D R k , j , k , l ′ (5) \tag5 Y_{j,m}^{'} = \sum_{k}\sum_l W_{k,l,m}D_{R_{k,j},k,l}^{'} Yj,m′=k∑l∑Wk,l,mDRk,j,k,l′(5)其中 R k , j R_{k,j} Rk,j,也称为 RULE,是一个矩阵,它指定给定内核偏移量 k k k 和输出索引 j j j 的输入索引 i i i。 式(5)中的inner sum不能通过GEMM计算,所以需要收集必要的输入来构造矩阵,执行GEMM,然后将数据分散回来。在实际应用中,可以利用预先构造的输入输出索引规则矩阵直接从原始稀疏数据中收集数据。
这增加了速度。 具体来说,构造了一个规则矩阵表 R k , i , t = R [ k , i , t ] R_{k,i,t}=R[k,i,t] Rk,i,t=R[k,i,t],其维度为 K × N i n × 2 K×N_{in}×2 K×Nin×2,其中 K K K 为核大小(以体积表示), N i n N_in Nin 为输入特征数, t t t为输入/输出索引。 元素 R [ : , : , 0 ] R[:,:, 0] R[:,:,0]存储用于收集的输入索引,元素 R [ : , : , 1 ] R[:,:, 1] R[:,:,1]存储用于 scatter 的输出索引。
N i n N_{in} Nin 表示输入特征的数量, N o u t N_{out} Nout 表示输出特征的数量。 N N N 是收集到的特征个数。Rule为 rule 矩阵,其中 R u l e [ i , : , : ] Rule[i,:,:] Rule[i,:,:] 为卷积核中第 i i i 个核矩阵对应的第 i i i个rule。
除白色以外的颜色的方框表示数据稀疏的点,白色方框表示空点。
Rule 生成算法
常采用基于CPU的规则生成算法,该算法使用哈希表,但这种算法速度较慢,需要在CPU和GPU之间进行数据传输。规则生成的更直接方法是迭代处理输入点,查找与每个输入点相关的输出,然后将相应的索引存储到规则中。在迭代过程中,需要使用一个表来检查每个输出位置的存在,以决定是否使用全局输出索引计数器累积数据。这是阻碍算法中并行计算应用的主要挑战。
论文设计了一个基于GPU的规则生成算法(算法1),该算法在GPU上运行速度更快。图1的底部显示了我们提出的算法。首先,我们收集输入索引和相关的空间索引,而不是输出索引(算法1中的第1个循环)。在这个阶段获得了重复的输出位置。然后,对空间索引数据执行一个 unique parallel 算法,以获得输出索引及其相关的空间索引。
从先前的结果生成一个与稀疏数据具有相同空间尺寸的缓冲区,以便在下一步中进行表查找(算法1中的第2个循环)。最后,在规则上进行迭代,并使用存储的空间索引来获得每个输入索引的输出索引(算法1中的第3个循环)。
稀疏卷积中间提取器
中间提取器用于学习关于 z 轴的信息,并将稀疏的3D数据转换为2D BEV图像。它包括两个阶段的稀疏卷积。每个阶段包含多个子流形卷积层和一个普通的稀疏卷积,用于在z轴上进行降采样。在 z 维度降采样到一或两维后,稀疏数据被转换成密集的特征图。然后,数据被简单地重塑成类似图像的2D数据。
黄色框表示稀疏卷积,白色框表示子流形卷积,红色框表示稀疏到密集层。图的上半部分是稀疏数据的空间维数。
区域提议网络 RP
论文使用了一个 single shot multibox detecor(SSD) 来构建一个 RPN 架构。RPN 的输入由稀疏卷积中间提取器的特征映射组成。RPN体系结构由三个阶段组成。每个阶段从一个下采样卷积层开始,然后是几个卷积层。在每个卷积层之后,应用BatchNorm和ReLU层。然后,将每个阶段的输出采样到一个相同大小的特征图,并将这些特征图连接成一个特征图。最后,将三种1 × 1卷积用于类、回归偏移量和方向的预测。
锚点和目标
由于待检测对象的大小大约是固定的,所以使用固定大小的锚点,锚点是根据 KITTI 训练集中所有ground truth的大小和中心位置的平均值确定的,旋转0度和90度。
每个锚点都被分配了一个分类目标的一位 one-hot 向量、一个 box 回归目标的7维向量,以及一个方向分类目标的一位 one-hot 向量。不同类别对于匹配和不匹配具有不同的阈值。
对于回归目标,使用以下 box 编码函数: x t = x g − x a d a , y t = y g − y a d a , z t = z g − z a h a , w t = log ( w g w a ) , l t = log ( l g l a ) , h t = log ( h g h a ) , θ t = θ g − θ a (6) \tag6x_t = \frac{x_g-x_a}{d_a},y_t=\frac{y_g-y_a}{d_a},z_t=\frac{z_g-z_a}{h_a},\\w_t=\log (\frac{w_g}{w_a}),l_t=\log(\frac{l_g}{l_a}),h_t=\log(\frac{h_g}{h_a}),\\ \theta_t=\theta_g-\theta_a xt=daxg−xa,yt=dayg−ya,zt=hazg−za,wt=log(wawg),lt=log(lalg),ht=log(hahg),θt=θg−θa(6)其中 x 、 y 、 z x、y、z x、y、z为中心坐标; w 、 l 、 h w、l、h w、l、h分别为宽、长、高; θ θ θ 是绕 z z z 轴的偏航旋转;下标 t 、 a 、 g t、a、g t、a、g 分别表示编码后的值、锚点和基真值; d a = ( l a ) 2 + ( w a ) 2 d^a =\sqrt{(l^a)^2 + (w^a)^2} da=(la)2+(wa)2 是锚 box 底部的对角线。
训练与推理
Loss
角度回归的正弦误差损失
角度损失回归: L θ = SmoothL1 ( sin ( θ p − θ t ) ) (7) \tag7 L_{\theta}=\text{SmoothL1}(\sin(\theta_p-\theta_t)) Lθ=SmoothL1(sin(θp−θt))(7)其中下标 p p p 表示预测值。
这种角度损失的方法有两个优点:(1)它解决了 0 和 π 方向之间的对立例子问题;(2)它根据角度偏移函数自然地建模IOU。
为了解决,即将方向相反的 box 视为相同的这一问题,论文在RPN的输出中添加了一个简单的方向分类器。该方向分类器使用 softmax 损失函数。采用以下方法生成方向分类器目标:如果绕地面真值 z 轴的偏航旋转大于零,则结果为正;否则,它是负的。
分类的 Focal Loss
使用了 RetinaNet 中的一种称为 focal loss 的有效单期损失: F L ( p t ) = − α t ( 1 − p t ) γ log ( p t ) (8) \tag 8 FL(p_t) = -\alpha_t(1-p_t)^{\gamma}\log(p_t) FL(pt)=−αt(1−pt)γlog(pt)(8)其中 p t p_t pt 为模型估计的概率, α α α 和 γ γ γ 为 focal 参数。
Total Training Loss
通过组合上面讨论的损失,可以得到多任务损失的最终形式如下: L t o t a l = β 1 L c l s + β 2 ( L r e g − θ + L r e g − o t h e r ) + β 3 L d i r (9) \tag9 L_{total} = \beta_1L_{cls}+\beta_2(L_{reg-\theta}+L_{reg - other})+\beta_3L_{dir} Ltotal=β1Lcls+β2(Lreg−θ+Lreg−other)+β3Ldir(9)其中 L c l s L_{cls} Lcls 是分类损失, L r e g − o t h e r L_{reg-other} Lreg−other 是位置和维数的回归损失, L r e g − θ L_{reg-θ} Lreg−θ 是新角度损失, L d i r L_{dir} Ldir 是方向分类损失。 使用相对较小的β3值,以避免网络难以识别物体的方向的情况。
数据增强
在训练过程中遇到的主要问题是 ground truth 太少,这严重限制了网络的收敛速度和最终性能。
从训练数据集生成一个包含所有 ground truth 及其相关点云数据( ground truth 的3D包围框内的点)标签的数据库。然后,在训练过程中,从该数据库中随机选取几个ground truth,通过串联的方式将其引入到当前的训练点云中。
可以大大增加每个点云的地面真相的数量,并模拟存在于不同环境中的物体。
论文总结
现有的三维目标检测方法大多将点云数据转化为二维表示,如BEV和前视表示,从而丢失了原始点云中包含的大部分空间信息。 论文介绍了一种新的角度损失回归方法,并在基于 lidar 的网络中成功地应用了稀疏卷积,提出了一种新的数据增强方法,充分利用了点云的优势。