VoxelNeXt:用于3D检测和跟踪的纯稀疏体素网络
VoxelNeXt:Fully Sparse VoxelNet for 3D Object Detection and Tracking
目前自动驾驶场景的3D检测框架大多依赖于dense head,而3D点云数据本身是稀疏的,这无疑是一种低效和浪费计算量的做法。我们提出了一种纯稀疏的3D 检测框架 VoxelNeXt。该方法可以直接从sparse CNNs 的 backbone网络输出的预测 sparse voxel 特征来预测3D物体,无需借助转换成anchor, center, voting等中间状态的媒介。该方法在取得检测速度优势的同时,还能很好地帮助多目标跟踪。VoxelNeXt在nuScenes LIDAR 多目标跟踪榜单上排名第一。
1.概述
在本文中,我们提出了VoxelNeXt。这是一个简单、高效且无需后期处理的3D对象检测器。我们设计的核心是体素到对象方案,其根据体素特征直接预测3D对象一个强大的完全稀疏的卷积网络。关键的优点是我们的方法可以去掉锚代理,稀疏到密集转换、区域建议网络和其他复杂组件。
由于我们的体素到对象方案避免了密集的特征图,所以网络可以高效推理。它只预测稀疏和必要的位置,如表1所示,与CenterPoint[57]相比。这种表示也使得VoxelNeXt可以很容易地扩展到使用离线跟踪器的3D跟踪。先前的工作[57]只跟踪预测的物体中心,这可能涉及对其位置的预测偏差。在VoxelNeXt中,查询体素(用于框预测的体素),也可以被跟踪以进行关联。
最近,FSD[16]利用了完全稀疏的框架。在VoteNet[37]的推动下,它投票支持对象中心,并采用迭代细化。由于3D稀疏数据通常分散在物体表面,因此这种投票过程不可避免地会引入偏差或误差。因此,需要诸如迭代群校正之类的细化来确保最终的准确性。该系统因其对客体中心的强烈信念而变得复杂。FSD[16]在大范围表现不错,但其效率不如我们的,如图所示。
2.具体方法
如果不使用2D检测头,直接用voxel稀疏会有什么问题呢?
稀疏探测器[16,46,47]的方法避免了密集的探测头,而是引入了其他复杂的管道。RSN[47]对距离图像执行前景分割,然后检测剩余图像上的3D对象稀疏数据。SWFormer[46]提出了一种具有精细窗口分割和具有特征金字塔的多个头的稀疏变换器。受VoteNet[37]的启发,FSD[16]使用点聚类和组校正来解决中心特征缺失的问题。
这些检测器进行稀疏预测,但以不同的方式使检测管道复杂化。在我们的工作中,这个中心缺失的问题也可以通过具有大感受野的稀疏网络简单地跳过。我们对常用的稀疏神经网络进行最小的调整,以实现完全稀疏的检测器。
稀疏神经网络因其效率而成为3D深度学习[10,11,23,41]中的大型骨干网络。人们普遍认为,它的表现能力对于预测是有限的。与所有这些解决方案相反,我们证明,在没有任何其他复杂设计的情况下,通过额外的下采样层可以简单地解决感受野瓶颈不足的问题。
点云或体素分布不规则,通常分散在3D对象的表面,而不是中心或内部。这促使我们沿着一个新的方向进行研究,直接基于体素而不是手工制作的锚或中心来预测3D盒子。
2.1.稀疏CNN骨干网适配
具有足够感受野的强特征表示是确保对稀疏体素特征进行直接和正确预测的必要条件。尽管普通稀疏CNN骨干网络已被广泛用于3D对象检测器[12,41,57],但最近的工作表明了其弱点,并提出了各种方法来增强稀疏骨干,例如使用精心设计的卷积[7]、large kernels [8], and transformers [25, 26, 35]。
与所有这些方法不同,我们尽可能少地进行修改来实现这一点,只使用额外的下采样层。默认情况下,简单稀疏的CNN骨干网络有4个阶段,其特征步长为{1,2,4,8}。我们将输出稀疏特征分别命名为{F1,F2,F3,F4}。此设置无法进行直接预测,尤其是对于大型对象。为了增强其能力,我们简单地包括两个额外的下采样层,以获得{F5,F6}的步长为{16,32}的特征。
这种微小的变化直接对扩大感受野产生了显著的影响。我们将最后三个阶段{F4,F5,F6}到Fc的稀疏特征进行组合。它们的空间分辨率都与F4对齐。对于阶段i,Fi是一组单独的特征fp。p∈Pi是三维空间中的一个位置,坐标为(xp,yp,zp)。该过程如图4所示。值得注意的是,这种简单的稀疏串联不需要其他参数化层。稀疏特征Fc和它们的位置Pc被获得为:
图4 VoxelNeXt框架的详细结构。图中带圆圈的数字对应于第3.1节和第3.2节中的段落。1-额外向下取样。2-稀疏高度压缩。3-体素选择。4-框回归。为了简单起见,我们在这里省略了F1、F2和F3的生成。
在附加下采样层的情况下,有效感受野ERF更大,预测框更准确。它足够有效,并且几乎不需要额外的计算,如表2所示。因此,我们使用这种简单的设计作为骨干网络。
稀疏高度压缩
3D对象检测器通过将稀疏特征转换为密集特征,然后将深度(沿z轴)组合为通道维度,将3D体素特征压缩为密集的2D图。这些操作需要占用占用内存和计算。
在VoxelNet中,我们发现2D稀疏特征对于预测是有效的。VoxelNeXt中的高度压缩是完全稀疏的。我们只需将所有体素放在地面上,并在相同的位置对特征进行累加。它的成本不超过1毫秒。我们发现,对压缩的2D稀疏特征的预测成本低于使用3D稀疏特征的成本,如表5所示。压缩的稀疏特征F’c及其位置P’c如下所示:
空间体素修剪
我们的网络完全基于体素。3D场景通常包含大量冗余的背景点,并且对预测几乎没有好处。我们沿着下采样层逐渐修剪不相关的体素。根据SPS Conv[32],我们抑制了具有小特征量值的体素的膨胀,如图6所示。
将抑制比设为0.5,我们仅对特征幅度|fp|(在通道维度上平均)位于所有体素的上半部分的体素进行扩张。体素修剪在很大程度上节省了计算,而不会影响性能,如表3所示。
2.2. 稀疏检测头
体素选择
图4显示了VoxelNeXt模型的详细框架。我们不依赖于密集特征图M,而是直接基于3D CNN骨干网络V∈R的稀疏输出来预测对象 N×F。我们首先预测K类体素的分数,s∈R
N×K。在训练过程中,我们将离每个注释边界框中心最近的体素指定为正样本。我们使用焦点损失[31]进行监督。我们注意到,在推理查询过程中,体素通常不在对象中心。它们甚至不一定在边界框内,例如图中的行人。我们在表7中统计了nuScenes验证集上查询体素的分布。
在推理过程中,我们通过使用稀疏最大池来避免NMS后处理,因为特性足够稀疏。与子流形稀疏卷积[19]类似,它只对非空位置进行运算。这是基于预测的分数s,并针对每个类别单独进行。
我们采用稀疏最大池来选择具有空间局部最大值的体素。去除的体素将被排除在框预测中,这节省了头部的计算。
框回归
从正的或选定的稀疏体素特征v∈Rn×F直接回归边界框。根据CenterPoint[57]中的协议,我们回归位置(∆x,∆y)∈R2,高度h∈R,3D尺寸s∈R3,旋转角度(sin(α),cos(α))∈R2
对于nuScenes数据集或跟踪,我们通过任务定义回归速度v∈R2。这些预测是在训练期间在L1损失函数下监督的。对于Waymo数据集,我们还预测了IoU,并在IoU损失的情况下进行训练,以提高性能[22]。我们简单地使用核大小为3的全连通层或3×3子流形稀疏卷积层进行预测,而不需要其他复杂的设计。我们发现,3×3稀疏卷积比全连接层产生更好的结果,负担有限,如表6所示
2.3 3D跟踪
我们的框架自然扩展到了3D跟踪。CenterPoint[57]通过二维速度v∈R2跟踪预测的物体中心,该速度也受到L1损失的监督。我们将此设计扩展到VoxelNeXt中。我们的解决方案是使用体素关联来包括更多与查询体素位置匹配的轨迹。
如图8所示,我们记录了用于预测每个框的体素的位置。与中心关联类似,我们计算L2距离以进行匹配。通过将查询位置的索引回溯到原始输入体素而不是stride-8位置来选择查询位置。被跟踪的体素存在于输入数据中,其比预测的中心具有更小的偏差。此外,相邻帧之间的查询体素共享与框相似的相对位置。我们的经验表明,体素关联改善了表11中的跟踪。
3.总结及实验结果
文章相对centerpoint 有较大提升,思想源于centerpoint,创新点在于直接使用真值中心最近对应的voxel作为有无目标的回归,而centerpont中还是基于2d特征的heatmap。跟踪时也使用原始查询voxel表现突出。具体指标如下:
原论文:https://arxiv.org/pdf/2303.11301.pdf
相关文章:

VoxelNeXt:用于3D检测和跟踪的纯稀疏体素网络
VoxelNeXt:Fully Sparse VoxelNet for 3D Object Detection and Tracking 目前自动驾驶场景的3D检测框架大多依赖于dense head,而3D点云数据本身是稀疏的,这无疑是一种低效和浪费计算量的做法。我们提出了一种纯稀疏的3D 检测框架 VoxelNeXt。该方法可以…...

必须了解的内存屏障
目录 一,内存屏障1,概念2,内存屏障的效果3,cpu中的内存屏障 二,JVM中提供的四类内存屏障指令三,volatile 特性1,保证内存可见性定义2,禁止指令重排序3,不保证原子性 一&a…...

【设计模式】状态模式
文章目录 前言状态模式1、状态模式介绍1.1 存在问题1.2 解决问题1.3 状态模式结构图 2、具体案例说明状态模式2.1 不使用状态模式2.2 使用状态模式 3、状态模式总结 前言 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示…...
内核驱动支持浮点数运算
最近在调 iio 下的 ICM42686 驱动,因项目求需要在驱动对加速度和陀螺raw数据进行换算,避免不了浮点运算。内核编译时出现了报错,提示如下: drivers/iio/imu/tdk_icm42686/icm42686.o: In function gyro_data2float: /home/share/…...
Flink学习(一)
分布式计算框架 Java可以使用分布式计算来处理大规模的数据和计算任务,提高计算效率和性能。以下是一些Java分布式计算的例子: Apache Hadoop:Hadoop是一个开源的分布式计算框架,可以处理大规模数据集的分布式存储和处理。它使用Java编写,可以在分布式环境中运行MapReduc…...

linux 常用命令awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 AWK用法 awk 用法:awk pattern {action} files 1.RS, ORS, F…...

MySQL学习---15、流程控制、游标
1、流程控制 解决复杂问题不可能是通过一个SQL语句完成,我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分。只要是执行的程序,流程就分为三大类: 1、顺序结…...

信息调查的观念
每次做一件事前都要把这件事调查清楚,比如考一门科目我们要把和这门科目有关的资源都收集起来,然后把再从中筛选出有用的信息,如数值计算方法我们在考试前就可以把b站有关的学习资源网课或者前人总结的考试经验做个收集总结,做出对…...
leetcode 337. 打家劫舍 III
题目链接:leetcode 337 1.题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的…...

基于Docker的深度学习环境NVIDIA和CUDA部署以及WSL和linux镜像问题
基于Docker的深度学习环境部署 1. 什么是Docker?2. 深度学习环境的基本要求3. Docker的基本操作3.1 在Windows上安装Docker3.2 在Ubuntu上安装Docker3.3 拉取一个pytorch的镜像3.4 部署自己的项目3.5 导出配置好项目的新镜像 4. 分享新镜像4.1 将镜像导出为tar分享给…...
c#中slice,substr,substring区别
1. 都使用一个参数: //栗子数据 var arr [1,2,3,4,5,6,7], str "helloworld!"; //防止空格干扰,不用带空格的,注意这里有个!号也算一位 console.log(str.slice(1)); //elloworld! console.log(str.substring(1)); //…...
java语言里redis在项目中使用场景,每个场景的样例代码
Redis是一款高性能的NoSQL数据库,常被用于缓存、消息队列、计数器、分布式锁等场景。以下是50个Redis在项目中使用的场景以及对应的样例代码和详细说明: ##1、缓存:将查询结果缓存在Redis中,下次查询时直接从缓存中获取ÿ…...

Mongo集合操作
2、创建切换数据库 2.1 默认数据库 mongo数据库和其他类型的数据库一样,可以创建数据库,且可以创建多个数据库。 mongo数据库默认会有四个数据库,分别是 admin:主要存储MongoDB的用户、角色等信息 config:主要存储…...

ConvTranspose2d 的简单例子理解
文章目录 参考基础概念output_padding 简单例子: stride2step1step2step3 参考 逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)nn.ConvTranspose2d的参数output_padding的作用torch.nn.ConvTranspose2d Explained 基础概念 逆卷…...

酒精和肠内外健康:有帮助还是有害?
谷禾健康 酒精与健康 饮酒作为一种特殊的文化形式,在我们国家有其独特的地位,在几千年的发展中,酒几乎渗透到日常生活、社会经济、文化活动之中。 据2018年发表的《中国饮酒人群适量饮酒状况》白皮书数据显示,中国饮酒人群高达6亿…...
SylixOS Shell下操作环境变量方法
系统启动后会在内核中生成一份默认的环境变量,环境变量名和默认值由源程序决定。系统启动后如果文件系统中存在有效的/etc/profile文件,则还会自动读取文件中的内容,并导入到Shell环境中,覆盖对应变量或增加新的变量。程序运行时&…...

【dfs解决分组问题-两道例题——供佬学会!】(A元素是放在已经存在的组别中,还是再创建一个更好?--小孩子才做选择,dfs直接两种情况都试试)
问题关键就是: 一个点,可能 新开一个组 比 放到已经存在的组 更划算 因为后面的数据,我们遍历之前的点时,并不知道 所以我们应该针对每个点,都应该做出一个选择就是 新开一个元组或者放到之前的元组中,都尝…...

使用Hexo在Github上搭建个人博客
使用Hexo在Github上搭建个人博客 1. 安装Node和git2. 安装Hexo3. Git与Github的准备工作4. 将Hexo部署到Github5. 开始写作 1. 安装Node和git 在Mac上安装Node.js可以使用Homebrew,使用以下命令安装: brew install node使用以下命令安装Git: …...

【面试题】面试官:说说你对 CSS 盒模型的理解
前言 CSS 盒模型是 CSS 基础的重点难点,因此常被面试官们拿来考察候选人对前端基础的掌握程度,这篇文章将对 CSS 盒模型知识点进行全面的梳理。 我们先看个例子:下面的 div 元素的总宽度是多少呢? js <!DOCTYPE html> &…...
【ROS2】学习笔记
1. 基础概念 1.1 执行单元 1.1.1 executable——执行程序 executable表示针对某个目标的程序执行流程,一个executable可以启动多个node; 1.1.2 node——“进程” node其实就是进程的意思; ROS2允许同时启动两个相同的node,&a…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...