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

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

芯链情报局2026-08-25
23
1

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

简介

SparseBevFusionMultitaskOE模型是一个bev多任务感知模型,包含感知三大任务的检测头:sparse动态检测头,sparse静态元素检测头和通用障碍物检测头。整体的模型结构如下:

whiteboard_exported_image-6.png

sparse bev类模型主要思路是通过关键点投影回camera空间采样并进行预测。因此对于多任务模型来说,不同task之间可以共用的是img_encoder的backbone和neck部分,同时加入辅助分支densedepthnet用于辅助训练,部署时不需要。动态检测、静态要素检测和占用格预测任务可以分别抽象为三个head:detection head(det head)、onlinemapping head(om head)和occupancy head(occ head)。在模型的选择上,我们选取了参考算法已集成的,也是较主流的模型-sparse4d、maptr、flashocc,在J6上部署的效果更好。

性能精度指标

模型信息

精度(浮点/定点)

J6M性能

模型

数据集

Input shape

backbone

num_anchor

det

om

occ

FPS

Latency

NDS

mAP

mAP

bev_sparse_henet_tinym_nuscenes

Nuscenes

6x3x256x704

HENET

384

0.5403/0.5333

0.4344/0.42

6

-

-

98.74

10.44ms

maptroe_sparse_henet_tinym_nuscenes

Nuscenes

6x3x256x704

HENET

100

-

-

0.5924/0.5895

-

111.22

9.3ms

flashocc_henet_lss_occ3d_nuscenes

Nuscenes

6x3x512x960

HENET

bevsize 128x128

-

-

-

0.364/0.3664

136.07

7.65ms

SparseBevFusionMultitaskOE

Nuscenes

6x3x256x704

HENET

sparse4d:384
maptr:100
flashocc:bevsize 128x128

0.5431/0.5295

0.41/0.41

0.592/0.5833

31.97/32.73

36.66

27.65ms

注:flashocc掉点为分辨率降低导致;sparse动态目标检测掉点会在后续版本中优化。

模型介绍

参考算法已有的三个单任务模型都是基于nuscenes数据集的,它同时包含三个任务的标注数据。其中dataset使用NuscenesSparseMapDataset,包含了地图相关的标注。NuscenesSparseMapDataset继承自NuscenesMapDataset和NuscenesBevDataset,同时含有动态、静态和occ的标注。因此多任务模型选用NuscenesSparseMapDataset作为数据集,可以同时对动态、静态和occ任务一起监督训练;动态检测头用到了时序信息,所以 data_loader采用了 DistStreamBatchSampler,确保数据按时序返回。训练集和测试集的处理流程见:heal/data/datasets/nuscenes_map_dataset.py

整体结构

HEAL使用的是注册机制,模型结构和参数在config中通过dict定义,在config中构建多个head的dict,然后通过配置enable_xx_head参数选择需要合入的任务。

构建一个OrderedDict,通过标识选择加入哪些模型,然后在整体model中,传入task_heads。

多任务 Head 架构

各任务 head 在 config 中以 dict 形式构建,det / occ / om 三个 head 的关键配置如下:

多任务的forward流程为遍历dict(每个dict可以理解为一个task_head),依次执行各自的head,代码可见:heal/models/structures/sparse_multitask.py

注:为了兼容lidar融合的模型,head中保留lidar_feature,在不使用lidar net的情况下lidar_feature=None

地平线部署说明

sparse多任务模型的每个head是基于公版模型做了优化后部署的,以下为模型相较于公版的改动点:

模块

改动点

input

统一为6x3x256x704

backbone

img_encoder和bev_encoder均使用henet

neck

img_encoder 使用MMFPN,返回所有层的feat

Sparse head

- num_anchor和num_temp_instances降低。num_abchor 900- num_anchor和num_temp_instances降低。num_abchor 900- num_anchor和num_temp_instances降低。num_abchor 900- num_anchor和num_temp_instances降低。num_abchor 900-->384;num_temp_instances 600384;num_temp_instances 600384;num_temp_instances 600384;num_temp_instances 600-->128
- 一阶段生成的featuremap只使用第二层(stride=16),非公版的使用4层。
- 去除instance的update
- 新增get和cache对当前帧的anchor、feature 和temp帧做融合(cat),精度上有提升
- DeformableFeatureAggregation中kps_generator直接使用offset(linear)生成,非公版的基于anchor生成
- RefinementModule对速度去除refine计算

maptr head

- 一阶段生成的featuremap只使用第二层(stride=16)
- bev_decoders采用sparse 方式,在性能更高的情况下保持了精度

occ head

- BEV网格大小由公版的200x200调整为128x128
- view_transform使用地平线针对性优化后的LSSTransformer来替换公版中的bevpooling实现的LSSViewTransformer,且移除了公版中的时序融合模块

详细可以参考单任务模型的参考文档的改动说明章节:

地平线静态目标检测 MapTR 参考算法-V2.0 - 地平线开发者社区

地平线3D目标检测 bev_sparse 参考算法-V2.0 - 地平线开发者社区

地平线占用预测FlashOcc参考算法-V1.0 - 地平线开发者社区

性能优化

Sparse多任务模型通过共用 img_encoder 的 backbone 与 neck、降低 num_anchor / num_temp_instances、仅使用第二层 featuremap、去除 instance update、采用 sparse 方式的 bev_decoders、以及用 LSSTransformer 替换 bevpooling 等手段,在保证精度的前提下提升部署性能,具体改动见上方「地平线部署说明」表格。各模块相较于公版的改动点可参考单任务模型参考文档的改动说明章节。

精度优化

浮点精度

SparseBevFusionMultitaskOE模型在训练上:

  • SparseBevFusionMultitaskOE模型为同源数据集,多个任务一起训练,非单独的训练某个head。

  • 模型训练时需要增加添加BevRotation,经过在nescenes上验证,不添加会导致掉点。

  • 训练策略复用了单任务模型 。

  • 对模型配置loss weight,根据模型表现动态的调整权重值。

量化精度

为量化精度保证,我们采取了HistogramObserver的校准方式(OE 3.7.0 版本及以后支持),精度上优于MSEObserver。校准数据为训练数据,校准的step为100,无qat训练。

q_templates为量化配置,分为全局的配置、自定义的ModuleNameTemplate、基于敏感度的SensitivityTemplate算子配置以及float32冻结模板。

  • ModuleNameTemplate主要作为全局量化配置和个别层的量化配置,被用于配置全局量化类型、对算子配置int16、固定算子的scale操作,以上都是基于经验的。
  • SensitivityTemplate为敏感度的配置,它是基于debug结果,对敏感排行较高的算子通过topk_or_ratio配置int16算子比例。
  • float32_freeze_template为float32冻结模板,对部分对量化敏感的算子(如det头的cls_layers、quality_layers)配置为 None 并 freeze=True,保持float32计算。

详细的使用方法可见用户手册*量化感知训练--开发指南--Qconfig详解 *章节(https://doc.oe.horizon.auto/guide/plugin/user_guide/qconfig.html)。

在多任务时,建议先将已知的在单任务中需要fix-scale的层(特别是具有物理意义、范围固定的op)做固定scale处理、对已知需要int16精度的算子配置高精度。例如动态单任务的fix-scale为:

多任务时可以做复用,核心模板 q_template_core 如下:
其中 sensitivity_templates 为基于 quant_analysis 敏感度分析结果显式枚举的 SensitivityTemplate 列表(det 的 cls/pred/quality 与 om 的 pts/bbox/cls 共 6 张敏感度表),每张表取 topk 算子,topk_or_ratio=len(list) 即将表中列出的算子全部提升为 int16:
注:早期版本中敏感度算子是在运行时从 ckpt_dir/quant_analysis 下的 *_L1_sensitive_ops.pt文件加载的(通过 topk_or_ratio 字典配置);最新接口已将这些算子硬编码到 qconfig.py,量化配置不再依赖这些 .pt 文件的存在。
模型基于int8的量化配置下做calibration,若出现精度掉点问题参考用户手册中的量化感知训练--开发指南--精度调优工具使用指南 (https://doc.oe.horizon.auto/guide/tuning_guide/accuracy_tune.html选取badcase做debug分析,基于debug信息对部分算子配置更高的精度或者尝试手动处理。

多任务量化推荐流程:

whiteboard_exported_image-7.png
若未部署过单任务则可以按照用户手册推荐流程(量化感知训练--开发指南--**量化精度调优指南)做部署。(https://doc.oe.horizon.auto/guide/tuning_guide/accuracy_tune.html)

总结与建议

训练建议:

  • 模型训练时需要增加添加BevRotation,经过在nescenes上验证,不添加会导致掉点。

  • 对模型配置loss weight,根据模型表现动态的调整权重值;对精度较差的任务可以适当的增大loss weight。

  • 训练策略复用了单任务模型,多个任务为同源数据集一起训练,非单独训练某个head。

部署建议:

  • 量化优先尝试HistogramObserver校准方式。

  • 多任务量化时建议基于单任务的经验,对需要固定scale的算子做fixscale,可以有效缩短量化周期。

  • 若出现精度掉点问题,可结合量化敏感性分析(quant_analysis)选取badcase做debug分析,基于debug信息对部分算子配置更高的精度或者尝试手动处理。

本文通过对SparseBevFusionMultitaskOE在地平线征程6上量化部署的优化,使得模型在J6M上得到latency为28 ms的部署性能,同时,通过SparseBevFusionMultitaskOE 的部署经验,可以推广到其他多任务模型的部署中。

附录

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

  2. 地平线静态目标检测 MapTR 参考算法-V2.0 - 地平线开发者社区

  3. 地平线3D目标检测 bev_sparse 参考算法-V2.0 - 地平线开发者社区

  4. 地平线占用预测FlashOcc参考算法-V1.0 - 地平线开发者社区

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

    你好这篇的相关的code有开源吗?

    2026-08-27
    0
    0