1. 从PointNet到PointNet++:为什么我们需要“局部”的智慧
大家好,我是老张,在三维视觉和点云处理这个领域摸爬滚打了十来年。今天想和大家深入聊聊PointNet++,特别是它如何通过多尺度特征融合和一系列优化策略,解决了三维点云处理中的几个核心痛点。如果你看过PointNet,可能会觉得它很酷——直接吃进去一堆无序的点,就能输出分类或分割结果。但用久了,尤其是在实际项目里,比如处理自动驾驶的激光雷达数据或者机器人抓取的不规则物体,你就会发现PointNet有点“力不从心”。
PointNet的核心问题,用一个词概括就是“缺乏局部感知”。你可以把它想象成一个非常博学但有点“粗心”的学者。它要么盯着一个点看(高维映射),要么一下子看完所有点(全局池化),但就是不会把几个相邻的点放在一起,琢磨它们之间的关系。这就导致它在处理一些精细结构时,比如分割桌子的腿和桌面,或者识别物体表面的细微纹理时,精度上不去。更麻烦的是“平移不变性”问题。点云的坐标是绝对的(x, y, z),你把一个物体在空间里挪个位置,所有点的坐标都变了,PointNet提取的特征就可能大变样,导致识别错误。对于单个物体,我们还能把它挪到坐标系中心归一化一下,但一个场景里堆着几十个物体,你归一化谁呢?
所以,PointNet++的诞生,就是为了把“局部智慧”引入点云处理。它的核心思想非常直观:在小的局部区域里,反复、迭代地使用PointNet。这就像我们看一幅画,先看局部细节的笔触(一个小区域),然后退后几步看更大的色块和构图(更大的区域),最后把握整体意境。PointNet++通过一种叫做“集合抽象化”的操作,实现了这种多级、分层的特征学习。具体怎么做的呢?我们接下来就拆开看看。
2. PointNet++的核心机制:集合抽象化与分层特征学习
2.1 集合抽象化:点云的“下采样”与“特征提取”
PointNet++最核心的操作叫做 Set Abstraction,我习惯叫它“集合抽象化”层。这个层干三件事:采样、分组、特征提取。我们用一个简单的2D例子(比如字母A的点云)来理解。
首先,采样。我们从上一层的所有点中,选出一些“代表点”。怎么选?常用最远点采样,目的是让选出的点尽量均匀地覆盖整个形状。这些代表点,就是我们要研究的各个“小区域”的中心。
接着,分组。以每个代表点为中心,画一个球(在2D里就是圆),设定一个半径。把球内的所有点都找出来,归为一组。这一步就定义了我们关心的“局部区域”。这里有个关键,球内的点数量可能不一样,有的区域点密,有的稀疏,但这没关系,因为下一步的PointNet能处理。
最后,也是精髓所在,特征提取。对每一个分组(即一个局部区域内的点集),我们将其坐标转换到以代表点为中心的局部坐标系中。这一步很妙,它瞬间解决了平移敏感性问题——因为现在所有局部区域都在自己的小坐标系里看问题,整体平移不影响局部相对位置。然后,对这个局部点集使用一个迷你版的PointNet。这个迷你PointNet会学习这个局部区域的几何结构,并输出一个特征向量。这个特征向量,连同代表点自身的坐标,就形成了一个新的、更高层次的“点”。
经过这么一轮操作,我们得到了一组新的点集。新点集的数量比原来少(因为采样),但每个点都“代表”了其周围一个区域的复杂几何信息。这个过程可以重复多次,就像卷积神经网络里的池化层一样,实现点云的多级抽象:点的数量越来越少,

297

被折叠的 条评论
为什么被折叠?



