该示例为参考算法,仅作为在J6上模型部署的设计参考,非量产算法
简介
在自动驾驶视觉感知系统中,BEV(Bird's Eye View)感知通过将多视角图像特征转换到统一的鸟瞰图空间,实现多摄像头融合的3D感知。其中基于 Lift-Splat-Shoot(LSS)的 BEV 方法通过深度估计与视锥点云投影完成 2D 到 3D 的视角转换,是主流的 BEV 感知路线之一。
性能精度指标
模型配置:
模型 | 数据集 | img_shape | grid_size | num_points | img_encoder | vt | bev_encoder | head | ||
|---|---|---|---|---|---|---|---|---|---|---|
backbone | neck | backbone | neck | |||||||
bev_vt_v2 | 256x704 | 128x128 | 10 | ResNet50 | FPN | LSS | ResNet50 | FPN | det | |
bev_vt_v1 | 256x704 | 128x128 | 10 | efficientnetb0 | FastSCNNN | LSS | efficientnetb0 | BiFPN | det+seg |
性能精度表现:
模型 | Latency ms | 检测精度(浮点/定点) | |
|---|---|---|---|
NDS | mAP | ||
bev_vt_v2 | 16.45ms(J6M) | 0.3602/0.3539 | 0.283/0.2797 |
bev_vt_v1 | 6.128ms(J6E) | 0.3006/0.3003 | 0.2061/0.2046 |
公版模型介绍

bev_vtv2 是 lss based 的 bev 目标检测。bev_lss 是基于 bev_depth 结构实现的,使用多视图的6张RGB图像作为输入,输出是目标的3D Box(bev_vtv2 为单任务检测,不含分割)。首先使用2D主干对多视角图像获取2D 特征。然后将img_feature作为depth_net输入获得深度特征,将深度特征和img_encoder_feature 分别转换为BEV视角后生成点云特征,最后,接上任务特定的head,输出检测结果。模型主要包括以下部分:
地平线部署说明
bev_vtv2 在地平线平台上部署的优化点(含 bev_mt_lss 基础优化与 bev_vtv2 增量优化)为:
BevPool 采用 gridsample 方案实现,将深度特征与图像特征投影到 BEV 空间,并通过多次采样相加来减少相同voxel特征的遗漏,BPU 可高效支持;
depth 与 feature 分开做视角转换:将深度特征和图像特征分别 grid_sample 后再做 mul,相比先 mul 再视角转换可减少 mul 计算量;
- 采样点选取策略优化(bev_vtv2 增量):基于均匀采样可能存在近处目标多导致漏检的情况,设计了距离排序+topk的采样点选取策略,在采样点数量不变、bev转换方式不变的情况下,增加模型对近处目标的采样,从而提升近处目标的检测精度,可通过use_vtv2参数控制;
说明: 本文档对应模型为 bev_vtv2_resnet50_nuscenes,核心实现位于 heal/models/task_modules/bev/,下文涉及改动点的配置均出自 configs/bev_vtv2_resnet50_nuscenes/。
下面将部署优化对应的改动点以及量化配置依次说明。
性能优化
bev_lss 使用的转换方法是 LSS 实现,流程如下图所示:

生成深度特征
对深度特征和img_encoder_feature做bev坐标转换
生成视锥点云特征(frustum features)
下面对以上流程做详细介绍。
生成深度特征
生成depth为60的depth_feature,对depth_feature计算深度的score值。
对应代码:
生成 bev_feature
为了减少mul计算量, 先把深度特征和 feature 分开做bev视角转换:
生成点云特征

为了不遗失坐落在相同voxel中的点云特征,将对每个voxel都采样10次,最终将每个点云特征相加得到128x128x64的BEV特征图:
注意:采样次数(num_points)增加可提高精度,但是会导致延迟增大,建议按需设置。
除上述 view_transformer 的优化外,模型的 2D Image Encoder(backbone ResNet50 + neck FPN)、3D BEV Encoder(ResNet50 + FPN)以及 BEV Decoder(CenterPointHead)等部分与公版一致,在此不做赘述。
精度优化
浮点精度
1. 多次采样
为了 voxel 的特征多样性,对每个 voxel 采样多次点云特征并相加,避免遗漏坐落在相同 voxel 中的点云特征。
2. 采样点选取策略优化
heal/models/task_modules/bev/view_transformer.py
量化精度
说明: bev_vtv2 全局 QconfigSetter 统一配置量化,默认全局 qint8(gridsample的grid工具自动为int16量化)。量化入口在 configs/bev_vtv2_resnet50_nuscenes/qconfig.py,含 Calibration 与 QAT 两条流水线。
configs/bev_vtv2_resnet50_nuscenes/qconfig.py
量化配置要点:
- 全局默认 qint8(ModuleNameTemplate({"": qint8})),Conv 输入/权重均为 qint8,matmul 输入为 [qint8, qint8];backbone.quant 固定 scale 方式为 int8;
- Calibration 使用 HistogramObserver,QAT 使用 MinMaxObserver 并 fix_scale=True 冻结激活 scale,Weight正常更新;
模型结构对量化友好,无需对中间算子额外配置 int16 即可保证量化精度;如私有数据集上出现量化掉点,可对敏感算子补充 int16/固定 scale 配置,并配合精度 debug、敏感度分析工具定位。
总结与建议
部署建议
用户在部署 LSS-based 的 bev 模型时建议使用gridsample方案替代公版bevpool。遇到精度问题可以通过对采样点的生成过程进行优化从而达到性能不变、精度提升的效果,根据具体问题调整不同分布的采样点,本文给出了对近处目标更多采样的方式(距离排序+topk),达到精度提升的效果。
附录
公版实现:https://github.com/HuangJunJie2017/BEVDet/blob/dev3.0/configs/bevdet/bevdet-r50.py
论文:https://arxiv.org/pdf/2112.11790.pdf
bev_lss_v1 版本参考文档:https://developer.horizon.auto/blog/10386
参考算法官网(modellabs):https://(待发布)
