1. 为什么3D点云值得单独写一篇综述
如果你这两年一直在做视觉相关的项目,大概率会有一种感觉:2D图像那边的玩法已经非常成熟了,分类、检测、分割各有各的经典网络,论文刷来刷去无非是 backbone 换一换、注意力加一加。但一旦把场景换成3D点云,事情就完全不一样了。点云不是规整的网格,它是散落在空间里的一堆坐标,数量不定、密度不均、还没有固定的排列顺序。同样一个椅子,从不同角度扫出来的点云,点的个数可能差好几倍,顺序也完全对不上。这就导致2D里那套卷积、池化的思路没法直接搬过来用。
我最早接触点云是在一个室内重建的小项目里,当时用深度相机扫了一圈房间,拿到几十万个点,想做个简单的物体分类。结果发现把点云直接丢给常规网络根本跑不通,要么是输入维度对不上,要么是训练完全不收敛。后来才慢慢摸清楚,点云深度学习是一个相对独立的方向,它有自己的问题定义、自己的网络设计范式、自己的评价体系。这篇综述论文《Deep Learning for 3D Point Clouds: A Survey》做的就是把这些零散的东西系统性地梳理一遍,从3D数据的几种表示形式讲起,一路覆盖到分类、分割、检测这几大核心任务,最后还讨论了少样本、对抗攻击这些前沿话题。
这篇文章适合谁看?我觉得有三类人。第一类是刚进入3D视觉方向的研究生或者工程师,需要一份能快速建立全局认知的地图;第二类是已经在做2D视觉、想往3D迁移的从业者,需要知道哪些经验可以复用、哪些坑必须重新踩;第三类是做机器人、自动驾驶、AR/VR相关产品的开发者,需要判断当前点云技术到底能做到什么程度、哪些任务已经相对成熟可以落地。接下来我会按照这篇综述的脉络,把里面的核心技术点拆开讲,同时补上我自己在实操中积累的一些经验和判断。
2. 3D数据的表示方式与点云的特殊性
2.1 四种主流3D表示形式对比
在深入网络结构之前,必须先搞清楚一个前提问题:3D数据到底怎么表示。这篇综述里把常见的表示形式分成了四类,我结合自己的理解重新整理一下。
| 表示形式 | 数据结构 | 优点 | 缺点 | 典型网络 |
|---|---|---|---|---|
| 点云 | 无序点集合 (x,y,z) | 保留原始几何信息,采集直接 | 无序、稀疏、密度不均 | PointNet系列 |
| 体素 | 规则3D网格 | 可复用3D卷积 | 分辨率与内存矛盾尖锐 | VoxNet、3D U-Net |
| 网格 | 顶点+面片 | 表面连续,渲染友好 | 从点云重建网格有误差 | MeshNet |
| 多视图 | 多个2D投影 | 可复用成熟2D网络 | 遮挡丢失信息,视角选择敏感 | MVCNN |
体素这条路我试过,把点云量化成比如 64×64×64 的网格,然后套3D卷积。听起来很顺,但实际做的时候你会发现一个尴尬的事情:分辨率提上去,显存直接爆炸;分辨率降下来,很多细节就糊成一团了。一个 256³ 的体素网格,光是存储就是一千六百多万个体素,大部分还是空的。所以体素方法后来基本只在一些对精度要求不那么极致的场景里用。
多视图的思路更取巧一些,把3D物体从多个角度拍成2D图,然后用2D网络提取特征再融合。这个方案的好处是能直接吃2D视觉的红利,但问题也很明显:视角怎么选?选少了信息不全,选多了计算量翻倍,而且遮挡区域永远拍不到。网格表示则更多用在图形学渲染那边,从点云重建网格本身就是一个难题。
所以绕了一圈,点云这种最原始的表示反而成了深度学习时代最受关注的方向。它没有中间转换的损失,采集设备(激光雷达、深度相机)直接输出的就是点。难点在于,你得设计一种网络,能处理这种无序、稀疏、密度不均的数据。
2.2 点云处理的三个核心难点
我把点云深度学习的难点归纳成三条,这三条几乎决定了后面所有网络设计的基本思路。
第一是无序性。给你一堆点,你把它们的顺序打乱,这个点云代表的还是同一个物体。这意味着网络必须对输入顺序具有置换不变性。传统卷积天然依赖固定的空间位置,没法直接用。PointNet 的解法是用对称函数,比如最大池化,把每个点单独提特征之后取全局最大值,这样无论顺序怎么变,结果都一样。
第二是稀疏性和密度不均。激光雷达扫出来的点,近处密密麻麻,远处稀稀拉拉。深度相机也是,离得近的地方点很多,边缘区域可能就几个点。这种不均匀性会让网络在稠密区域过拟合、在稀疏区域欠拟合。常见的应对手段包括最远点采样做下采样、或者用球查询在局部自适应地聚合邻居。
第三是旋转不变性。同一个物体,你把它转个角度,点云坐标全变了,但它还是同一个物体。理想情况下网络应该对旋转不敏感。但实际中大部分网络并没有显式地处理这个问题,通常靠数据增强(随机旋转)来让网络自己学会。也有一些工作专门设计旋转等变的网络结构,但复杂度和收益之间的权衡一直是个问题。
提示:如果你刚开始做点云项目,不要一上来就追求旋转不变性。先用数据增强把基线跑通,再考虑要不要引入更复杂的等变结构。很多场景下,数据增强带来的鲁棒性已经够用了。
3. 点云分类与分割的核心网络演进
3.1 从PointNet到PointNet++:局部特征的关键一步
PointNet 是这个方向的里程碑,它的核心思想非常简洁:对每个点用一个共享的MLP提特征,然后用最大池化聚合全局特征。这个设计优雅地解决了无序性问题,而且参数量很小。但它的短板也很明显:它只提取了全局特征,没有利用局部结构。你可以理解为,它把每个点单独看,然后取了个全局最大值,但点与点之间的邻域关系完全没管。
PointNet++ 就是冲着这个短板去的。它引入了层级化的特征提取,简单说就是先把点云分成若干局部区域,在每个区域内部用PointNet提特征,然后逐层抽象。这个思路其实和2D卷积网络里感受野逐层扩大的逻辑是一致的。具体实现上,它用最远点采样选中心点,用球查询找邻居,然后在每个球内做特征聚合。
我在复现PointNet++的时候踩过一个坑:最远点采样的计算量其实不小,尤其是点数多的时候。后来发现很多工程实现里会用随机采样或者体素下采样来替代,精度损失不大但速度快很多。这个取舍在实际项目中很值得考虑,论文里不一定写,但你跑起来就知道时间都花在哪了。
3.2 基于卷积的点云网络:把卷积搬到3D空间
PointNet系列之后,有一大批工作试图把卷积操作重新引入点云处理。思路大致分两种:一种是把点云投影到规则网格上再做卷积,另一种是直接在点云上定义连续卷积。
基于网格的方法里,比较有代表性的是把点云体素化之后用稀疏卷积。稀疏卷积的好处是只对非空体素做计算,避免了大量无效运算。这个思路在自动驾驶场景里用得比较多,因为激光雷达点云本身就非常稀疏,稀疏卷积能把计算效率拉回来不少。
直接在点云上做卷积的代表是点卷积类的方法,比如用核密度估计或者参数化卷积核,在每个点的邻域内做加权聚合。这类方法的优势是保留了原始几何精度,但实现起来比稀疏卷积复杂,调参也更麻烦。我个人的经验是,如果你的场景对精度要求极高、点数又不算太多,可以试试点卷积;如果是大规模场景、实时性有要求,稀疏卷积更稳妥。
3.3 基于图的方法与注意力机制
点云天然可以看成一张图,每个点是节点,邻域关系是边。所以图神经网络很自然地就被引入进来。基于图的方法核心在于怎么定义边、怎么在边上做消息传递。相比固定邻域的卷积,图方法可以更灵活地建模长距离依赖。
注意力机制在点云里的应用也是这两年的热点。核心思路是让网络自己学习每个邻居点的权重,而不是像传统卷积那样用固定的空间权重。这样做的好处是能自适应地关注更重要的局部结构。但注意力机制的计算复杂度通常是邻居数的平方,点数一多就很吃力。所以实际用的时候,往往需要在注意力和效率之间做权衡,比如只在小范围邻域内做注意力,或者用线性注意力近似。
3.4 分割任务的特殊考量
分类是给整个点云打一个标签,分割是给每个点打一个标签。这个区别决定了分割网络必须保留更多的局部信息。分类网络可以一路下采样到全局特征,但分割网络在下采样之后还得上采样回去,把每个点的类别预测出来。
常见的分割架构是编码器-解码器结构,编码器逐层下采样提特征,解码器通过插值或者反池化逐步恢复分辨率。这里有个关键细节:上采样的时候怎么把特征传回去。最简单的是最近邻插值,但这样会丢失细节。更好的做法是像U-Net那样,把编码器对应层的特征跳连到解码器,让浅层的几何细节和深层的语义信息融合起来。
我在做部件分割的时候发现,跳连的设计对边缘区域的精度影响特别大。没有跳连的时候,物体边界附近的点经常被分错,因为深层特征虽然语义强但空间分辨率太低。加上跳连之后,边界精度能提升好几个百分点。这个经验在论文里可能只是一句话,但实际调的时候值得重点关注。
4. 3D目标检测:从室内到室外的主流方案
4.1 检测任务的两种主流范式
3D目标检测和2D检测一样,核心是找出物体在哪里、是什么。但3D里多了一个维度,问题复杂度上了一个台阶。主流方案大致分两类:一类是基于候选框的方法,先生成一堆可能包含物体的3D框,再分类和回归;另一类是单阶段方法,直接在每个点上预测类别和框参数。
基于候选框的方法精度通常更高,但速度慢,因为生成候选框和后续处理都很耗时。单阶段方法速度快,适合实时场景,但小物体的召回率往往不如两阶段。这个取舍和2D检测里的情况非常类似,本质上还是精度和速度的平衡。
4.2 室外场景:激光雷达点云的特殊处理
室外自动驾驶场景的点云有几个鲜明特点:范围大(几十米到上百米)、稀疏、前景和背景极度不平衡。一辆车可能只占几百个点,而地面和背景占了绝大多数。所以室外检测网络通常需要专门设计前景采样策略,或者在损失函数里对前景加权。
另一个关键问题是坐标系。激光雷达点云是在传感器坐标系下的,而检测需要在世界坐标系或者鸟瞰图视角下做。所以很多方法会先把点云投影到鸟瞰图,然后在鸟瞰图上做2D检测。这样做的好处是可以复用成熟的2D检测网络,而且鸟瞰图视角下物体不会重叠,后处理简单。但缺点是丢失了高度信息,对于高度差异不大的物体(比如行人和自行车)区分度不够。
4.3 室内场景:密集点云与多模态融合
室内场景的点云通常来自深度相机或者结构光设备,特点是范围小、密度高、噪声大。室内检测的难点在于物体之间遮挡严重、类别繁多、尺度变化大。很多室内方法会融合RGB图像和点云,因为RGB提供纹理信息,点云提供几何信息,两者互补。
多模态融合说起来简单,做起来麻烦。最大的问题是标定误差和对齐精度。RGB和深度图之间的对齐如果差几个像素,融合特征就会错位,反而拖累性能。我在一个室内抓取项目里试过早期融合和晚期融合,最后发现晚期融合(各自提特征再拼接)虽然简单,但鲁棒性反而更好,因为对对齐误差不那么敏感。
4.4 检测中的评价指标与常见陷阱
3D检测的评价指标主要是IoU(交并比)和mAP(平均精度均值)。但3D IoU的计算比2D复杂,因为涉及到旋转框。两个3D框即使中心很近,如果旋转角度差很多,IoU也可能很低。所以有些工作会用BEV视角下的IoU或者3D IoU的近似计算。
一个常见的陷阱是:在训练集上IoU很高,但测试集上掉得厉害。这通常是因为过拟合了训练场景的特定分布。比如训练集里车都是朝一个方向停的,测试集里车朝向变了,旋转回归就崩了。解决办法除了数据增强,还可以在损失函数里对旋转误差单独加权,或者用一些旋转解耦的表示方法。
注意:做3D检测的时候,一定要检查你的标注框的坐标系定义和网络输出的坐标系定义是否一致。我见过不止一个项目因为坐标系搞反了,导致训练完全不收敛,排查了好几天才发现是标注工具和网络约定不一样。
5. 前沿方向与实战中的取舍
5.1 少样本与自监督学习
标注3D数据比标注2D数据贵得多。一张2D图框个物体几秒钟,但3D点云里框一个物体,需要旋转、缩放、调整朝向,熟练的标注员也要几十秒。所以少样本学习和自监督学习在点云领域特别受关注。
自监督的常见思路是设计前置任务,比如让网络预测点云被旋转的角度、预测被遮挡的部分、或者对比不同视角下的特征一致性。这些任务不需要人工标注,可以利用大量未标注点云来预训练。预训练之后再在小规模标注数据上微调,往往能显著提升性能。
我在一个数据标注成本很高的项目里试过自监督预训练,效果确实明显。但要注意,前置任务的设计要和下游任务相关。如果你用重建任务预训练,但下游是分类,提升可能有限;如果用对比学习预训练,下游是分割,也可能不太匹配。选前置任务的时候要想清楚它学到的特征对下游有没有用。
5.2 对抗攻击与鲁棒性
点云网络同样面临对抗攻击的问题。攻击者可以通过轻微扰动几个点的坐标,让网络把飞机识别成桌子。这种攻击在自动驾驶场景里是很危险的,因为路面上一个被篡改的点云可能导致检测失效。
防御手段目前主要有两类:一类是输入层面的去噪和滤波,把异常点过滤掉;另一类是在网络里加入鲁棒性约束,比如对输入扰动做平滑。但说实话,目前还没有特别成熟的通用防御方案,这个方向还有很大的研究空间。实际部署的时候,如果安全要求高,建议在点云预处理阶段加一些统计滤波,把明显离群的点去掉,能挡掉一部分简单攻击。
5.3 实际项目中的选型建议
结合我自己的经验,给几个选型上的建议。
如果你的任务是点云分类,而且点数不多(几千到几万),PointNet++ 或者基于注意力的方法都可以,优先考虑实现简单、社区资源多的方案。如果点数很多(几十万以上),先做下采样,或者用稀疏卷积。
如果是部件分割或语义分割,编码器-解码器结构是标配,重点调跳连方式和上采样策略。如果对实时性有要求,可以考虑轻量化的 backbone,或者用点云下采样加特征插值的方式加速。
如果是3D检测,室外场景优先考虑鸟瞰图投影加2D检测的路线,工程上更成熟;室内场景如果有多模态数据,建议做RGB和点云的融合,但要注意对齐精度。
如果是研究性质的项目,想发论文或者探索新方向,可以关注自监督、旋转等变、高效注意力这几个方向,目前还有很多空白。
5.4 常见问题速查
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| 训练不收敛 | 学习率过大、坐标系不一致 | 检查标注和网络坐标系,降低学习率 |
| 测试精度远低于训练 | 过拟合、数据分布不一致 | 加数据增强,检查测试集场景差异 |
| 显存溢出 | 点数过多、batch过大 | 下采样、减小batch、用稀疏卷积 |
| 推理速度慢 | 最远点采样耗时、注意力复杂度过高 | 换采样策略、简化注意力 |
| 小物体检测差 | 前景背景不平衡 | 前景加权、focal loss、多尺度特征 |
6. 一些踩坑之后的个人体会
做点云这几年,最大的感受是这个领域变化太快,但底层的东西其实没那么复杂。不管网络结构怎么变,核心问题始终是那三个:无序性、稀疏性、旋转不变性。你把这三个问题想清楚了,看新论文的时候就能很快抓住它的核心贡献在哪里。
另一个体会是,工程实现和论文描述之间往往有差距。论文里一笔带过的采样策略、损失权重、后处理参数,在实际项目里可能决定了最终效果的好坏。所以我的习惯是,看论文先看它的核心思想,然后自己复现的时候把每个细节都调一遍,记录下哪些参数敏感、哪些不敏感。这些记录比论文本身更有价值。
最后说一个具体的技巧:做点云项目的时候,一定要把可视化工具搭好。点云不像2D图像那么直观,很多问题光看loss曲线是看不出来的。把输入点云、中间特征、输出结果都可视化出来,你会发现很多隐藏的问题,比如标注错误、坐标系偏移、采样偏差。这个习惯帮我省了很多排查时间。