点云分割与分类:从 PointNet++ 到图方法

FreeGuideOnline 最新 2026-06-20

引言:3D 世界的理解——点云分割与分类

在自动驾驶、机器人导航、AR/VR 等场景中,三维数据是理解物理环境的关键。点云作为最直接的三维数据表达形式,由大量空间坐标点组成,能精确刻画物体表面形状。然而,点云的无序性、稀疏性和不规则性给深度学习带来了巨大挑战。本教程将带您从经典方法 PointNet++ 出发,逐步过渡到更强大的 图方法(Graph-based Methods),系统掌握点云分割与分类的核心思想与实现路径。

1. 点云基础与任务定义

1.1 点云是什么?

点云是一组三维空间中的点集合,通常由激光雷达(LiDAR)、深度相机或运动恢复结构(SFM)生成。每个点包含 $(x,y,z)$ 坐标,可能附加颜色、法向量、强度等信息。

特性:

  • 无序性:点集本质上是集合,交换点的顺序不会改变几何含义。网络必须具有排列不变性。
  • 稀疏性:物体仅存在于空间中的少数区域,大部分体积为空。
  • 不规则采样:接近传感器的区域点稠密,远处则稀疏。
  • 旋转平移等变性:对刚性变换理应保持一致的理解。

1.2 两大核心任务

  • 点云分类(Shape Classification):给定一个点云,预测其全局类别(如“桌子”“汽车”)。
  • 点云分割(Semantic Segmentation):为点云中的每一个点赋予一个语义标签(如“车顶”“车轮”)。可细分为:
    • 语义分割:区分物体类别(如“桌子上的杯子”)。
    • 零件分割:区分物体内部的部件(如“椅子的扶手”)。
    • 实例分割:区分同一类别下的不同个体。

2. PointNet:排列不变性的奠基之作

PointNet 是直接处理点云的先驱网络,其核心是使用对称函数(如最大池化)实现排列不变性。

网络结构:

  1. 输入点集通过共享的多层感知机(MLP)映射到高维空间。
  2. 所有点的特征进行最大池化,得到全局特征向量。
  3. 全局特征再与逐点特征拼接,最终输出每个点的分类得分(分割)或直接用于全局分类(分类)。

公式表示: $$f({x_1, \dots, x_n}) \approx g(h(x_1), \dots, h(x_n))$$ 其中 $h$ 是 MLP,$g$ 是对称函数(如 max pooling)。

局限性: 最大池化只保留了最显著特征,忽略了局部几何结构,难以捕获细粒度模式。这是 PointNet++ 要解决的问题。

3. PointNet++:层次化的局部特征学习

3.1 核心思想:Multi-Scale Hierarchical Feature Learning

PointNet++ 在 PointNet 的基础上引入局部邻域聚合,通过采样(Sampling)分组(Grouping)特征提取(PointNet on groups) 三个步骤逐层构建特征,类似于 CNN 中的下采样和感受野扩展。

3.2 关键模块详解

1) 采样层(Farthest Point Sampling, FPS)
从输入点集 $N$ 中选出 $N'$ 个点作为局部区域的中心(称为Set Abstraction层)。FPS 能保证采样点较好地覆盖整个点云。

2) 分组层(Ball Query)
以每个采样点为中心,在半径 $R$ 的球形邻域内搜索 $K$ 个最近邻点(可加上限以确保固定点数)。这形成 $N'$ 个局部点集,每个大小为 $K$。

3) 特征提取层(Mini-PointNet)
对每个局部组,将组内点的坐标转换为相对于中心点的局部坐标,再输入一个小型 PointNet(MLP + Max Pooling)提取局部特征。这样每个中心点得到一个特征向量。

堆叠多个 SA 层后,网络输出具有更大多与范围的抽象特征。

3.3 网络用于分类与分割

  • 分类:最后一层 SA 的输出全局最大池化 → 全连接 → 输出类别。
  • 分割:采用特征传播(Feature Propagation) 方法上采样。通过基于距离的插值和跳跃连接,将高层特征传播回原始点云,最后逐点预测标签。

3.4 应对密度变化的鲁棒性

点云密度可能因距离远近而变化。PointNet++ 提出多尺度分组(MSG)多分辨率分组(MRG),在不同半径下聚合特征,从而适应稀疏和稠密区域。

4. 图方法:从邻域关系到拓扑建模

虽然 PointNet++ 通过欧氏距离定义局部邻域,但点之间的关系可能更复杂。图神经网络(GNN) 为点云提供了表达力更强的框架:将每个点视为图中节点,将点与点之间的关系建模为边。

4.1 点云的图表示

构建图 $G = (V, E)$:

  • 节点 $V$:点云中的每个点。
  • 边 $E$:通常基于 $k$ 最近邻(kNN)连接,或基于固定半径的球连接。
  • 边特征:可以计算节点间的差值、距离、方向等信息。

4.2 边卷积(EdgeConv):DGCNN 的精髓

Dynamic Graph CNN (DGCNN) 提出了 EdgeConv 操作,核心公式: $$e_{ij} = h_\Theta(x_i, x_j - x_i)$$ 其中 $h_\Theta$ 是一个共享的 MLP。该操作同时编码了全局形状信息(通过 $x_i$)和局部邻域信息(通过 $x_j - x_i$)。 所有邻边特征聚合(如 max)后得到中心节点的新特征。每次 EdgeConv 后,图可以基于新的特征空间动态重建(重新计算最近邻),从而使网络的感受野不断扩大,并能捕获语义相似但欧氏距离远的结构(例如椅子腿的两端)。

4.3 DGCNN 整体架构

  1. 输入原始点云。
  2. 堆叠多个 EdgeConv 层,每层之间可动态更新图。
  3. 将各层输出的逐点特征拼接(保留不同抽象级别的信息),经过全局最大池化得到全局特征,用于分类;或与局部特征结合,上采样后用于分割(类似 PointNet++ 的特征传播)。

4.4 图方法的优势与扩展

  • 动态图更新 自动学习更高级的语义邻接关系,而不是固定空间邻域。
  • 可集成多种几何特征:可轻松将点对的距离、夹角等作为边特征输入。
  • 与注意力机制结合:如 Point Transformer 使用向量注意力,可视为图网络上的自注意力变体。

其他重要图方法包括:

  • KPConv:在 3D 空间中定义可学习的核点,通过核点与邻域点的距离进行加权卷积,本质上也是一种基于图的权重学习。
  • GCN-based models:将谱图卷积或空间图卷积应用到点云。

5. 实践路线:从 PointNet++ 到图网络

5.1 环境与数据集

  • 常用框架:PyTorch + PyTorch3D、Open3D。
  • 标准数据
    • 分类:ModelNet40(CAD 模型点云采样)
    • 分割:ShapeNet Part(零件分割),S3DIS / ScanNet(室内场景语义分割),SemanticKITTI(室外自动驾驶)
  • 预处理:点云降采样至固定点数(如 2048 点),归一化坐标,数据增强(随机旋转、抖动、缩放)。

5.2 实现 PointNet++ 的关键步骤

  1. 实现 FPS 采样:取出当前点集,迭代选最远点。
  2. 实现 Ball Query:对每个中心点建立球形邻域索引。
  3. 构建 Set Abstraction 模块:
class SetAbstraction(nn.Module):
    def __init__(self, npoint, radius, nsample, in_channel, mlp):
        # npoint: 采样点数,radius: 球半径,nsample: 组内点数
        ...
    def forward(self, xyz, points):
        # 采样 -> 分组 -> MLP + Max Pool
        ...
  1. 分类网络:多个 SA → 全局最大池化 → 分类头。
  2. 分割网络:对称的 SA 层与上采样层 (FP 模块)。

5.3 实现动态图边缘卷积 (DGCNN)

核心 EdgeConv:

class EdgeConv(nn.Module):
    def __init__(self, k, in_channels, out_channels):
        self.k = k
        self.mlp = nn.Sequential(...)
    def forward(self, x):
        # x: (B, N, C)
        # 1. 在特征空间中找 k 近邻
        idx = knn(x)  
        # 2. 构建边特征
        x_central = x.unsqueeze(2).repeat(1,1,k,1)
        x_neighbor = gather(x, idx)  # (B,N,k,C)
        edge_feat = torch.cat([x_central, x_neighbor - x_central], dim=-1)
        # 3. MLP + max
        out = self.mlp(edge_feat).max(dim=2)[0]
        return out

堆叠三次不同的 EdgeConv,并将输出拼接。

6. 进阶思考:统一框架与未来方向

  • 从局部到全局:无论是 PointNet++ 的层次结构还是图网络的动态图,本质都是学习合适的点与点交互。图方法通过动态关系构建获得了更强的模型容量。
  • 点云 Transformer:最新工作(如 Point Transformer V2)将自注意力作为图上的邻域聚合,用向量注意力替代标量注意力,在大场景分割中表现优异。
  • 跨模态融合:将点云与图像、体素等其他表示结合,增强感知能力。

7. 总结

方法 核心思想 优点 缺点
PointNet 对称函数 + MLP 简单,排列不变,可分类可分割 忽略局部结构
PointNet++ 层次化局部聚合 有效抽取多尺度特征,性能好 邻域固定,密度敏感需额外处理
DGCNN 动态图边缘卷积 可学习语义邻接关系,更灵活 构图开销较高,内存随k增长

从 PointNet++ 到图方法,我们见证了 3D 深度学习从刚性局部感知走向动态关系建模的演进。掌握这两种代表性框架,将为解决实际点云任务打下坚实基础。建议动手复现上述代码,在 ModelNet40 和 ShapeNet Part 上实践,理解细节带来的性能差异。点云世界的大门已经敞开,开始你的三维深度学习之旅吧!