PointNet++
PointNet++ (PointNet2) 是由斯坦福大学在2017年提出的 3D点云深度学习里程碑模型,是 PointNet 的升级版,核心解决了 PointNet 无法有效捕捉局部几何结构的缺陷。
一、提出背景
- PointNet 的局限:
- 直接全局最大池化,缺乏局部感受野,无法建模点与点间的空间邻近关系。
- 对点云密度变化敏感,在非均匀采样的真实场景中性能下降。
- 细粒度分割、复杂场景理解能力不足。
- PointNet++ 的核心目标:
- 引入层次化局部特征学习,模拟 CNN 从局部到全局的特征金字塔。
- 处理无序、非结构化、密度不均的真实点云。
- 提升分类、部件分割、语义分割的精度与鲁棒性。
二、核心架构与原理
PointNet++ 主要由 Set Abstraction (SA, 集抽象) 和 Feature Propagation (FP, 特征传播) 两大模块构成。
1. Set Abstraction (SA):分层下采样与特征提取
每个 SA 模块包含三步:
- Farthest Point Sampling (FPS, 最远点采样)
- Ball Query / K-Nearest Neighbor (KNN)
- PointNet 特征聚合
- 在每个局部组内用 PointNet + 最大池化提取局部特征。
- 多尺度方案:
- MSG (Multi-Scale Grouping):同一质心用不同半径提取多尺度特征。
- MRG (Multi-Resolution Grouping):组合不同层的特征适应密度变化。
2. Feature Propagation (FP):上采样与逐点恢复(分割用)
- 反距离加权插值:把高层特征传回原始点云。
- 跳跃连接 (Skip Connection):拼接低层细粒度特征。
- 逐点 MLP 恢复逐点预测(语义/部件标签)。
3. 整体流程
- 分类:SA 堆叠 → 全局池化 → MLP 分类。
- 分割:SA 下采样 → FP 上采样 → 逐点分类。
三、关键创新
- 层次化局部建模:从点→局部→全局,感受野逐层扩大。
- 密度自适应:MSG/MRG 应对非均匀点云。
- 排列不变性:用最大池化保证点序无关。
- 端到端:直接输入 N×(3+C) 坐标+特征,无需体素化/投影。
四、性能与应用
- 优势:
- 在 ModelNet40(分类)、ShapeNet(部件分割)、ScanNet(场景分割) 大幅超越 PointNet。
- 更适合自动驾驶、机器人、三维重建、AR/VR等真实点云。
- 应用场景:
- 3D 物体分类/检索
- 部件分割(如飞机机翼、汽车轮胎)
- 室内/室外场景语义分割
- 点云配准、目标检测(如 PointRCNN 骨干)
五、与 PointNet 对比
| 特性 |
PointNet |
PointNet++ |
| 局部特征 |
无,全局池化 |
有,多层SA局部建模 |
| 密度鲁棒 |
差 |
强(MSG/MRG) |
| 细粒度 |
一般 |
优秀 |
| 速度 |
快 |
较慢(分层计算) |
六、总结
PointNet++ 是点云深度学习的基石,以分层局部特征+密度自适应解决了 PointNet 的核心短板,至今仍是很多 3D 算法的基础骨干(如 PointRCNN、PV-RCNN、OpenPCDet 等)。
输入输出
N × 6 (x,y,z + r,g,b)
N × 9 (x,y,z + 法向量 nx,ny,nz + 颜色)
| 任务 |
输入形状 |
输出形状 |
含义 |
| 分类 |
N × 3 |
1 × K |
整个物体属于哪一类 |
| 分割 |
N × 3 |
N × K |
每个点属于哪一类 |
Pipeline
原始点云输入 (N, 3+C) —— N:点数量;3:xyz坐标;C:可选额外特征(颜色/法向量)
↓
┌─────────────────────────────────────────────────────────────────┐
│ 编码器:多层Set Abstraction (SA) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ SA1 │ │ SA2 │ │ SA3 │ │
│ │ 采样→分组→聚合│ → │ 采样→分组→聚合 │ → │ 采样→分组→聚合 │ │
│ │ (N→N1, D→D1)│ │ (N1→N2, D1→D2)│ │ (N2→N3, D2→D3)│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└───────────────────────────────┬─────────────────────────────────┘
↓
全局高维特征 (N3, D3)
↓
┌─────────────────────────────────────────────────────────────────┐
│ 解码器:多层Feature Propagation (FP) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ FP3 │ │ FP2 │ │ FP1 │ │
│ │插值+拼接+融合│ ← │插值+拼接+融合│ ← │插值+拼接+融合│ │
│ │ (N3→N2, D3+D2→D4)│ (N2→N1, D4+D1→D5)│ (N1→N, D5+D0→D6)│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└───────────────────────────────┬─────────────────────────────────┘
↓
逐点特征 (N, D6)
↓
┌─────────────────────────────────────────────────────────────────┐
│ 分类头:共享MLP │
└───────────────────────────────┬─────────────────────────────────┘
↓
输出:逐点分割预测 (N, K) —— K:分割类别数
| 网络层 |
输入维度 |
核心操作 |
输出维度 |
关键说明 |
| 原始输入 |
(4096, 3) |
无(仅输入点云坐标) |
(4096, 3) |
N=4096,feat_dim=3(xyz) |
| SA1 |
(4096, 3) |
FPS(2048) + Ball Query + MLP(3→64→128) + 最大池化 |
(2048, 128) |
下采样:4096→2048;特征升维:3→128 |
| SA2 |
(2048, 128) |
FPS(512) + Ball Query + MLP(128→256→512) + 最大池化 |
(512, 512) |
下采样:2048→512;特征升维:128→512 |
| SA3 |
(512, 512) |
FPS(128) + Ball Query + MLP(512→512→1024) + 最大池化 |
(128, 1024) |
下采样:512→128;特征升维:512→1024(全局特征) |
| FP3 |
高层(128,1024)、低层(512,512) |
反距离插值 + 跳跃拼接 + MLP(1024+512→512) |
(512, 512) |
上采样:128→512;融合高层+SA2特征 |
| FP2 |
高层(512,512)、低层(2048,128) |
反距离插值 + 跳跃拼接 + MLP(512+128→256) |
(2048, 256) |
上采样:512→2048;融合高层+SA1特征 |
| FP1 |
高层(2048,256)、低层(4096,3) |
反距离插值 + 跳跃拼接 + MLP(256+3→128) |
(4096, 128) |
上采样:2048→4096;还原原始点数,融合细节 |
| MLP分类头 |
(4096, 128) |
MLP(128→64→32→K) + Softmax |
(4096, 10) |
逐点输出类别概率,K=10(可按需修改) |
SA 结构图
SA模块输入:(n_points, feat_dim) —— n_points:当前层点数量;feat_dim:当前特征维度
│
├───────────────────────────────────────────────────┐
│ ① Farthest Point Sampling (FPS) 最远点采样 │
│ 输出:中心点集 (n_sample, 3) —— n_sample:采样后点数 │
└───────────────────────────┬───────────────────────┘
↓
├───────────────────────────────────────────────────┐
│ ② 邻域分组:Ball Query(半径)/ KNN(近邻数) │
│ 输出:(n_sample, k_neighbor, 3+feat_dim) │
│ —— k_neighbor:每个中心点的邻域点数量 │
└───────────────────────────┬───────────────────────┘
↓
├───────────────────────────────────────────────────┐
│ ③ 局部归一化:邻域点坐标 - 对应中心点坐标 │
│ 消除中心点位置影响,聚焦局部几何结构 │
└───────────────────────────┬───────────────────────┘
↓
├───────────────────────────────────────────────────┐
│ ④ 小型PointNet:多层MLP(1×1卷积) │
│ 作用:提取局部邻域的高维特征,升维 │
└───────────────────────────┬───────────────────────┘
↓
├───────────────────────────────────────────────────┐
│ ⑤ 逐组最大池化:聚合邻域特征 │
│ 输出:SA模块最终结果 (n_sample, new_feat_dim) │
│ —— new_feat_dim:聚合后的新特征维度 │
└───────────────────────────────────────────────────┘
FP 结构图
FP模块双输入:
输入1:高层稀疏点特征 (n1, d1) —— 编码器深层输出,点数少、语义强
输入2:低层稠密点特征 (n2, d2) —— 编码器浅层输出,点数多、细节足(n2 > n1)
│
├───────────────────────────────────────────────────┐
│ ① 反距离加权插值 │
│ 作用:将高层稀疏特征 (n1, d1) 插值到低层稠密点位置 │
│ 输出:插值后特征 (n2, d1) │
└───────────────────────────┬───────────────────────┘
↓
├───────────────────────────────────────────────────┐
│ ② 跳跃连接(Skip Connection) │
│ 操作:插值特征 (n2, d1) + 低层原始特征 (n2, d2) │
│ 输出:拼接后特征 (n2, d1+d2) │
└───────────────────────────┬───────────────────────┘
↓
├───────────────────────────────────────────────────┐
│ ③ 1×1 MLP 融合降维 │
│ 作用:融合拼接特征,降低维度,避免冗余 │
│ 输出:FP模块最终结果 (n2, new_d) —— new_d:融合后维度 │
└───────────────────────────────────────────────────┘
PointNet++
PointNet++ (PointNet2) 是由斯坦福大学在2017年提出的 3D点云深度学习里程碑模型,是 PointNet 的升级版,核心解决了 PointNet 无法有效捕捉局部几何结构的缺陷。
一、提出背景
二、核心架构与原理
PointNet++ 主要由 Set Abstraction (SA, 集抽象) 和 Feature Propagation (FP, 特征传播) 两大模块构成。
1. Set Abstraction (SA):分层下采样与特征提取
每个 SA 模块包含三步:
2. Feature Propagation (FP):上采样与逐点恢复(分割用)
3. 整体流程
三、关键创新
四、性能与应用
五、与 PointNet 对比
六、总结
PointNet++ 是点云深度学习的基石,以分层局部特征+密度自适应解决了 PointNet 的核心短板,至今仍是很多 3D 算法的基础骨干(如 PointRCNN、PV-RCNN、OpenPCDet 等)。
输入输出
Pipeline
SA 结构图
FP 结构图