Skip to content

paper PointNet #541

@junxnone

Description

@junxnone

PointNet++

PointNet++ (PointNet2) 是由斯坦福大学在2017年提出的 3D点云深度学习里程碑模型,是 PointNet 的升级版,核心解决了 PointNet 无法有效捕捉局部几何结构的缺陷。

Image

一、提出背景

  • PointNet 的局限
    • 直接全局最大池化,缺乏局部感受野,无法建模点与点间的空间邻近关系。
    • 点云密度变化敏感,在非均匀采样的真实场景中性能下降。
    • 细粒度分割、复杂场景理解能力不足。
  • PointNet++ 的核心目标
    • 引入层次化局部特征学习,模拟 CNN 从局部到全局的特征金字塔。
    • 处理无序、非结构化、密度不均的真实点云。
    • 提升分类、部件分割、语义分割的精度与鲁棒性。

二、核心架构与原理

PointNet++ 主要由 Set Abstraction (SA, 集抽象)Feature Propagation (FP, 特征传播) 两大模块构成。

1. Set Abstraction (SA):分层下采样与特征提取

每个 SA 模块包含三步:

  1. Farthest Point Sampling (FPS, 最远点采样)
    • 从点云中选出 N 个质心点,覆盖全局、分布均匀。
  2. Ball Query / K-Nearest Neighbor (KNN)
    • 以质心为中心,按半径或近邻数分组局部邻域
  3. PointNet 特征聚合
    • 在每个局部组内用 PointNet + 最大池化提取局部特征
  • 多尺度方案
    • MSG (Multi-Scale Grouping):同一质心用不同半径提取多尺度特征。
Image
  • MRG (Multi-Resolution Grouping):组合不同层的特征适应密度变化。

2. Feature Propagation (FP):上采样与逐点恢复(分割用)

  • 反距离加权插值:把高层特征传回原始点云。
  • 跳跃连接 (Skip Connection):拼接低层细粒度特征。
  • 逐点 MLP 恢复逐点预测(语义/部件标签)。

3. 整体流程

  • 分类:SA 堆叠 → 全局池化 → MLP 分类。
  • 分割:SA 下采样 → FP 上采样 → 逐点分类。

三、关键创新

  1. 层次化局部建模:从点→局部→全局,感受野逐层扩大
  2. 密度自适应:MSG/MRG 应对非均匀点云
  3. 排列不变性:用最大池化保证点序无关
  4. 端到端:直接输入 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 × (3 + C)
    • C:额外特征(可选,比如颜色、法向量、强度值)

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:融合后维度 │
        └───────────────────────────────────────────────────┘

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions