Sparse4D,一文带你了解稀疏的BEV感知!

作者 | Malignus 编辑 | 自动驾驶之心

原文链接:https://zhuanlan.zhihu.com/p/15362624581

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心BEV感知技术交流群

本文只做学术分享,如有侵权,联系删文

许久没有更新了,自从开始工作以后愈发的困在了Corner Case和各种各样的琐事,闲言少叙,这篇文章将用尽可能简洁的语言,帮助各位大佬了解地平线的Sparse 4D系列工作。(PS:对于Sparse4D中,不同帧间的信息不再依赖各自帧内的ego2global部分就不做介绍了,大佬工作的代码写的很清晰,有这样一个概念即可~)

Summary

  • 环视障碍物的检测,将不依赖显式的稠密BEV特征进行学习。

  • 基于K-Means的初始化Anchor, 让模型拥有更快的收敛速度,且Query的可解释性更好

  • 引入去噪过程,模型可更快收敛。

  • 考虑3D检测特点,引入质量估计

  • 以检测结果为基础,可出Tracking结果,不依赖BEV下的多目标追踪后处理

Methods

接下来,我们将分开两部分介绍模型结构部分;分开两部分的原因,是因为Denoising并不影响整体模型训练的pipeline,拆开两部分,可更好帮助各位大佬理解整体工作。

  1. 介绍模型整体的forward流程,包括Loss的设计

  2. 介绍Denoising的使用

Overall Pipeline

一言以蔽之:模型将基于query_based的instance_feature和anchor,进行整体的稀疏BEV感知;图像特征将不进行显式的深度信息编码,模型基于anchor的中心点,通过offset的学习,将图像特征引入至instance_feature。

接下来将基于开源的代码,进行尽可能简短的模型forward pipeline介绍。

  • instance_feature和anchor起始存储于instance_bank内。anchor(,11)的初始化,是基于GT的kmeans计算得到。对应的11维信息:[x,y,z,l,w,h,,,,,state]. 其中, 所有anchor的速度为0yaw角为0,最后一维信息可不关注,仅与denoise相关。模型在训练过程中,anchor会伴随着模型的学习更新。但在每一个iter的forward开始,instance_bank内取到的初始化当前帧instance_feature都是全0(即instance_feature永远依赖于当前图像特征的提取,和后续的注意力计算)。

  • 在通过Transformer进行forward过程中,operation主要包括:deformable, ffn, norm, refine, temp_interaction, interaction在内的六部分。其中,ffn, norm很好理解,重点介绍deformable, refine, temp_interaction, interaction四部分。

    • 单帧decoder: deformable+FFN+Norm+Refine

    • 多帧decoder: temp_interaction+interaction+norm+deformable+ffn+norm+Refine

    • 模型整体包括两类decoder:

其中,Deformable模块负责将图像特征引入;Refine模块负责基于instance_feature获取感知结果;temp_interaction负责对当前帧特征信息与历史特征信息进行融合; interaction负责将当前帧特征进行自注意力计算。

  • deformable(图像特征引入):前面提到,Sparse4D中,模型将不在学习稠密的显式BEV特征。图像特征的使用主要依赖该module。该模块的作用,是将图像特征基于anchor和采样点,对instance_feature进行更新(即引入图像特征)。

  • deformable依赖的输入包括instance_feature, anchor, anchor_embed, feature_maps与projection_mat. 最终输出的结果将用于更新instance_feature.

  1. instance_feature[B,,256]: 当前帧的instance feature, 模型在每一轮forward时,第一次进入deformable中的instance_feature结果都是全0,是通过若干次调用deformable module的过程中,图像特征的不断引入堆叠才得到最终的instance_feature.

  2. anchor:[B,,11]当前帧的anchor,即可能会存在于当前帧的框体的位置和对应大小的预设。

  3. anchor_embed:[B,,256]当前帧anchor对应的position_embedding。

bbf03d8f13fea121bbfccbe7dc8b7327.png

图像特征引入模块的forward流程五步走:

  1. 获取key_points[B,,,3]:基于anchor_embed求解anchor中心点的对应位置偏移量,与anchor相加后得到key_points。此处的指代的是anchor中心点对应采样在图像中采样点的个数,论文中=8.

  2. 获取多尺度图像特征采样的权重weights[B,,,]:对已有的instance_feature分别引入框体的位置编码信息(anchor_embed)和相机参数的编码信息(基于ego2img的全连接层进行的编码信息). 并通过全连接层和softmax层,以及15%的随机掩码,得到weights。论文中=8,=8(的引入理解为multi-head attention就好)。

  3. 获取采样后的图像特征features[B,,,256]: 基于ego2img, 将key_points的点投影到图像特征中的归一化位置(在[0, 1]位置内)。通过grid_sample采样每个key_points在图像上的对应特征。对于采样点经ego2img投影后不在图像范围内的情况,对应features为0。

7fd79b31f3d8b91a2dd96d39ea60903f.png
  1. refine(基于instance_feature和anchor,基于全连接层得到感知结果):

  2. 整体输入依赖instance_feature, anchor与anchor_embed,最终的输出结果包括:经过refine后的anchor[B,,11],对应anchor的类别分类[B,,],质量分析(quality)[B,,2] (值范围在[0,1]区间内)

  3. refine模块流程三步走:

  • 基于已有instance_feature和对应的anchor位置编码信息相加, 得到instance_feature

  • instance_feature通过全连接层得到anchor的偏移量,相加后更新anchor。

  • quality, cls全连接层得到对应的质量结果和分类结果。

  1. temp_interaction(基于当前帧特征和历史特征,进行交叉注意力学习):输入包括instance_feature(当前帧特征[B,,256]), temp_instance_feature(历史帧特征[B,,256]), 对应的位置编码信息anchor_embed&temp_anchor_embed。

  2. interatcion(基于当前帧特征,进行自注意力学习):输入包括instance_feature(当前帧特征[B,,256])。对应位置编码信息anchor_embed

  • 历史特征(temp_instance_feature),历史anchor(temp_anchor)及当前帧anchor、当前帧特征的获取(get),是从instance_bank内获取,在Det_head每一轮forward的起始去做,获取的过程中,会基于历史特征和当前帧特征的时间间隔,进行mask判断;历史帧的anchor会基于ego2global信息进行基础的运动补偿,统一至当前帧下。

  • 基于历史特征,历史anchor和当前帧的anchor,当前帧的特征及对应confidence对当前帧特征和anchor的更新,是在模型经过单帧decoder forward后进行的,是通过concat当前帧的top与历史帧的得到。即instance_feature在基于采样点引入对应图像特征后,选取对应topk的当前帧特征,与历史帧特征融合,作为新的instance_feature&anchor,随后进行多帧decoder的forward。

  • 基于完整forward后instance_feature, anchor及对应的confidence,对instance_bank内的特征进行更新。选择confidence最高的top作为新的历史特征(temp_instance_feature)和历史anchor(temp_anchor)。

Loss

Loss部分将仅针对Quality部分进行讲解

  1. cns_target: 预测与真值在x,y,z上面的l2距离误差:dist,最小值为0,最大值为无穷,所对应的,值域为(0, 1].即误差越大,对应值越接近0。

  2. yns_target: 预测与真值在sin(yaw)和cos(yaw)的余弦相似度,若相似度大于0,yns_target为1.0,反之为0。反映的是预测与真值在yaw角的预测上是否可保证是在同一方向上。

  3. 模型输出的cns和yns与对应target进行loss计算,其中cns用交叉熵损失计算,yns用高斯focal loss计算

个人理解,该部分的loss学习,本质上是强调模型对于目标障碍物的中心点(特别是深度)和yaw角的预测,因为本质上对于图像进行3D检测的ill-posed问题,yaw角和深度的预测就是最关键,最难的问题。(个人也有一些瞎想,即现有的learning-based prediction&planning, 也在强调在一味的模仿学习基础上,要学习人类的判别逻辑/或提供奖励函数等等;此处的quality是否也可作此理解呢?)

Denoising

一言以蔽之:Denoising中在loss计算部分,与正常anchor的loss计算一摸一样;Denoising的作用,在于绕过了匈牙利匹配,在去噪的过程中,直接优化检测头。李峰:[CVPR 2022 Oral]DN-DETR: 去噪训练加速DETR收敛 评论区大佬的这个解释让我茅塞顿开

其实detection任务可以类比成image domain到box domain的机器翻译问题。自然语言的翻译问题通常需要在两种语言上都有预训练才能work的比较好。ImageNet预训练的backbone使得我们有了很好的image domain预训练模型,但box domain我们是没有预训练模型的,只能利用image-box pair在训练过程中强行拟合。本文利用GT生成的noisy query更像是在box domain构造了一个自监督task,有效地缓解了box domain没有预训练模型的问题。类似思路在Pix2seq中也有体现。

  1. Denoising部分只在训练过程中引入,并不会影响模型的infer阶段

  2. 获取denoising的相关信息,

最终得到的输出包括:

74d7a18904b5fae8bfe2146e544e3760.png
  • Forward pipeline

  1. 设置了max denoising GT=24,如果当前batch_idx下的GT中周边障碍物数量大于该数量,则取前24个,否则取全量的GT。获取的GT信息包括分类信息和对应的框体信息(x,y,z,l,w,h,yaw,vx,vy)。

  2. 统计当前batch_size中最多的GT数量,上限为max denoising_GT的数量。

  3. 对cls_target和box_target中,batch_idx中不足最大GT数量的样本进行补齐。其中,cls_target补-1, box_target进行对应的全零补齐。

8e9c3a018d0fedcf84a21a6770316b48.png
  1. 求解box_cost,对应得到每一个加入噪声后的dn_anchor, 其去噪后最接近的box_target。

  2. 基于box_cost得到的匈牙利匹配结果,构建dn_box_target和dn_cls_target。其中,positive的部分由于添加的噪声较小,对应的target就是GT的cls_target和box_target,而negative部分,对应的box_target为全0,cls_target为全部-3。

aee80cefb317d84e30ce40eca515cb05.png

原有的anchor中包括的11维的输入,其中最后一维本身是没用的,可能是作为dn_anchor和anchor的区分位置
dn_anchor补齐最后一维的shape,最后一个remain_state_dim为0。并与anchor进行concat。此时的anchor_shape,为 [B,N]
构建attn_mask, 在计算自注意力机制时,对不同的query之间的attention进行mask。最终的目的,在于正常的query进行进行self_attention时,不会看到各个group的denoising query信息(防止GT信息泄漏)。同时各个denoising query在进行self_attention计算时,也不会看到正常的query和其他group的query信息(防止one-to-one的assignment,变成了n to one)。此处的信息泄露,是指denoising_query中的信息,是在GT基础上加小幅度扰动得到的,把近乎百分之百准确的投影点投回到图像中拿的query肯定很准,用这样的信息给原有的query看到属于泄题,会完全影响模型学习。

Thinking

个人在初次读完Sparse4D的系列工作,第一感觉是好屌,而且代码的工程量开发好大。但后续再阅读了DAB-DETR,DN-DETR和DINO在内的三篇工作后,发现Sparse4D的系列工作更多是踩在巨人的肩膀上,进一步完善了环视障碍物的BEV检测任务。在这里也推荐作者本人在知乎进行的论文分享~李峰:DINO: 让目标检测拥抱Transformer 李峰:[CVPR 2022 Oral]DN-DETR: 去噪训练加速DETR收敛

有一些美中不足的地方和可能可以去改进的点,一方面在于,由于没有显式的深度信息学习,导致基于anchor的中心及对应offset往回投影学习图像特征时,无法考虑到目标车辆部分被前车遮挡的情况。能想到的一些解决思路,是通过GT提供分割结果,一定程度上约束图像特征投影点学的是统一的instance。

碎碎念

由于自己的懒惰,导致大半年的时间长期没有进行认真系统的论文阅读。在读Sparse4D的工作时,需要结合开源的代码逐行阅读,一点一点厘清思路。但当最近系统化的再次阅读了DETR系列的相关工作,会发现Sparse4D更多的是站在了巨人的肩膀上,将BEV障碍物检测的性能再次拔高了一个台阶。

年底了,在这里也立个小flag,尽量保证至少两周一次的更新频率维护我的论文分享,也希望各位大佬不吝指正赐教。个人能力有限,很多分享难免会有纰漏,也欢迎各位大佬进行指正

① 2025中国国际新能源技术展会

自动驾驶之心联合主办中国国际新能源汽车技术、零部件及服务展会。展会将于2025年2月21日至24日在北京新国展二期举行,展览面积达到2万平方米,预计吸引来自世界各地的400多家参展商和2万名专业观众。作为新能源汽车领域的专业展,它将全面展示新能源汽车行业的最新成果和发展趋势,同期围绕个各关键板块举办论坛,欢迎报名参加。

a8c3d8b37ca920bafaf816f2c8fe5fe7.jpeg

② 国内首个自动驾驶学习社区

『自动驾驶之心知识星球』近4000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知端到端自动驾驶世界模型仿真闭环2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型,更有行业动态和岗位发布!欢迎扫描加入

e1d81b488201056ddcff2692307191a6.png

 ③全网独家视频课程

端到端自动驾驶、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、CUDA与TensorRT模型部署大模型与自动驾驶NeRF语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

2022d0f5375f9e0649c58d0c4d2cbb00.png

网页端官网:www.zdjszx.com

④【自动驾驶之心】全平台矩阵

078a54d8f2e85332e4ae840359ec98bb.png

### Sparse4D BEV Implementation and Usage Sparse4D 是一种创新性的方法,旨在通过稀疏场景表示来优化自动驾驶车辆和其他计算机视觉任务中的三维物体检测。这种方法不仅提升了感知性能,还在 nuScenes 排行榜上超越了现有的一些算法[^3]。 #### 方法概述 Sparse4D 主要特点在于其能够处理多时间戳和多视角的数据,并利用这些数据进行特征级融合以及迭代式的边界框回归。具体而言: - **多时间戳与多视图特征融合**:该模型接收来自不同时间和角度的信息输入,从而增强了对于动态环境的理解。 - **迭代细化机制**:为了更加精确地定位目标对象的位置及其形状,采用了一个逐步调整的过程来进行最终预测。 这种设计使得 Sparse4D 可以有效地减少冗余计算量并加快处理速度,同时保持较高的精度水平。 #### 技术细节 在实际应用中,Sparse4D 实现的关键要素包括但不限于以下几个方面: 1. **稀疏场景建模** 使用稀疏表征而非传统的密集鸟瞰图(BEV)特性,这有助于降低内存消耗和加速运算过程。相比于基于 BEV 的方案,这种方式减少了不必要的特征采样需求,降低了硬件资源的要求[^2]。 2. **深度重估模块增强** 为进一步改善深度估计的质量,在未来版本里计划引入多视图立体匹配(MVS)技术,以便获取更为精准的距离测量结果。此外,考虑到摄像头内参的影响因素,适当调整编码器结构也有助于提高跨平台下的泛化表现力。 3. **高效能架构支持** 整体网络被精心设计成易于部署的形式,特别适合应用于边缘端设备之上。即使是在有限算力条件下也能维持良好运作状态,满足实时性要求极高的应用场景所需。 ```python import torch from sparse4d import SparseSceneModel, DepthRefinementModule def process_sparse_bev(data): # 初始化稀疏场景模型实例 model = SparseSceneModel() # 加载预训练权重文件 (假设已下载至本地路径) checkpoint_path = 'path/to/checkpoint.pth' state_dict = torch.load(checkpoint_path)['state_dict'] model.load_state_dict(state_dict) with torch.no_grad(): output = model(data['multi_timestamp_views']) refined_output = DepthRefinementModule()(output) return refined_output ``` 此代码片段展示了如何加载预先训练好的 `SparseSceneModel` 并对其进行推理操作。注意这里省略了一些具体的初始化配置步骤,实际使用时需参照官方文档完成相应设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值