专栏算法工具链【地平线工具链参考算法|J6|HEAL】bev_vtv2 _v3.0

【地平线工具链参考算法|J6|HEAL】bev_vtv2 _v3.0

芯链情报局2026-08-24
6
0

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

简介

在自动驾驶视觉感知系统中,BEV(Bird's Eye View)感知通过将多视角图像特征转换到统一的鸟瞰图空间,实现多摄像头融合的3D感知。其中基于 Lift-Splat-Shoot(LSS)的 BEV 方法通过深度估计与视锥点云投影完成 2D 到 3D 的视角转换,是主流的 BEV 感知路线之一。

bev_vtv2 是基于 LSS 的 BEV 目标检测参考算法,贴近于公版 bevdet-r50 的配置,使用多视图的6张RGB图像作为输入,输出目标的3D Box。本参考算法在征程6平台上部署,并针对采样点选取策略做了优化(见下文「地平线部署说明」)。
相比 v1版本,bev_vtv2 更贴近于公版的 bevdet-r50 的配置,优化了bev-lss转换时采样点的选取逻辑,其他实现均对齐公版,发布浮点/定点精度相较于v1版本有较高提升,在nuscenes上精度表现可对齐公版。v1版本位于另外的算法包,基本无改动,本文档对其内容予以保留供参考。

性能精度指标

模型配置:

模型

数据集

img_shape

grid_size

num_points

img_encoder

vt

bev_encoder

head

backbone

neck

backbone

neck

bev_vt_v2

Nuscenes

256x704

128x128

10

ResNet50

FPN

LSS

ResNet50

FPN

det

bev_vt_v1

Nuscenes

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

公版模型介绍

流程图.jpg

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,输出检测结果。模型主要包括以下部分:

Part1—2D Image Encoder:图像特征提取层。使用2D主干网络(ResNet50)和FPN输出不同分辨率的特征图。返回最后一层--上采样至1/16原图大小层,用于下一步投影至3D 坐标系中。
Part2—View transformer:将img_encoder_feature生成深度特征,将深度特征和img_encoder_feature 做bev 空间转换后生成视锥点云特征。(部署侧重点更新部分,更新采样点选取策略,见下文「地平线部署说明」)
Part3—3D BEV Encoder:BEV特征提取层。
Part4—BEV Decoder:Detection Head。得到统一的BEV特征后,使用DepthwiseSeparableCenterPointHead进行3D目标检测任务,检测的类别为["car","truck","bus","barrier","bicycle","pedestrian"]。bev_vtv2 为单任务检测,不含分割头。

地平线部署说明

bev_vtv2 在地平线平台上部署的优化点(含 bev_mt_lss 基础优化与 bev_vtv2 增量优化)为:

  1. BevPool 采用 gridsample 方案实现,将深度特征与图像特征投影到 BEV 空间,并通过多次采样相加来减少相同voxel特征的遗漏,BPU 可高效支持;

  2. depth 与 feature 分开做视角转换:将深度特征和图像特征分别 grid_sample 后再做 mul,相比先 mul 再视角转换可减少 mul 计算量;

  3. 采样点选取策略优化(bev_vtv2 增量):基于均匀采样可能存在近处目标多导致漏检的情况,设计了距离排序+topk的采样点选取策略,在采样点数量不变、bev转换方式不变的情况下,增加模型对近处目标的采样,从而提升近处目标的检测精度,可通过use_vtv2参数控制;
说明: 本文档对应模型为 bev_vtv2_resnet50_nuscenes,核心实现位于 heal/models/task_modules/bev/,下文涉及改动点的配置均出自 configs/bev_vtv2_resnet50_nuscenes/。

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

性能优化

bev_lss 使用的转换方法是 LSS 实现,流程如下图所示:

实现路径在 heal/models/task_modules/bev/view_transformer.py 的 LSSTransformer。可将 bev_lss 的 view_transformer 分为3个部分:
  1. 生成深度特征

  2. 对深度特征和img_encoder_feature做bev坐标转换

  3. 生成视锥点云特征(frustum features)

接下来将对这三个部分的具体代码实现进行介绍。其中,view_transformer 的视角转换由于不支持index操作,需要将公版的bevpool做替换,替换方案为GridSample实现。同时对depth 与 feature 分开做视角转换以减少 mul 计算量,每个 voxel 多次采样后相加以避免点云遗漏。

下面对以上流程做详细介绍。

生成深度特征

生成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)等部分与公版一致,在此不做赘述。

精度优化

浮点精度

bev_vtv2 在浮点层面贴近公版 bevdet-r50 配置,其他实现均对齐公版。影响浮点精度的主要改动主要在bevpool的替换策略上。

1. 多次采样

为了 voxel 的特征多样性,对每个 voxel 采样多次点云特征并相加,避免遗漏坐落在相同 voxel 中的点云特征。

num_points(每个 voxel 的采样点数,默认 10):采样点数越多,BEV 视锥点云特征越充分,浮点精度越高,但 mul/add 计算量随之增加;需在精度与性能间权衡。每个 voxel 采样 num_points 次后将点云特征相加,得到 BEV 特征图。
对应代码:heal/models/task_modules/bev/view_transformer.py

2. 采样点选取策略优化

在采样点数量不变、bev 转换方式不变的情况下,增加模型对近处目标的采样,从而提升近处目标的检测精度;相比均匀采样可减少近处目标漏检,对整体浮点精度为正向收益。采样点在 `_gen_reference_point` 中生成,bev_lss_v2 版本相比 v1 通过 `use_vtv2` 参数控制:v1 版本排序后取前 10 个点,会导致周围目标容易丢失;v2 版本采用距离排序+topk,具体为:

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),达到精度提升的效果。

附录

  1. 公版实现:https://github.com/HuangJunJie2017/BEVDet/blob/dev3.0/configs/bevdet/bevdet-r50.py

  2. 论文:https://arxiv.org/pdf/2112.11790.pdf

  3. bev_lss_v1 版本参考文档:https://developer.horizon.auto/blog/10386

  4. 参考算法官网(modellabs):https://(待发布)

算法工具链
技术深度解析官方教程征程6
评论0
0/600