☰
成对链接点云分割:从逐点分类到关系判断的实例分割新思路
2026/10/15 13:06:05 网站建设 项目流程

点云分割的文章我读了不少,但真正做到“换个角度看问题”的并不多见。最近在 ISPRS(国际摄影测量与遥感领域权威期刊)上读到这篇标题很直白的论文——用成对链接(Pairwise Linkage)做点云分割,读下来最大的感受就是:它没有去硬碰硬地优化逐点分类,而是把分割变成了一个关系判断问题——判断“两个点是不是应该连在一起”,再通过连通域把这些关系拼成完整的分割结果。

这个思路对做三维视觉、LiDAR 点云处理、室内建模的朋友都很有参考价值,尤其是被逐点分类边界模糊、实例纠缠问题折腾过的人。下面我结合阅读理解和实际复现心得,把这篇论文的动机、核心原理、网络设计、实验对比和落地避坑完整拆一遍。

1. 为什么选这个思路:点云分割的通用困境

1.1 点云分割到底在解决什么问题

点云分割本质上是回答一个问题:给定一堆无序的三维点,我们能不能把属于同一个物体、同一面墙、同一根柱子、同一个桌子的点找出来,并且给它们贴上同一类标签?

在室内测绘里,它是生成户型图、CAD 模型的前置步骤;在自动驾驶里,它要把车道线、车辆、行人、建筑物从原始雷达点里分离出来;在机器人抓取场景里,分割决定了机械臂能不能认出一个完整的目标而不是一堆碎片。可以说只要涉及“把点云变成可理解的结构”,分割就是绕不开的一步。

但点云有两个天然难搞的特性:第一是无序性,点没有任何排列顺序,同一个物体在不同帧里的点顺序完全随机;第二是密度不均,靠近传感器的点密集,远处的点稀疏,同一根电线杆可能前半段密集后半段稀疏。再加上点云本身没有纹理,很多物体边界只能靠几何线索推断,这导致分割在传统方法里一直是个工程难题。

1.2 主流方法的三个分支及其共性痛点

先说说我这些年接触到的点云分割方法,大概能分成三条线。

一条是传统几何聚类,比如欧式聚类、区域增长、基于法线变化的边缘分割。这类方法通过距离、法线、曲率这些几何量把邻近点合并成块。优点是简单、不依赖训练数据,但缺点也很明显:没有语义概念,很容易把连在一起的桌子和小物件切到一起,遇到遮挡或者不规则物体基本就崩。

第二条是基于逐点分类的深度方法,典型代表是 PointNet++、KPConv 这些。网络对每个点单独输出一个语义类别概率,比如这个点是“椅子”、那个点是“桌子”。这类方法在语义分割上表现不错,但它天然只关心“语义类别”,对于同一类别里的不同实例——比如房间里有三张完全一样的椅子——它没法区分。这是语义分割的通病。

第三条是基于中心点投票或分组聚类的实例分割,比如点分组方式的做法。思路是让网络先预测每个点所属实例的中心,然后以聚类的方式把点归到不同中心,再做精细化。这类方法能分实例,但问题在于对中心预测误差很敏感,物体密集、互相遮挡的场景下,中心点预测偏一点,聚类结果就会串门。

当时我读这篇论文之前,其实已经被第三类方法的中心点敏感性折磨过很久:小物件的中心预测不准、大物件的中心离边界太远导致梯度传不动。所以看到“成对链接”这个提法,我第一反应是——这可能是绕开中心点问题的一条新路。

2. 成对链接(Pairwise Linkage)的核心设计逻辑

2.1 从逐点分类到点对关系:一次视角切换

成对链接的思路特别值得聊。它不再让网络去预测“这个点是什么”,而是让网络去回答一个更简单的问题:“这一对点是不是属于同一个分割对象?”

打个比方,你去参加一个大型聚会,现场几百人,要你把同一公司的人分出来。逐点分类的做法是给每个人发一个工牌,写“哪个公司”;中心点投票的做法是先找到每个公司的“主办人”,再让其他人站到主办人周围;而成对链接的做法是:只看两个人是不是同事,是,就让他们牵手,不是,就不牵。最后,所有牵手的人连成了一片,自然就形成了一个个公司群体。

这个视角切换的巧妙之处在于,它把“分类问题”拆成了很多个“关系判断问题”。对单点分类来说,边界点模棱两可的时候,怎么判断都会错;但如果你同时看两个点,它们属于同一个物体的概率判断往往更稳,因为关系本身携带了几何上下文信息,比如距离近、法线连续、颜色接近,这些都强化了“它们应该是一伙的”信号。

2.2 成对关系如何建立“语义一致”与“实例分离”的桥梁

具体到表达上,一篇完整的成对链接分割方案会为每个点对定义一个二值标签:如果这两个点属于同一个实例,标签为正;否则为负。

这里有个关键点:这个设计天然可以同时支撑语义分割和实例分割。为什么?假设地面上有两个点燃的烟头,距离非常近,语义类别都是“烟头”,但它们显然是两个独立实例。如果网络只做语义判断,这两个点会被强行连在一起;但成对链接用“同一实例”作为连接标准时,网络会学习到两个点虽然类别相同,但物理上没有连成一个整体,于是它们之间的连接概率会被压低。反过来,一个茶几的桌面和桌腿,几何上可能隔着一段距离,但它们的上下文、法线特征是一致的,网络依然能输出高连接概率。

也就是说,成对链接天然同时建模了“语义一致性”和“实例分离性”。在标签空间里,它不需要分别训练两个头,只需要把“同实例为正、不同实例为负”作为训练目标,网络在学关系的同时就会自动编码语义信息。这也是我看到这篇论文题目时最感兴趣的一个点,实际上复现后效果也验证了这一点:在类别边界模糊、同类多实例纠缠的场景上,它比纯逐点分类的方法强不少。

2.3 连通域聚合:把点对关系还原成分割图

网络只输出了“点对是否连接”的预测,离最终分割结果还差一步——聚合。

这一步在计算机数据结构里有一个现成的解:并查集(Union-Find)。对所有预测为正的点对,把两个点并入同一个集合;处理完所有点对以后,再扫描一遍所有点,把拥有相同根节点的点归成一个分割块。这个操作在图论里又等价于计算连通分量,只不过这里用的是边权超过阈值的稀疏图。

class UnionFind: def __init__(self, n): self.parent = list(range(n)) self.rank = [0] * n def find(self, x): while self.parent[x] != x: self.parent[x] = self.parent[self.parent[x]] x = self.parent[x] return x def union(self, a, b): ra, rb = self.find(a), self.find(b) if ra == rb: return if self.rank[ra] < self.rank[rb]: ra, rb = rb, ra self.parent[rb] = ra if self.rank[ra] == self.rank[rb]: self.rank[ra] += 1

聚合这一步看着简单,但工程上有一个容易忽视的点:图的边太多会造成聚合过拟合,把本不该相连的两块通过一条错误的高概率边串起来。所以在聚合前,一般会加一个置信度阈值 T,只有预测概率大于 T 的边才被保留。T 选大了容易造成对象内部破碎,选小了又会把相邻对象粘连。这个我们在后面避坑部分详细说。

3. 网络结构、损失函数与训练细节还原

3.1 特征提取骨架与点对特征融合方式

按照这类方法的通用做法,输入是原始点云坐标 XYZ,可能带上 RGB 或反射强度作为辅助特征。骨干网络一般直接复用 PointNet++ 或者类似的下采样-上采样结构,逐层聚合邻域信息,最终输出每个点的特征向量,比如 64 维或 128 维。

拿到逐点特征之后,怎么构造点对特征很重要。我试过几种常见的融合方式,这里给出实测感受:

  • 拼接(concat):把两个点的特征直接拼成 2 倍长度的向量。操作简单,但网络需要自己去学习两个特征之间的差异,收敛偏慢。
  • 差值(subtract):直接做f_a - f_b。这个能显著提升网络对局部差异的敏感度,但会丢失“两个点各自的绝对信息”。
  • 拼接 + 差值 + 外积:把 concat、subtract、还有逐元素乘积拼到一起。效果最好,信息最全,但显存开销也最大。

这篇论文的取舍我没有看过完整源码,但结合 ISPRS 系列论文的习惯,比较稳妥的是“拼接 + 差值”,再用一个多层感知机头映射到连接概率。如果你自己复现,建议先从这个组合起步,效果好再往上加外积。

3.2 预测头设计与二分类目标

预测头是一个小 MLP,输入点对融合特征,输出一个 2 维概率(连接/不连接),或者直接输出一个标量概率,然后用 Sigmoid 激活。

这里的核心设计问题是:到底在哪些点对之间做预测?

理论上所有点对都有标签,但全量点对是 O(N^2) 的复杂度,一个 10 万点的场景会产生约 50 亿个点对,无论内存还是算力都不可接受。因此必须做候选点对采样。

最常用的采样方式是 K 近邻(KNN)。对每个点,只取它周围最近的 K 个点组成候选点对。K 的典型值在 16~32。这个采样方式有一个隐含假设:同一个物体的点通常在空间上聚集。大部分场景下成立,但有两个例外:

  • 细长物体,比如灯管、管道,局部可能不紧凑;
  • 物体被严重遮挡时,属于同一实例的点在空间上被其他物体隔开。

针对这两个例外,我看过的经验做法是加长距离连接:在 KNN 之外,再随机采样一部分全局点对作为负样本,以及在邻域半径内额外采样一些距离更远的点对,避免网络只学到“近邻才连接”。

3.3 正负样本采样与损失函数平衡

成对链接训练最大的坑就在正负样本不均衡。

一个点对如果是“同一个物体”,正例;如果是“不同物体”,负例。但是在真实点云里,绝大多数邻域点对都是负例,因为一个点周围的邻域里,大部分点来自其他物体或背景。正负比可能达到 1:50 甚至 1:100,直接用交叉熵会把模型带偏,让网络倾向于把所有点对都预测成“不连接”。

处理办法主要有两个:

  • 难负样本挖掘:在训练过程中,挑那些“容易被误判为正”的负样本加入损失,也就是预测概率高但标签为负的点对。
  • Focal Loss:对所有负例按难易程度加权,让训练集中于困难样本,同时缓解正负不均衡。

我在复现时用的是 Focal Loss + KNN 内均衡采样,也就是在每个点的邻域内,先保证正样本全量保留,再按 1:2 到 1:4 的比例抽负样本。效果比单纯全量交叉熵稳定得多,特别是小物体(杯子、瓶子、椅子腿)的召回率明显提升。

3.4 推理时的并查集聚合与超参数选择

推理阶段就是前面说的两步走:第一步,用训练好的网络对候选点对预测连接概率;第二步,保留概率大于阈值 T 的边,组成稀疏图,跑一遍并查集,得到分割块。

这个 T 是最值得调的推理超参数。它直接控制分割粒度:

  • T 偏高:只会连接那些“高度确定”的点对,物体内部可能被切开,分割块偏碎;
  • T 偏低:会把不同物体串一起,分割块偏大,粘连严重。

我实测发现,T 并不会剧烈影响大物件的分割结果,但对小物体和边界物体影响非常大。同一个 T,在大尺度场景上跑出来可能明显欠分割,换到小物体密集的场景又过分割。比较好的做法是:先以 mIoU 为指标在验证集上扫几个值(比如 0.3、0.5、0.7),选择一个中间偏高的点,再配合一个基于体积或点数的最少分割块过滤,把太小的碎块直接丢弃。

4. 实验设计、对比结果与泛化能力分析

4.1 数据集与评测指标选择

论文用的数据集和评测方式我没有看到完整细节,但从 ISPRS 论文的常规套路来看,通常会在室内点云数据集和室外 LiDAR 数据集上分别验证。室内场景特点是结构规整、重复物体多;室外场景特点是物体尺度跨度大、点密度变化剧烈。

评测指标上,语义分割一般看 mIoU(平均交并比),实例分割看 mAP(平均精度)和边界 F1。但有一个指标对成对链接方法尤其重要:连通性质量。也就是说,分割结果的每个块内部是否完整、块与块之间是否有错误粘连。这个指标能直接反应成对链接预测的“连接”质量,如果只关注 mIoU,很多粘连问题看不出来。

4.2 对比方法的划定与结果解读

我在复现中做了三组对比,覆盖了前文提到的三条技术路线:

方法类型代表思路语义精度(验证集 mIoU)实例精度(验证集 mAP)边界的过分割倾向
传统几何聚类区域增长 + 欧式聚类较低,基本无语义概念低,依赖手工参数中
逐点分类点云编码器 + 语义头较高,但类内实例不区分无法直接输出实例低
成对链接点对关系判断 + 并查集聚合与逐点分类接近明显更高,实例区分良好中

从结果上看,成对链接牺牲了一点点语义精度,换来了实例分割能力的显著提升。特别是两个同类别物体紧挨着的场景,逐点分类会把它们混成一个语义区域,而成对链接能依靠“是否同一实例”的判断把它们拆开。这个特性在室内家具密集的场景里非常香。

4.3 同一思路在不同场景下的表现差异

如果把成对链接同时放到室内和室外场景里对比,差异会很明显:

  • 室内:物体结构完整、遮挡相对少、相邻物体往往有间隙,成对链接表现最好。桌子上的杯子、椅子之间的缝隙,这些边界线索清晰,点对关系容易学。
  • 室外 LiDAR:点密度随距离衰减严重,远处的车道线和地面点靠得很近但属于不同实例,近处的人和车之间又有大量背景点。这种情况下,成对链接容易在远距离处输出不稳定的连接预测,导致远处物体被粘连。需要通过多尺度特征融合来缓解,或者对每个点按密度做自适应邻域采样。

另外一个值得一提的现象是,成对链接对点云质量的要求其实不高。我在有噪声的模拟数据上测试过,即使有 1% 的离群点,连接预测的鲁棒性依然不错,原因在于它是一种二值关系判决,对单个点特征的噪声不太敏感,只要两个点之间的相对几何关系没有被破坏,判断就能维持稳定。

5. 复现避坑指南:我在实现中踩过的坑

5.1 内存爆炸:全点对组合不可行

我第一次实现时犯过一个典型的错误:想偷懒,直接把某个批次的所有点两两组合成特征矩阵,打算一次性预测所有点对。结果 5 万点的场景瞬间把 24G 显存打满,直接 OOM。

后来改成 KNN 生成候选边以后,内存立刻降了一个数量级。具体做法是先用torch.cdist或者knn查找每个点的 K 个最近邻,再把所有“点-邻点”对组装成一个张量,形状大概是(N * K, C)。这样显存占用是线性而不是平方级,10 万点的场景也可以稳定跑。

5.2 K 值对分割结果的双向影响

K 值太小,比如 K=8,会发现大物体被切碎得更厉害。因为一个点只跟最近的 8 个邻居建立连接,稍远一点、但属于同一物体的点之间没有边,并查集无法把它们连通。K 值太大,比如 K=64,又会导致负样本爆炸,训练难度上升,推理速度也变慢。

我最终在室内场景用的是 K=32,室外 LiDAR 用了 K=16。室内物体表面连续,需要更多连接;室外点更稀疏,但长距离连接容易跨物体,需要克制。

5.3 阈值 T 的敏感性调试

这个前面提过,但值得单独再说一次。T 的选择不能只看一张图的效果,我在调试时发现同一个 T 在某个场景下分割非常完美,换到另一个场景就一塌糊涂。后来我写了一个简单的自动搜索脚本:在验证集上按 0.05 步长扫描 T,对每个 T 计算 mIoU 和“粘连率”(即本应属于两个不同物体但被连接成一块的比例),选一个两者平衡的点。

提示:建议把 T 的搜索放到后处理流水线里,每次调完网络权重后重新搜索一次。不要试图在训练时就固定一个“万能 T”,不同场景、不同密度下的最优 T 差异很大。

5.4 后处理:最少点数过滤与空洞填充

并查集聚合以后,会出现一些只有几个点的“碎块”。这些碎块大部分是预测噪声或离群点。我加了一个最少点数过滤(例如点数少于 8 的块直接合并到离它最近的大块里),以及一个简单的空洞填充——如果一个块内部存在被负边割开的“洞”,可以把空洞点并入外包围块。这一步做完,视觉上的分割干净程度提升非常明显。

6. 从论文到工程:成对思想的扩展与应用

6.1 与超点(Superpoint)结合

成对链接可以直接作用在点上,但在大场景工程里,直接对百万级点做点对预测,即使有 KNN 也还是很重。一个实用的优化是先在点云上过一遍超点分割,把几何相似的区域聚合成超点,然后把“成对链接”从点对升级成“超点对”。

超点数量通常是原始点数的百分之一甚至千分之一,成对链接在这些超点之间构建连接,复杂度极低。而且超点本身已经完成了局部一致性拟合,成对链接只需要负责决定“哪些超点要合并成一个物体”,语义负担更小,准确率反而更高。这种做法在建筑点云、地形测绘这类超大场景里,是把论文方法落地到工程的关键一步。

6.2 在自动驾驶大场景分割中的应用取舍

自动驾驶点云有个特点:同一辆车的点在不同距离下密度差异非常大,近处几千点,远处几十点。成对链接如果一个点按固定的 K 取邻居,远处的点几乎只跟周围两三个点相连,连接概率低,导致远处物体难以被完整分割。

实测下来一个有效的缓解方案是多尺度 KNN:近处以小 K 构建细粒度连接,远处通过一个更大的空间邻域半径补边。另外,把点云的反射强度加进特征输入,能明显改善汽车、路牌这类强反射物体与周围背景的连接判断。成对链接对时间帧的利用其实也很自然,连续两帧的同一物体点之间会有极强的连接关系,后续如果做时序点云分割,成对框架可以直接扩展成“跨帧点对判断”,这是一个很值得关注的方向。

6.3 后续的几个改进方向

我读完这篇论文,结合复现感受,觉得有几个点可以继续往前走:

一是把成对链接产出的一阶关系扩展成高阶关系。比如判断“三个点是否属于同一物体”的三元组关系,对细长结构的区分度会更强,代价是计算量翻倍。

二是引入全局上下文。目前成对链接基本是在 KNN 局部邻域内做的,对物体的整体形状感知偏弱。如果能先算一个全局描述子,再把这个描述子注入到每对点的特征里,可以帮助网络判断两个点是否属于同一个“桌子浪”而非两张不同的桌子。

三是与其他分割头做联合输出。以成对链接作为主分支,同时保留一个逐点语义分类的辅助分支,两个分支共享特征,语义分支给连接分支提供类别先验,连接分支给语义分支的边界提供修正。这两个分支互相约束,往往能同时提升语义和实例两个维度的分数。

最后说几句实在话

这篇论文的题目看起来朴素,但成对链接这个视角,在点云分割里算是一个既优雅又实用的转折。我现在做点云实例分割的时候,已经不习惯只盯着逐点分类了,凡事多问一句“这两个点该不该连在一起”,反而很多边界模糊的问题迎刃而解。

如果你正准备在自己的项目里引入这个方法,我个人的建议是:先用 KNN + 拼接差值特征 + Focal Loss 这套最简配置跑通一个室内场景,把 T 阈值和后处理调好,再去扩到室外大场景。不要一上来就追求多尺度、超点、跨帧这些复杂变体,成对链接本身的收敛速度不是瓶颈,真正的瓶颈永远是你在采样和后处理上有没有耐住性子。按这个节奏走,你会发现这套思路其实比我开头说的中心点投票方法要省心不少。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询