基于全稀疏的单阶段3D目标检测器优化方案

作者:王利民
本文介绍我们在 3d 目标检测领域的新工作:sparsebev。我们所处的 3d 世界是稀疏的,因此稀疏 3d 目标检测是一个重要的发展方向。然而,现有的稀疏3d目标检测模型(如 detr3d[1],petr[2] 等)和稠密3d检测模型(如 bevformer[3],bevdet[8])在性能上尚有差距。针对这一现象,我们认为应该增强检测器在 bev 空间和 2d 空间的适应性(adaptability)。基于此,我们提出了高性能、全稀疏的 sparsebev 模型。在 nuscenes 验证集上,sparsebev 在取得 55.8 nds 性能的情况下仍能维持 23.5 fps 的实时推理速度。在 nuscenes 测试集上,sparsebev 在仅使用 v2-99 这种轻量级 backbone 的情况下就取得了 67.5 nds 的超强性能。如果用上 hop[5] 和 streampetr-large[6] 等方法中的 vit-large 作为 backbone,冲上 70+ 不在话下。
我们的工作已被 iccv 2023 接收,论文、代码和权重(包括我们在榜单上 67.5 nds 的模型)均已公开:
在cver微信公众号后台回复:sparsebev,可下载本论文pdf和代码
sparsebev: high-performance sparse 3d object detection from multi-camera videos
论文:https://arxiv.org/abs/2308.09244
代码:https://github.com/mcg-nju/sparsebev
1. 引言
现有的 3d 目标检测方法可以被分类为两种:基于稠密 bev 特征的方法和基于稀疏 query 的方法。前者需要构建稠密的 bev 空间特征,虽然性能优越,但是计算复杂度较大;基于稀疏 query 的方法避免了这一过程,结构更简单,速度也更快,但是性能还落后于基于 bev 的方法。因而我们自然而然地提出疑问:基于稀疏 query 的方法是否可以实现和基于稠密 bev 的方法接近甚至更好的性能?
根据我们的实验分析,我们认为实现这一目标的关键在于提升检测器在 bev 空间和 2d 空间的适应性。这种适应性是针对 query 而言的,即对于不同的 query,检测器要能以不同的方式来编码和解码特征。这种能力正是之前的全稀疏 3d 检测器 detr3d 所欠缺的。因此,我们提出了 sparsebev,主要做了三个改进。首先,设计了尺度自适应的自注意力模块(scale-adaptive self attention, sasa)以实现在 bev 空间的自适应感受野。其次,我们设计了自适应性的时空采样模块以实现稀疏采样的自适应性,并充分利用长时序的优势。最后,我们使用动态 mixing 来自适应地 decode 采到的特征。
早在今年的2月9日,iccv 投稿前夕,我们的 sparsebev(v2-99 backbone)就已经在 nuscenes 测试集上取得了65.6 nds 的成绩,超过了 bevformer v2[7] 等方法。如下图所示,该方案命名为 sparsebev-beta,具体可见 eval.ai 榜单。
最近,我们采用了一些来自 streampetr 的最新 setting,包括将 bbox loss 的 x 和 y 的权重调为 2.0,并使用 query denoising 来稳定训练等等。现在,仅采用轻量级 v2-99 作为 backbone 的 sparsebev 在测试集上就能够实现 67.5 nds 的超强性能,在纯视觉 3d 检测排行榜中排名第四(前三名均使用重量级的 vit-large 作为 backbone):
在验证集的小规模的 setting(resnet50,704x256)下,sparsebev 能取得 55.8 nds 的性能,同时保持 23.5 fps 的实时推理速度,充分发挥了 sparse 设计带来的优势。
2. 方法
模型架构
sparsebev 的模型架构如上所示,其核心模块包括尺度自适应自注意力、自适应时空采样、自适应融合。
二:不同类别的物体所对应的 query 生成的 τ 值有着明显差异。我们发现,大物体(例如公交车)对应 query 的感受野明显大于小物体对应 query(例如行人)的感受野。(如下图所示。注意:τ 越大,感受野越小)
相比于标准的 mhsa,sasa 几乎没有引入额外开销,简单又有效。在消融实验中,使用 sasa 替换 mhsa 能直接暴涨 4.0 map 和 2.2 nds:
adaptive spatio-temporal sampling
这样,我们生成的采样点可以适应于给定的 query,从而能够更好地处理不同尺寸、远近的物体。同时,这些采样点并不局限于给定的 query bbox 内部,它们甚至可以撒到框外面去,这由模型自己决定。
接着,为了进一步捕捉长时序的信息,我们将采样点 warp 到不同时刻的坐标系中,以此实现帧间对齐。在自动驾驶场景中,有两种类型的运动:一是车自身的运动(ego motion),二是其他物体的运动(object motion)。对于 ego motion,我们使用数据集提供的 ego pose 来实现对齐;对于 object motion,我们利用 query 中定义的瞬时速度向量,并配合一个简单的匀速运动模型来对运动物体进行自适应的对齐。这两种对齐操作都能涨点:
随后我们将 3d 采样点投影到 2d 图像并通过双线性插值获取对应位置的 2d 特征。这里有一个工程上的小细节:由于是六张图的环视输入,detr3d 是将每个采样点分别投影到六个视图中,并对正确的投影点抽到的特征取平均。我们发现,大多数情况下就只有一个投影点是正确的,偶尔会有两个(即采样点位于相邻视图的重叠区域)。于是,我们干脆只取其中一个投影点(即使有时会有两个),把它对应的视图 id 作为一个新的坐标轴,从而可以通过 pytorch 内置的 grid sample 算子的 3d 版一步到位。这样可以显著提速,并且不咋掉点(印象里只掉了 0.1~0.2 nds)。具体可以看代码:
github.com/mcg-nju/sparsebev/blob/main/models/sparsebev_sampling.py.py
对于稀疏采样这块,我们后来也基于 deformable detr 写了一个 cuda 优化。不过,纯 pytorch 实现其实也挺快的,cuda 优化进一步提速了 15% 左右。
我们还提供了采样点的可视化(第一行是当前帧,二三两行是历史前两帧),可以看到,sparsebev 的采样点精准捕捉到了场景中不同尺度的物体(即在空间上具备适应性),且对于不同运动速度的物体也能很好的对齐(即在时间上具备适应性)。
dual-branch sparsebev
在实验中,我们发现将输入的多帧图像分为 fast、slow 两个分支处理可以进一步提升性能。具体地,我们将输入分为高分辨率、低帧率的 slow 分支和低分辨率、高帧率的 fast 分支。于是,slow 分支专注于提取高分辨率的静态细节,而 fast 分支则专注于捕获运动信息。加入 dual-branch 的 sparsebev 结构图如下所示:
dual-branch 设计不光减小了训练开支,还显著提升了性能,具体可见补充材料。它的涨点说明了自驾长时序中的静态细节和运动信息应该解耦处理。但是,它把整个模型搞得太复杂,因此我们默认情况下并没有使用它(本文中只有测试集 nds=63.6 的那行结果用了它)。
3. 实验结果
上表为 sparsebev 与现有方法在 nuscenes 的验证集上的结果对比,其中 † 表示方法使用了透视预训练。在使用 resnet-50 作为 backbone 和 900 个 query,且输入图像分辨率为 704x256 的情况下,sparsebev 超越现有最优方法 solofusion[4] 0.5 map 和 1.1 nds。在使用 nuimages 预训练并将 query 数量降低到 400 后,sparsebev 在达到 55.8 的 nds 的情况下仍能维持 23.5 fps 的推理速度。而将 backbone 升级为 resnet-101 并将输入图像尺寸升为 1408x512 后,sparsebev 超越 solofusion 达 1.8 map 和 1.0 nds。
nuscenes test split
上表为 sparsebev 与现有方法在测试集上的结果对比,其中 † 表示方法使用了未来帧。在不使用未来帧的情况下,sparsebev 取得了 62.7 nds 和 54.3 map;其 dual-branch 版本进一步提升到了 63.6 nds 和 55.6 map。在加入未来帧后,sparsebev 超越 bevformer v2 高达 2.8 map 和 2.2 nds,而我们使用的 v2-99 仅约 70m 参数,参数量远低于 bevformer v2 使用的 internimage-xl(超过 300m 参数)。
4. 局限性
sparsebev 的弱点还不少:
sparsebev 非常依赖 ego pose 来实现帧间对齐。在论文的 table 5 中,如果不使用 ego-based warping,nds 能掉 10 个点左右,几乎和没加时序一样。
sparsebev 中使用的时序建模属于堆叠时序,它的耗时和输入帧数成正比。当输入帧数太多的时候(比如 16 帧),会拖慢推理速度。
目前 sparsebev 采用的训练方式还是传统方案。对于一次训练迭代,dataloader 会将所有帧全部 load 进来。这对于机器的 cpu 能力有较高的要求,因此我们使用了诸如 turbojpeg 和 pillow-simd 库来加速 loading 过程。接着,所有的帧全部会经过 backbone,对 gpu 显存也有一定要求。对于 resnet50 和 8 帧 704x256 的输入来说,2080ti-11g 还可以塞下;但如果把分辨率、未来帧等等都拉满,就只有 a100-80g 可以跑了。我们开源的代码中使用的 training 配置均为能跑的最低配置。目前有两种解决方案:
a.将部分视频帧的梯度截断。我们开源的 config 中有个 stop_prev_grad 选项,它会将所有之前帧都以 no_grad 模式推理,只有当前帧会有梯度回传。
b. 另一种解决方案是采用 solofusion、streampetr 等方法中使用的 sequence 训练方案,省显存省时间,我们未来可能会尝试。
5. 结论
本文中,我们提出了一种全稀疏的单阶段 3d 目标检测器 sparsebev。sparsebev 通过尺度自适应自注意力、自适应时空采样、自适应融合三个核心模块提升了基于稀疏 query 模型的自适应性,取得了和基于稠密 bev 的方法接近甚至更优的性能。此外我们还提出了一种 dual-branch 的结构进行更加高效的长时序处理。sparsebev 在 nuscenes 同时实现了高精度和高速度。我们希望该工作可以对稀疏 3d 检测范式有所启发。


电机保护控制器的接线方法和注意事项
拓维信息与湖南工商大学签署校企战略合作协议
科学家研发获突破,可降低回收锂电池成本
介绍pyverilog分析工具的使用
美行科技高管专访:承上启下,把握方向展望未来
基于全稀疏的单阶段3D目标检测器优化方案
PCB板的堆叠与分层解析
索尼X8500G电视评测 无疑是万元左右价位中一个极具性价比的选择
三相高频斩波式交流稳压装置的研究
简述Zener(齐纳二极管)的使用场景
Fluke 572-2高温红外测温仪的特性和应用范围
树莓派与nanopi的对比
苹果取消打赏抽成!苹果取消微信内容打赏抽成的背后,是屈服还是套路?
人工智能会有意识吗
混合硬盘介绍
EMI实际应用解决方案的学习
开关电源TL431环路接法及传递函数推导
Microchip PIC系列8位单片机入门教程(2):点亮LED灯
CAD-CAM数据转换的新趋势
思科CEO预测联网设备增速超预期 网络安全受关注