点云分割与分类:从 PointNet++ 到图方法
引言:3D 世界的理解——点云分割与分类
在自动驾驶、机器人导航、AR/VR 等场景中,三维数据是理解物理环境的关键。点云作为最直接的三维数据表达形式,由大量空间坐标点组成,能精确刻画物体表面形状。然而,点云的无序性、稀疏性和不规则性给深度学习带来了巨大挑战。本教程将带您从经典方法 PointNet++ 出发,逐步过渡到更强大的 图方法(Graph-based Methods),系统掌握点云分割与分类的核心思想与实现路径。
1. 点云基础与任务定义
1.1 点云是什么?
点云是一组三维空间中的点集合,通常由激光雷达(LiDAR)、深度相机或运动恢复结构(SFM)生成。每个点包含 $(x,y,z)$ 坐标,可能附加颜色、法向量、强度等信息。
特性:
- 无序性:点集本质上是集合,交换点的顺序不会改变几何含义。网络必须具有排列不变性。
- 稀疏性:物体仅存在于空间中的少数区域,大部分体积为空。
- 不规则采样:接近传感器的区域点稠密,远处则稀疏。
- 旋转平移等变性:对刚性变换理应保持一致的理解。
1.2 两大核心任务
- 点云分类(Shape Classification):给定一个点云,预测其全局类别(如“桌子”“汽车”)。
- 点云分割(Semantic Segmentation):为点云中的每一个点赋予一个语义标签(如“车顶”“车轮”)。可细分为:
- 语义分割:区分物体类别(如“桌子上的杯子”)。
- 零件分割:区分物体内部的部件(如“椅子的扶手”)。
- 实例分割:区分同一类别下的不同个体。
2. PointNet:排列不变性的奠基之作
PointNet 是直接处理点云的先驱网络,其核心是使用对称函数(如最大池化)实现排列不变性。
网络结构:
- 输入点集通过共享的多层感知机(MLP)映射到高维空间。
- 所有点的特征进行最大池化,得到全局特征向量。
- 全局特征再与逐点特征拼接,最终输出每个点的分类得分(分割)或直接用于全局分类(分类)。
公式表示: $$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 整体架构
- 输入原始点云。
- 堆叠多个 EdgeConv 层,每层之间可动态更新图。
- 将各层输出的逐点特征拼接(保留不同抽象级别的信息),经过全局最大池化得到全局特征,用于分类;或与局部特征结合,上采样后用于分割(类似 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++ 的关键步骤
- 实现 FPS 采样:取出当前点集,迭代选最远点。
- 实现 Ball Query:对每个中心点建立球形邻域索引。
- 构建 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
...
- 分类网络:多个 SA → 全局最大池化 → 分类头。
- 分割网络:对称的 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 上实践,理解细节带来的性能差异。点云世界的大门已经敞开,开始你的三维深度学习之旅吧!