该示例为参考算法,仅作为在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 在地平线平台上部署的改动点为:
前处理 point encoder部分,仅使用5维,并做归一化处理,浮点相比官方几乎不掉点,对量化训练更友好;
PillarFeatutreNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,使该结构可在BPU上高效支持,性能提升;
PillarFeatutreNet 中的 PFNLayer 使用 MaxPool2d,替换原有的 torch.max,便于性能的提升;
Scatter过程使用horizon_plugin_pytorch实现的point_pillars_scatter,便于模型推理优化,逻辑与公版相同。
对于耗时严重的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:

对 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:
PillarFeatureNet 中的 PFNLayer 使用 MaxPool2d,替换原有的 torch.max,便于性能的提升。
说明:对应代码见上文 PFNLayer 的 self.max_pool(x)。
改动点4:
Scatter 过程使用 horizon_plugin_pytorch 实现的 point_pillars_scatter,便于模型推理优化,逻辑与公版相同。该层实现伪图像转换的最后一个步骤:将 P 转化为(W, H),最终通过映射获得形如(C, H, W) 的伪图像,实现流程见上图。
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、敏感度分析工具定位。
附录
论文:https://arxiv.org/abs/2006.12675
参考算法官网(modellabs):https://(待发布)
