该示例为参考算法,仅作为在J6上模型部署的设计参考,非量产算法
简介
在自动驾驶感知系统中,激光雷达(LiDAR)凭借直接测距、不受光照影响的优势,是3D目标检测的重要传感器。LiDAR 3D 检测通常先将无序点云体素化(voxel/pillar 化)为规则的伪图像表征,再通过2D卷积网络提取特征并完成检测框的回归与分类,代表性方法包括 VoxelNet、PointPillars、CenterPoint 等。
PointPillars 提出了一种改进版本的点云表征方法 Pillar,可以将点云转换成伪图像进而通过2D卷积实现目标检测,是 LiDAR 3D 检测的经典一阶段方法。本参考算法基于 PointPillars 公版,针对征程6平台的计算特性做了定制化修改(见下文「地平线部署说明」)。
性能精度指标
model | backbone | dataset | mAP精度 (浮点/定点) | J6M Latency | J6M FPS |
|---|---|---|---|---|---|
PointPillars | SECONDNeck | kitti3D | 0.7733/0.7707 | 22.52 ms | 213 |
该性能指标基于以下配置测得:
点云数量 | 点云范围 | Voxel 尺寸 | 最大点数 | 最大pillar数 | 检测类别 |
|---|---|---|---|---|---|
15w | [0, -39.68, -3, 69.12, 39.68, 1] | [0.16, 0.16, 4.0] | 100 | 12000 | "car" |
公版模型介绍

pointpillar model structure
PointPillars整个网络结构分为三个部分:
Pillar Feature Net:将输入的点云转换为稀疏的Pseudo image
Backbone:处理Pseudo image得到高层的特征
Detection Head:检测和回归3D框
地平线部署说明
PointPillars 在地平线平台上部署的改动点为:
前处理 point encoder部分,仅使用4维(官方9维),并做归一化处理,耗时减小4ms;精度表现: 浮点相比官方几乎不掉点(官方浮点77.42),但是对量化训练更友好;
PillarFeatutreNet 中的 PFNLayer 使用 Conv2d + BathNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,便于模型量化;
PillarFeatutreNet 中的 PFNLayer 使用 MaxPool2d,替换原有的 torch.max,便于性能的提升;
Scatter过程使用horizon_plugin_pytorch的point_pillars_scatter,便于模型推理优化,逻辑与公版相同。
说明: 本文档对应模型为 pointpillars_kitti_car,核心实现位于 heal/models/task_modules/pointpillars/ 与 heal/models/task_modules/lidar/pillar_encoder.py,下文涉及改动点的配置均出自 configs/pointpillars_kitti_car/。
下面将部署优化对应的改动点以及量化配置依次说明。
性能优化
改动点1:

改动点2:
PillarFeatureNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,便于模型量化。该算法主要实现将点云数据的shape (1,D,P,N)经过pfn_layers后变换为(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下实现,见代码:
精度优化
浮点精度
PointPillars 在浮点层面未做独立的结构性精度优化改动,部署改动点(见上文「性能优化」)以量化友好与性能为导向:
改动点1将 point encoder 由 9 维降至 4 维并做归一化,浮点相比官方几乎不掉点(官方浮点 77.42),同时为量化训练提供更好的初始化;
改动点2将 PFNLayer 由 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,浮点精度保持一致,主要收益在量化友好性。
其余 backbone(SECONDNeck)、Detection Head、Loss 等结构与公版逻辑一致,未做影响浮点精度的改动。
量化精度
量化配置要点:
点云为归一化后的输入,更利于量化。
- 全局默认 qint8(ModuleNameTemplate({"": qint8})),Conv 输入/权重均为 qint8;matmul 输入为 [qint8, qint16]。
- Calibration 使用 MSEObserver,QAT 使用 MinMaxObserver;QAT 阶段 fix_scale=True 将激活 scale 冻结在 calib 值,便于收敛。
总结与建议
部署建议
点云输入维度 仅使用 4 维相比官方 9 维可减少前处理耗时,在精度允许的前提下优先采用更低维度。
PFNLayer 使用Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,便于量化与算子融合,量化友好性较好,通常无需对中间算子额外配置 int16。
- Scatter 过程使用 horizon_plugin_pytorch 的 point_pillars_scatter,便于推理优化。
PFNLayer 的 pooling 用 MaxPool2d 替代 torch.max,便于性能提升。
点云归一化后再输入更有利于模型量化。如私有数据集出现量化掉点,可对敏感算子补充 int16/固定 scale 配置,并配合精度 debug、敏感度分析工具定位。
附录
论文:https://arxiv.org/abs/1812.05784
公版代码:https://github.com/traveller59/second.pytorch
参考算法官网(modellabs):https://(待发布)
