想象你搬来一整箱散落的乐高零件:红色车轮、灰色底板、黄色人仔混在一起倒在桌上。现在要造一台自动分拣机器人,帮它把每块积木放进对应收纳盒。分拣之前,机器人得先「看懂」眼前这堆积木:哪些连成一体、哪里是边界、哪块是多余的边角料。这个「看懂并归类」的过程,放在自动驾驶和机器人领域,就叫点云分割。 激光雷达每次扫描,都会给周围世界返回成千上万个三维点,就像把一箱乐高零件瞬间倒在地上。点云分割要做的事,就是给每一个点贴上语义标签:这个点是地面、那个点是行人、远处那一团是电线杆。分割质量直接决定了机器人能不能避开障碍、汽车能不能看清路口。本文会从点云数据本身的特性讲起,依次介绍区域增长、模型拟合和深度学习三类主流方法,再结合室内外场景分析它们的差异与局限。看完之后,你会像一个熟练的分拣师,知道什么场景该用哪套「分拣手法」。
点云分割是机器人感知的「眼睛级能力」,学透它能让你在感知与定位项目中准确选中算法、快速定位问题,是成为一名合格 AI 工程师的必修课。
可视化演示
展示三维点云从原始数据到语义分割的完整过程,通过区域增长与深度学习将点云按语义类别划分。
本节配有交互动效(进入视口后自动加载,约 3KB)。
原始点云 未分割的三维点云数据,所有点具有相同颜色 无语义信息,需进一步处理 点击下方按钮切换分割方法
点云分割概述
分拣乐高之前,你至少得知道眼前是什么:是一箱完整的套件散件,还是混进了其他玩具的零件?点云分割面对的问题也一样。激光雷达扫描得到的点云,本质上是一群孤立的三维坐标点,它们带着空间位置信息,却没有告诉你「哪个点属于哪个物体」。把这一堆点划分成若干有意义的子集,并给每个子集贴上语义标签,就是点云分割。
在机器人感知与定位里,点云分割是为后续识别和导航铺路的。比如扫地机器人要先从点云里把地面分出来,才能判断哪里能走;自动驾驶要先从道路场景中把车辆和行人分离,才能做出避让决策。它面临的核心挑战在于点云本身的无序性、稀疏性和密度不均——不同距离处的点数量差别很大,就像乐高堆里大块零件和小颗粒零件多寡悬殊,分拣起来难易不同。
回到乐高场景:点云分割就是给每个散落积木记下「当前位置」,再判断它属于哪一类。有了这个基础,后面的分拣算法才能开始工作。
- 点云集合分割的输入是整个点云,记为集合 \(S\),里面共 \(N\) 个点。
- 单个点向量每个点 \(\mathbf{p}_i\) 用三维坐标表示,就像乐高零件在桌面上的位置。
- 扩展属性实际工程中还会带上颜色、反射强度或法向量,作为后续分割的辅助线索。
点云数据基础
乐高零件有颜色、尺寸、形状,点云中的每个点也不是孤立的白板。除了三维坐标,很多传感器还会记录反射强度,点云的局部区域还能估算出法向量——就像你能摸出积木表面是平是弯。分割算法非常依赖这些「手感」信息。
点云的密度分布极不均匀:同样大小的纸箱,放得越远,扫到的点数越少;近处的墙面密密麻麻,远处的栏杆却稀稀拉拉。这种不均匀对区域增长这类依赖邻域的算法影响很大,因为远处的邻域搜索半径可能需要更大。同时,传感器噪声与边缘跳变会产生孤立点,就像混进乐高堆里的微小碎屑,需要在分割前进行滤波或剔除。
密度不均就像乐高盒子里有的格子塞得很满、有的格子空荡荡:分割算法必须适应这种「有的地方积木密集、有的地方稀疏」的分布,否则容易把远处稀疏零件漏掉。
- 两点差值先看两点在 \(x\)、\(y\)、\(z\) 三个方向上的差距。
- 平方求和把三个方向差距分别平方再相加,消除正负方向影响。
- 开根号对总和开平方,得到两点间的直线距离。
区域增长算法
如果让你手工分拣一堆积木,你会先抓起一块积木,找找旁边有没有颜色和大小相似的邻居,把它们归到一起,再从这个新成员出发继续往外找。区域增长算法正是这个思路:先选一个「种子点」,然后依据距离和法向相似度,把符合条件的新点不断吸收进当前区域。
区域增长的成败很大程度取决于种子选得好不好、生长准则合不合适。种子可以选曲率最小的点,代表平坦区域;邻域条件通常包括空间距离阈值和法向夹角阈值。距离太近会漏掉点,太远会把不同物体粘连;法向条件则能防止把墙面和桌子混在一起。当没有新的邻域点满足条件时,算法停止,当前区域完成分割。
区域增长像一颗种子慢慢长成一片苔藓:只要土壤条件一致,它就会持续蔓延;一旦遇到坡度突变或间隙太大,生长就停下了。这就是它适合室内平整场景、怕嘈杂边缘的原因。
- 距离近当前点 \(p_j\) 到区域 \(R\) 内某个点 \(p_i\) 的欧氏距离小于阈值 \(r_{\mathrm{th}}\)。
- 方向一致两点法向夹角 \(\theta_{ij}\) 的余弦值要大于阈值 \(\cos\theta_{\mathrm{th}}\),保证表面朝向接近。
- 同时满足用逻辑与 \(\wedge\) 连接,两个条件缺一不可。
模型拟合算法
换一种分拣思路:与其从种子向外爬,不如拿一个透明塑料模具去「扣」积木堆。圆柱状积木往圆柱模具里扣,平板积木往平面模具里扣。模型拟合算法就是这样——预先假设点云中的某些区域符合某个几何形状,再用数学方法把形状「扣」出来。
最著名的模型拟合算法是 RANSAC(随机采样一致性)。它随机取三个点,计算出一个平面或圆柱模型,然后统计有多少点符合这个模型(称为内点)。重复很多次后,内点数最多的模型被当作分割结果。RANSAC 的优点是抗噪声能力很强,就算混入大量杂点,也能稳定找到主要平面;缺点是只能处理几何结构明显的区域,遇到不规则的椅子、人体就无能为力了。
用模具扣积木,扣得越贴合说明这批积木越像同一个形状。RANSAC 就是反复换不同模具,最后留下贴合度最好的那一个。这种方法在室内地面、墙面这类「标准件」上非常高效。
- 平面方程假设平面由参数 \(a,b,c,d\) 决定,平面上的点满足 \(a x + b y + c z + d = 0\)。
- 点到平面代数值把点的坐标代入平面方程,得到偏差 \(a x + b y + c z + d\)。
- 取绝对值除模长对偏差取绝对值,再除以平面法向量的长度,得到真正的垂直距离。
深度学习方法
前面的分拣手法都需要人工定规则:距离阈值设多少、法向夹角多少、模具是平面还是圆柱。有没有可能让机器人自己看一堆分拣好的例子,学会「该这么分」?深度学习分割就是这个思路的分拣机器人。
PointNet 是里程碑式的点云深度学习模型。它最大的创新是解决点云的无序性问题:点点点打乱顺序不影响分类结果。它把每个点独立提取特征,再通过一个对称的最大值池化操作,把所有点的信息汇聚成全局特征。PointNet++ 则进一步借鉴「由近到远看局部」的策略,把点云划分成多个小邻域,逐层提取局部结构。最新的点云 Transformer 还能建模长距离依赖,让远处的点之间也能互相「打招呼」。
深度学习分拣员不需要人告诉它「圆的放轮子盒」,它见过成千上万种轮子之后,自己就学会了看形状、看上下文。但这位分拣员胃口很大,需要大量标注数据和高性能 GPU,不是所有小作坊都养得起。
- 逐点变换每个点 \(x_i\) 先经过一个多层网络 \(h\),得到高维特征。
- 最大值池化对所有点的特征逐位取最大值,得到全局特征,这一步天然具备「顺序无关性」。
- 最终映射再用网络 \(\gamma\) 把全局特征映射为每个点的语义标签。
室内场景应用
室内环境就像一张整洁的乐高操作台:地面平坦光滑,桌面上的物体相对独立,光照和噪声都比较可控。这个场景下,点云分割最经典的子任务就是地面分割与物体分割。
地面分割通常利用「地面近似是一个平面」这一强先验。先通过 RANSAC 拟合出一个水平平面,把所有贴近该平面的点标记为地面,余下的点再交给区域增长或聚类算法,进一步分成椅子、桌子、墙壁等物体。室内计算资源往往受限,所以算法必须在轻量性和实时性之间取舍。模型拟合和区域增长这类经典方法计算开销小、解释性强,成为很多嵌入式机器人的首选。
室内分拣台干净整齐,规则简单,一个平面模具加一把「尺子」就能完成大半工作。区域增长的耐心生长和 RANSAC 的快速扣模,在客厅、仓库这些场景里往往比重量级的深度学习更实用。
- 取高度取点 \(\mathbf{p}_i\) 的 \(z\) 坐标,代表它在机器人坐标系里的高度。
- 设定阈值地面附近的点通常在某个高度范围 \(z_{\mathrm{th}}\) 之内。
- 逻辑蕴含若条件成立,则把该点归入地面集合。
室外场景应用
室外就是另一番光景了:操作台变成了狂风暴雨下的工地,积木被吹得到处都是,还混进了树叶、石块和反光碎片。自动驾驶使用的激光雷达点云通常范围大、密度不均,远处一个行人可能只有十几个点,近处一辆卡车却有数万个点。
室外分割的重点是道路分割、车辆分割和行人分割。道路分割需要从大范围地面点中分离可行驶区域,车辆和行人分割则要求算法对远、近尺度都有好表现。多尺度是个大难题,因为最近处的点在弱特征条件下也能分得很细,而最远处的点稀疏到几乎无法依赖形状。因此,室外场景越来越倾向使用深度学习方法,让网络同时学习局部细节和全局上下文。
室外分拣员必须同时盯住远处的小点和大片的道路,如果只靠距离和法向这种基础手感,很容易把稀疏的远点认错。所以深度学习这种「见多识广」的分拣机器人,正在成为自动驾驶感知的主流选择。
- 类别概率模型为点 \(\mathbf{p}_i\) 预测它属于类别 \(k\) 的概率 \(P(y_i = k \mid \mathbf{p}_i)\)。
- 取最大项在所有 \(K\) 个候选类别中选出概率最高的那一个。
- 赋予标签把该类别编号作为点的最终语义标签 \(\hat{y}_i\)。
算法对比与权衡
面对一箱乐高,分拣方式没有绝对最优,只有当下最合适。区域增长精度高但速度慢,RANSAC 对噪声鲁棒但只能处理几何形状,深度学习精度最好但需要算力和数据。选型的核心是在精度、速度、鲁棒性三者之间做权衡。
在结构化、近中距离的室内场景,传感器噪声小、平面结构多,优先考虑 RANSAC 或区域增长;在非结构化、远距离、动态物体多的室外场景,深度学习语义分割是更稳妥的方案。工程上还会把多种方法串成管线:先用 RANSAC 快速抽掉地面,再用深度学习分割剩余物体,最后用区域增长做边缘细化,就像分拣师先用大铲子筛大块,再靠人工精挑细选。
| 方法 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 区域增长 | 边界细致 | 计算量大 | 室内平整面 |
| 模型拟合 | 抗噪强 | 限几何形状 | 地面、墙面 |
| 深度学习 | 精度高 | 需要算力数据 | 室外复杂场景 |
选择分拣手法的经验法则其实很简单:零件形状规则、场地固定,就上模具;零件五花八门、场地多变,就请深度学习老师傅。先想清楚你的「积木堆」长什么样,再决定用什么武器,这就是点云分割选型的第一课。
AI 应用场景
室内服务机器人的地面分割
阶段:感知预处理
解决的问题:扫地机器人需要先区分地面和障碍物,传统人工阈值在不同地面材质上不稳定。使用 RANSAC 拟合平面,可以快速提取地面点云,再交给后续导航模块规划清扫路径。
具体案例:某仓库清扫机器人每天在平整环氧地坪上作业。激光雷达扫描后,先用 RANSAC 拟合出地面平面,再用区域增长把地面边缘的墙脚线也完整分割出来,有效避免了清扫轮在墙角反复碰撞。
工业检测中的平面拟合
阶段:定位与测量
解决的问题:流水线上需要检测工件表面是否平整,传统接触式测量速度慢。通过模型拟合方法,从三维点云中提取平面并计算平整度偏差,可以做到非接触式在线质检。
具体案例:某汽车零件厂用结构光相机拍摄刹车片表面,获得密集点云后,用 RANSAC 拟合主平面,再统计点到平面的残差分布,快速标记出表面凹陷超过 0.5mm 的次品。
自动驾驶道路语义分割
阶段:环境感知
解决的问题:无人车需要实时识别道路、车辆、行人,传统几何方法难以应对复杂场景。基于深度学习的点云语义分割,将每个点标注为道路、车、人等类别,为决策规划提供结构化输入。
具体案例:某自动驾驶公司使用 PointNet++ 对 64 线激光雷达点云做语义分割,在高速场景下实现 95% 以上的道路标注准确率,并把远距离稀疏点通过全局上下文补充标签,保障了变道和避障的安全余量。
Python 演示
import numpy as np class RansacPlane: def __init__(self, distance_threshold=0.05, max_iterations=100, min_inliers=30): self.distance_threshold = distance_threshold self.max_iterations = max_iterations self.min_inliers = min_inliers self.best_model = None self.best_inlier_count = 0 def fit(self, points): best_model = None best_count = 0 n = len(points) for _ in range(self.max_iterations): idx = np.random.choice(n, 3, replace=False) p1, p2, p3 = points[idx] normal = np.cross(p2 - p1, p3 - p1) norm = np.linalg.norm(normal) if norm < 1e-10: continue normal = normal / norm d = -np.dot(normal, p1) distances = np.abs(points @ normal + d) inliers = distances < self.distance_threshold count = np.sum(inliers) if count > best_count: best_count = count best_model = (normal, d, inliers) self.best_model = best_model self.best_inlier_count = best_count return best_model def predict(self, points): normal, d, _ = self.best_model distances = np.abs(points @ normal + d) return distances < self.distance_threshold if __name__ == '__main__': rng = np.random.default_rng(42) plane = rng.normal(size=(300, 3)) plane[:, 2] = 0.2 * plane[:, 0] + 0.3 * plane[:, 1] + rng.normal(0, 0.01, 300) noise = rng.uniform(-1, 1, size=(80, 3)) points = np.vstack([plane, noise]) model = RansacPlane().fit(points) print('best_inlier_count:', model[2].sum())
normal = np.cross(p2 - p1, p3 - p1)用三个采样点中任意两个向量做叉积,得到平面法向量,相当于确定模具的朝向。normal = normal / norm将法向量单位化,方便后续距离计算。d = -np.dot(normal, p1)把采样点代入平面方程,解出偏移量 \(d\)。distances = np.abs(points @ normal + d)一次性计算所有点到平面的距离。inliers = distances < self.distance_threshold距离小于阈值的点被视为内点,即「模具扣得住的点」。if count > best_count保留当前迭代中内点数最多的模型,这就是最优模具。
常见误区
误区很多初学者以为点云分割就是把点云用 K-means 或 DBSCAN 聚类成几堆,聚类完成就等于分割完成。
正解聚类只负责把点分组,并不知道每一组代表什么;分割的核心是给每个点赋予「地面」「车辆」「行人」这样的语义标签。就像把乐高分成几堆还不够,你还要说出每堆是轮子还是人仔。实际管线中,聚类常常只是分割的前置步骤,而不是终点。
为何常见:因为许多教程首先展示的是聚类效果图,彩色点簇看起来很直观,让人误以为颜色相同的簇就是语义相同的物体。
误区有人用过一次 RANSAC 提取地面后,以为它就是一次性工具,拟合完一个平面就结束了。
正解RANSAC 是一种反复迭代的框架,每拟合出一个平面后,可以把内点从点云中剔除,再对剩余点重新拟合下一个平面。这样就能依次提取地面、墙面、桌面等多层结构。就像分拣完一批积木,可以把它们先放到一边,再继续分剩下的。
为何常见:因为教材例子通常只展示一次提取地面的简单场景,让人误以为算法只能处理单个模型。
误区既然深度学习会自动学习特征,是不是把原始点云直接丢给 PointNet 就能得到好结果?
正解原始点云往往包含离群噪声、密度变化剧烈、范围跨度大等问题。实际使用前通常需要降采样、去噪、裁剪空间范围,有时还要计算法向量作为额外输入。就像分拣机器人需要先把积木堆里的沙土筛掉,不然再怎么聪明也会被干扰。
为何常见:因为演示代码经常直接加载干净且规整的公开数据集,掩盖了工业现场点云的脏乱差。
误区看到深度学习分割精度更高,就认为区域增长这种经典方法没有工程价值。
正解区域增长在计算资源受限、场景结构规整的室内场景中依然有重要地位,它不需要训练数据、可解释性强、边界精细。很多嵌入式机器人依然用它做墙面和地面的精分割。它像一把手工雕刻刀,虽然不快,但胜在顺手可控,适合精细活。
为何常见:因为学术论文普遍追求更大规模数据集上的精度数字,而工程上「够用、省电、可解释」同样是金标准。
面试题
Q1. 点云分割在感知与定位中的核心目标是什么?
- A.把点云压缩成二维图像
- B.给每个点打上语义标签← 正确答案
- C.提升激光雷达扫描频率
- D.将点云转换成人眼画面
答案:B。点云分割的核心是给三维点赋予语义类别,如地面、车辆、行人。压缩成图像或提升频率都不是分割本身的任务,就像分拣乐高的目的是归类积木,而不是给积木重新上色。
Q2. 点云中一个点最常见的表示形式是什么?
- A.二维像素坐标 (u,v)
- B.三维坐标 (x,y,z)← 正确答案
- C.颜色直方图
- D.一维强度值
答案:B。点云最基本的单元是三维坐标点,多个属性如颜色或强度只是附加信息。二维像素、颜色直方图都不是点云点的本质表示,正如乐高积木的归属首先由它在空间中的位置决定。
Q3. 区域增长算法中,判断一个新点能否加入当前区域通常需要考虑哪些条件?
- A.点的颜色完全一致
- B.距离近且法向相似← 正确答案
- C.点云密度均匀
- D.点的序号连续
答案:B。区域增长通过空间距离阈值和法向夹角阈值来判断邻域点是否属于同一表面,二者同时满足才会生长。颜色不是必要条件,密度和序号则无关,就像找相邻积木时看距离和角度,而不是看编号排布。
Q4. 下列哪种方法最擅长从大量噪声点云中拟合出平面?
- A.基础区域增长
- B.K-means 聚类
- C.RANSAC 模型拟合← 正确答案
- D.最近邻插值
答案:C。RANSAC 通过随机采样和反复投票,能在噪声点占比较高时依然找到内点最多的平面模型。区域增长容易受噪声点干扰,K-means 不关心几何形状,插值只是补充缺失点,都不擅长抗噪声拟合。
Q5. PointNet 如何处理点云的无序性问题?
- A.把点云按高度排序
- B.使用最大值池化聚合特征← 正确答案
- C.将点云转换成体素网格
- D.相邻点颜色加权平均
答案:B。PointNet 对每个点独立提取特征后,用最大值池化将所有点的特征整合为一个全局特征,最大值运算天然与点的输入顺序无关。排序、体素化或颜色平均都会改变或丢失空间信息。
Q6. 区域增长算法的生长停止条件通常包括哪些?
- A.没有新的近邻点满足距离阈值← 正确答案
- B.邻域点的法向夹角超过设定值← 正确答案
- C.当前区域点数达到预设上限← 正确答案
- D.点云颜色全部变为灰色
答案:ABC。区域增长找不到符合距离条件的点、遇到法向变化过大的边界、或达到最大点数限制,都会停止生长。颜色变化不是停止标准,乐高积木分到收纳盒装满、周围没有相似积木时才会停止。
Q7. 关于室内与室外点云分割,下列说法正确的是哪个?
- A.室外点云密度均匀且噪声更低
- B.室内场景更适合使用深度学习分割
- C.室外分割普遍面临多尺度难题← 正确答案
- D.RANSAC 一定不适用于室外场景
答案:C。室外点云范围大、近远密度差异悬殊,多尺度问题突出。室外噪声更大,更适合用深度学习处理;室内结构规整反而适合经典方法;RANSAC 在室外提取地面依然很常用。
Q8. 下列哪些属于深度学习点云分割的优势?
- A.能自动学习局部和全局特征← 正确答案
- B.对复杂类别有很强的判别能力← 正确答案
- C.无需任何标注数据即可训练
- D.在非结构化场景中表现通常更好← 正确答案
答案:ABD。深度学习通过大量数据自动学习语义特征,适合复杂、非结构化场景,但也需要大量标注数据训练。所以说它完全不需要数据是错误认知,其优势恰恰建立在高质量标注之上。
Q9. 某项目需要在嘈杂的室外点云中快速提取道路平面,同时保留后续处理余量,最合理的策略是?
- A.只用 PointNet 做逐点分类,不预分割
- B.先用 RANSAC 快速提取地面,再用深度学习分割← 正确答案
- C.全部用区域增长,从种子逐点生长
- D.直接使用颜色阈值过滤道路点
答案:B。工程上常采用多级管线:RANSAC 先快速抽走大面积地面,再让深度学习聚焦剩余物体,兼顾速度与精度。纯深度学习方法开销大,纯区域增长噪声适应差,颜色阈值在激光点云中不可控。
Q10. 关于点云数据特性的描述,哪些是正确的?
- A.同一物体在不同距离处点密度不同← 正确答案
- B.点云是无序且非结构化的三维点集← 正确答案
- C.所有点云都包含 RGB 颜色信息
- D.法向量可由局部邻域估计得到← 正确答案
答案:ABD。点云随距离增大而变得稀疏,天然无序,法向量可以通过邻域点拟合平面估算。但并非所有传感器都输出颜色,雷达点云通常只有位置和强度信息,所以颜色选项是错误的。