该示例为参考算法,仅作为在 征程 6 上模型部署的设计参考,非量产算法
简介
BEVFormer 是当前热门的自动驾驶系统中的 3D 视觉感知任务模型。BEVFormer 是一个端到端的框架,BEVFormer 可以直接从原始图像数据生成 BEV 特征,无需依赖于传统的图像处理流程。它通过利用 Transformer 架构和注意力机制,有效地从多摄像头图像中学习生成高质量的鸟瞰图(Bird’s-Eye-View, BEV)特征表示。相较于其他的 BEV 转换方式:
- 时空注意力机制:模型结合了空间交叉注意力(Spatial Cross-Attention, SCA)和时间自注意力(Temporal Self-Attention, TSA),使网络能够同时考虑空间和时间维度上的信息。融合历史 bev 特征来提升预设的 BEV 空间中的 query 的自学能力,得到 bev 特征。
- Deformable attn:通过对每个目标生成几个采样点和采样点的 offset 来提取采样点周围的重要特征,即只关注和目标相关的特征,减少计算量。
- transformer 架构:能够有效捕捉序列中的长期依赖关系,适用于处理图像序列。
性能精度指标
模型参数:
性能精度表现:
模型介绍
·公版 BEVFormer 模型主要可以分为以下几个关键部分:
- Backbone 网络:用于从多视角摄像头图像中提取特征,本文为 tiny 版本,因此为 ResNet50。
- 时空特征提取:BEVFormer 通过引入时间和空间特征来学习 BEV 特征。具体来说,模型包括:
- Temporal Self-Attention(时间自注意力):利用前一时刻的 BEV 特征作为历史特征,通过自注意力机制来计算当前时刻的 BEV 特征。
- Spatial Cross-Attention(空间交叉注意力):进行空间特征注意力,融合多视角图像特征。
- Deformable Attention(可变形注意力):BEVFormer 使用可变形注意力机制来加速运算,提高模型对不同视角图像特征的适应性。
- BEV 特征生成:通过时空特征的融合,完成环视图像特征向 BEV 特征的建模。
- Decoder:设计用于 3D 物体检测的端到端网络结构,基于 2D 检测器 Deformable DETR 进行改进,以适应 3D 空间的检测任务。
地平线部署说明
公版 bevformer 在 征程 6 上部署相比于 征程 5 来说更简单了,需要考虑的因素更少。征程 6 对非 4 维的支持可以和 4 维的同等效率,因此 征程 6 支持公版的注意力实现,不再限制维度,因此无需对维度做 Reshape,可直接支持公版写法。但需注意的是公版的 bev_mask 会导致动态 shape。征程 6 不支持动态输入,因此 bev_mask 无法使用。在精度上,我们修复了公版的 bug 已获得了精度上的提升,同时通过对关键层做 int16 的量化精度配置以保障 1%以内的量化精度损失。
下面将部署优化对应的改动点以及量化配置依次说明。
性能优化
改动点 1:
将 attention 层的 mean 替换为 conv 计算,使性能上获得提升。
/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/attention.py
self.query_reduce_mean = nn.Conv2d(
self.num_bev_queue * self.reduce_align_num,
self.reduce_align_num,
1,
bias=False,)
# init query_reduce_mean weight
query_reduce_mean_weight = torch.zeros(
self.query_reduce_mean.weight.size(),
dtype=self.query_reduce_mean.weight.dtype,
)
for i in range(self.reduce_align_num):
for j in range(self.num_bev_queue):
query_reduce_mean_weight[i, j * self.reduce_align_num + i] = (
1 / self.num_bev_queue
)
self.query_reduce_mean.weight = torch.nn.Parameter(
query_reduce_mean_weight, requires_grad=False
)
改动点 2:
公版中,在 Encoder 的空间融合模块,会根据 bev_mask 计算有效的 query 和 reference_points,输出 queries_rebatch 和 reference_points_rebatch,作用为减少交互的数据量,提升模型运行性能。对于稀疏的 quer