入门一个新领域时,很多人的第一反应是去搜“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:逐层上采样,恢复空间细节。
- 任务头:最后输出分类、分割或检测结果。
在这个过程中,每个点都被表示成一个融合了几何、上下文和语义的向量,再送入对应任务头完成实际任务。
小结
我觉得入门一个领域,最好先整体理解,再深入具体模型。
先弄清楚领域的核心问题,再找一个代表性方法,把力集中施加在它身上。等理解完一个具体模型,再回头看整个领域,很多东西会突然变得清楚。
这篇只是入门笔记,细节没有展开太多,后面如果继续写点云,会再补更细的模型和代码理解。

评论
由 GitHub Discussions 提供,首次加载可能需要一点时间。