
上半年给客户做一栋商业楼的室内点云语义分割数据量拉到两千多万点我第一反应就是用PointTransformer——毕竟这名字听起来就是点云处理领域的明星模型。真正上手V1之后体验只能用“理想很丰满现实很骨感”来形容单卡A100上显存直接告急推理一个楼层要跑半天墙角、踢脚线这类细节分割出来全是糊的还不如调参调好的稀疏卷积网络。后来把PointTransformer V1、V2、V3三代模型从头到尾重新捋了一遍才算明白这三代到底在解决什么问题。这篇就把它们的演进逻辑、核心机制和工程选型经验一次性说清楚。1. V1开山的意义自注意力第一次在点云上跑通1.1 点云不是图像Transformer不能照搬图像Transformer能成功很大程度上是因为图像天然是规则网格每个像素有固定位置、固定数量的邻居位置编码和计算范式都是现成的。但点云完全不是这么回事——点与点之间距离不均匀密度可能差几个数量级而且点云本身无序你把所有点随机打乱语义上它还是同一个物体。早期照搬图像Transformer方案的做法在点云上几乎都碰壁了核心原因是它们默认使用绝对位置编码。对图像来说像素坐标比如第10行第10列是有语义含义的物体一般出现在画面中央但点云没有“绝对坐标”这一说坐标原点稍微一换编码就全变了模型自然泛化不动。V1PointTransformer发表时是ICCV 2021做的第一个关键决策就是用相对位置编码替代绝对位置编码把点与点之间的位移向量Δij直接编码进注意力机制让模型对平移不再敏感。这个改动听着不大却是Transformer能在点云上“站”住的根基。1.2 向量注意力公式与逐参数拆解理解V1之前先看它的核心模块。用伪代码表示V1的注意力大致长这样# 伪代码PointTransformer V1 的向量注意力 def v1_attention(x_i, x_j, p_i, p_j): delta_ij p_i - p_j # 相对位置几何信息的输入 f_i phi(x_i) # 查询侧线性投影 f_j psi(x_j) # 键侧线性投影 logits gamma(beta(f_i, f_j) delta(alpha(delta_ij))) att softmax(logits) # 注意力向量不是标量 out att * (psi(x_j) delta(alpha(delta_ij))) return out逐项解释一下phi、psi两个线性投影把点特征分别映射成查询表达和键表达alpha输入相对位移的编码MLP把三维的相对位置变成高维几何特征delta把位置编码映射回特征维度的变换beta负责交互两个特征分支的MLP学习查询和键之间的匹配关系gamma输出最终注意力权重的MLPsoftmax把权重归一化到0到1之间。这里注意一个和图像Transformer的本质区别图像里注意力权重通常是一个标量而V1输出的是一个和特征维度相同的注意力向量再和后面的特征逐元素相乘。这种向量注意力的好处是每个特征维度有自己独立的注意力权重表达能力更强坏处是计算量和显存开销成倍上涨后来V2效率优化一直在和这个设计博弈。1.3 实际项目里V1暴露的两个致命短板我自己项目里把V1跑起来后暴露的问题非常典型。第一计算和显存开销太大。V1对每个中心点要计算它和邻域内所有点的注意力复杂度是O(N×K)K是邻域半径内的点数。想要感受野够大K经常要拉到几十甚至上百两层堆叠之后显存直接爆炸。两千多万点的场景V1根本不敢用全局注意力最后被迫做分块推理块与块交界处的分割结果还会出现明显的接缝。第二位置先验被削弱。V1的位置编码alpha(Δij)是所有点共享同一个MLP它对“物体内部相对位置”的敏感度不够。打个比方墙面上的一排点在局部坐标系里的相对位置几乎一样V1很容易把墙面上不同区域的分割结果平均化导致墙角、踢脚线、门窗交接线这类细节大范围丢失。我当时的输出里墙面交界处糊成一片就是这个问题在作祟。提示如果任务只是几十万点以内的物体分类或部件分割V1的精度依然够用代码也成熟、好复现。但一旦进入场景级分割它的效率和细节表现都明显跟不上。2. V2的组向量注意力把语义与几何分开治疗2.1 为什么不做“更大的V1”而是换机制踩了V1的坑之后我的第一直觉是效果不够好那就加深加宽堆更多的层。后来看了PointTransformer V2PTv22022年底公开的设计才发现方向完全错了。V2的改进思路不是堆参数而是质疑V1的底层设计V1把“这个点是什么”语义和“这个点在哪里”几何混在同一个特征空间里用一套注意力处理。但这两类信息对注意力的需求是矛盾的——语义信息在同类物体之间高度相似需要共享式的表达这样网络才能学到“墙就是墙”的共性几何信息却要求精确区分共享反而会把局部细节抹平。PTv2提出的组向量注意力Group Vector Attention就是从这里下刀把特征分成两个互补的子空间一个负责全局语义一个负责局部几何让它们各用各的规则做注意力。2.2 分组向量注意力的工作流程PTv2的组向量注意力可以这样理解对每个中心点i和它的邻域点集先把特征沿通道维拆成两半然后并行处理全局分支用一组可学习的“组向量”作为查询对象在一个组内共享语义表达。组向量的数量远小于点的数量计算量因此大幅下降。同时因为组内共享表达模型会“被迫”学到同类点之间的共性对噪点和密度变化也更鲁棒局部分支保留逐点的几何编码通过位置相关MLP把相对位置信息直接注入到特征变换的权重里让网络对局部几何结构更敏感。两个分支的注意力输出最后拼回一起经过可学习的融合方式组合。效果就是模型既能抓住“这是一面墙”的全局语义又能捕捉“这一块是墙的转角”的局部几何细节而不是像V1那样把两类信息揉成一团互相干扰。# 伪代码PTv2 组向量注意力双分支 def gva(feat, rel_pos): f_global, f_local split_channel(feat) # 沿通道拆成两份 a_global group_attention(f_global) # 全局语义组向量共享 a_local position_mlp(f_local, rel_pos) # 局部几何位置相关 return merge(a_global, a_local)2.3 可学习温度系数一个常被忽略的关键细节V2里还有个看似不起眼、实际很关键的改动——可学习温度系数。普通Transformer里softmax的输入通常直接是点积分数V1也一样直接对MLP输出过softmax。问题在于MLP的输出分布可能很“尖锐”也可能很“平坦”如果直接过softmax注意力权重很容易过早集中到少数几个点上或者反过来过于平均两种极端都不利于训练收敛。V2的做法是在softmax之前用一个可学习的标量参数τ对注意力分数做缩放让模型在训练中自己找到最合适的注意力温度。我在复现时发现把τ从固定值改成可学习参数之后训练前几十个epoch的收敛速度明显加快最终精度也有稳定的小幅提升。这是性价比极高的改动也是V2里最容易被忽略的细节之一。2.4 实测效果V2到底比V1强在哪在公开数据集上V2的增益是全局性的。以ScanNet室内分割为例mIoU从V1的70%左右提升到了75%以上在S3DIS、SemanticKITTI等数据集上也有类似的提升。更重要的是因为组向量机制大大压缩了注意力计算量V2在相同显存下能处理的点数比V1多得多推理速度也明显提升。我在室内项目里把V1替换成V2后最直观的变化有两个一是墙面和地面的边界不再“糊”了转角处和踢脚线的分割准确率显著提高二是显存占用降了大约三分之一之前被迫分块的数据可以一次性喂进去训练省掉了很多工程上的麻烦。3. V3的无参数化之路更简单反而更强3.1 V3的“减负”思路从哪里来到了2024年PointTransformer V3PTv3的出现把整个设计哲学又带偏了一次——这次不是做加法而是做减法。PTv3的论文标题写得很直白Simpler, Faster, Stronger。核心结论是V2里各种复杂机制组向量、可学习温度、位置相关MLP在足够大的数据规模面前未必是最优解很多时候把复杂算子换成无参数算子效果反而更好。这里需要解释什么是无参数算子。常规卷积、注意力、MLP都有大量可学习权重需要靠梯度更新。而无参数算子指max pooling、mean pooling这类不需要学习的操作给定一组邻域特征直接取最大值或平均值。PTv3的实验结果表明在模型足够深、数据足够大的前提下用这些简单算子替代复杂的可学习映射精度不降反升泛化能力还更强训练速度大幅变快。3.2 点序不变性与序列化PTv3的底层逻辑PTv3另一个重要设计是点序不变性。前面反复说过点云本身无序而Transformer天然对序列顺序敏感所以早期方案要么给每个点加位置编码要么用复杂的置换不变网络。PTv3的做法很有意思把点云通过空间填充曲线比如希尔伯特曲线、Z-order曲线序列化成一个线性顺序然后在序列上做注意力。问题是排序方式本身没有语义含义模型怎么应对顺序变化答案就在无参数算子身上——max pooling和mean pooling的输出与输入顺序无关所以PTv3的Transformer块不管点云按什么顺序排列输出在高层特征层面保持一致模型天然拥有不错的点序不变性。这也意味着它不再需要依赖复杂的位置编码来对抗顺序干扰省掉了相关的大量参数和计算。3.3 PTv3在实际项目中的表现我目前的主力项目已经迁移到PTv3。最直观的对比同样在两千多万点的室内点云上PTv3单卡A100可以正常训练吞吐量比V2又提升了一倍以上最终分割结果在墙面、顶棚、门窗这些大类上比我调参调了半天的V2还要好一点。论文里的数据也支持这个结论在ScanNet、S3DIS、SemanticKITTI、NuScenes等多个室内外数据集上PTv3都刷到了当时的SOTA训练速度约是之前最强模型的3倍。注意PTv3在“速度优先、精度不降”这个目标上做得很成功但它也引入了4D位置编码3D空间时间帧序号来处理连续扫描的多帧数据对输入预处理的要求比V1、V2高不少不是随便丢点云进去就能出好结果的。4. 三代模型选型对比别拿V2的定位去打V3的仗4.1 三代核心能力一览用一张表把三代的差别摆出来方便对照维度PointTransformer V1PointTransformer V2PointTransformer V3核心机制向量注意力 相对位置编码组向量注意力 位置相关MLP无参数算子 序列化语义建模能力一般强强几何细节能力偏弱易被平均化较强强计算效率低显存占用大中组向量压缩计算量高训练速度快约2-3倍点序敏感度需要位置编码需要位置编码天然点序不敏感公开精度表现基础可用相比V1显著提升多数据集SOTA最适合场景小规模物体级任务中小规模场景级分割大规模室内外场景、工程落地4.2 工程选型的几条经验我的选型建议是分场景看的。如果任务只是几万个点以内的物体分类、部件分割V1仍然有它的价值结构简单、代码成熟、好复现当教学基线模型再合适不过。如果做几十万到几百万点的室内单场景分割V2是性价比之选显存可控、精度和速度平衡得比较好。如果要处理单体建筑甚至城市级别的点云直接上PTv3它的序列化加稀疏卷积设计就是为大规模数据准备的数据越多优势越明显。第四条经验容易被忽略不要只看模型名字选型。V1、V2、V3虽然都叫PointTransformer但它们对输入预处理的要求完全不同。V1几乎不需要什么特殊预处理V2对邻域搜索的半径和点数更敏感V3还要考虑序列化方式、多帧时间戳编码这些新参数。换模型不是改个模型名那么简单整个数据管线都要跟着一起调。4.3 关于算力和显存的一点提醒做工程时我习惯在代码里加显存监控。网络层数、邻域点数、批量大小、序列长度这几个参数只要有一个拉满显存占用就会指数级上升。PTv3虽然快但如果你把它配置成全局注意力模式显存照样会爆。建议的做法是先用小批量和小序列长度把模型跑通确认关键指标正常再逐步加大规模同时观察训练吞吐量。吞吐量开始明显下降的位置往往就是显存瓶颈出现的位置把序列长度或批量卡在那里最合理。5. 从Transformer到Mamba点云序列建模的下一站5.1 为什么Mamba会出现在点云圈子里聊完PTv3再聊聊最近很热的一个方向——Mamba处理点云。Transformer一直有个绕不开的短板注意力复杂度是O(N²)点云场景动辄几百万上千万点局部窗口只能缓解不能根治。Mamba这类状态空间模型把复杂度降到了O(N)同时通过选择性扫描机制保持长距离依赖建模能力这种特性天然适合超长点云序列。PointMamba、Mamba3D这类工作的大致思路是先把点云通过八叉树或空间填充曲线排序成一个线性序列然后把序列交给Mamba块做线性扫描。相比TransformerMamba在显存占用和推理速度上优势明显对大场景点云的适应能力也更强。这个方向最近升温很快很多做自动驾驶点云感知的团队都在跟进。5.2 Mamba和PTv3并不是零和关系这里想纠正一个常见误解不是说Mamba要取代PointTransformer而是两者解决的问题层面和适用数据规模不一样。PTv3通过局部注意力加稀疏卷积已经很大程度上规避了全局注意力的计算爆炸在中等规模数据上又快又准Mamba则更擅长超长序列的全局感受野且单点成本更低。所以在实际工程里如果数据规模还没到千万点以上PTv3仍然是非常稳的选择如果未来要处理连续采集的城市场景点云或者要做实时感知流Mamba路线的性价比会越来越明显。两者在架构上也并非完全对立——把PTv3的序列化和Mamba块结合起来是眼下很多论文在试的组合方式。5.3 我的下一个实验计划我最近在准备把PTv3的序列化模块替换成Mamba块做一组同数据、同配置的对比实验计划重点对比mIoU、训练吞吐量、显存占用和长尾类别召回率这几个维度。目前来看Mamba路线在架构上更简洁但生态成熟度远不如PointTransformer系列——文档少、复现坑多身边已经有朋友在跑Mamba3D时因为状态维度设置不当导致显存振荡需要花不少时间排查。我个人实践中的体会是不要把Mamba当成灵丹妙药它的调参难度和工程成熟度短期内还追不上PTv3。但对想跟踪前沿的人来说现在正是把Transformer和Mamba两种范式放进同一套数据管线做横向对比的好时机——这类对比实验本身比单刷一个SOTA更有价值。