该示例为参考算法,仅作为在J6上模型部署的设计参考,非量产算法
简介
SparseBevFusionMultitaskOE模型是一个bev多任务感知模型,包含感知三大任务的检测头:sparse动态检测头,sparse静态元素检测头和通用障碍物检测头。整体的模型结构如下:

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动态目标检测掉点会在后续版本中优化。
模型介绍
整体结构
构建一个OrderedDict,通过标识选择加入哪些模型,然后在整体model中,传入task_heads。
多任务 Head 架构
各任务 head 在 config 中以 dict 形式构建,det / occ / om 三个 head 的关键配置如下:
注:为了兼容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,根据模型表现动态的调整权重值。
量化精度
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为:
注:早期版本中敏感度算子是在运行时从 ckpt_dir/quant_analysis 下的 *_L1_sensitive_ops.pt文件加载的(通过 topk_or_ratio 字典配置);最新接口已将这些算子硬编码到 qconfig.py,量化配置不再依赖这些 .pt 文件的存在。
多任务量化推荐流程:

总结与建议
训练建议:
模型训练时需要增加添加BevRotation,经过在nescenes上验证,不添加会导致掉点。
对模型配置loss weight,根据模型表现动态的调整权重值;对精度较差的任务可以适当的增大loss weight。
训练策略复用了单任务模型,多个任务为同源数据集一起训练,非单独训练某个head。
部署建议:
量化优先尝试HistogramObserver校准方式。
多任务量化时建议基于单任务的经验,对需要固定scale的算子做fixscale,可以有效缩短量化周期。
若出现精度掉点问题,可结合量化敏感性分析(quant_analysis)选取badcase做debug分析,基于debug信息对部分算子配置更高的精度或者尝试手动处理。
本文通过对SparseBevFusionMultitaskOE在地平线征程6上量化部署的优化,使得模型在J6M上得到latency为28 ms的部署性能,同时,通过SparseBevFusionMultitaskOE 的部署经验,可以推广到其他多任务模型的部署中。
附录
参考算法(modellabs)官网:https://(待发布)
