SECOND:Sparsely Embedded Convolutional Detection

论文背景

为了克服图像单独提供空间信息的不足,点云数据在三维应用中变得越来越重要。点云数据包含精确的深度信息,可以由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,vP(x,y)lWuu0,vv0,l,mDu,v,l(1) 其中 x x x y y y 是输出空间索引, u − u 0 u-u0 uu0 v − v 0 v-v0 vv0 表示内核偏移量 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=lW,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} Wuu0,vv0,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=iP(j)lWk,l,mDi,l(3) P ′ ( j ) P^{'}(j) P(j) 是一个用于获取输入索引 i i i 和滤波器器偏移量的函数。下标 k k k 是对应于等式(1)中的 u − u 0 u-u0 uu0 v − v 0 v-v0 vv0 的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=lW,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=klWk,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=daxgxa,yt=daygya,zt=hazgza,wt=log(wawg),lt=log(lalg),ht=log(hahg),θt=θgθa(6)其中 x 、 y 、 z x、y、z xyz为中心坐标; w 、 l 、 h w、l、h wlh分别为宽、长、高; θ θ θ 是绕 z z z 轴的偏航旋转;下标 t 、 a 、 g t、a、g tag 分别表示编码后的值、锚点和基真值; 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(1pt)γ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θ+Lregother)+β3Ldir(9)其中 L c l s L_{cls} Lcls 是分类损失, L r e g − o t h e r L_{reg-other} Lregother 是位置和维数的回归损失, 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 的网络中成功地应用了稀疏卷积,提出了一种新的数据增强方法,充分利用了点云的优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/98567.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3回到顶部(BackTop)

效果如下图:在线预览 APIs 参数说明类型默认值必传bottomBackTop 距离页面底部的高度number | string40falserightBackTop 距离页面右侧的宽度number | string40falsevisibilityHeight滚动时触发显示回到顶部的高度number180falsetoBackTop 渲染的容器节点 可选 元…

Springboot启动异常 Command line is too long

Springboot启动异常 Command line is too long Springboot启动时直接报异常 Command line is too long. Shorten command line for xxxxxApplication or also for Spring Boot default解决方案: 修改 SystemApplication 的 Shorten command line,选择 JAR manife…

unity tolua热更新框架教程(2)

Lua启动流程 增加脚本luamain,继承luaclient 建立第一个场景GameMain,在对象GameMain挂载脚本LuaMain,启动场景 看到打印,lua被成功加载 lua入口及调用堆栈 这里会执行main.lua文件的main函数 C#接口导出 在此处配置C#导出的代码 …

【综述+3D】基于NeRF的三维视觉2023年度进展报告(截止2023.06.10)

论文:2003.Representing Scenes as Neural Radiance Fields for View Synthesis 官方网站:https://www.matthewtancik.com/nerf 突破性后续改进: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding | 展示官网&#…

【Vuex状态管理】Vuex的基本使用;核心概念State、Getters、Mutations、Actions、Modules的基本使用

目录 1_应用状态管理1.1_状态管理1.2_复杂的状态管理1.3_Vuex的状态管理 2_Vuex的基本使用2.1_安装2.2_创建Store2.3_组件中使用store 3_核心概念State3.1_单一状态树3.2_组件获取状态3.3_在setup中使用mapState 4_核心概念Getters4.1_getters的基本使用4.2_getters第二个参数4…

vue3哪个数组方法在vue2上做了升级处理

在 Vue 3 中,v-for 指令的数组更新行为进行了升级处理。在 Vue 2 中,当使用 v-for 渲染数组时,如果对数组进行了以下操作,Vue 无法检测到变化: 直接通过索引修改数组元素,例如 arr[0] newValue修改数组的…

一文读懂GPU显卡的10个重要参数

在当今的高性能计算机世界中,GPU显卡的性能至关重要。这一领域的快速发展,使得图形渲染、游戏体验、视频编辑等高性能计算任务变得更加高效和流畅。正因如此,选择一款合适的GPU显卡变得越来越重要。在挑选GPU显卡时,了解其关键参数…

【SpringSecurity】十一、SpringSecurity集成JWT实现token的方法与校验

文章目录 1、依赖与配置2、JWT工具类3、认证成功处理器4、创建JWT过滤器5、安全配置类 1、依赖与配置 添加JWT的maven依赖&#xff1a; <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId…

vue 使用qrcode生成二维码并可下载保存

安装qrcode npm install qrcode --save代码 <template><div style"display: flex; flex-direction: column; align-items: center; justify-content center;"><div>查看溯源码&#xff0c;<a id"saveLink" style"text-decorati…

C#,《小白学程序》第十四课:随机数(Random)第一,几种随机数的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十四课&#xff1a;随机数&#xff08;Random&#xff09;第一&#xff0c;几种随机数的计算方法与代码 /// 本课初步接触一下随机数。 /// </summary> /// <param name"sender"></param> ///…

开发前期准备工作

开发前期准备工作 文章目录 开发前期准备工作0 代码规范0.1 强制0.2 推荐0.3 参考dao&#xff1a;跟数据库打交道service&#xff1a;业务层&#xff0c;人类思维解决controller&#xff1a;抽象化 0.4 注释规范0.5 日志规范0.6 专有名词0.7 控制层统一异常统一结构体控制层提示…

【git】从一个git仓库迁移到另外一个git仓库

在远端服务器创建一个新的仓库 用界面创建&#xff0c;当然也可以用命令创建 拉去源仓库 git clone --bare git192.168.10.10:java/common.gitgit clone --bare <旧仓库地址>拉去成功以后会出现 进入到文件夹内部 出现下面信息&#xff1a; 推送到新的远端仓库 git …