点云方向这几年的论文量,我估计是3D视觉里增长最快的一支。分类、分割、检测、配准、补全、生成,任务多且互相交叉,光是把名字都念顺就得花上一阵子。我去年做点云多个任务的论文整理,前前后后筛了数十篇,从只看摘要到动手复现主干方法,中间走了不少弯路。这篇把整理依据、各任务的主线论文、代表思路和踩坑经验一起写出来,适合准备切入3D视觉的学生,也适合本来就做2D感知、想横向拓展的工程师。
1. 为什么我会动手整理这份点云多任务论文清单
1.1 这份清单不是“关键词下载一百篇”,而是按任务主线切
刚开始整理点云方向论文时,最容易踩的坑,就是从搜索关键词开始。分类、分割、检测、配准,每个关键词一搜,返回几十篇名字特别像的方法,收藏夹越滚越大,脑子里却还是一团浆糊。
点云任务有一个特点:不同任务之间共享大量底层组件。一个网络能提取点云特征,换个输出头就是分类;再多加一个点特征传播,就是语义分割;把特征组织成柱状或体素,就是检测。也就是说,任务看似很多,底层技术路线是互通的。如果按关键词平行地收集,你会看到同一思想在不同任务里反复出现,却很难意识到背后的共同脉络。
所以我整理时没有按“分类找10篇、分割找10篇”这种粗暴方式,而是按“一条主干线”去组织:每个任务先找奠基工作,再看转折性的工作,最后看近期主流思路。这样几十篇论文排下来,每个方向都能看到一条从baseline到当前主流方案的演进线。整理到最后,你能回答的不仅是“这个方法是干什么的”,还有“它为什么出现在这个时间点”。
1.2 选文标准:能复现、能照抄思路、能看到演进
几十篇论文看起来数量很大,真正值得放进整理列表的其实不多。我的选文标准是四个。
第一,启发性。方法思路和主流路线明显不同,哪怕当时效果不是最强,也优先收。比如无锚框检测、掩码预训练、随机采样分割,这些转折点比平平无奇刷一个点的技巧重要得多。
第二,可复现性。只贴了论文、没放代码的工作,先放在“待读”区。点云方向很多方法严重依赖训练技巧和数据增强,没有代码很难复现出论文里的精度。一个不能跑的方法,对整理技术脉络的贡献有限。
第三,泛化性。同一个方法最好在分类、部分分割、场景语义分割等多个benchmark上都有报告。泛化性强的模型,通常才是更有代表性的通用特征提取架构。
第四,时间节奏。每个任务收1篇奠基、1篇转折、1篇近期主流,这就保证了一套紧凑的脉络。剩下的论文,按“受谁启发”“后续被谁改进”挂在主线上,而不是平铺在列表里。
1.3 整理台账:我用一张表管住全部论文
几十篇论文如果没有统一的组织方式,很快就会乱。我习惯用一张表来维护,每行是一篇论文,列包括:任务、年份、方法名、输入形式、核心模块、复现难度、代码状态、一句话备注。
下面的脚本是我实际整理时用的,构造一个CSV台账,后面可以用任何表格工具查看,也能轻松转成Markdown发到团队里。
import pandas as pd rows = [ ["分类", "PointNet", "原始点云", "逐点MLP + 全局最大池化", "低", "可复现"], ["分类", "PointNet++", "分层点云", "最远点采样 + 球邻域 + 局部PointNet", "中", "可复现"], ["分割", "RandLA-Net", "大规模点云", "随机采样 + 局部特征聚合", "中", "可复现"], ["检测", "PointPillars", "柱状体素", "pillar内PointNet + 伪2D检测", "低", "可复现"], ] df = pd.DataFrame( rows, columns=["任务", "方法", "输入形式", "核心思路", "复现难度", "代码状态"] ) df.to_csv("pointcloud_paper_list.csv", index=False)这里最有用的一列是“一句话备注”。它强迫我只用一句话说清楚这个方法的贡献:“输入是什么、核心模块做了什么、输出是什么”。写不出这句话,说明这篇论文还没真正读懂。
注意:这张表不是论文收藏夹,而是导航图。你要能随时指着一行说,这篇方法在整条技术脉络里处于哪个位置。
2. 先说分类与特征学习:点云任务的入口
2.1 第一梯队:PointNet与PointNet++为什么绕不开
点云本身是一种无序点集,喂给网络时同一个几何体可以有无穷多种点排列顺序。PointNet的核心贡献就是解决置换不变性:把每个点独立地过一遍共享MLP,再用全局最大池化把所有点的特征压缩成一个全局特征。
最大池化是一个对称函数,输入顺序怎么打乱,输出的最大值不变,这就保证了网络对点顺序不敏感。加上对齐模块(输入点云对齐、特征空间对齐),整体架构就完整了。
但PointNet的缺点也很明显:它对每个点独立编码,没有显式建模局部几何结构。点云里的一个小局部,比如桌角、墙面拐弯、车轮弧面,靠单点信息是表达不出来的。PointNet++因此引入分层结构:先在最远点采样出的中心点周围取邻域,把局部点云丢进一个小PointNet里,逐层扩大感受野,得到多尺度特征。这个思路和二维CNN不断叠加卷积核扩大感受野是同一个逻辑。
复现PointNet很容易,结构简单,一晚上就能跑通。PointNet++实现细节就多很多了:最远点采样怎么写得高效、球查询怎么用密度自适应的多尺度分组、特征传播层怎么把稀疏点特征还原到密集点云。这些细节直接决定精度,编程能力一般的话建议先看已有开源实现,再自己手写核心操作。
2.2 局部算子的三种设计路线:图卷积、点卷积与核点卷积
PointNet++之后,大家都在思考同一个问题:如何在无规则排列的点云上定义“卷积”。我用三张表把代表方法按路线划开。
| 方法 | 局部聚合方式 | 核心思想 | 适合场景 |
|---|---|---|---|
| PointNet++ | 球邻域内逐点MLP + 最大池化 | 分层感受野 | 通用baseline |
| DGCNN | 动态KNN图边特征 | 每层重建特征空间邻居 | 类别差异大的数据 |
| KPConv | 核点空间插值 | 用可学习核点逼近卷积 | 有固定邻域结构 |
DGCNN是图卷积路线的代表作。它把每个点的邻域关系建成语义空间里的边,用EdgeConv把中心点特征和邻居特征做差分,再经过MLP和池化。最关键的是图不是一次建好就固定,而是每一层都重新在特征空间里找邻居。这样特征的感受野会随着网络加深自适应扩张,收敛速度和精度都很有竞争力。
PointCNN走了不同的路。它提出X-Conv变换,对局部邻域内的点先学习一个变换矩阵,把无序邻域“拍”成近似有序的表示,再做卷积。这个想法类比起来,就像在二维图像上做卷积前,先对感受野做一次几何矫正。
PointConv的切入点是密度。它的核心是用MLP把卷积核参数化为连续函数,同时用逆密度权重补偿点云采样不均匀的问题。激光雷达的近处点密、远处点稀,如果不做密度补偿,网络会特别偏向密集区域。
KPConv则直接用一组可学习的核点。每个核点有对应的权重,邻域点根据到核点的距离做空间插值,把权重加权到输入特征上。它的可变形版本还能让核点自适应移动,类似二维可变形卷积。
注意:这几种局部算子不是单纯的“谁替代谁”。直到今天,很多检测框架在体素内做特征编码时,用的仍然是PointNet式的共享MLP,因为简单高效,而且体素范围内的点数不多,复杂算子带来的提升非常有限。
2.3 注意力时代的点云特征学习与掩码预训练
Transformer进入视觉之后,点云方向也坐不住了。Point Transformer的思路是把局部邻域当成一组token,在邻域内做自注意力,位置编码使用点坐标的差值信息。相比最大池化的硬路由,注意力机制能更灵活地决定哪些局部特征重要。代价是显存和计算量迅速上涨,实际部署时要配合稀疏化策略。
PointMLP更极端。它没有复杂的局部聚合算子,只靠精心设计的残差MLP结构,就在多个分类和分割基准上追平甚至超过以往的图卷积方法。它最大的贡献不是网络本身,而是给整个领域带来了一个反向思考:我们真的需要那么复杂的局部算子吗?算力有限的团队完全可以先用这种简单结构做基线,再逐步叠加复杂度。
掩码预训练也是近年绕不开的一类方法。Point-MAE的思路和二维掩码重建类似:随机掩蔽一部分点,让网络重建被遮蔽区域的几何中心或局部块,预先学习点云的几何结构,再在下游分类、分割任务上微调。PointContrast则走对比学习路线,让同一个场景不同视角的特征尽量接近,不同场景的特征互相排斥。
为什么这类方法值得单独划出来?因为3D标注比2D昂贵得多。一套自动驾驶点云标注框的单价和工期都远高于图像框,无标签预训练能把标注需求压降一大截。整理论文时我直观感受是,自监督已经从一个独立子方向变成了各类点云大模型的标配预训练手段。
3. 分割任务:语义、实例与部分分割的论文怎么排
3.1 语义分割:从小场景到大场景,算力如何支配架构
语义分割的任务是给点云里的每个点分配一个类别标签,比如墙面、桌面、行人、车辆。小场景室内数据集上,PointNet++作为baseline表现就很好,原因很简单:点数少,计算相对可控。但一旦到室外自动驾驶场景,几万甚至几十万个点,直接跑PointNet++这类密集计算结构,显存和延迟都会爆炸。
大场景语义分割的代表路线是RandLA-Net。它的核心是放弃计算量高的最远点采样,改用随机采样。为了不让信息在随机采样中丢失,它设计了局部特征聚合模块,通过空间编码、注意力权重、池化来保留局部几何信息。整体复杂度随点数近线性增长,这正是大规模场景能跑起来的原因。
另一条路线是稀疏卷积。点云转成体素网格后,绝大部分体素是空的,普通3D卷积会浪费大量计算。稀疏卷积只对非空体素做运算,速度和内存都显著改善。不过体素化本身会引入量化误差,网格分辨率与感受野之间的平衡要慢慢调。
还有两条偏工程化的路线。一条是把点云转成2D距离图像,直接复用成熟的2D语义分割框架,速度快但会损失部分几何细节;另一条是用极坐标或柱坐标系重新栅格化,比如PolarNet、Cylinder3D,专门应对激光雷达近处密、远处稀的问题。极坐标在径向上天然适配雷达的扫描方式,远近距离的栅格分布更均匀。
我的建议是,入门期先在部分分割或小规模室内场景上跑通PointNet++和DGCNN,明白点级标签监督是怎么回事,再切到大场景的稀疏卷积或随机采样路线。直接上手大场景模型,很容易被显存和数据加载问题淹没,反而学不到模型结构的精髓。
3.2 实例分割:聚类后处理如何演变成可学习模块
语义分割只能回答“这个点是墙还是桌子”,不能回答“这张桌子是哪一个”。实例分割要把同一个类别但不同物体的点区分开。早期方案基本是“语义分割 + 后处理聚类”:先给每个点打上类别标签,再在同类点里做欧式聚类,用物体间距离把它们分开。
这个方案的问题在阈值。距离设大了,两辆车靠太近就被粘连成一个实例;距离设小了,一辆车稍微稀疏一点就被切成好几块。阈值只能靠人工调,换一个场景就不稳。
PointGroup改变整个玩法。它在语义分割之外加了一个聚类分支,网络会预测每个点到其所属实例中心的偏移量。然后把原始坐标加上预测偏移量,让每个点都“向自己的实例中心靠近一步”,再聚类。原本挨在一起的物体,偏移后自然拉开间距,聚类阈值一下就变得好设很多。
SoftGroup进一步优化聚类本身的鲁棒性。PointGroup把点硬分配到某一个候选实例,当预测质量不高时容易错分;SoftGroup允许一个点同时属于多个候选簇,在簇级再做细化。HAIS则在点级聚类和实例级聚类之间做层次聚合,把漏掉的小实例重新捞回来。
也有彻底避开聚类的路线,比如直接预测无锚框的实例边界框,把实例分割当成检测问题做。这类方法在某些摆放过分规整的场景效果不错,但对任意遮挡和堆叠物体,召回率往往会吃亏。要复现的话,还是建议从PointGroup入手,它的双分支结构是后续很多工作的模板,理解了它,SoftGroup、HAIS的增量改进就很容易看明白。
3.3 部分分割:一个便宜又实用的模型检验场
部分分割是把一个物体拆成更细的语义部件,比如椅子分椅背、椅面、椅腿。它和语义分割的区别是:语义分割发生在场景尺度,标签是环境类别;部分分割发生在单物体尺度,标签是部件类别。
这个任务的数据通常从CAD模型生成,类别边界比较干净,没有场景语义分割那么强的类不均衡问题。所以部分分割非常适合用来快速验证一个特征提取网络的能力。PointNet、PointNet++、DGCNN这些方法都在部分分割基准上有标准测试,跑一遍就知道自己的复现是否正常。
实际操作中,部分分割的training objective是简单的逐点交叉熵,指标直接看mIoU。数据量小、训练速度快、问题容易暴露,非常适合刚入门的人debug。我在跑通PointNet++的部分分割后,才对“逐点分类网络其实是特征提取器加分类头”这件事有了实感。很多做检测的人以前不愿意碰分割任务,实际上这部分代码量不大,能快速建立对点云特征传播的理解,是性价比很高的练习。
4. 检测与多模态融合:自动驾驶场景里最热的方向
4.1 3D检测主干的四次迭代:从密集体素到柱状到中心点
3D目标检测的任务是给点云中的物体定位,通常用一个长方体框表示,包含中心坐标、长宽高和朝向。点云方向论文数量最爆炸的就在这里。
VoxelNet是理解整个3D检测演进的起点。它把点云切成稠密体素网格,每个体素内的点通过一个微型PointNet聚合,生成体素特征,再用3D卷积网络做特征提取,最后接RPN回归3D框。这个方法把点云到3D框的流程完全端到端化,但问题是3D卷积对空体素也做了大量冗余计算,速度很慢。
SECOND解决速度问题的方式是稀疏卷积。它对非空体素做卷积,空体素直接跳过,同时引入角度损失回归和多帧数据增强。稀疏卷积让体素类的检测器第一次有了实用性。后来很多体素框架的基础都是这一套。
PointPillars则把栅格从三维“压缩”到二维。它把点云沿z轴压缩成一个个柱状体,每个柱状体内的点用PointNet聚合,得到伪2D特征图,后面直接复用成熟2D检测器的结构。这个设计极大降低了计算量,实车部署的很多检测系统都以它作为基线。但z轴的信息丢失是硬伤,对于小目标和被遮挡目标,精度上限不如体素方法。
CenterPoint踩的是锚框设计的坑。传统3D检测要预先定义密集的3D锚框,方向、尺寸、比率,任何一个设置不合理都会让训练难收敛。CenterPoint改为预测物体中心点,直接对中心点的热力图做回归,再回归尺寸和朝向。中心点回归的匹配逻辑比锚框简单得多,收敛稳定,很适合作为后续方向设计的底座。
我在复现时体会到:PointPillars适合快速验证,CenterPoint适合追求更稳的精度,SECOND系列适合对速度精度都有要求的场景。没有绝对最强,只有任务匹配。VoxelNet现在更多是看思路用,直接训练比较少。
4.2 图像和点云融合:先有视锥,后有BEV
纯点云检测在近距离和中等距离表现不错,但远处的点太稀疏,一个行人可能只剩一两帧里零星几个点。图像能提供颜色和纹理,正好互补。
最早的融合思路是视锥。先让2D检测器在图像上框出目标,把2D框反投影到3D空间,形成一个锥形区域,只对锥内的点云做精细分类。这种做法的优点是干净,2D检测能把大量背景点过滤掉;缺点是整个流程是串联的,2D一旦漏检,3D再怎么努力也没用。
PointPainting换了个角度。先用2D语义分割网络给每个像素打上类别概率,再把图像语义投影到点云上。点云里每个点都额外带上一个类别得分,相当于给原始的三维坐标“涂了一层语义颜色”。检测网络本身不用大改,输入从xyz变成“xyz+语义特征”,训练端到端完成,实用性很强。
更进一步是BEV融合。多相机图像被分别变换到鸟瞰视角,生成图像BEV特征;激光雷达本身也在BEV下有特征。两个特征进一步对齐融合,再进入检测头。BEV空间天然统一了传感器坐标,避免了每根射线做像素级对齐的误差累积。很多新框架都朝着这个方向演进。
注意:多模态融合论文的复现成本通常远高于单模态。图像分支、点云分支、传感器标定、时间同步,任何一个环节出问题,结果都可能比纯点云更差。没有标定信息,不要去碰融合方法。
4.3 时序信息:检测任务里容易漏掉的一环
单帧检测的精度上限受信息量限制。激光雷达的一帧点云本身是稀疏的,运动中的车辆可能只被扫到几层线束。此时如果只输入当前帧,任何模型都很难稳定检出远处目标。
一个有效思路是把历史帧的点云先变换到当前帧坐标系,叠加起来再送进检测网络。多帧叠加后点云稠密度大幅提升,原本只有几个点的目标变成了几十个点。另一类思路是在检测框架里引入运动信息预测,用上一帧的目标运动趋势辅助当前帧的候选生成。
时序对实例层的作用更明显。检测加跟踪联合设计可以减少ID切换,车辆在帧间稳定关联,后面做轨迹预测就顺手很多。整理这些论文时,我会提醒自己:时序检测看起来只是多了一个输入维度,实际上避不开位姿估计、运动补偿、关联匹配三个大坑。值得读,但不要指望一周就能复现干净。
5. 别跳过配准、补全和生成这三个任务
5.1 配准:经典ICP的深度学习替代品
配准的目标是把两片点云对到同一个坐标系,比如同一个物体在不同视角下的两帧扫描。经典ICP迭代最近点,反复找最近对应点并更新位姿,对初始位姿极其敏感,容易收敛到局部最优。工程上常年有人吐槽,ICP要么一把过,要么完全跑飞。
深度配准路线做的事情,是用网络学习更鲁棒的特征和对应关系。PointNetLK的思路是:把原始点云通过PointNet提成全局特征,再借鉴经典LK配准的迭代框架,在特征空间里求解位姿更新。DCP则用Transformer提取两组点云的逐点特征,估计软对应矩阵,再用可微SVD直接算出旋转和平移。RPM-Net把经典鲁棒点匹配算法网络化,对outlier更稳定。CoFiNet走粗到细路线,先在低分辨率上找对应片段,再细化到逐点对应,兼顾效率和精度。
实操经验是,工业项目里不要一股脑上深度配准。正确的顺序是:先用经典算法做粗配准,把两片点云大致摆正,再用深度学习精配准微调。毕竟深度方法一样有初值问题,它的鲁棒性不是无穷大。
5.2 点云补全:小任务里藏着大收益
传感器只能看到物体被扫描到的那一面,背面永远缺失。点云补全就是根据可见部分,预测完整的物体形状。这个任务在自动驾驶里价值很直接:被行人遮挡的车辆,如果网络能提前预测出完整轮廓,下游规划就更安全。
PCN是这个方向常见的起点。它用encoder提取部分点云的特征,再用decoder先重建一个稀疏骨架点云,然后逐步加密。骨架到细节的两阶段设计,后来成为补全模型的经典套路。PointTr把Transformer编码引入补全,加强全局形状建模,让网络在不规则部分输入下也能抓住整体结构。SnowflakeNet则用“分点生成”的方式逐步细化局部,特别擅长恢复物体的精细几何细节。
补全任务看起来小,但评价指标和训练稳定性坑不少。要看两个指标:一个是重建点云与真值点云的倒角距离,另一个是重叠点对比例。只看一个指标很容易被生成一堆簇状噪声的方法骗过去。
5.3 生成模型与自监督:把标注成本打下来
点云生成模型负责学习点云分布,再从噪声采样生成新的点云。这类方法的直接用途是数据扩充,尤其是对路面上的极端场景做补全,避免模型在自动驾驶数据集的长尾分布上失灵。
PointFlow一类方法用连续归一化流建模点云分布,把点集看作从某个分布中采样得到的样本。扩散模型进入3D后,点云生成开始有了更强的保真度。这类生成模型有个额外好处:学到的高质量几何特征可以迁移到判别任务。
自监督和生成是相互成就的。当一个模型能够还原被遮挡点云的几何结构时,它就已经学到了很强的3D先验。现在主流的掩码预训练,本质上就是在做一种“几何填空”。整个点云方向的显性价值,正在从“如何设计更好的聚合算子”转移到“如何用更少的标注学更好的几何表征”。这是我的实际感受,数据标注成本会长期限制3D模型的发展,谁能少吃标注数据,谁就掌握主动权。
6. 复现十几篇论文后,我最想说避坑经验
6.1 数据预处理里的坑
点云预处理是复现失败的第一高发区。
第一个坑是归一化尺度。很多方法在公开基准里会把坐标归一化到单位球或特定范围。换到自己的数据集时,如果忘了同步改缩放系数,模型基本直接崩。这里建议把归一化写成一个独立函数,并在配置文件里明确记录原始数据尺度。
第二个坑是密度不均。公开基准大多经过精心的数据清洗,密度分布比真实传感器数据规律得多。把在标准集上跑通的模型直接丢到真实激光雷达数据上,精度可能掉一档次。缓解办法包括逆密度权重、多尺度分组、人为对密集区域下采样。
第三个坑是法向量。很多几何特征依赖法向量,但法向量的计算会受邻域半径影响。邻域半径和点密度不匹配时,法向量会在光滑表面上抖动,进而影响配准和很多高阶特征。建议先统计点的平均间距,再设置邻域半径。
第四个坑是DataLoader。大规模场景语义分割非常吃IO,在线做体素化、随机采样会拖慢训练好几倍。把预处理离线做完,存成可直接读取的格式,训练速度能提升一半不止。
6.2 训练参数与框架选择
复现时最让我头疼的不是模型结构,而是损失函数里各种权重和默认参数。3D检测常见的box回归损失、方向分类损失、中心点损失,不同方法对这些loss的权重差异很大。源码里写死的一组权重,换到另一个数据集上可能就失衡。拿到一份复现代码,第一件事不是跑,而是把损失函数里每个分量的配置读一遍。
混合精度训练在点云模型上经常触发NaN。同一个模型,用FP32能正常收敛,开启自动混合精度后可能几个step就爆炸。常见的处理办法是给loss加缩放,关闭部分算子的低精度计算。如果实在查不出原因,先退回单精度训练,再逐个算子排查。
显存不够时,优先减少输入点数而不是换小模型。点云模型的分辨率对精度影响非常大,砍掉三分之一点数,指标下降可能比换一个小模型更明显。如果必须降点数,建议采用均匀随机采样,而不是保留前三万个点,否则对稠密区域有严重偏置。
6.3 读论文的正确顺序
几十篇论文,不可能每篇都精读三遍。适合点云方向的读法,是把每篇论文都丢进“输入—模块—输出”这个框架里。
第一遍,只读摘要、方法图和结论。干的事是回答三个问题:输入是点也好、体素也好、多模态也好;核心模块是局部聚合、注意力、稀疏卷积还是Transformer;输出是特征、类别、框还是点云。回答完这三个问题,这篇论文的基本盘就清楚了。
第二遍,精读实验表,重点是消融实验。消融实验直接告诉你网络里哪个模块贡献了几个点。你不需要复现全部方法,只需要看“去掉注意力掉了多少,加上位置编码涨了多少”,就能判断哪些模块值得借鉴。
第三遍,对照公开代码的forward和loss实现。论文里最容易含糊的地方,比如正负样本匹配、损失权重、采样方式,都会在代码里现出原形。点云方向有一大特点:论文里的一行公式,代码里可能要写三五十行。
7. 最后分享一点个人习惯
整理到最后,我发现自己不再是按论文标题去回忆,而是按“输入形式—聚合模块—输出头”来检索。这个方法帮我快速判断一篇新论文到底新在哪:换了一个聚合模块,换了一种输出表达,还是换了一套监督方式。很多人问我“这么多论文看得过来吗”,我的真实感受是:点云领域的任务再多、论文再杂,主干脉络就那几条。把每个任务选一篇奠基工作、一篇转折工作、一篇近期主流吃透,再横向对照自己关心的场景,比单纯刷数量有用得多。
如果让我重新整理一遍,我会更早开始写那本“三行摘要”,而不是等到读了二十篇之后才动手。每篇论文只写三行:输入是什么、模块做了什么、输出是什么。坚持一个月,你会发现自己对点云任务的全局认知,比收藏两百篇论文的人还要清楚。