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

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

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

该示例为参考算法,仅作为在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 在地平线平台上部署的改动点为:

  1. 前处理 point encoder部分,仅使用4维(官方9维),并做归一化处理,耗时减小4ms;精度表现: 浮点相比官方几乎不掉点(官方浮点77.42),但是对量化训练更友好;

  2. PillarFeatutreNet 中的 PFNLayer 使用 Conv2d + BathNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,便于模型量化;

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

  4. 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:

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

改动点2:

PillarFeatureNet 中的 PFNLayer 使用 Conv2d + BatchNorm2d + ReLU,替换原有的 Linear + BatchNorm1d + ReLU,便于模型量化。该算法主要实现将点云数据的shape (1,D,P,N)经过pfn_layers后变换为(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下实现,见代码:

精度优化

浮点精度

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、敏感度分析工具定位。

附录

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

  2. 公版代码:https://github.com/traveller59/second.pytorch

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


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