专栏算法工具链地平线3D目标检测 Bevformer 参考算法-V2.0

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

芯链情报局2024-12-10
929
0

该示例为参考算法,仅作为在J6上模型部署的设计参考,非量产算法

简介

BEVFormer是当前热门的自动驾驶系统中的3D视觉感知任务模型。BEVFormer是一个端到端的框架,BEVFormer可以直接从原始图像数据生成BEV特征,无需依赖于传统的图像处理流程。它通过利用Transformer架构和注意力机制,有效地从多摄像头图像中学习生成高质量的鸟瞰图(Bird's-Eye-View, BEV)特征表示。相较于其他的BEV转换方式:

  1. 时空注意力机制:模型结合了空间交叉注意力(Spatial Cross-Attention, SCA)和时间自注意力(Temporal Self-Attention, TSA),使网络能够同时考虑空间和时间维度上的信息。融合历史bev特征来提升预设的BEV空间中的query的自学能力,得到bev特征。
  2. Deformable attn:通过对每个目标生成几个采样点和采样点的offset来提取采样点周围的重要特征,即只关注和目标相关的特征,减少计算量。
  3. transformer架构:能够有效捕捉序列中的长期依赖关系,适用于处理图像序列。

性能精度指标

模型参数:

 

性能精度表现:

 

J6E性能(FPS)

检测精度(浮点/定点)

NDS

mAP

28.8

0.3713/0.3678

 0.2673/0.2615

模型介绍

公版BEVFormer模型主要可以分为以下几个关键部分:

  1. Backbone网络:用于从多视角摄像头图像中提取特征,本文为tiny版本,因此为ResNet50。
  2. 时空特征提取:BEVFormer通过引入时间和空间特征来学习BEV特征。具体来说,模型包括:
  3. Temporal Self-Attention(时间自注意力):利用前一时刻的BEV特征作为历史特征,通过自注意力机制来计算当前时刻的BEV特征。
  4. Spatial Cross-Attention(空间交叉注意力):进行空间特征注意力,融合多视角图像特征。
  5. Deformable Attention(可变形注意力):BEVFormer使用可变形注意力机制来加速运算,提高模型对不同视角图像特征的适应性。
  6. BEV特征生成:通过时空特征的融合,完成环视图像特征向 BEV 特征的建模。
  7. Decoder:设计用于3D物体检测的端到端网络结构,基于2D检测器Deformable DETR进行改进,以适应3D空间的检测任务。

地平线部署说明

公版bevformer在J6上部署相比于J5来说更简单了,需要考虑的因素更少。J6对非4维的支持可以和4维的同等效率,因此J6支持公版的注意力实现,不再限制维度,因此无需对维度做Reshape,可直接支持公版写法。但需注意的是公版的bev_mask会导致动态shape。J6不支持动态输入,因此bev_mask无法使用。在精度上,我们修复了公版的bug已获得了精度上的提升,同时通过对关键层做int16的量化精度配置以保障1%以内的量化精度损失。

下面将部署优化对应的改动点以及量化配置依次说明。

性能优化

改动点1:

将attention层的mean替换为conv计算,使性能上获得提升。

/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/attention.py

改动点2:

公版中,在Encoder的空间融合模块,会根据bev_mask计算有效的query和reference_points,输出queries_rebatch和reference_points_rebatch,作用为减少交互的数据量,提升模型运行性能。对于稀疏的query做crossattn后再将query放回到bev_feature中。

以上提取稀疏query步骤的主要算子为gather,放回bev_feature步骤的主要算子为scatter。由于工具链对这两个算子暂未支持(gather算子930已支持)而且bev_mask为动态的,为了提升模型的运行性能,工具链提供了gridsample算子的替换方式,index计算只与内外参有关,因此作为前处理,将计算好的index作为模型输入即可。

gather

gather为根据bevmask来提取稀疏query,降低cross attn的数据量,提升运行效率。

代码路径:/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/view_transformer.py

query_rebatch 

scatter

scatter操作对经过deformable_attention后的query放入到bevfeature中,然后求平均。

代码路径为:/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/attention.py

其中restore_bev_grid,根据bevmask反算回bev_feature的位置:

精度优化

浮点精度

改动点3:

公版通过can_bus 初始化ref来做时序融合,然而这个时候bev feat并没有对齐,在attention计算时不能简单的concat起来。因此我们换了一种时序对齐的方式,通过前后两帧的ego2global坐标系转换矩阵将当前帧的bev特征和上一帧对齐,此时ref都是一样的。(非J6不支持,为公版bug),精度上获得提升。

/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/view_transformer.py get_prev_bev get_fusion_ref

 

改动点4:

量化精度

为量化精度保证,我们将以下的算子配置为int16或int32输出:

view_transformer:输入节点做int16量化:
attention层:最后两个conv和add开启int16
decoder层:cls_branches、reg_branches的conv配置为int32输出;sigmoid和reference_points配置为int16

总结与建议

训练建议

  • 浮点和公版一致即可

  • qat训练需要将lr降低,下降策略建议使用StepDecayLrUpdater。

部署建议

  • 建议bev size的选择考虑性能影响。J6相比于J5带宽增大,但仍需注意bevsize过大导致访存时间过长对性能的影响,建议考虑实际部署情况选择合适的bevsize做性能验证。

  • 使用bevmask来提升运行性能,可参考4.1章节使用gridsample替换不支持的scatter。

  • 在注意力机制中存在一些ElementWise操作,对于导致性能瓶颈的可以考虑conv替换,对于造成量化风险的可以根据敏感度分析结果合理选择更高的量化精度,以确保注意力机制的部署。

 

本文通过对Bevformer在地平线征程6上量化部署的优化,使得模型在该计算方案上用低于1%的量化精度损失,得到latency为45.74ms的部署性能,同时,通过Bevformer的部署经验,可以推广到其他模型部署优化,例如包含MSDA模型结构、transformer-based BEV的部署。

附录

  1. 论文:https://arxiv.org/pdf/2203.17270

  2. 公版代码:https://github.com/fundamentalvision/BEVFormer

 

 

 

算法工具链
征程6官方教程
评论0
0/1000