PointPillars 3D 目标检测详解

PointPillars 3D 目标检测详解

适用场景:自动驾驶、低速无人车、移动机器人、园区/地铁站巡检机器人等 LiDAR 3D 感知任务。

核心思想:把稀疏无序点云转换成 BEV 伪图像,再用高效 2D CNN 完成 3D 目标检测。

1. PointPillars 解决什么问题?

激光雷达点云天然是稀疏、无序、点数可变的数据。传统 3D 检测常见路线包括:

路线 表示方式 优点 缺点
Point-based 直接处理点 几何细节保留好 邻域搜索/采样较慢
Voxel-based 3D 体素 结构规则,适合 3D CNN / sparse CNN 3D 计算量较大
BEV-based 俯视图网格 快,适合 2D CNN 高度信息容易损失
PointPillars XY 柱体 + PointNet 编码 快,端到端,部署友好 对垂直结构表达弱于完整 3D voxel

PointPillars 的关键创新是:

不在 Z 方向切分体素,而是在 XY 平面划分柱体 pillar,每个 pillar 覆盖整个高度范围。

这样做可以避免 3D 卷积,把问题压缩成 2D BEV 伪图像检测。


2. 总体网络结构

text 复制代码
LiDAR points
    |
    | 1. Range filter
    v
Valid points in detection range
    |
    | 2. Pillarization on XY plane
    v
Non-empty pillars
    |
    | 3. Pillar Feature Net / PFN
    v
One feature vector per pillar
    |
    | 4. Scatter
    v
BEV pseudo-image: C x H x W
    |
    | 5. 2D Backbone + Neck
    v
Multi-scale BEV feature map
    |
    | 6. Detection Head
    v
Class score + 3D box residual + direction
    |
    | 7. Decode + rotated NMS
    v
Final 3D detection boxes

3. 输入点云与坐标范围

单帧 LiDAR 点云通常表示为:

text 复制代码
P = {p_i}, p_i = [x_i, y_i, z_i, r_i]

其中:

  • x, y, z:LiDAR 坐标系下的三维位置;
  • r:反射强度 intensity / reflectance;
  • 点数 N 每帧不固定;
  • 检测前会做范围裁剪,例如只保留车前方或机器人有效感知区域内的点。

典型检测范围可写成:

text 复制代码
x ∈ [x_min, x_max]
y ∈ [y_min, y_max]
z ∈ [z_min, z_max]

4. Pillarization:点云柱体化

PointPillars 在 XY 平面划分网格:

text 复制代码
pillar_size = [dx, dy]
H = (y_max - y_min) / dy
W = (x_max - x_min) / dx

每个网格单元对应一个垂直柱体 pillar:

text 复制代码
pillar = all points whose x,y fall into the same BEV grid cell

与 VoxelNet 不同:

  • VoxelNet:x, y, z 三个方向都划分体素;
  • PointPillars:只划分 x, y,Z 方向不切分。

优点:

  1. 减少 3D 稀疏卷积或 3D CNN 的计算;
  2. 输出天然是 2D 网格,适合 2D CNN;
  3. 对部署更友好,尤其适合 TensorRT / ONNX / C++ 推理。

5. Pillar Feature Net / PFN

每个 pillar 内有若干点。为了批处理,通常设置:

text 复制代码
P = max_num_pillars
N = max_num_points_per_pillar
D = point_feature_dim

形成张量:

text 复制代码
pillars: [P, N, D]

5.1 点特征构造

原始点特征一般包含:

text 复制代码
[x, y, z, r]

PointPillars 会加入相对位置信息:

text 复制代码
x_c = x - mean_x_of_pillar
y_c = y - mean_y_of_pillar
z_c = z - mean_z_of_pillar

x_p = x - pillar_center_x
y_p = y - pillar_center_y

常见增强后特征:

text 复制代码
[x, y, z, r, x_c, y_c, z_c, x_p, y_p]

其中:

  • cluster offset:点相对 pillar 内点簇中心的偏移;
  • center offset:点相对 pillar 几何中心的偏移;
  • 这些特征帮助网络理解 pillar 内局部几何形状。

5.2 Shared MLP + Max Pool

每个点经过共享 MLP:

text 复制代码
point_feature -> shared MLP -> high dimensional feature

然后对同一 pillar 内所有点做 max pooling:

text 复制代码
pillar_feature = max_pool(point_features_in_same_pillar)

最终每个非空 pillar 得到一个向量。


6. Scatter:散射成 BEV 伪图像

PFN 输出是稀疏的 pillar 特征:

text 复制代码
non_empty_pillar_features: [P, C]
pillar_coords: [P, 2]

scatter 操作把每个 pillar 特征放回对应的 BEV 网格位置:

text 复制代码
pseudo_image: [C, H, W]

没有点的 pillar 位置填 0。

这一步是 PointPillars 的核心转换:

text 复制代码
irregular sparse points -> regular dense BEV feature map

得到 BEV 伪图像后,后续就可以使用成熟的 2D CNN 检测结构。


7. 2D Backbone + Neck

PointPillars 使用轻量 2D CNN 对 BEV 伪图像提取特征,常见结构为:

text 复制代码
Block1: Conv2D + BN + ReLU, stride 2
Block2: Conv2D + BN + ReLU, stride 2
Block3: Conv2D + BN + ReLU, stride 2

DeBlock1: upsample
DeBlock2: upsample
DeBlock3: upsample

concat multi-scale features

Backbone 的作用:

  1. 扩大感受野;
  2. 融合局部目标结构与大范围上下文;
  3. 输出统一尺度的 BEV 特征图给检测头。

8. Anchor-based Detection Head

PointPillars 原始设计使用 anchor-based head。每个 BEV 位置预设若干 anchor:

text 复制代码
anchor = [x_a, y_a, z_a, w_a, l_a, h_a, yaw_a]

检测头通常输出三类信息:

分支 输出 作用
Classification class score 判断目标类别
Regression box residual 回归 3D 框位置、尺寸、朝向
Direction heading bin 解决 yaw 角周期性问题

3D box 常表示为:

text 复制代码
box = [x, y, z, w, l, h, yaw]

解码后再经过 rotated NMS 得到最终检测框。


9. 损失函数

PointPillars 常用多任务损失:

text 复制代码
L = L_cls + beta * L_loc + gamma * L_dir

其中:

  • L_cls:分类损失,常用 focal loss;
  • L_loc:3D 框回归损失,常用 Smooth L1;
  • L_dir:方向分类损失;
  • betagamma:权重系数。

9.1 分类损失

Focal Loss 常用于缓解正负样本不均衡:

text 复制代码
FL(p_t) = - alpha_t * (1 - p_t)^gamma * log(p_t)

9.2 框回归损失

回归目标一般是 anchor residual:

text 复制代码
Δx = (x - x_a) / d_a
Δy = (y - y_a) / d_a
Δz = (z - z_a) / h_a

Δw = log(w / w_a)
Δl = log(l / l_a)
Δh = log(h / h_a)

Δθ = sin(θ - θ_a)

其中:

text 复制代码
d_a = sqrt(w_a^2 + l_a^2)

10. 推理流程

text 复制代码
1. 读取 .bin / PointCloud2 点云
2. 坐标范围裁剪
3. 生成 pillars 与 pillar indices
4. PFN 编码每个 pillar
5. Scatter 成 BEV pseudo-image
6. 2D Backbone 提取 BEV 特征
7. Head 输出 cls/reg/dir
8. Decode anchors
9. Score filter
10. Rotated NMS
11. 输出 3D boxes

11. 为什么 PointPillars 快?

主要原因:

  1. 不做 Z 方向 voxel 切分

    只在 XY 上划分柱体,减少稀疏结构复杂度。

  2. PointNet 编码局部点集

    每个 pillar 内用共享 MLP + max pooling,结构简单。

  3. 转成 2D BEV 伪图像

    后续使用高度优化的 2D CNN,比完整 3D CNN 更容易加速。

  4. 适合工程部署

    ONNX / TensorRT / CUDA / C++ 推理路径成熟。


12. 总结

PointPillars 的本质是:

text 复制代码
用 PointNet 学习每个垂直柱体的局部点云特征,
再把这些 pillar feature 散射成 BEV 伪图像,
最后用高效 2D CNN 做 3D 检测。

它不是精度最强的 3D 检测架构,但因为结构简单、速度快、部署友好,非常适合作为机器人和自动驾驶 LiDAR 3D 检测的工程 baseline。

相关推荐
泠不丁1 小时前
物联网实时传输可靠性:基于 Zigbee 网络的穿戴设备协议栈调优
人工智能
卡梅德生物科技小能手1 小时前
卡美德生物科普:LINGO-1(神经修复关键负向调控因子)
人工智能·经验分享·深度学习
weixin_446260851 小时前
HANDOFF:基于蒸馏互补教师的人形机器人任务空间整体控制
人工智能·算法·机器人
碳基硅坊1 小时前
Gemma-4-31B推理加速:量化、框架与加速技术实战
人工智能·gemma·模型加速·gemma4·gemma4-31b
戴西软件1 小时前
戴西CAxWorks.AICrash:AI+法规驱动的行人保护自动化分析
linux·运维·网络·人工智能·安全·自动化
aqi001 小时前
15天学会AI应用开发(四)根据Token长度截断历史对话
人工智能·python·大模型·ai编程·ai应用
淡水瑜1 小时前
豆包Trae、华为CodeArts Agent、海外Cursor、ClaudeCode实操
人工智能
出海小龙1 小时前
2026 SaaS增长:挖掘海外 Affiliate 的 7 个隐藏渠道
人工智能
luweis1 小时前
企智孪生 ETA (6.3 数字人格 (Digital Persona) 的构建工程、6.4 交互触点:全场景嵌入策略)【杭州联保致新科技有限公司 卢伟舜】
人工智能·程序人生·机器学习·自然语言处理·职场和发展·知识图谱·学习方法