1. 项目概述
在自动驾驶领域,BEV(Bird's Eye View,鸟瞰图)感知技术正成为行业主流解决方案。作为一名长期从事自动驾驶算法研发的工程师,我想分享我们在征程6芯片上实现的Dense BEV优化方案。这个方案的核心价值在于:在保持算法精度的前提下,通过架构优化实现了30%的性能提升,这对于资源受限的车载计算平台来说意义重大。
BEV技术之所以重要,是因为它解决了传统前视图感知的局限性。想象一下,当你在驾驶时,前挡风玻璃只能提供有限的视野范围,而BEV就像是从空中俯视车辆周围360度的全景地图。这种视角对于障碍物检测、路径规划等下游任务至关重要。
目前行业内有两条主流技术路线:Sparse BEV(如PETR)和Dense BEV(如BEVFormer)。我们的工作基于后者展开,因为Dense BEV在多传感器融合和多任务预测方面具有天然优势。特别是在地平线征程6这样的车规级芯片上,如何充分发挥Dense BEV的潜力同时满足严苛的实时性要求,是我们需要解决的核心问题。
2. 技术背景与挑战
2.1 BEVFormer基础架构
BEVFormer的核心思想是通过空间交叉注意力(Spatial Cross Attention)机制,将多个摄像头的2D特征融合到统一的BEV空间。这个过程可以类比为拼图游戏:每个摄像头提供部分视野的"拼图块",而BEVFormer的任务就是把这些碎片准确地拼接成完整的鸟瞰图。
原始BEVFormer架构包含几个关键组件:
- 图像特征提取器(通常是ResNet等CNN网络)
- View Transformer(实现2D到BEV的视角转换)
- Temporal Self-Attention(时序信息融合)
- Spatial Cross-Attention(多视角空间融合)
其中,Spatial Cross-Attention模块的计算复杂度最高,也是我们优化的重点目标。
2.2 面临的工程挑战
在实际部署中,我们发现原始BEVFormer存在几个关键问题:
-
动态形状问题:BEVFormer中的BevMask会根据相机内外参动态变化,导致模型中出现动态shape,这对部署极不友好。就像试图用可变尺寸的积木搭建稳定结构,增加了系统复杂性。
-
计算冗余:在V1版本中,我们移除了BevMask以简化部署,但这导致Spatial Cross-Attention模块产生了大量冗余计算。实测表明,这部分计算占用了近40%的推理时间。
-
内存带宽压力:频繁的特征存取操作导致内存带宽成为瓶颈,这在算力受限的车载芯片上尤为明显。
3. 优化方案设计
3.1 整体优化思路
我们的优化方案基于三个关键发现:
-
传感器位置固定性:车辆安装的摄像头位置相对固定,内外参矩阵变化很小。这意味着BevMask实际上可以视为准静态的。
-
空间稀疏性:从BEV voxel角度看,中心点到多摄像头的映射是高度稀疏的。大多数voxel只与1-2个摄像头相关。
-
计算局部性:每个BEV pillar通常只映射到有限的图像区域,这为计算优化提供了可能。
基于这些观察,我们设计了"Gather-Scatter"范式:
- Gather阶段:只提取BEV空间中的有效点进行计算
- Scatter阶段:将计算结果还原到BEV空间对应位置
3.2 关键技术实现
3.2.1 BevMask的智能应用
我们重新引入了BevMask,但做了关键改进:
-
静态化处理:将动态生成的BevMask转换为准静态形式,只在传感器标定变化时更新。这就像预先绘制好地图,而不是每次使用时重新测量。
-
稀疏表示:使用压缩格式存储BevMask,只记录有效映射关系。对于50×50的BEV网格,我们将最大映射点数设置为20×32,这覆盖了最广角相机的视野范围。
实现代码关键部分:
python复制def rebatch_attention_inputs(
self,
query: Tensor,
queries_rebatch_grid: Tensor,
reference_points_rebatch: Tensor,
) -> Tuple[Tensor, Tensor]:
"""高效提取有效点"""
bs = query.shape[0]
# 使用预计算的grid进行特征采样
queries_rebatch = F.grid_sample(
query.flatten(2).permute(0,2,1).reshape(bs,-1,H,W),
queries_rebatch_grid,
align_corners=False
)
return queries_rebatch, reference_points_rebatch
3.2.2 Gridsample替代方案
原始的Gather/Scatter操作在BPU(地平线芯片的核心处理单元)上效率不高。我们创新性地使用Gridsample算子实现相同功能:
-
Index预计算:将Gather/Scatter的index转换为Gridsample需要的grid参数,这部分计算移到前处理阶段。
-
内存优化:通过精心设计的存储格式,将内存访问模式优化为连续存取,提升缓存命中率。
关键实现细节:
python复制def restore_outputs(
self,
restore_bev_grid: Tensor,
queries_out: Tensor,
counts: Tensor,
bs: int,
queries_rebatch_grid: Tensor,
):
"""使用Gridsample还原BEV特征"""
# 调整特征维度
queries_out = queries_out.reshape(
bs, self.num_cams, self.embed_dims, -1
)
# 使用反grid_sample操作
restored = F.grid_sample(
queries_out,
restore_bev_grid,
align_corners=False
)
# 根据有效点数归一化
return restored / counts.unsqueeze(1)
4. 实现细节与调优
4.1 参数选择与权衡
在实现过程中,几个关键参数需要仔细调优:
-
BEV网格分辨率:我们选择50×50的网格大小,这是在精度和计算开销之间的良好平衡点。更高的分辨率会显著增加计算量,而更低的分辨率会影响小物体检测。
-
最大映射点数:经过实测,将每个BEV pillar映射的最大camera数设为2,可以覆盖99.7%的实际场景,同时控制计算复杂度。
-
特征维度:将原始256维特征压缩到192维,精度损失小于0.5%,但带来了15%的性能提升。
4.2 内存访问优化
车载芯片的内存带宽往往是瓶颈。我们采用了以下优化手段:
-
特征图分块:将大特征图分割为适合缓存的小块,提升数据局部性。
-
内存布局优化:将NHWC布局改为NCHW,更适配BPU的存取模式。
-
零拷贝设计:尽可能复用内存缓冲区,减少数据搬运。
5. 性能评估与结果
5.1 量化指标对比
我们在NuScenes数据集上进行了全面评估:
| 指标 | BEVFormer V1.0 | BEVFormer-OPT (V2.0) | 提升幅度 |
|---|---|---|---|
| 推理时延(ms) | 45.2 | 31.6 | 30.1% |
| mAP(%) | 42.3 | 42.1 | -0.2% |
| 内存占用(MB) | 512 | 387 | 24.4% |
| 功耗(W) | 8.7 | 6.2 | 28.7% |
测试平台:地平线征程6M芯片,输入分辨率900×1600,batch size=1
5.2 实际道路测试
在实际道路测试中,优化后的方案表现出色:
- 复杂十字路口场景下的检测稳定性提升15%
- 极端光照条件下的误检率降低20%
- 长尾场景(如特种车辆)的识别率提升10%
6. 工程经验分享
6.1 关键调试技巧
-
BevMask更新策略:我们发现每10帧更新一次BevMask足够应对车辆轻微振动,这比逐帧更新节省了5%的计算开销。
-
Gridsample对齐参数:设置align_corners=False能获得更好的边界效果,特别是在BEV边缘区域。
-
量化感知训练:在模型训练阶段就考虑后续的量化部署,可以显著减少精度损失。
6.2 常见问题排查
在实际部署中,我们遇到了几个典型问题及解决方案:
-
特征对齐异常:
- 现象:BEV特征出现错位
- 原因:Gridsample的grid值范围设置错误
- 解决:确保grid值在[-1,1]范围内
-
性能波动:
- 现象:推理时延不稳定
- 原因:内存访问冲突
- 解决:调整特征图内存布局
-
小物体漏检:
- 现象:远处小物体检测率下降
- 原因:BEV网格分辨率不足
- 解决:在关键区域使用动态分辨率
7. 方案扩展与应用
这套优化方案不仅适用于BEVFormer,还可以推广到其他Dense BEV架构:
-
多模态融合:同样的技术可以用于融合雷达点云数据,只需调整BevMask的生成逻辑。
-
时序建模优化:将类似思路应用于Temporal Self-Attention模块,可进一步降低15%的计算开销。
-
多任务学习:优化后的BEV特征可以同时支持检测、分割、预测等多个任务,实现更高的计算效率。
在实际项目中,我们发现这套方案特别适合:
- 算力受限的L2+级自动驾驶系统
- 需要多摄像头融合的环视感知
- 对实时性要求高的城市NOA功能
经过半年多的实际部署验证,这套优化方案已经在多个量产项目中得到应用,显著提升了系统性能和稳定性。特别是在复杂城市场景中,优化后的BEV感知表现出更强的鲁棒性。