news 2026/2/11 17:34:42

上手实操 | Dense Bev 融合优化方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
上手实操 | Dense Bev 融合优化方案

1. 简介

在自动驾驶领域,BEV 是一种从上方看对象或场景的视角,通过多个不同视场的传感器融合成 BEV 特征,可以提供车辆周围环境的完整视图,供下游任务使用,例如障碍物检测,路径规划等。

基于 BEV 的环境感知目前主要是有两种技术路线,一种是以 petr 为代表的 sparse bev 方法,它的主要思路是通过 3D 位置编码和 2D 的特征直接生成融合特征,再用基于 transformer 的 decoder 实现环境感知,这个过程不需要显式地生成 Dense Bev 特征; 另一种是以 bevformer 为代表的 dense bev 方法,该方法利用内外参信息将 2D 特征融合到一个 BEV 特征,再用 BEV 特征来进行后续的感知或规划任务。基于 Dense Bev 的方法,可以很方便地实现多传感器融合和多任务预测,因此在自动驾驶领域被广泛应用。

地平线面向智驾场景推出的征程 6 系列(J6)芯片,在提供强大算力的同时带来了极致的性价比。BEVFormer 是当前热门的自动驾驶系统中的 3D 视觉感知任务模型,我们基于 BevFormer 与征程 6 芯片,优化了多视图融合生成 Dense Bev 特征的方案,进一步提升基于 Dense Bev 的算法推理效率。本文将详细介绍参考算法对 BevFormer 中 ViewTransformer 优化方法以及模型端侧的表现。

2. 性能精度指标

  1. BEVFormer 为参考算法 V1.0 版本,BEVFormer-OPT 为优化后的参考算法 V2.0 版本

地平线 3D 目标检测 Bevformer 参考算法-V2.0);

  1. BEVFormer-OPT 使用了 Dense Bev 的优化方案;

3.优化方法介绍

3.1 整体架构

本文的 Dense Bev 方案是基于 BevFormer 的模型结构进行优化而来,参考算法 BevFormer 介绍见地平线 3D 目标检测 Bevformer 参考算法-V1.0, 这里不再赘述。

在 BevFormer 中,SpatialCrossAttention 模块是用来做空间融合的,即将多个 2D 视图特征融合成 Bev 特征,由于公版的 BevMask 会根据内外参进行动态变化,进而导致模型中出现动态 Shape,对部署非常不友好,因此在 V1 版本中我们直接去掉了 BevMask,虽然对部署更友好了,但是 SpatialCrossAttention 模块多了很多冗余的计算和 IO,对性能影响很大。整体框架如下图所示:

3.2 方案优化点

3.2.1 使用 BevMask

在优化方案中,我们对内外参生成 BevMask 的原理做了详细的分析,发现:

  1. 当相机传感器位置固定时,内外参转换矩阵即固定,轻微抖动对 BevMask 影响不大。
  2. 从 BEV voxel 的角度来看,中心点到 multi camera 的映射是稀疏的,在 BevFormer 开源的代码和模型中,默认利用了这个特性,加速计算而不会带来任何精度损失(也就是上面说的 bev_mask)
  3. 从 BEV pillar 的角度来看,通常每个 pillar 只会映射到 1-2 个 camera,如上图右上角所示。

利用到上面的几个特性我们可以减少空间融合模块的复杂度,但需要引入一对 gather/scatter 操作,以及相关的 index 计算。即先通过 gather 将 bev 空间上的有效点取出来,计算完空间特征融合后,再用 scatter 将其还原到 Bev 空间对应的位置,然后根据每个 bevpillar 的有效点数来算 Bev 空间每个点的均值即可。

整体框架如下图所示:

为了能编译成静态模型,有 2 个额外需要关注的设置:

  1. Bev 空间映射到每个 camera 的最大点数。这个可以根据内外参计算得到,但为了应对一些抖动情况,可以适当放开,在 Nuscenes 数据集上,50*50 大小的 Bevsize 下,我们设置为 20*32。 这个数字直观理解就是,最大视场的相机在 Bev 空间覆盖的区域大小。
  2. 每个 BEV pillar 映射到的最大的 camera 数。目前是一个静态设置的最大值,可以根据数据统计得到,在 Nuscenes 数据集中,我们设定为 2, 这个数字直观理解就是有视野重叠的最大 camera 数。

代码均在算法包位置:

hat/models/task_modules/bevformer/attention.py

# 对输入的Bevquery和reference_points取出有效点 def rebatch_attention_inputs( self, query: Tensor, queries_rebatch_grid: Tensor, reference_points_rebatch: Tensor, ) -> Tuple[Tensor, Tensor]: """Rebatch the attention inputs.""" bs = query.shape[0] ... return queries_rebatch, reference_points_rebatch # 将SpatialCrossAttention模块的输出映射会Bevfeat上,并求均值 def restore_outputs( self, restore_bev_grid: Tensor, queries_out: Tensor, counts: Tensor, bs: int, queries_rebatch_grid: Tensor, ): """Restore outputs to bev feature.""" queries_out = queries_out.reshape( bs, self.num_cams, self.embed_dims, -1 ) ... return slots

3.2.2 使用 Gridsample 高效实现 Gather 和 Scatter

gather/scatter 这一对操作在 BPU 上不是很友好,通过分析这对操作的 index 我们发现可以换成 BPU 更友好的方式,即使用 Gridsample 来实现这一对操作。Index 只受 camera 内外参的影响,而往往内外参的变化是非常低频的,因此,我们可以把 index 生成的逻辑放在前处理,按需触发计算,再把生成好的 index 转换为对应 Gridsample 需要的 grid 作为模型输入给到模型,供 Gridsample 算子直接使用,代码均在算法包位置:

hat/models/task_modules/bevformer/view_transformer.py

  1. 根据 Gather 的 Index 计算 Gridsample 的 Grid:
bev_mask = bev_mask.permute(2, 1, 3, 0, 4).squeeze(-1) max_len = self.virtual_bev_h * self.virtual_bev_w queries_rebatch_grid = reference_points_cam.new_zeros( [B * self.numcam, self.virtual_bev_h, self.virtual_bev_w, 2] ) ... reference_points_rebatch = ( reference_points_cam.flatten(-2) .permute(1, 0, 3, 2) .flatten(0, 1) .reshape(B * self.numcam, D * 2, self.bev_h, self.bev_w) )
  1. 根据 Scatter 的 Index 计算 Gridsample 的 Grid 和 每个 Bev Pillar 对应的有效点数:
bev_mask_ori = bev_mask.clone() bev_mask = bev_mask.permute(1, 0, 2, 3) restore_bev_grid = ( reference_points_cam.new_zeros( B, self.max_camoverlap_num * self.bev_h, self.bev_w, 2 ) - 1.5 ) ... restore_bev_grid = restore_bev_grid * 2 - 1 bev_pillar_counts = bev_mask_ori.sum(-1) > 0 bev_pillar_counts = bev_pillar_counts.permute(1, 2, 0).sum(-1) bev_pillar_counts = torch.clamp(bev_pillar_counts, min=1.0)

4.总结

4.1 优化策略小结

  1. 引入 BevMask, 可以大幅度降低空间融合模块的计算量和 IO;
  2. 根据模型特征,使用 BPU 友好的 OP。

4.2 总结

本文主要介绍了基于 Bevformer 优化的 DenseBev 方案,通过减少冗余计算和 IO,使用 BPU 友好 OP,相比于 v1.0 版本模型,这种方案在精度相当的情况下,在 征程 6M 平台上推理性能提升 30%。同时,这种 DenseBev 的优化经验可以推广到其他相似结构或相似使用场景模型的部署中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 11:48:39

OpenFlow是什么

文章目录OpenFlow的起源与发展OpenFlow的工作原理OpenFlow的应用场景OpenFlow是一种网络通信协议,应用于SDN架构中控制器和转发器之间的通信。软件定义网络SDN的一个核心思想就是“转发、控制分离”,要实现转、控分离,就需要在控制器与转发器…

作者头像 李华
网站建设 2026/2/11 16:43:48

亚马逊、temu、希音等平台自养号采购、代采系统怎么搭建?

构建稳定、安全、高效的自养号采购系统,远不止于批量注册账号,而是一项需要从技术底层到操作流程全方位设计的系统工程。其关键在于创建多个独立、可信的数字身份,形成可长期运作的采购网络。以下是构建此类系统的核心要素与实施路径。一、环…

作者头像 李华
网站建设 2026/2/8 20:06:28

智慧边检空间智能平台建设方案——基于空间视频感知与统一空间智能底座的新一代边检监管体系

智慧边检空间智能平台建设方案——基于空间视频感知与统一空间智能底座的新一代边检监管体系建设单位:镜像视界(浙江)科技有限公司一、建设背景:边检监管进入“全过程智能化”阶段随着国际人员流动规模持续扩大,口岸边…

作者头像 李华
网站建设 2026/2/5 22:52:18

10种实测靠谱的降ai率工具名单:教你如何科学降低ai率,实现ai降ai,目前最全的免费降低ai率教程。

又到了论文开题季,很多同学发现,自己用AI辅助写完的论文,AIGC率高得吓人。明明只是润色,检测却显示“高风险AI生成”。面对这个论文降ai的难题,盲目手改往往收效甚微。 别慌。市面上已经有很多工具可以辅助降低ai率。今…

作者头像 李华
网站建设 2026/2/2 17:09:49

Node.js 真的是单线程?前端老铁别被忽悠瘸了!

Node.js 真的是单线程?前端老铁别被忽悠瘸了!Node.js 真的是单线程?前端老铁别被忽悠瘸了!先给“单线程”这仨字儿上柱香主线程日常:一个 event loop 的社畜生活libuv:藏在床底下的“时间管理大师”Worker …

作者头像 李华
网站建设 2026/2/10 11:43:31

HDFS 在大数据领域的数据存储发展方向

HDFS 在大数据领域的数据存储发展方向 关键词:HDFS、大数据存储、分布式文件系统、数据湖、存储架构、数据管理、未来趋势 摘要:本文深入探讨了Hadoop分布式文件系统(HDFS)在大数据领域的数据存储发展方向。我们将从HDFS的基本原理出发,分析其当前的技术架构和局限性,然后详…

作者头像 李华