
3D点云处理这几年有一个很反直觉的现象不少团队明明数据、任务、算力都差不多最后模型精度却差出一大截原因往往不在调参而在最开始选错了网络骨架。PointNet和PointTransformer是当前基于原始点云做特征提取的两条典型技术路线一个靠“局部聚合”打天下一个靠“自注意力”做全局建模。很多新手把这两个模型当成同一种东西去替代结果在实际项目里被任务特性、显存开销和训练难度反复摩擦。这篇就围绕分类、分割、检测三类常见任务把它们从原理到落地选型完整对比一遍帮你省掉几个月的试错时间。1. 点云为何让深度学习这么头疼1.1 无序性同一个物体有无限种坐标排列图像是一张规则的像素网格卷积核滑过去每个位置的邻居关系是固定的。点云完全不同它是一堆XYZ坐标点的集合这些点在三维空间里排列得乱七八糟而且点的索引顺序换了本质上还是同一个物体。你用普通的卷积网络去处理点云稍微把点的顺序打乱一下网络的输出就可能崩溃。这个“无序性”是所有点云网络必须解决的第一关。网上很多资料把无序性讲得很玄乎其实用大白话说你把一袋大米倒进碗里米粒的位置固然固定但如果你把米粒重新标号1、2、3、4……无论怎么标它们还是同一袋米。网络结构必须对这一事实不敏感也就是说无论输入点的顺序怎么打乱输出特征都应该一致。这听起来简单做起来却不容易早期很多研究者直接把点云投影成多视角图片或者体素网格本质上就是在用传统结构“绕开”这个难题但也带来了信息损失和算力浪费。1.2 稀疏性三维空间里绝大多数区域是空的一张512像素的图片有26万个像素几乎每个像素都有信息。一个1024点的点云散落到一个房间大小的三维空间里绝大多数体素格子内部是空的。如果硬要把点云体素化比如把房间分成256的三次方网格那算出来的体素矩阵里可能超过95%都是零。传统3D卷积在这种高维稀疏数据上跑既浪费显存又浪费算力。这也是PointNet和PointTransformer这类“直接吃原始点云”的模型越来越受重视的原因。它们不需要把空间划分成体素而是直接在点的层级上做特征提取稀疏区域的空体素根本不会进入计算从根源上规避了维度爆炸。1.3 刚体变换旋转平移不能改变语义点云里的物体不会永远摆正朝向再进模型。自动驾驶场景里激光雷达扫到的车可能是任意角度在室内场景分割中一个沙发可能被任意旋转过。这就要求网络对刚体变换具备一定鲁棒性。早期很多工作靠“数据增强”硬扛靠随机旋转点云训练模型让它见过足够多的角度。但网络结构本身的“固有能力”更重要有的结构天然对旋转更敏感有的则不那么敏感。可以说无序性、稀疏性、刚体变换这三座大山决定了点云网络的设计空间。PointNet和PointTransformer恰好代表了两种差异很大的解决方案一种是把卷积的“局部感受野”思路移植到点云上另一种是借助自注意力直接建模任意点之间的相互关系。理解这两条路的差异就理解了它们在不同任务上的命运。2. PointNet核心思路把“局部几何”重新发明了一遍2.1 PointNet的局限与PointNet的补救PointNet是点云深度学习里的开山之作它的做法很简单对每个点独立做一次多层感知机把所有点的特征做最大池化得到一个全局特征。这套结构天然解决了无序性问题但一个致命弱点也随之而来——它在提取特征时完全不看每个点的邻居长什么样等于“每个点单打独斗最后把所有人的意见汇总”。对于全局分类这类任务效果还行一旦到了语义分割这种需要精细局部形状信息的任务就会漏掉大量几何细节。PointNet针对这一缺陷提出了一个很朴素的方案既然单个点看不出来局部形状那就把空间里相邻的点打包成一个“局部区域”在局部区域内用一个小型PointNet提取特征然后不断重复这个过程。这个思路和图像卷积网络非常像底层卷积看到小区域高层卷积看到大区域逐层抽象。2.2 集合抽象层采样、分组、提取三步走PointNet的核心模块叫集合抽象层Set Abstraction一共三个动作采样使用最远点采样Farthest Point Sampling从原始点云中选出一批“中心点”。最远点采样的好处是能保证选出的中心点在空间上尽量分散不会全都挤在一团。实际项目里这一步经常被忽略但它决定了后续每个局部区域的覆盖范围非常关键。分组以每个中心点为圆心设定一个半径比如0.2米把半径范围内的所有原始点归为一组。这里要考虑的是密度问题不同区域点的密集程度可能差很多因此PointNet还提供了多尺度分组MSG和多分辨率分组MRG两种应对方案本质上是把多个半径下的特征拼接起来。提取对每个分组内部的所有点做一次共享权重的PointNet提取出这个局部区域的几何特征。这套“采样-分组-提取”的过程可以反复堆叠每经过一层点的数量减半或者更少但每个点携带的感受野越大。到最后一层其实就得到了整个点云的全局描述。这个逐层抽象的过程跟CNN从边缘到部件再到整体的特征递进几乎完全一致。2.3 特征传播分割任务里怎么“还原”细节分类任务只需要全局特征但语义分割必须对原始每一个点输出标签。PointNet在逐层抽象的过程中点的数量越来越少分割时怎么把这些“下采样后的特征”还原到每个原始点上这里用到了特征传播Feature Propagation。简单说它用插值的方式把深层点的特征传播回浅层点再把插值结果和浅层原有特征拼接起来逐步恢复点的分辨率。很多新手在复现PointNet分割模型时容易忽略一点特征的传播不是简单复制而是要做距离加权插值再用一个共享MLP融合。这里如果实现得不够细致分割结果容易出现“边界糊成一片”的现象。我在实际项目里测试过在室内场景分割任务中特征传播层处理不好的话墙和门的交界处会很脏这点到了PointTransformer时代才被自注意力机制彻底改善。PointNet的整体优势在于计算可控、实现直观、对旋转增强的容忍度还不错但它也存在一个结构性问题——对局部邻域的覆盖依赖半径设置而半径设置一旦不合适复杂场景下的上下文信息就容易丢失。这个盲区正好成了PointTransformer一类方法的切入点。3. PointTransformer自注意力如何重新定义点云特征聚合3.1 从“邻居投票”到“全体注意力”PointNet处理一个局部区域时相当于让区域里的所有点通过一个小网络“投票”出这个区域的特征投票权重大体是平等的。而PointTransformer的核心主张是不同邻居对这个中心点应该有不同的关注度而且这种关注度应该是动态计算的而不是靠半径或者最近邻数量写死。Transformer里的自注意力机制让每个点在计算输出特征时可以“看”所有其他点根据彼此之间的特征相似度分配注意力权重。放在图像上这是长距离依赖建模放在点云上它天然就适合处理无序、非均匀分布的数据。PointTransformer在具体实现上通常不会真的让每个点去关注整个点云里的全部点那样计算量太大而是借鉴了局部感受野的思想只在每个点的K个近邻范围内做自注意力。这样既保留了对局部几何的敏感性又比固定半径的分组方式灵活得多。3.2 向量自注意力与位置编码的协同纯Transformer处理点云时有一个麻烦自注意力机制本身不知道两个点之间的空间关系。图像里有位置编码把像素的二维坐标加上去点云里同样需要位置编码而且必须编码三维空间中的相对位置和距离。PointTransformer提出了一个非常实用的设计向量自注意力。常规自注意力输出的是标量权重把各点特征加权求和PointTransformer则在每个局部邻域内额外引入一个可学习的权重向量用来对特征做逐通道的调制。这个设计让注意力不再是“谁重要就给谁加权”而是“不同特征维度应该以不同方式被邻居影响”。实际效果就是它对局部方向、距离、细粒度几何模式的表达能力明显强于普通自注意力。另一个关键细节是位置编码。PointTransformer使用点坐标的差值和中心点坐标作为位置编码的输入相当于把“相对位置”和“绝对位置”都告诉了网络。我在复现时注意过去掉位置编码直接跑精度会掉得非常快甚至可能比PointNet还差足以说明这个组件在整个结构里的份量。3.3 全局与局部的自适应权衡PointTransformer最吸引人的地方其实是它能够自适应地在局部细节和全局上下文之间做权衡。局部邻域内的注意力权重如果趋于平均就等价于在做局部聚合如果某些远距离点参与了进来又能拉入全局信息。这种灵活性让PointTransformer在语义分割任务上常常比单纯的局部卷积模型效果更好比如在S3DIS数据集上的平均交并比从PointNet的50多提升到70多提升相当可观。但要注意这种强大是有代价的。自注意力需要计算点对之间的相似度如果邻域点数K设得比较大内存占用和计算负担就会快速增长。很多工业项目里PointTransformer的推理速度比PointNet慢不少直接部署到算力受限的嵌入式设备上会有压力。这也决定了两种模型并不存在绝对优劣只存在适合不适合。4. 八项关键指标正面交锋架构、精度、算力与鲁棒性4.1 网络设计与实现差异对照先把两者在架构层面的差异用一张表看清楚后续选型和排错的依据基本都在这里对比维度PointNetPointTransformer点云输入方式原始点坐标可选法线原始点坐标可选法线特征聚合方式局部邻域内小型PointNet局部邻域内自注意力感受野控制靠采样半径和层级堆叠靠近邻数量K和注意力权重局部/全局建模逐层抽象局部为主局部注意力但可影响全局对无序性的处理最大池化 共享MLP自注意力天然对称位置编码无显式位置编码靠点坐标显式相对位置编码参数量相对精简通常更大实现复杂度较低易复现较高调试门槛高这张表只是静态对比真正的差别要在具体任务和数据上才能完全显现。4.2 分类与分割任务上的实测表现在ModelNet40点云分类任务上PointNet论文报告的准确率大约在91.9%PointTransformer在不同配置下通常能达到90.6%左右两者很接近PointNet甚至略高一点点。这个结果对很多人来说反直觉既然PointTransformer更强为什么分类任务上没拉开差距原因在于ModelNet40样本数量少物体形状规整全局特征基本足够完成判别局部注意力的优势发挥不出来。到了大规模语义分割场景转折就出现了。以室内场景S3DIS为例PointNet在第五区域Area 5的平均交并比大约在55上下PointTransformer可以拉到76左右差距接近20个点。这种差距在完整扫描点云、物体堆叠严重、类别边界复杂的真实场景里表现得特别明显。同理在自动驾驶语义分割、街景分割等任务上PointTransformer及其后续变体通常赢在边界清晰度和对远距离上下文的利用上。4.3 计算复杂度与训练资源消耗实际跑项目时精度不是唯一指标训练资源和推理速度往往决定模型能不能上线。PointNet的计算量主要由最远点采样和局部PointNet决定节点数多、半径大时也会膨胀但整体曲线温和。PointTransformer则不同它的注意力计算量随邻域点数量K线性增长如果K从16加到32训练显存和耗时增长非常明显。我自己的实测经验用一块24G显存的消费级GPU训练一个基于PointTransformer的室内分割模型批量大小通常只能放到4到8如果换成PointNet同样的数据可以放到16甚至更大。训练时间方面PointTransformer单轮迭代通常比PointNet慢30%到50%。这对大场景、长序列数据的项目来说是个很现实的约束。4.4 鲁棒性与部署难度的对比鲁棒性上PointNet对“局部点密度不均匀”更敏感场景里有遮挡或者近处物体点云密、远处物体点云稀的时候需要靠多尺度分组等策略去弥补否则预测会忽好忽坏。PointTransformer对密度差异的适应稍好一些因为注意力机制会自动聚焦到特征更明确的那些点上但也因为注意力权重随输入变化大在小样本场景下更容易过拟合。部署层面PointTransformer的模型文件往往比PointNet大一倍左右推理时多次张量重塑和注意力矩阵运算在没有经过深度优化的移动端或嵌入式平台上时延会偏高。如果项目的目标是车机、机器人边端部署PointNet这类轻量结构仍然更占优势。5. 实战选型指南别只看精度要按场景需求下单5.1 小样本、实时推理、计算受限PointNet是稳妥牌如果你手头的数据集规模不大比如只有几千个物体级别样本或者推理设备算力有限那PointNet是更稳妥的选择。它的特征提取过程更“规矩”不需要海量数据去学习复杂的注意力模式收敛速度也更快。在分类任务上它和PointTransformer的差距本身也不大选它不会吃亏。自动驾驶中的某些相对简单场景比如路沿检测、车道线分类用PointNet就可以稳定顶上没必要为了一点点精度提升去付出几倍的推理成本。另外一个容易被忽略的点是工程生态。PointNet的官方代码和第三方复现数量多社区积累的避坑经验丰富遇到问题很容易搜到解决方案。作为一个工程人员选一个“周边设施齐全”的模型长期维护成本往往能差出一倍以上。5.2 大场景语义分割、高精度需求PointTransformer更具潜力如果你的任务是大规模室外场景分割、复杂室内场景理解、或者需要精确边界的三维重建与语义标注那PointTransformer这类自注意力模型明显更占优。它的长距离建模能力能让模型“看到”更远处的结构例如分割一张会议桌时它能把桌腿和桌面的关系通过注意力连接起来避免同一物体被割裂成不同类别。这种优势在S3DIS、ScanNet这些数据集上已经体现得非常明显。同时要注意选择PointTransformer就要接受训练成本和推理成本的提升。在项目排期允许、算力充沛的前提下建议用PointTransformer做精度标杆再根据部署需求考虑蒸馏成轻量模型这个路线我在多个项目里验证过收益很可观。5.3 可解释性和调试体验PointNet更友好实际开发中模型不work的时候调试体验决定了你能多快定位问题。PointNet的结构非常透明哪一层负责采样、哪一层负责聚合都是固定的特征图输出尺寸变化也很直观哪怕团队里有新手也能很快上手排查问题。PointTransformer的可解释性就差一些。注意力权重矩阵到底学到了什么语义关系当前输出特征是受哪个远距离点影响的都很难直接可视化推理。遇到精度掉点问题你很难判断是位置编码没调好、K值设置不合理还是数据增强不够。这个问题在大团队协作场景里尤其容易被放大。5.4 融合思路站在两种结构的肩膀上其实这两种结构在企业级项目里不是非此即彼的关系。Point Transformer有后续版本Point Transformer V2用分组向量注意力做稀疏体素计算在效率和精度上都有提升也有一些语义分割框架会同时引入局部卷积模块和远程注意力模块得到混合架构。PointNet这种“局部紧凑特征提取器”也可以被嵌入到自注意力网络里当作底层特征提取模块减少直接K近邻搜索带来的内存开销。如果你刚开始搭建点云深度学习项目我建议这样规划先用PointNet快速跑通数据链路和任务效果建立基准然后用PointTransformer尝试刷新基准线。两个模型都跑一遍的成本远比选错方向后发现要重来一遍低得多。6. 复现与调参阶段最容易踩的坑6.1 数据加载与点云归一化第一坑在入口做点云深度学习和做图像最大的体验差异就是数据加载阶段就得操很多心。PointNet和PointTransformer都要求所有输入点数量统一而真实点云的点数往往从几千到几十万不等。最常规的做法是采样到固定点数常见是1024点、2048点、4096点但不同任务适合的采样策略不同。分类任务通常随机采样到1024或2048注意要固定随机种子否则训练和验证数据分布不稳。分割任务常见的做法是把大场景切成固定大小的空间块比如1米乘1米乘0.5米的块再在块内采样固定点数。块的大小直接影响模型的记忆强度切大了学得慢切小了看不到完整物体。归一化把点云中心平移到原点再缩放到单位球或者固定半径范围内。这一步特别重要不归一化会导致网络对尺度高度敏感训练过程也容易振荡。不少人在跑公开数据集时直接用别人切好的数据一换到自己的数据就崩往往就是没处理好采样和归一化。6.2 邻域参数设置半径还是K近邻决定模型视野PointNet里最关键的参数是分组半径。半径太小局部区域只覆盖到几个点学不到形状半径太大局部区域把不相关的点包进来特征容易混淆。通常先用数据集的平均点密度估算一个初始半径比如每平方米2000个点时0.2米的半径大约包含80个点这个数量级比较合适。然后通过验证集做几次实验微调。PointTransformer里则要注意K近邻的K值K16是常用的起步值增到32一般精度还会涨但显存压力上升也很快。我在项目里试过一个非常实用的做法把PointNet里半径从0.1逐步增到0.4的过程中分割准确率先升后降峰值出现在0.2左右。不要照搬论文默认值一定要用自己的数据做一遍这个扫描实验它能帮你找到模型的“视觉范围”。6.3 训练策略学习率、正则化与数据增强PointNet相对好训练常规AdamW加上余弦退火就能跑得不错初始学习率1e-3到3e-3都可以尝试。PointTransformer对学习率更敏感初始学习率建议从1e-3往下调如果训练损失在开头几轮就出现NaN大概率是学习率过高或者注意力权重初始化出了问题。数据增强方面随机旋转、随机缩放、随机平移是最常用的三件套。特别需要注意分类任务里的刚体变换增强可以狠一点随机旋转范围设大但语义分割任务中不同类别对方向有语义依赖比如天花板和地面的方向不能随便翻转要针对任务设计增强策略不能一把梭。6.4 显存溢出的排查与取舍跑PointTransformer时显存溢出几乎是每个初学者都会遇到的事。通常有三个解决方向减小Batch Size这是最简单粗暴的方式但要配合增大梯度累积步数来保住训练稳定性。减小邻域点数K或采样点数精度会掉但掉的程度可能没有想象中严重值得用实验去验证。检查代码里是否无意中创建了太多的中间张量尤其是一些实现里会在for循环里逐个计算注意力导致中间状态不断累积。可以改成矩阵运算一次完成显存占用立刻下降。原论文和开源实现里的显示配置都是在一定显存假设下写的。如果你的GPU不是A100级别就务必提前对模型复杂度做精简不要等到训练快完成了一看日志里全是OOM报错心态很容易崩。6.5 可视化评估不能只看mIOU一个数我在多个项目里有一种强烈的感受点云模型的评估指标和人对质量的感知有时对不上。mIOU涨了好几个点但点开可视化一看物体的边缘锯齿感依然很严重该贴合的平面出现了碎块。反过来说有些模型mIOU不高但主要类别、主要物体的分割轮廓是符合直觉的。所以做模型对比的时候一定要把分割结果可视化出来按照物体的颜色、形状、边界去逐帧观察。PointNet在复杂场景里容易“各自为战”把同一物体的不同部分归成不同类别PointTransformer则更容易出现“全局一致”的错误比如把同类别物体全错成另一个相似类别。这两种错误模式在mIOU上可能很接近但用户感受完全不同也决定了后面该往哪个方向优化。7. 我在实际工程里的选择经验连续做了几个点云项目之后我总结出自己的选型判断标准不一定普适但可以供大家参考如果训练数据少于10万帧、任务物体相对简单、部署算力有限我把PointNet放在第一位如果场景复杂、类别交叠多、边缘精度是刚需同时算力允许我毫不犹豫选PointTransformer或它的后续变体。两者我都放在项目流程里先跑一个准绳再跑一个增强最终的模型决定由实验数据而不是“哪个更先进”来下结论。另外还有个小技巧无论是PointNet还是PointTransformer训练后都可以使用知识蒸馏把复杂模型学到的“软标签”传给轻量模型。我个人试过的效果是把PointTransformer作为教师模型把精简版PointNet作为学生模型在一些嵌入式部署项目里能兼顾精度与速度这种方法比从头训练轻量模型稳定得多。点云领域还远没有到统一架构的时代把两种结构理解到位按需组合才是更实际的做法。