专栏算法工具链地平线占用预测FlashOcc参考算法-V1.0

地平线占用预测FlashOcc参考算法-V1.0

芯链情报局2024-08-27
1123
4

1. 简介

3D Occupancy Networks 的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分,同时获取更精确的占用和语义信息。然而,三维体素表示的处理带来了巨大的内存和计算开销,导致当前占用率预测方法的部署受到限制。FlashOcc 作为即插即用的占用网络,在保持精度的同时实现了更快的推理速度和更低的内存消耗。本文将介绍 FlashOcc 在地平线征程 6E/M 平台上的优化部署。

2.性能精度指标

模型

Input shape

backbone

bevsize

浮点精度MeanIOU

量化精度

MeanIOU

J6E FPS

FlashOcc

 

6x3x512x960

 

henet

 

128x128

 

公版

(6x3x256x704 )

参考算法

0.3642

68.60

 

0.3195

0.3646

3.公版模型介绍

FlashOcc在该领域做出了开创性的贡献,成功地以惊人的精度实现了实时surround视图3D占用预测。此外,在不同的车载平台上部署时表现出更强的通用性,因为它消除了对昂贵的体素级特征处理的需要,其中避免了视图变换器或3D(可变形)卷积算子。如下图所示,FlashOcc的输入为6张图像(前后视角+周视),输出是密集占用预测结果。

FlashOcc网络主要由5个部分组成:

  • 2D图像编码器:使用ResNet50+FPN从多视角图像中提取多尺度图像特征;
  • 视图转换模块:使用LSS实现从2D感知视图图像特征到3D BEV表示的映射;
  • BEV编码器:提取BEV空间的特征,并结合了多尺度的BEV特征来提升特征表示质量;
  • 占用预测模块:由多层Conv或者复杂的多尺度特征融合模块组成,该模块预测每个体素的分割标签;
  • 可选的时间融合模块:由时空对齐模块和特征融合模块组成,增强对动态目标或属性的感知。

4.地平线部署优化

改动点说明:

  1. 输入图像大小:由公版的256x704调整为512x960;
  2. BEV网格大小:由公版的200x200调整为128x128;
  3. Image encoder backbone:使用地平线深度优化的高效backbone HENet替换公版中的ResNet50;
  4. Bev encoder backbone:使用地平线深度优化的高效backbone HENet替换公版模型中的CustomResNet;
  5. 视图转换模块:使用地平线针对性优化后的LSSTransformer来替换公版中的bevpooling实现的LSSViewTransformer,且移除了公版中的时序融合模块;

4.1 性能优化

4.1.1 Backbone

Image Encoder采用了HENet+FPN来提取6V图像的多尺度特征,不仅在精度上可与 ResNet50 相媲美,而且在性能上有显著优势,这里的FPN采用的是地平线的高效实现,相对于公版更加高效。BEV Encoder同样采用了HENet+BiFPN来提取BEV特征,BiFPN这种重复双向跨尺度连接的结构,可以更好地实现梯度传播,从而实现BEV特征的多尺度融合。

HENet是针对J6平台专门设计的高效backbone,其采用了纯CNN架构,总体可分为四个stage,每个stage会进行2倍下采样。以下为总体的结构配置:

模型相关细节可以参考HENet高效模型相关介绍。

代码路径:/usr/local/lib/python3.10/dist-packages/hat/models/backbones/henet.py

4.1.2View transformer

View transformer采用地平线深度优化后的LSSTransformer,替换J6平台暂不支持的bevpooling,从而高效地将图像特征转换到BEV空间。为了进一步提升性能,将bev grid size由公版的200x200调整为了128x128。LSSTransformer主要的工作流程如下所示:

View transformer主要包括分为3个部分:

  1. 生成深度特征

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

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

接下来将对这三个部分的具体代码实现进行介绍:

生成深度特征

View transformer是基于图像特征,经过卷积层生成了depth为45的depth_feature,并使用softmax计算depth_feature的score值。对应代码如下所示:

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

生成BEV特征

为了减少计算量,LSSTransformer 首先将图像特征和深度特征分别转换到 BEV 视角下,然后对二者进行点乘计算。其中,图像特征转换到BEV空间的采样坐标points的生成在_gen_reference_point函数中,计算逻辑如下:

生成视锥点云特征

为了不遗失坐落在相同voxel中的点云特征,将对每个voxel都采样10次,最终将每个点云特征相加得到BEV特征图。对应代码:

 

4.2 精度优化

FlashOcc采用以下策略提升浮点精度:

  1. 模型结构优化:使用更多地平线进行针对性优化后的结构,包括backbone、view_transformer、bevencoder等,浮点精度相对于公版有所提升;
  2. 加载预训练权重:加载HENet的浮点预训练权重。

5. 总结与建议

5.1 训练建议

  1. 浮点训练时加载HENet的预训练权重;

5.2 部署建议

选择合适的BEV Grid尺寸

从图像空间到BEV空间的转换,是稠密特征到稠密特征的重新排列组合,计算量比较大,与图像尺寸以及BEV 特征图尺寸成正相关。若要保持BEV Grid 的分辨率不变(比如0.5m/格),则需要大大增加BEV 特征图的尺寸,从而使得端上计算负担和带宽负担都过重;若保持BEV特征图的尺寸不变,则需要使用更粗粒度的BEV Grid,感知精度就会下降(每个grid的尺寸增加)。所以在模型设计之初,综合考虑模型的精度和性能以选择合适的BEV Grid尺寸。

使用高效backbone提取特征

建议选择J6平台高效Backbone来搭建模型,高效Backbone经过在J6平台的迭代优化和验证,相比其它公版Backbone,在性能和精度上可以取得更加出色的效果,因此选取J6平台高效Backbone来搭建模型可以对整个场景模型带来性能和精度的增益。

附录

  1. 论文:FlashOcc
  2. 公版模型代码:Github-FlashOcc
算法工具链
技术深度解析征程6官方教程
+1
评论2
0/1000
  • Kerwin
    Lv.1

    不是哥们,最核心的地方居然无法显示

    2024-09-04
    0
    2
    • Huanghui回复Kerwin:

      我们联系发帖人更新一下,感谢关注!

      2024-09-04
      0
    • 芯链情报局回复Kerwin:

      感谢关注,已补全图片内容

      2024-09-04
      0
  • 默认23104
    Lv.1
    有提供的例子直接训练,float模型可视化为什么顶部会有一些占据,并且两次很多错误的占据
    2025-09-03
    0
    0