入门一个新领域时,很多人的第一反应是去搜“XX 带你入门”,然后看半天网课。

但我现在越来越觉得,入门的核心不是先堆资料,而是先抓住这个领域最核心的问题。

入门先抓核心问题

举几个例子:

  • VLA 的最终目标,是让机械臂更好地理解指令并完成动作。
  • LLM 的核心问题,是如何让 token 按照更合理的语义和逻辑继续生成。

那 3D 点云的核心问题是什么?

先看点云是什么。3D 点云通常由大量三维点组成,用来表示一个三维场景或物体。每个点可以包含多种信息:

  • (x, y, z):空间坐标。
  • RGB:颜色信息。
  • intensity:激光反射强度。
  • normal:法向量。
  • label:训练时的人为标注。

这些信息共同描述了一个点在三维空间中的位置、外观和语义。

点云为什么难?

LLM 的输入相对清楚:文本经过 tokenizer 之后变成 token 序列。这个序列天然有顺序,也有语言逻辑。

但点云不一样。点云是无序、不规则、稀疏的数据。

同一个场景里,把点的排列顺序换一下,场景本身并没有变。但神经网络通常更喜欢固定顺序、规则结构的输入。

所以点云领域最核心的问题就是:

如何在不规则、无序、稀疏的 3D 点集上学习有效的空间特征?

这里的空间特征可以是几何特征,比如它是平面还是曲面;也可以是区域特征,比如这是墙还是桌子;还可以是语义特征,比如这个物体属于什么类别。

模型学会这些空间特征之后,才能进一步用于实例分割、3D 目标检测、机器人抓取等任务。

用 Point Transformer 理解主流方法

了解基本元素和核心问题之后,下一步就是看主流方法到底在解决什么。

为了避免泛泛而谈,这里以 Point Transformer V3(PTv3)为例来理解。

既然点本身携带信息,我们当然可以把点云送入 Transformer,让 attention 去观察周围点,从而学习局部几何和上下文关系。

问题在于:点云本身是无序的,Transformer 却需要序列。

PTv3 如何把 3D 点云变成序列?

PTv3 会先把连续坐标离散化成网格坐标,然后利用 Z-order 或 Hilbert curve 这类空间填充曲线,为每个点生成序列化编码。

按照这个编码排序后,原本无序的 3D 点云就被组织成一维序列。这样做的好处是:模型获得了可以输入 Transformer 的序列,同时尽量保留了三维空间中的邻近关系。

接下来,PTv3 会像 ViT 一样把序列切成一个个 patch,并在每个 patch 内做 self-attention。也就是说,patch 内的点先互相看,patch 外的点暂时不看。

不同 patch 怎么交流?

如果一直只在 patch 内做 attention,信息就会被限制在局部范围内。

PTv3 的处理方式是:在不同层使用不同的序列化顺序。排序方式一变,patch 的分组也会改变。于是原本不在同一个 patch 里的点,到了下一层可能会被分到同一个 patch 中,从而实现跨 patch 的信息交互。

同时,点云还需要专属于 3D 空间的位置信息。PTv3 会在 attention 前加入稀疏卷积层,用它注入局部几何位置编码。

整体结构

在完成 self-attention 之后,PTv3 使用类似 U-Net 的结构:

  • Encoder:逐层下采样,提取更大范围的语义信息。
  • Decoder:逐层上采样,恢复空间细节。
  • 任务头:最后输出分类、分割或检测结果。

在这个过程中,每个点都被表示成一个融合了几何、上下文和语义的向量,再送入对应任务头完成实际任务。

小结

我觉得入门一个领域,最好先整体理解,再深入具体模型。

先弄清楚领域的核心问题,再找一个代表性方法,把力集中施加在它身上。等理解完一个具体模型,再回头看整个领域,很多东西会突然变得清楚。

这篇只是入门笔记,细节没有展开太多,后面如果继续写点云,会再补更细的模型和代码理解。