自动驾驶感知不是单帧的事,时序信息对运动目标预测、遮挡恢复、假阳性过滤都至关重要。我在一个高速NOA项目里做了基于征程6M的时序BEV融合,把多帧BEV特征对齐、时序注意力、轨迹预测三个模块跑通。这篇把设计思路和踩坑经验记下来。
一、时序BEV融合架构
时序融合的核心问题:如何把历史帧的BEV特征和当前帧对齐?
我们的方案:
1. ego-motion补偿:根据车辆自身的运动(速度、yaw rate),把历史BEV特征投影到当前帧的坐标系
2. 时序特征聚合:用3D卷积或Transformer聚合多帧特征
3. 轨迹预测头:基于聚合后的时序特征,预测目标未来3秒的轨迹
二、Ego-motion补偿
车辆运动时,历史帧的BEV特征需要补偿ego-motion才能和当前帧对齐。
补偿公式:
```python
# 历史帧BEV特征投影到当前帧
# R: 旋转矩阵(根据yaw rate积分得到)
# t: 平移向量(根据速度积分得到)
bev_current = warp(bev_past, R, t)
```
征程6部署时,warp操作可以用BPU的AAE(Advanced Acceleration Engine)加速。AAE支持warping/resizing等图像变换算子,比用CPU做快10倍以上。
踩坑记录:
一开始我用PyTorch的F.affine_grid+F.grid_sample做warp,导出ONNX后产生GridSample算子。老版本OE(
解决方案:
1. 升级到OE 3.5.0+,新版对GridSample的支持更完善
2. 或者把GridSample拆成可分离的平移+旋转,用BPU原生支持的算子组合实现
3. 如果精度要求不高,可以用最近邻插值替代双线性插值,减少计算量
三、时序特征聚合
多帧BEV特征聚合的几种方案:
方案 延迟 内存 精度 适用场景
3D卷积 低 中 中 短时时序(2-4帧)
时序Transformer 高 高 高 长时时序(8-16帧)
简单concat 最低 低 低 对时序要求不高
滑动平均 最低 最低 低 实时性优先
推荐方案:3D卷积
3D卷积在时间维度上做kernel=3的卷积,相当于"短时记忆"。部署到征程6时:
```python
self.temporal_conv = nn.Conv3d(
in_channels=256,
out_channels=256,
kernel_size=(3, 1, 1), # 时间维度3帧,空间1×1
stride=(1, 1, 1),
padding=(1, 0, 0), # 时间维度padding=1
groups=1
)
```
注意kernel_size的格式是(T, H, W)。时间维度3帧,空间维度1×1(不做空间卷积,只做时序聚合)。
四、轨迹预测头
轨迹预测头输入是聚合后的时序BEV特征,输出是每个目标未来K个时间点的位置(K=6,对应3秒,每0.5秒一个点)。
踩坑记录:
轨迹预测头的输出是(batch, num_objects, K, 2)(2表示x,y坐标)。ONNX导出时,num_objects是动态的(每张图的目标数不一样),hb_mapper不支持。
解决方案:
1. 固定最大目标数:设max_objects=100,不足100的padding,超过100的截断
2. 把预测头拆出来:BPU只跑特征提取和编码,轨迹预测在CPU上用轻量级MLP做
推荐方案2。轨迹预测的MLP很小(输入256维,隐藏64维,输出12维),CPU上跑只需要0.5ms,不影响实时性。
五、性能优化
时序融合的性能瓶颈在内存带宽(多帧BEV特征来回读写)。优化策略:
1. BEV特征压缩:从256维压缩到64维,内存降为1/4
2. 帧间隔采样:不做逐帧融合,每2帧或每3帧融合一次
3. 内存复用:历史帧特征buffer原地复用,不重复申请
优化后在J6M上的性能:
· BEV特征提取:6路摄像头并行,约15-20ms
· 时序融合:3帧聚合,约3-5ms
· 轨迹预测:CPU上约0.5ms
· 总延迟:约20-25ms,帧率40fps
六、踩坑记录
· 坑1:时序融合保存太多历史帧(>8帧),DDR带宽不够,推理出现周期性卡顿。建议历史帧≤4。
· 坑2:ego-motion补偿的旋转矩阵精度不够(float16),高速场景下(>100km/h)对齐误差累积。建议用float32计算旋转矩阵,补偿完再转回fp16。
· 坑3:时序Transformer的attention权重在int8量化后出现"注意力崩溃"(所有权重趋同)。解决:attention层用int16,或在QAT训练时对attention做特殊的校准策略。
七、顺便提一嘴
· 时序融合对遮挡恢复很有效。比如前车被遮挡了2帧,单帧检测会漏检,但时序融合可以通过历史帧的特征"脑补"出被遮挡的目标。
· 征程6P的DDR带宽比6M高很多,时序融合可以上更多历史帧(8-16帧),精度提升明显。
· 如果项目预算有限,可以用"滑动平均"做时序融合的降级方案,几乎不增加延迟,精度比单帧好5-10%。
数据来源:本文时序融合方案参考地平线开发者社区官方博客《地平线 征程 6 工具链进阶教程 | 多任务 不同帧率 部署方案介绍》及BEV感知相关技术文档。
