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

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

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

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

简介

在自动驾驶感知系统中,激光雷达(LiDAR)凭借直接测距、不受光照影响的优势,是3D目标检测的重要传感器。LiDAR 3D 检测通常先将无序点云体素化(voxel/pillar 化)为规则的伪图像表征,再通过2D卷积网络提取特征并完成检测框的回归与分类,代表性方法包括 VoxelNet、PointPillars、CenterPoint 等。

CenterPoint 为在 PointPillars 基础上做优化的多类别3D检测模型,检测类别10类,是一阶段模型。本参考算法基于 CenterPoint 公版,针对征程6平台的计算特性做了定制化修改(见下文「地平线部署说明」)。

性能精度指标

model

dataset

雷达线数

input_shape

浮点/定点精度

J6M latency

J6M FPS

NDS

mAP

Centerpoint

Nuscenes

32

[1, 5, 40000, 20]
[40000, 4]

0.5865/0.5847

0.474/0.4693

9.23ms

183

该性能指标基于以下配置测得:

点云大小

点云范围

Voxel 尺寸

最大点数

最大pillar数

检测类别

300000x5(注1)

[-51.2, -51.2, -5.0, 51.2, 51.2, 3.0]

[0.2, 0.2, 8]

20

40000

10类(注2)

注1:维度为(x,y,z,r,t),即:3维坐标、强度和时间

注2:"car","truck","construction_vehicle","bus","trailer","barrier","motorcycle","bicycle","pedestrian","traffic_cone",

公版模型介绍

CenterPoint 公版在 PointPillars 的基础上做优化,模型实现上与 PointPillars 相同,在 VoxelNet 中 Voxel 的基础上提出了一种改进版本的点云表征方法 Pillar,可以将点云转换成伪图像,进而通过2D卷积实现多类别目标检测。由于 nuscenes 在二阶段模型中精度相比一阶段无明显提升,因此该 CenterPoint 为一阶段模型。

CenterPoint 整个网络结构分为三个部分:

  • 体素化(pillar 化):将输入的5维原始点云转换为稀疏的伪图像形式

  • Backbone:将 PFN 层后的特征提取高层语义特征

  • CenterPointHead:多类别的3D目标检测和回归3D框

地平线部署说明

Centerpoint 在地平线平台上部署的改动点为:

  1. 前处理 point encoder部分,仅使用5维,并做归一化处理,浮点相比官方几乎不掉点,对量化训练更友好;

  2. PillarFeatutreNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使该结构可在BPU上高效支持,性能提升;

  3. PillarFeatutreNet 中的 PFNLayer 使用 MaxPool2d,替换原有的 torch.max,便于性能的提升;

  4. Scatter过程使用horizon_plugin_pytorch实现的point_pillars_scatter,便于模型推理优化,逻辑与公版相同。

  5. 对于耗时严重的OP,采用H W维度转换的方式,将大数据放到W维度,比如1x5x40000x20 转换为 1x5x20x40000。

说明: 本文档对应模型为 centerpoint_pointpillar_nuscenes,核心实现位于 heal/models/task_modules/centerpoint/ 与 heal/models/task_modules/lidar/pillar_encoder.py,下文涉及改动点的配置均出自 configs/centerpoint_pointpillar_nuscenes/。

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

性能优化

改动点1:

前处理 point encoder部分,仅使用5维,并做归一化处理。Voxelization 在horizon-plugin中实现,preprocess实现voxelization过程,主要是将点云数据根据预设size划分为一个个的网格。凡是落入到一个网格的点云数据被视为其处在一个 voxel里,或者理解为它们构成了一个 voxel。voxelization的实现流程见下图:
流程图-2.jpg
对应代码:horizon_plugin_pytorch/nn/quantized/functional_impl/_voxelization

对 pillar 特征归一化,可通过指定维度和范围值做归一化,有助于量化训练:

heal/models/task_modules/centerpoint/pre_process.py

改动点2:

PillarFeatureNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使该结构可在BPU上高效支持。该算法主要实现将点云数据的shape (1,D,N,P)经过pfn_layers后变换为(1,C,1,P)PillarFeatureNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使该结构可在BPU上高效支持。该算法主要实现将点云数据的shape (1,D,N,P)经过pfn_layers后变换为(1,C,1,P)PillarFeatureNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使该结构可在BPU上高效支持。该算法主要实现将点云数据的shape (1,D,N,P)经过pfn_layers后变换为(1,C,1,P)PillarFeatureNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使该结构可在BPU上高效支持。该算法主要实现将点云数据的shape (1,D,N,P)经过pfn_layers后变换为(1,C,1,P)-->(1,1,P,C)。整体步骤如下图:

流程图-3.jpg
对应代码:heal/models/task_modules/lidar/pillar_encoder.py

改动点3:

PillarFeatureNet 中的 PFNLayer 使用 MaxPool2d,替换原有的 torch.max,便于性能的提升。

说明:对应代码见上文 PFNLayer 的 self.max_pool(x)。

改动点4:

Scatter 过程使用 horizon_plugin_pytorch 实现的 point_pillars_scatter,便于模型推理优化,逻辑与公版相同。该层实现伪图像转换的最后一个步骤:将 P 转化为(W, H),最终通过映射获得形如(C, H, W) 的伪图像,实现流程见上图。

对应代码:heal/models/task_modules/lidar/pillar_encoder.py

Scatter实现代码在horizon_plugin_pytorch下实现,见代码:

改动点5:

对于耗时严重的OP,采用 H W 维度转换的方式,将大数据放到 W 维度,比如 1x5x40000x20 转换为 1x5x20x40000。

说明:对应代码见上文 _voxel_feature_encoder 中 features.unsqueeze(0).permute(0, 3, 2, 1).contiguous()(改动点1)。

精度优化

浮点精度

Centerpoint 在浮点层面未做独立的结构性精度优化改动,部署改动点(见上文「性能优化」)以量化友好与性能为导向:

  • 改动点1将 point encoder 仅使用5维并做归一化,浮点相比官方几乎不掉点,同时为量化训练提供更好的初始化;

  • 改动点2将 PFNLayer 由Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使结构可在 BPU 上高效支持,浮点精度保持一致,主要收益在性能与量化友好性;

其余 backbone(SECONDNeck)、CenterPointHead、Loss 等结构与公版逻辑一致,未做影响浮点精度的改动。

量化精度

量化配置要点:

  • 点云数据需归一化后作为模型输入,更有利于量化。

  • 全局默认 qint8(ModuleNameTemplate({"": qint8})),Conv 输入/权重均为 qint8;matmul 输入为 [qint8, qint16];
  • Calibration 使用 MSEObserver,QAT 使用 MinMaxObserver;QAT 阶段固定scale不更新,仅weight更新;
  • 量化流程为 Calibration + QAT。如私有数据集上出现量化掉点,可对敏感算子补充 int16/固定 scale 配置,并配合精度 debug、敏感度分析工具定位。

configs/centerpoint_pointpillar_nuscenes/qconfig.py

总结与建议

部署建议

  • 点云输入仅使用5维(num_input_features=5,(x,y,z,r,t))并对 pillar 特征做归一化(norm_range/norm_dims),相比高维输入减少前处理耗时、对量化训练更友好;归一化范围需根据实际数据分布配置。
  • PFNLayer 使用Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使结构可在 BPU 上高效支持、便于量化;pooling 用 MaxPool2d 替代 torch.max 提升性能。

  • Scatter 使用 horizon_plugin_pytorch 的 point_pillars_scatter(use_horizon_pillar_scatter=True)便于推理优化;当前仅支持设置为 True。
  • 对耗时严重的 OP 采用 H/W 维度转换,将大数据放到 W 维度(如 1x5x40000x20 → 1x5x20x40000),降低算子开销。

  • 量化采用全局 qint8(Calibration + QAT),结构对量化友好;如出现量化掉点,可对敏感算子补充 int16/固定 scale 配置,并配合精度 debug、敏感度分析工具定位。

附录

  1. 论文:https://arxiv.org/abs/2006.12675

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

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