激光雷达点云降采样:原理、策略与方法综述
1.1. 激光雷达点云:获取、特性与挑战
Section titled “1.1. 激光雷达点云:获取、特性与挑战”激光雷达(LiDAR)技术通过发射激光脉冲并测量其反射回波的时间或相位差来获取目标物体的三维空间信息,已成为获取高精度三维数据的关键手段。其基本原理,如飞行时间(Time-of-Flight, ToF)法,涉及测量激光脉冲从发射到接收的往返时间,结合光速计算出距离。根据应用场景和平台的不同,LiDAR 系统可分为地面激光扫描(Terrestrial Laser Scanning, TLS)、机载激光扫描(Airborne Laser Scanning, ALS)以及车载 LiDAR 等多种类型。
LiDAR 系统生成的数据通常以点云(Point Cloud)的形式表示,即三维空间中大量点的集合,每个点包含其坐标(X, Y, Z)以及可能的附加信息,如反射强度、颜色(RGB)、法向量等。LiDAR 点云的主要特点包括:
- 高密度与高分辨率:能够提供高精度的距离和角度测量,生成包含数百万甚至数十亿点的高分辨率点云。
- 高精度:测量精度通常可达厘米级甚至毫米级。
- 非结构化:点云本质上是无序的点集,缺乏像图像那样的规则网格结构。
- 密度不均匀:点云密度可能因扫描距离、物体表面特性、扫描角度以及不同扫描仪或采集方法(如 LiDAR 与 SfM)而显著变化。
- 噪声与离群点:受测量误差、环境干扰或硬件限制,原始点云可能包含噪声和离群点。
尽管 LiDAR 点云提供了丰富的环境信息,但其庞大的数据量也带来了严峻挑战。处理大规模点云需要巨大的计算资源(处理时间、内存)和存储空间。对于需要实时处理的应用(如自动驾驶),高密度点云的处理速度往往成为瓶颈。此外,点云中常常存在冗余信息,特别是在平坦或结构简单的区域。这些挑战使得点云降采样成为必要环节。不同应用对点云数据的需求差异显著,例如,自动驾驶等实时应用更看重处理速度,可能允许一定程度的信息损失,而高精度建模(如建筑缺陷检测)或精细农业应用(如作物器官分割)则要求在降采样的同时,最大限度地保留关键的几何细节和结构特征,这往往需要采用更复杂、更具针对性的降采样策略。
1.2. LiDAR 应用中降采样的必要性
Section titled “1.2. LiDAR 应用中降采样的必要性”点云降采样(Downsampling),也称为点云稀疏化或子采样,旨在减少点云中的点的数量,同时尽可能保留原始点云的关键几何特征和结构信息。其必要性主要体现在以下几个方面:
- 降低计算负载:减少点云数据量可以直接降低后续处理算法(如分割、分类、目标检测、配准、表面重建、SLAM 等)的计算复杂度和时间消耗。
- 减少内存占用:稀疏化的点云需要更少的内存存储和传输带宽,这对于资源受限的平台(如嵌入式系统)或需要网络传输的场景至关重要。
- 加速处理流程:处理速度的提升对于实时应用(如自动驾驶中的实时环境感知、机器人导航)至关重要。
- 提高算法效率和鲁棒性:去除冗余点和部分噪声可以提高某些算法的效率和稳定性。
- 满足特定算法输入要求:例如,许多基于深度学习的点云处理网络要求输入固定数量的点,降采样是满足这一要求的常用手段。
点云降采样广泛应用于自动驾驶、机器人技术、三维建模与测绘、精准农业、土木工程、虚拟现实 和安防监控 等领域。在这些应用中,降采样的核心挑战在于如何在减少数据量的同时,有效保留对下游任务至关重要的信息,如物体的边缘、曲率变化区域、或者特定的几何结构。因此,降采样并非简单的随机丢弃,而是一个需要精心设计的预处理步骤,它直接影响后续分析的质量和效率。它不仅仅是为了压缩数据,更是为了使后续的复杂算法(如深度学习网络或点云配准)能够有效运行并取得良好效果。
1.3. 降采样目标与方法概述
Section titled “1.3. 降采样目标与方法概述”点云降采样的主要目标是在显著减少点数量的同时,最大程度地保留原始点云所蕴含的几何形状和结构信息,以满足特定下游任务的需求。次要目标可能包括:
- 降低噪声:某些降采样方法(如体素均值滤波)具有一定的去噪效果。
- 均匀化点云密度:解决原始点云密度不均的问题,使点分布更规则。
- 保留关键特征:特别关注并保留边缘、高曲率区域等对形状表达至关重要的点。
根据实现原理和策略的不同,点云降采样方法可以大致分为以下几类,本综述将对这些方法进行详细探讨:
- 随机采样(Random Sampling, RS):最简单的方法,随机选取点。
- 基于栅格/体素的方法(Grid/Voxel-based Methods):将空间划分为网格或体素,在每个单元内选取代表点。
- 最远点采样(Farthest Point Sampling, FPS):迭代选取距离已选点集最远的点。
- 基于空间距离/均匀分布的方法(Spacing-based/Uniform Methods):确保采样点之间满足一定的空间距离约束或按固定间隔选取。
- 基于特征的方法(Feature-aware Methods):根据点的几何特征(如法线、曲率)进行采样。
- 自适应方法(Adaptive Methods):根据局部点云密度或其他属性动态调整采样率。
- 基于八叉树的方法(Octree-based Methods):利用八叉树结构进行空间划分和采样。
- 基于聚类的方法(Clustering-based Methods):先对点云进行聚类,再从簇中采样。
- 基于学习的方法(Learning-based Methods):利用神经网络学习最优的采样策略。
这些方法各有优劣,适用于不同的场景和需求。理解它们的原理、特性和适用性,对于在实际应用中选择或设计合适的降采样策略至关重要。
2. 基础降采样策略
Section titled “2. 基础降采样策略”基础降采样策略通常实现简单、计算速度快,是许多复杂方法的基础或对比基准。
2.1. 随机采样 (Random Sampling, RS)
Section titled “2.1. 随机采样 (Random Sampling, RS)”随机采样是最直观的降采样方法。其核心思想是从原始点云 P 中随机选择 Nsub 个点(或按一定比例 p 选择点)组成降采样后的点云 Psub。在选择过程中,每个点被选中的概率是均等的。
优势:
- 实现简单:算法逻辑非常直接。
- 计算速度快:时间复杂度通常与要采样的点数成正比,非常高效。
- 参数少:只需要指定采样后的点数或采样比例。
劣势:
- 分布不均匀:由于其随机性,采样结果可能无法均匀覆盖整个点云空间,容易在某些区域产生点聚集,而在另一些区域(特别是稀疏区域)造成点缺失。
- 丢失细节:不能保证保留重要的几何特征或结构信息,可能随机丢弃掉关键点。
- 忽略几何结构与密度:采样过程完全不考虑点云的局部密度和几何形状。
- 性能可能次优:在许多需要保留结构信息的任务中,其效果通常不如更复杂的采样方法。一项研究指出,随机采样可能更容易移除距离较远的点。
尽管存在明显缺点,但随机采样因其极高的效率,常被用作快速预处理步骤或作为其他更复杂方法的性能基准。在某些特定任务,如语义分割中,有研究表明随机采样有时也能取得不错的效果,甚至优于最远点采样。
2.2. 体素网格降采样 (Voxel Grid Downsampling)
Section titled “2.2. 体素网格降采样 (Voxel Grid Downsampling)”体素网格降采样是一种广泛应用的降采样技术,它通过将点云空间规则化来减少点数。
核心概念:
- 空间划分:将包含整个点云的三维空间划分为一系列等体积的立方体单元,称为体素(Voxel)。体素的大小(通常用边长 l 或
leaf_size表示)是该方法的关键参数,直接控制降采样的程度。 - 点分配:将原始点云中的每个点根据其坐标分配到相应的体素中。
- 代表点选择:对于每个包含至少一个点的非空体素,选择一个代表点来表示该体素内的所有点。其余点被丢弃。
常见代表点选择策略:
- 体素质心 (Centroid):计算体素内所有点的坐标平均值(质心),将这个质心作为代表点。这种方法能更准确地反映体素内点的分布,但计算稍慢。
- 体素中心点 (Center):选择体素内距离该体素几何中心最近的那个原始点作为代表点。这种方法计算更快,但可能不如质心法准确。PCL 库中的
UniformSampling采用了类似策略。 - 体素质心最近邻 (Voxel Centroid Nearest Neighbor):先计算体素内所有点的质心,然后选择原始点云中距离这个计算出的质心最近的点作为代表点。
优势:
- 实现简单:算法逻辑清晰,易于实现。
- 空间均匀性:能够在体素尺度上保证采样点的空间分布相对均匀,有效去除冗余点。
- 可控采样密度:通过调整体素大小可以方便地控制降采样后的点云密度。
- 适用性广:能够有效处理大规模点云数据。
- 结构转换:将非结构化的点云数据转换为规则的栅格结构,便于后续处理。
- 一定的去噪能力:采用质心策略时,相当于对体素内的点进行了平均,可以平滑掉部分噪声。
劣势:
- 细节损失:由于每个体素只保留一个点,体素内部的精细几何结构和细节信息会被忽略或丢失。
- 边界效应与模糊:在物体边界或特征变化剧烈的区域,体素化可能导致边界模糊或变形。
- 参数敏感:降采样效果对体素大小的选择非常敏感。过大的体素会导致过度稀疏化和特征丢失;过小的体素则可能无法达到足够的简化效果。
- 非旋转不变性:对点云进行旋转后,再进行体素降采样,得到的结果可能与先降采样再旋转不同。
- 无法自适应密度:标准的体素降采样对整个点云使用统一的体素大小,无法根据局部点云密度进行自适应调整。
- 可能引入噪声:虽然可以去噪,但在某些情况下,如果体素内主要是噪声点,选出的代表点也可能是噪声。
体素网格降采样是 PCL 和 Open3D 等主流点云库中常用的基础降采样方法。尽管存在局限性,但其简单性和有效性使其成为许多点云处理流程中的标准预处理步骤。
2.3. 最远点采样 (Farthest Point Sampling, FPS)
Section titled “2.3. 最远点采样 (Farthest Point Sampling, FPS)”最远点采样是一种旨在最大化采样点集覆盖范围的迭代算法。
算法流程:
-
从原始点云 P 中随机选择一个点作为初始采样点,加入采样点集 Psub。
-
迭代执行以下步骤,直到 Psub 包含所需数量 Nsub 的点:
- 对于 P 中尚未被选中的每个点 pi∈P∖Psub,计算它到当前已选点集 Psub 的最短距离 d(pi,Psub)=minpj∈Psub∥pi−pj∥2。
- 选择使得该最短距离最大的点 pfarthest=argmaxpi∈P∖Psubd(pi,Psub)。
- 将 pfarthest 加入 Psub。
覆盖特性:
- 相比随机采样,FPS 能够更好地覆盖整个点云空间,使得采样点在全局范围内分布更均匀。它倾向于选择点云的边界或突出区域的点。
优势:
- 良好覆盖性:能有效覆盖点云的整体形状。
- 保留边界:通常能较好地保留物体的轮廓和边界点。
- 确定性:给定相同的起始点,采样结果是确定的。
- 深度学习常用:被广泛应用于点云深度学习模型(如 PointNet++)中,作为特征提取前的降采样(池化)层。PointNet++利用 FPS 逐步扩大感受野,类似于 CNN 中的池化操作。
- 可指定采样点数:可以直接控制输出点云的数量。
劣势:
- 计算成本高:朴素实现的计算复杂度较高(通常为 O(N⋅Nsub) 或更高),对于大规模点云 (N 很大) 计算非常耗时。虽然存在如桶优化(BFPS)等加速算法,但仍比 RS 和 Voxel Grid 慢。
- 任务无关性 (Task-agnostic):FPS 的选择标准仅基于点间距离,完全不考虑点对于下游任务(如分类、分割、检测)的重要性或其局部几何特征(如曲率)。
- 可能丢失内部或稀疏区域特征:由于优先选择最远点以保证全局覆盖,FPS 可能会在密集的平坦区域采样过多点,而在包含重要特征但点数较少的稀疏区域或物体内部采样不足,甚至完全错过某些小物体或稀疏特征。
- 并行计算瓶颈:其迭代性质使其难以高效并行化。
FPS 因其良好的覆盖特性和在深度学习中的成功应用而备受关注。然而,其计算复杂度和任务无关性是其主要缺点,催生了许多改进型 FPS 算法和基于学习的采样方法。
基础采样方法(RS、Voxel Grid、FPS)各有侧重。RS 追求速度,Voxel Grid 追求空间均匀性,FPS 追求全局覆盖。然而,它们在平衡采样均匀性、特征保持能力和计算效率方面都存在固有的局限性。例如,Voxel Grid 通过强制空间划分实现均匀性,但代价是损失体素内部细节;FPS 通过最大化点间距离实现全局覆盖,但可能忽略局部特征的重要性且计算成本高。这种基础方法在均匀性和特征保持之间的内在权衡,促使研究者探索更先进的策略。同时,即使在同一策略内,如 Voxel Grid 的质心法与中心点法,也存在速度与精度之间的细微权衡,表明实现细节同样重要。
3. 高级与专用算法策略
Section titled “3. 高级与专用算法策略”为了克服基础策略的局限性,研究者们提出了多种更高级、更具针对性的算法策略,它们通常结合了更多的几何信息、密度信息或采用更复杂的空间划分结构。
3.1. 均匀与基于空间距离的采样
Section titled “3.1. 均匀与基于空间距离的采样”这类方法主要通过固定的空间规则(如点序、最小距离)来控制采样点的分布和密度。
- 均匀降采样 (按序选择):按固定间隔(每 k 个点)选择点。例如,Open3D 库中的
uniform_down_sample(every_k_points=k)函数实现的就是这种策略。这种方法非常简单快速,但结果严重依赖于输入点云的原始顺序。对于无序点云,结果缺乏意义;但对于有序点云(如来自某些传感器的结构化输出),它可能用于在保持结构的同时进行快速降采样。 - 最小距离/空间子采样 (Spatial Subsampling):核心思想是确保采样后的点集中任意两点之间的最小三维距离不小于一个预设阈值 dmin。CloudCompare 软件提供了这种模式,它遍历点云,如果一个点与所有已选点的距离都大于 dmin,则保留该点。采样密度由 dmin 控制,值越大,采样点越少。
- 泊松盘采样 (Poisson Disk Sampling):这是一种特殊的空间距离采样方法,旨在生成分布均匀且满足最小距离约束的点集,其采样点分布具有“蓝噪声”特性,有助于避免采样引入的摩尔纹等瑕疵。它常用于从连续表面(如三角网格)生成高质量的初始点云样本,也可用于对现有密集点云进行降采样,通过丢弃距离过近的点来实现。该方法需要指定泊松盘的半径(即最小允许距离)。
这些方法提供了比随机采样更可控的空间分布,特别是最小距离和泊松盘采样,能够产生更均匀的点集。
3.2. 法线空间采样 (Normal Space Sampling, NSS)
Section titled “3.2. 法线空间采样 (Normal Space Sampling, NSS)”法线空间采样着眼于点云的几何朝向信息,旨在使降采样后的点云在法线方向上分布均匀。
原理:
- 计算原始点云中每个点的法线向量。
- 将法线向量的三个分量(Nx,Ny,Nz)分别进行直方图统计。
- 从每个直方图区间(bin)中随机采样一定数量的点。
目的:通过确保采样点覆盖各种不同的表面朝向,期望能更好地保留点云的整体几何结构,尤其是在包含多个不同朝向平面的场景中。
优势:
- 关注几何朝向的多样性,可能比纯粹的空间采样更能捕捉结构变化。
劣势:
- 需要预先计算法线,增加了计算成本。
- 由于在每个 bin 内是随机采样,每次运行结果可能不一致。
- 其效果相对其他方法的优劣依赖于具体应用场景和数据特性。一篇论文在点云配准任务中将其与体素网格(VG)和基于曲率的分割采样(CBSS)进行了比较。
NSS 提供了一种基于几何属性(法线方向)进行采样的思路,是对纯粹基于空间位置采样的补充。
3.3. 基于曲率的采样策略
Section titled “3.3. 基于曲率的采样策略”曲率是描述表面弯曲程度的重要几何属性。高曲率区域通常对应于物体的边缘、角点或细节丰富的部位。基于曲率的采样策略正是利用这一点,优先保留高曲率区域的点,认为这些点对形状的表达更重要。
原理:
- 计算点云中每个点(或其邻域)的曲率值。曲率可以通过分析局部邻域点的协方差矩阵或拟合局部表面来估计。
- 根据曲率值对点进行排序或加权。
- 优先采样曲率值高的点,同时可能结合其他策略(如空间分布)来避免在高曲率区域过度采样。
示例方法:
- 基于曲率的分割采样 (Curvature-Based Segmental Sampling, CBSS):计算所有点的曲率并降序排列。将排序后的点云划分为若干段(segment),然后按一定规则从各段中采样,可能在高曲率段采样更多点。
- 曲率引导的最远点采样 (Curvature-informed FPS, CFPS):改进 FPS 算法,在选择下一个最远点时,不仅考虑距离,还结合点的曲率得分,使得高曲率点有更高的概率被选中,同时保持 FPS 的覆盖性。
优势:
- 特征保持:能够显式地保留边缘、角点等高频细节,这些细节容易被均匀采样或随机采样方法忽略。
- 任务相关性:曲率通常与三维重建、识别等任务中的关键特征相关,因此这种采样策略具有一定的任务导向性。
劣势:
- 需要计算曲率:增加了额外的计算开销,且曲率计算本身可能对噪声敏感。
- 参数调整:可能需要调整如何平衡曲率和空间分布的权重,或者如何划分曲率段。
基于曲率的采样代表了利用局部几何特征指导采样过程的重要方向,旨在实现更智能、更注重特征保持的降采样。
3.4. 自适应与基于密度的采样
Section titled “3.4. 自适应与基于密度的采样”这类方法的核心思想是让采样过程适应点云的局部特性,最常见的是根据局部点密度动态调整采样率。目标通常是在点云稀疏区域保留更多点,而在密集区域移除更多冗余点。
示例方法:
- 自适应密度采样 (Adaptive Density Sampling):如相关文献中描述的方法,首先估计每个点 pi 的局部密度 di。然后设定一个目标密度 t。点 pi 被保留的概率为 min(1,t/di)。这意味着,当局部密度 di 低于目标密度 t 时,该点一定被保留;当局部密度 di 高于目标密度 t 时,该点以 t/di 的概率被保留。这种方法在保持稀疏区域细节方面优于随机采样。
- 基于标量场的空间子采样 (CloudCompare):CloudCompare 的空间子采样模式允许使用当前激活的标量场(如曲率或密度)来调节最小采样距离。用户可以指定标量场最小值和最大值对应的采样距离,软件会进行线性插值,从而在标量值高的区域采样更密,在标量值低的区域采样更疏。
- 动态体素滤波 (Dynamic Voxel Filtering):这是对传统体素滤波的改进,旨在自动适应局部密度变化。其核心思想是:对于点数较多的(密集)体素,将其细分为更小的子体素;对于点数较少的(稀疏)体素,则可能使用更大的体素(或与其他稀疏体素合并)。例如,14 中提出的方法,先将整个点云包围盒划分为单元体素,统计每个单元体素的点数,然后根据点数将单元体素动态地划分为不同尺寸的子体素(使用归一化和余弦函数确定尺寸),最后在每个动态尺寸的体素内保留质心点。这类方法通常还会结合边缘提取模块,通过分析点的法线向量夹角等特征来识别并强制保留边缘点,以弥补体素化过程中可能丢失的边界信息。
优势:
- 智能数据缩减:相比均匀采样,能更有效地分配采样点,在稀疏区域保留更多细节。
- 参数自适应:动态体素滤波等方法旨在减少对全局参数(如固定体素大小)的手动调整需求。
- 特征保持:结合边缘提取等模块,能更好地保留关键结构特征。
劣势:
- 实现复杂度:通常比基础方法更复杂。
- 计算开销:需要额外的密度或特征估计步骤,增加计算时间。
- 性能依赖:效果可能依赖于密度/特征估计的准确性。动态体素方法在极端密集或噪声环境下可能仍需改进。
自适应采样方法提供了一种更精细化的点云处理方式,通过响应点云的局部变化来实现更优的采样效果。
3.5. 基于八叉树的降采样
Section titled “3.5. 基于八叉树的降采样”八叉树是一种用于组织三维空间点的层级数据结构,它通过递归地将空间立方体划分为八个等大的子立方体(卦限)来工作。八叉树结构本身非常适合进行空间查询、近邻搜索和点云压缩,也可以用于降采样。
原理:
利用八叉树结构对点云进行组织后,可以通过多种方式实现降采样:
- 叶节点代表点:构建八叉树到一定的深度或直到叶节点包含的点数少于某个阈值。然后,从每个叶节点中选择一个代表点(如该叶节点内所有点的质心,或距离叶节点中心最近的点)。
- 体素质心获取:PCL 中的
pcl::octree::OctreePointCloudVoxelCentroid类允许构建一个具有特定体素(叶节点)分辨率的八叉树,然后直接获取所有非空体素的质心作为降采样结果。
示例方法:
- CloudCompare 八叉树子采样:选择一个八叉树层级,保留每个该层级叶节点单元中心最近的那个点。层级越高,单元越小,保留的点越多。
- PCL 八叉树体素质心:如上所述,使用
OctreePointCloudVoxelCentroid获取叶节点质心。 - 一般八叉树降采样:递归划分空间,直到满足停止条件(如节点内点数、最大深度)。从每个最终的叶节点中选取一个代表点。PCL 也利用八叉树进行空间划分和搜索操作。
优势:
- 高效空间组织:八叉树提供了高效的空间索引。
- 多分辨率/LOD 控制:可以通过选择不同的八叉树深度来控制降采样的程度,实现不同细节层次的表示。
- 适应密度变化:八叉树的划分是自适应的,空间点密集的区域会被划分得更深,可能比固定大小的体素网格更能适应密度变化。有研究表明八叉树采样在生成数字高程模型(DEM)时,尤其在复杂地形下,表现优于空间采样和随机采样,因为它能更好地拟合微地形。
- 处理大规模数据:适合处理非常大的点云。
劣势:
- 实现相对复杂:相比 RS 或 Voxel Grid,八叉树的构建和遍历更复杂。
- 细节损失:与 Voxel Grid 类似,最终每个叶节点只保留一个代表点,仍会损失节点内部的细节。
- 性能比较:其相对性能取决于具体实现和应用。
八叉树提供了一种强大的、具有层级结构的降采样框架,特别适用于需要多分辨率表示或高效空间查询的场景。
3.6. 基于聚类的降采样
Section titled “3.6. 基于聚类的降采样”这种策略利用聚类算法将点云划分为若干个簇(Cluster),然后从每个簇中选取代表点。
原理:
- 应用聚类算法(如 K-means)将原始点云 P 分成 k 个簇 C1,C2,…,Ck。
- 对于每个簇 Ci,选择一个代表点 pi′(例如,簇的质心或簇中某个实际点)。
- 降采样后的点云
Psub={p1′,p2′,...,pk′}。
优势:
- 适应不规则分布:聚类算法可以自然地适应点云的不规则形状和分布。
- 对密度变化鲁棒:某些聚类方法对点密度变化不敏感。
劣势:
- 依赖聚类算法:效果严重依赖所选的聚类算法及其参数(如 K-means 中的 k 值)。
- 高密度区域效果差:对于非常密集的点云,聚类可能效果不佳,容易丢失特征点并模糊边缘。
- 计算成本:聚类算法本身的计算成本可能较高。
- 应用相对较少:相比 Voxel Grid、FPS 等方法,基于聚类的降采样在文献中提及较少。
虽然 DBSCAN 等聚类算法常用于点云分割(在降采样之后进行),但直接将其用于降采样本身似乎不太普遍。
这些高级算法策略体现了研究者们试图超越基础方法的局限性,通过融入更多几何(法线、曲率)或统计(密度)信息来指导采样过程。这反映了一种趋势,即在不依赖深度学习的情况下,让采样过程本身变得更“智能”。例如,法线空间采样关注方向多样性,曲率采样关注形状关键点,自适应密度采样关注信息分布的均衡。比较体素网格和八叉树,前者强制全局规则划分,后者则进行层级化的自适应划分,这使得八叉树在处理密度变化剧烈或需要多层次细节表示的场景(如地形)时可能更具优势。然而,这些高级方法往往也带来了更高的实现复杂度和参数调整需求(如最小距离、目标密度、曲率阈值、八叉树深度等),这限制了它们的全自动应用,并为基于学习的方法提供了发展空间。
4. 基于学习的降采样策略
Section titled “4. 基于学习的降采样策略”近年来,随着深度学习在三维数据处理领域的兴起,基于学习的降采样方法应运而生。这类方法旨在克服传统算法策略的任务无关性,通过神经网络学习针对特定下游任务最优的采样模式。
4.1. 基本原理与动机
Section titled “4.1. 基本原理与动机”动机:
- 任务相关性:传统方法如 FPS、RS 等在选择采样点时并不考虑这些点对于后续任务(如分类、分割、配准)的重要性,可能导致次优性能。学习方法的目标是学习到对特定任务最有益的采样点子集。
- 端到端优化:希望将采样过程集成到整个深度学习模型中,实现端到端的训练和优化,从而可能获得更好的整体性能。
基本思路:
利用神经网络来学习采样策略。这通常涉及设计一个网络模块,该模块接收原始点云作为输入,输出降采样后的点云或用于选择采样点的依据(如重要性得分)。
主要类别:
根据输出形式和学习目标,基于学习的降采样方法大致可分为两类:
- 生成式方法 (Generative-based):网络直接生成降采样后点云的坐标。
- 基于得分/选择的方法 (Score-based / Selection-based):网络为原始点云中的每个点评估一个重要性分数,然后根据分数选择点;或者学习一种可微的采样/选择机制。
虽然基于学习的降采样研究相比传统方法仍属少数,但正快速发展。
4.2. 生成式方法
Section titled “4.2. 生成式方法”原理:这类方法通常采用类似自编码器(Autoencoder)的结构,将原始点云编码到一个低维潜在空间,然后再解码生成一个点数较少的、但保留了关键信息的点云。
示例:
- FoldingNet:一种基于自编码器的点云处理网络,可以通过解码器从潜在向量“折叠”出点云,可用于降采样或重建。
- 其他提及的方法:如 VoxelContext-Net、使用带掩码的卷积网络学习体素概率分布的方法(Nguyen 等)、高斯模型体素网络 GVnet、基于深度卷积自编码器的方法(Gezawa 等)。
优势:
- 灵活性:生成的点不一定来自原始点集,理论上可以产生最优的点分布来表示形状。
劣势:
- 保真度问题:生成的点与原始点可能没有直接对应关系,可能丢失原始数据的精确几何信息或附加属性(如颜色、法线)。
- 训练稳定性:直接生成坐标可能比选择点更难训练,可能存在模式坍塌等问题。简单的 MLP 生成可能导致端到端学习不稳定。
- 复杂性:网络结构和训练过程可能比较复杂。
4.3. 基于得分/选择的方法
Section titled “4.3. 基于得分/选择的方法”原理:这类方法不直接生成新点,而是学习如何从原始点云中选择一个子集,或者为原始点分配权重。核心在于如何评估每个点的重要性以及如何使选择过程可微(以便端到端训练)。
示例:
- SampleNet (CVPR 2020):提出了一种点云采样的可微松弛(differentiable relaxation)方法。它将采样点近似为原始输入点云中点的混合(加权平均),从而解决了之前学习采样方法中匹配步骤不可微的问题,实现了端到端训练。
- Learned FPS (LFPS):试图结合 FPS 的均匀覆盖性与学习方法的自适应性。它设计了一个新的损失函数,在学习过程中强制采样点保持均匀分布(理论上可达到 FPS 的均匀性),同时允许网络根据任务需求进行自适应选择。旨在成为 FPS 的一个即插即用且更快的替代方案。
- PointAS (Adaptive Sampling):以 FPS 获取初始采样点,然后通过一个自适应采样模块对这些初始点周围的邻居点进行重新加权,使采样结果能够自适应地迁移,从而关注信息量最大的特征。
- REPS (Reconstruction-based Efficient Point Sampling):通过两个重建任务来评估点的重要性:一是基于邻域特征重建中心点(评估点的局部冗余性),二是移除该点后重建整体形状(评估点对全局结构的重要性)。引入全局-局部融合注意力(GLFA)模块来提取高质量特征以支持重建和采样。
- PCDNet (Progressive Point Cloud Deconvolution Network):并非直接生成或选择,而是学习将非学习方法(如 RS 或 FPS)产生的初始采样点优化到更好的位置。其设计使其能够直接采样到任意分辨率,无需针对不同分辨率重新训练。
- FPN (Filter Point Network):学习逐点的重要性得分,并用此得分来过滤点云。同样具有分辨率无关的特性。
- 基于 Coreset 的方法:针对特定任务(如点云配准)设计。例如有研究提出选择一个加权的残差子集,该子集能精确重构原始点云在当前位姿估计下的二次配准误差函数,从而在大幅减少计算量的同时保持配准精度。
- 曲率引导的 FPS (CFPS):将 FPS 产生的软排序(soft rank)与从网络(如 PCPNet)获得的曲率得分相结合,生成联合排序,用于指导采样。旨在实现更稳定的端到端学习。
- 语义采样 (Semantic Sampling):利用预先获得的语义分割结果来指导采样。例如,在 3D 目标检测任务中,可以优先采样属于前景物体的点,而减少背景点的采样比例。
优势:
- 任务自适应:能够学习到对下游任务最优的采样策略。
- 性能提升:通常能在下游任务中取得比传统算法方法更好的性能。
- 可微性:许多方法被设计成可微的,支持端到端训练。
- 保留原始点:通常选择的是原始点云的子集,保留了原始点的坐标和属性。
- 关注信息量:能学习优先保留信息量更丰富的点。
劣势:
- 复杂性:网络设计和训练过程可能很复杂。
- 数据依赖:需要大量的标注数据进行训练。
- 过拟合风险:可能对训练数据过拟合,泛化能力需要验证。
- 均匀性损失:可能牺牲 FPS 等方法的均匀覆盖保证。
- 可解释性:神经网络的决策过程有时难以解释。
- 训练策略:某些方法可能需要多阶段训练(如先用 FPS 训练,再替换并训练采样层)。
基于学习的方法,特别是可微采样方法(如 SampleNet, LFPS, REPS, CFPS)的出现,是该领域的一个重要进展。它们解决了将采样集成到端到端深度学习流程中的关键技术障碍——不可微性。这使得采样策略本身可以与下游任务一起进行优化。在生成式和选择式两种学习策略中,近期研究似乎更倾向于后者。这可能是因为选择式方法直接操作原始点,能更好地保留数据的保真度,并且通过优化现有采样点(如 PCDNet, PointAS, CFPS)可能比从头生成点更容易实现稳定训练。
4.4. 混合方法
Section titled “4.4. 混合方法”一些研究工作尝试将深度学习与传统算法相结合,取长补短。
示例:
- SIEV-Net:在体素网络中加入高度信息补充模块,以减少特征聚合过程中的高度信息损失。
- SVGA-Net:使用体素图模块和稀疏到密集回归模块进行 3D 检测。
- 基于 FPS 的改进:许多学习方法以 FPS 为基础或起点,通过学习来调整或优化 FPS 的结果,如 PointAS、PCDNet、CFPS。
这类方法试图利用传统算法的几何保证(如 FPS 的覆盖性)或结构(如体素网络),同时引入学习能力以提高任务适应性。
4.5. 优势与挑战总结
Section titled “4.5. 优势与挑战总结”优势回顾:
- 任务适应性:核心优势,能够为特定任务优化采样。
- 潜在性能:有望在下游任务中获得更高精度。
- 端到端学习:可微性使得采样层能够无缝集成到深度学习模型中。
挑战回顾:
- 复杂性:模型设计、训练和部署比传统方法复杂。
- 数据需求:通常需要大量(可能需要标注的)训练数据。
- 训练稳定性与收敛性:训练过程可能不稳定或难以收敛。
- 泛化能力:模型在未见过的数据、不同密度、不同噪声水平或不同传感器类型上的泛化能力是一个关键问题。例如,处理来自不同传感器(如 Kinect 和 LiDAR)的点云时,巨大的密度和分布差异对学习方法的鲁棒性提出了严峻考验。
- 几何保证的损失:为追求任务性能,可能牺牲传统方法所具有的某些几何保证(如均匀性)。
- 可微性设计:设计有效的可微采样机制仍然是一个活跃的研究领域。
尽管基于学习的方法展现出巨大潜力,但它们也带来了新的挑战,特别是在鲁棒性、泛化能力和训练数据的需求方面。这使得传统算法方法在许多场景下仍然具有吸引力,尤其是在缺乏大量训练数据或需要强几何保证的情况下。
5. 降采样技术比较分析
Section titled “5. 降采样技术比较分析”选择合适的点云降采样技术需要权衡多个因素。本节将对前面讨论的各种方法进行比较分析。
5.1. 评估指标与框架
Section titled “5.1. 评估指标与框架”评价降采样方法性能通常涉及以下几个方面的指标:
-
计算效率:
- 处理时间:完成降采样所需的时间。
- 内存消耗:算法运行期间所需的内存量。
-
简化率 (Simplification Rate):降采样后点数与原始点数的比率,或移除点的百分比。
-
下游任务性能:降采样后的点云在具体应用任务上的表现,这是衡量采样有效性的最终标准。
- 目标检测:平均精度(mAP)、交并比(IoU)、召回率(Recall)。
- 语义/实例分割:平均交并比(mIoU)、整体精度(OA)。
- 分类:整体精度(OA)。
- 配准:配准误差(如旋转误差 RE、平移误差 TE)。
- 重建:重建误差(如倒角距离 Chamfer Distance, 地球移动距离 EMD)。
-
几何保真度/特征保持:衡量降采样后点云在多大程度上保留了原始几何结构。
- 定性评估:通过可视化检查是否保留了边缘、角点、曲面细节等。
- 定量指标:如正点捕获率(Positive Point Capture Rate)、唯一采样点比率(Unique Point Ratio),或通过重建误差间接评估。
-
覆盖度与分布:
- 均匀性:采样点在空间中分布的均匀程度,可以是定性描述或通过特定指标衡量。
- 覆盖范围:采样点集对原始点云空间范围的覆盖程度。
-
鲁棒性:
- 噪声鲁棒性:在存在噪声情况下的性能表现。
- 密度鲁棒性:在点云密度变化较大时的性能表现。
- 跨数据集/场景泛化能力。
5.2. 降采样方法比较总结表
Section titled “5.2. 降采样方法比较总结表”下表对本综述中讨论的主要降采样方法进行了总结比较:
| 方法 | 原理 | 关键参数 | 优势 | 劣势 | 速度 | 内存 | 特征保持 (结构/边缘/曲率) | 覆盖/均匀性 | 任务适用性 (通用) | 主要库 (PCL/Open3D) |
|---|---|---|---|---|---|---|---|---|---|---|
| 随机采样 (RS) | 随机选取点 | 采样点数/比例 | 极快,简单,内存低 | 分布不均,丢失细节,任务无关 | 最快 | 最低 | 差/差/差 | 差/差 | 快速基线,部分分割任务 | PCL, O3D (NumPy) |
| 体素网格 (Voxel Grid) | 体素化空间,每体素选代表点 (质心/中心/最近邻) | 体素大小 (leaf_size) | 简单,空间均匀 (体素级),去冗余,可处理大数据 | 丢失体素内细节,参数敏感,非旋转不变 | 快 | 中 | 中/中/差 | 好 (局部)/中 | 通用预处理,均匀化密度 | PCL, Open3D |
| 最远点采样 (FPS) | 迭代选取距离已选点集最远的点 | 采样点数 | 全局覆盖好,保留边界,深度学习常用 | 计算成本高,任务无关,可能丢失稀疏/内部特征 | 慢 | 中高 | 好/中/差 | 好 (全局)/好 | DL 骨干网络,需要覆盖性 | PCL, Open3D |
| 均匀采样 (按序) | 按固定间隔选取点 | 间隔 k | 极快,简单 | 依赖点序,不适用于无序点云 | 最快 | 最低 | 依赖点序 | 依赖点序 | 有序点云快速处理 | Open3D |
| 空间/最小距离采样 | 确保采样点间最小距离 | 最小距离 dmin | 控制点间距,产生较均匀分布 | 效率可能低于 RS/Voxel,参数选择 | 中 | 中 | 中/中/中 | 好/好 | 需要均匀分布的应用 | CloudCompare, PCL? |
| 泊松盘采样 | 空间距离采样,产生蓝噪声分布 | 半径 r | 高质量均匀分布,避免混叠 | 计算可能较复杂 | 中慢 | 中 | 中/中/中 | 极好/极好 | 高质量表面采样,抗混叠 | Open3D (from mesh) |
| 法线空间采样 (NSS) | 确保采样点法线方向分布均匀 | Bin 数量/采样率 | 关注几何朝向多样性 | 需计算法线,结果可能不确定,性能依赖场景 | 中慢 | 中 | 中/中/中 | 好 (法线空间)/中 | 需要方向多样性的场景 | PCL |
| 基于曲率采样 | 优先采样高曲率区域的点 | 曲率阈值/权重 | 保留边缘/角点等细节 | 需计算曲率,增加开销,对噪声敏感 | 中慢 | 中 | 好/好/好 | 中/中 | 特征保持要求高的任务 | PCL (需实现), O3D? |
| 自适应密度采样 | 根据局部密度调整采样率 | 目标密度 t | 智能缩减,保留稀疏区细节 | 实现较复杂,需密度估计 | 中 | 中 | 好/好/中 | 好 (自适应)/中 | 密度变化剧烈的场景 | PCL (需实现) |
| 动态体素滤波 | 自适应调整体素大小,常结合边缘保持 | (较少,可能内部参数) | 自动适应密度,保留边缘,减少手动调参 | 极端情况性能待提升,实现复杂 | 快 | 中 | 好/好/中 | 好 (自适应)/中 | 需要自动适应和边缘保持 | (特定论文实现) |
| 八叉树降采样 | 利用八叉树结构,在叶节点选点 | 树深度/叶节点分辨率 | 高效空间组织,多分辨率控制,适应密度变化 | 实现较复杂,可能丢失叶节点内细节 | 中快 | 中 | 好/中/中 | 好 (层级)/中 | 大规模数据,多分辨率 | PCL, CloudCompare |
| 基于学习 (通用) | 神经网络学习采样策略 | 网络结构,训练参数 | 任务自适应,潜在高性能 | 复杂,需数据,泛化性/鲁棒性是挑战 | 训练慢,推理快 | 高 | 任务依赖 | 任务依赖 | 特定任务优化 | (特定论文实现) |
| SampleNet | 可微松弛选择点 | 网络参数 | 可微,端到端训练,性能较好 | 复杂性,数据需求 | 推理快 | 高 | 好 (任务适应) | 中 | 分类,重建,配准 | (论文实现) |
| LFPS | 学习的 FPS,结合均匀性损失 | 网络参数,损失权重 | 结合 FPS 覆盖和学习自适应,更快 | 复杂性,数据需求 | 推理快 | 高 | 好 (任务适应+覆盖) | 好 | FPS 替代,大规模点云 | (论文实现) |
| REPS | 基于重建误差评估点重要性 | 网络参数 | 关注信息量,可微 | 复杂性,数据需求 | 推理快 | 高 | 好 (任务适应) | 中 | 分类等 | (论文实现) |
注意:表中的“速度”、“内存”、“特征保持”、“覆盖/均匀性”是相对定性的评估,具体表现会受实现、数据、参数选择等多种因素影响。PCL/Open3D 库的支持情况表示该库提供了直接对应或实现该策略核心思想的功能。
5.3. 详细比较
Section titled “5.3. 详细比较”- 算法方法内部比较 (RS vs. FPS vs. Voxel Grid):
- 效率权衡:随机采样(RS)无疑是最快的,内存消耗也最低,但牺牲了采样质量。体素网格(Voxel Grid)在速度和内存消耗上通常处于中等水平,提供了一种可控的均匀化方法。最远点采样(FPS)为了保证全局覆盖,计算成本最高,尤其对于大规模点云,其迭代特性使其难以高效并行。
- 分布特性:FPS 旨在实现全局最优覆盖,点间距离尽可能大。Voxel Grid 在体素尺度上强制实现局部均匀性。RS 则完全随机,分布最不均匀。
- 特征保持:Voxel Grid 会平滑掉体素内部的细节。RS 可能随机丢失任何特征点。FPS 倾向于保留边界点,但由于其任务无关性,可能在平坦区域采样过多而在特征丰富的稀疏区域采样不足。
- 适用场景:RS 适用于对速度要求极高且对采样质量要求不高的场景或作为基准。Voxel Grid 广泛用于需要大致均匀密度输入的预处理步骤。FPS 常用于需要良好全局覆盖或作为深度学习模型(如 PointNet++ 17)输入的场景。
- 自适应 vs. 非自适应方法:
- 自适应方法(如基于密度、曲率或八叉树的方法)的核心优势在于能够根据点云的局部特性调整采样策略。这使得它们在处理密度变化剧烈或几何结构复杂的点云时,通常能比使用全局固定规则的非自适应方法(RS, Voxel Grid, FPS)更好地保留重要细节。例如,自适应密度采样能在稀疏区域保留更多点,而基于曲率的采样能优先保留边缘和角点。代价是实现更复杂,并且需要额外的计算(如密度、曲率估计)。
- 基于学习 vs. 算法方法:
- 核心差异:学习方法的核心优势是任务自适应性,能够学习到针对特定下游任务最优的采样点分布。而大多数算法方法是任务无关的(语义采样 和基于曲率的采样 是例外,它们隐式地考虑了任务相关性)。
- 性能:在特定任务上,精心训练的学习方法通常能超越传统算法方法。然而,这种优势并非绝对,有时传统方法也能取得相当甚至更好的结果,尤其是在跨数据集或任务泛化时。
- 复杂性与要求:学习方法需要训练数据、复杂的网络设计和训练过程。算法方法则直接应用,无需训练。
- 保证与可解释性:算法方法(如 FPS)可能提供某些几何保证(如覆盖性)。学习方法通常优化任务指标,可能牺牲这些保证,且其决策过程的可解释性较差。LFPS 等方法试图在学习自适应性的同时保留均匀性保证。
5.4. 任务特定适用性
Section titled “5.4. 任务特定适用性”不同下游任务对降采样方法的需求不同:
- 目标检测:需要保留足够的物体点以进行定位和分类。有研究对比了多种 FPS 变种和语义采样策略,发现保留物体内部点(Positive Point Capture Rate)对检测性能至关重要。语义采样通过优先采样前景点提升了性能。基于体素的方法(如 VoxelNet)也是主流选择。
- 语义分割:需要保留足够的上下文信息和区分不同类别边界的细节。有研究发现随机采样有时优于 FPS。针对植物点云分割的研究表明,基于体素的方法(UVS, VFPS)和 3DEPS 表现较好,但最优策略依赖于具体的分割网络架构。
- 点云配准:降采样对配准精度和效率影响显著。需要保留具有区分性的几何特征点。基于 Coreset 的采样 被专门设计用于优化配准误差。基于曲率的 CBSS 也被提出用于配准。处理不同传感器来源(跨源)的点云配准时,需要对密度变化具有鲁棒性的特征提取和采样策略。SampleNet 也被用于配准任务。
- 表面重建:通常需要保留能够准确反映表面形状的点,特别是曲率变化区域。基于曲率的采样 或能够良好保持结构的方法可能更受欢迎。学习方法也常在重建任务上进行评估。
5.5. 讨论:“没有万能法则”原则
Section titled “5.5. 讨论:“没有万能法则”原则”正如多项研究(尤其是在植物点云分割领域)所强调的,不存在一个适用于所有场景的“黄金标准”或“万能”降采样策略。最优方法的选择高度依赖于:
- 应用任务:不同任务(检测、分割、配准等)对保留的点有不同要求。
- 数据特性:点云的密度、噪声水平、结构复杂度、是否有序等都会影响方法的表现。
- 后续算法:降采样通常是预处理步骤,其效果也取决于后续处理算法(如特定的神经网络结构)的特性。
- 计算资源:可用的计算时间、内存等限制了可选方法的范围。
例如,一些对比研究揭示了看似矛盾的结果:一项研究发现随机采样在语义分割上优于 FPS,而另一项研究则深入比较了多种 FPS 变体在目标检测上的性能。这进一步印证了“没有万能法则”的结论,并强调了必须在具体的应用背景下解释和评估降采样方法的性能。此外,评价指标本身也在发展,除了传统的速度和任务精度外,更关注几何保持能力的指标(如正点捕获率)和分布均匀性度量(如 LFPS 的损失函数)正变得越来越重要,它们有助于更深入地理解不同采样策略的内在差异及其对结果的影响。
因此,在实践中,选择降采样方法需要基于对具体问题的理解,进行实验比较,甚至可能需要结合多种方法或设计定制化的策略。
6. 实现:库与代码示例
Section titled “6. 实现:库与代码示例”实现点云降采样通常依赖于成熟的点云处理库。本节将介绍主要的库,并提供一些常见降采样方法的概念性代码示例。
6.1. 主要库概述
Section titled “6.1. 主要库概述”- PCL (Point Cloud Library):
- 语言:C++为主,有 Python 绑定但可能不完整。
- 特点:功能全面,历史悠久,广泛应用于机器人(ROS 集成)和学术界。提供了丰富的滤波、特征提取、分割、配准等模块。
- 降采样相关:包含
pcl::VoxelGrid,pcl::RandomSample,pcl::UniformSampling,pcl::FarthestPointSampling(可能需要较新版本或特定模块),以及基于八叉树 (pcl::octree) 的操作和降采样方法(如OctreePointCloudVoxelCentroid)。所有滤波器通常继承自pcl::Filter或pcl::FilterIndices基类。PCL 也有 GPU 加速模块,但可能需要特定配置。 - 相关文献/资源:4。
- Open3D:
- 语言:C++核心,提供优秀的 Python 接口,易于使用和集成。
- 特点:专注于三维数据处理、可视化和深度学习集成。接口现代,文档和教程丰富。
- 降采样相关:提供
voxel_down_sample,uniform_down_sample(按序),farthest_point_down_sample(注意版本依赖)。还提供点云选择 (select_by_index)、离群点移除 (remove_radius_outlier,remove_statistical_outlier)、聚类 (cluster_dbscan) 等功能。包含 KDTree 和 Octree 数据结构。提供基于 Tensor 的几何处理模块,支持 GPU 运算。 - 相关文献/资源:3。
- 其他工具:
- PDAL (Point Data Abstraction Library):强大的命令行工具和库,特别适合处理大规模地理空间 LiDAR 数据(如 LAZ 格式)。提供了多种滤波器,包括表达式过滤、体素滤波 (
voxelcentroidnearestneighbor) 等。 - CloudCompare:流行的开源点云编辑和处理软件(GUI 和命令行),提供多种子采样方法,包括随机(按数量或百分比)、空间(最小距离,可结合标量场)、基于八叉树层级的采样。
- LAStools:一套高效处理 LiDAR 数据的工具集(命令行),包含
lasthin等用于稀疏化点云的工具。 - MATLAB:也可用于点云处理和算法实现,有时用于对比验证。
- PDAL (Point Data Abstraction Library):强大的命令行工具和库,特别适合处理大规模地理空间 LiDAR 数据(如 LAZ 格式)。提供了多种滤波器,包括表达式过滤、体素滤波 (
6.2. 代码示例 (概念性)
Section titled “6.2. 代码示例 (概念性)”以下代码片段展示了在 PCL (C++) 和 Open3D (Python) 中调用常见降采样方法的基本方式。注意,这些只是核心调用示例,省略了头文件包含、数据加载、错误处理等完整代码所需的上下文。
PCL (C++)
C++
#include <pcl/point_types.h>#include <pcl/point_cloud.h>#include <pcl/filters/voxel_grid.h>#include <pcl/filters/random_sample.h>#include <pcl/filters/uniform_sampling.h>#include <pcl/filters/farthest_point_sampling.h> // 可能需要特定版本或模块#include <pcl/octree/octree_pointcloud_voxelcentroid.h>
// 假设 cloud_in 是输入的 pcl::PointCloud<pcl::PointXYZ>::Ptr
// 1. Voxel Grid (质心) [44, 45, 54]pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_voxel(new pcl::PointCloud<pcl::PointXYZ>);pcl::VoxelGrid<pcl::PointXYZ> vg_filter;vg_filter.setInputCloud(cloud_in);vg_filter.setLeafSize(0.05f, 0.05f, 0.05f); // 设置体素大小 (米)vg_filter.filter(*cloud_voxel);
// 2. Random Sample [56, 72, 86]pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_random(new pcl::PointCloud<pcl::PointXYZ>);pcl::RandomSample<pcl::PointXYZ> rs_filter;rs_filter.setInputCloud(cloud_in);rs_filter.setSample(1000); // 设置采样后的点数// rs_filter.setSeed(std::rand()); // 可选:设置随机种子rs_filter.filter(*cloud_random); // 注意:PCL RandomSample filter 直接输出点云
// 3. Farthest Point Sampling (FPS) [55, 56, 59]// 注意:PCL中FPS的直接易用接口可能不如Open3D,以下为概念性示例pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_fps(new pcl::PointCloud<pcl::PointXYZ>);pcl::FarthestPointSampling<pcl::PointXYZ> fps_filter;fps_filter.setInputCloud(cloud_in);fps_filter.setSample(1000); // 设置采样后的点数// fps_filter.setSeed(std::rand()); // 设置起始点选择的随机种子fps_filter.filter(*cloud_fps); // filter方法输出采样后的点云
// 4. Uniform Sampling (体素中心最近点) [49, 50, 75]pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_uniform(new pcl::PointCloud<pcl::PointXYZ>);pcl::UniformSampling<pcl::PointXYZ> us_filter;us_filter.setInputCloud(cloud_in);// 注意:这里用 setRadiusSearch 设置的是体素大小 [50]us_filter.setRadiusSearch(0.05); // 设置体素大小 (米)us_filter.filter(*cloud_uniform);
// 5. Octree Voxel Centroid [2, 54, 67]pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_octree(new pcl::PointCloud<pcl::PointXYZ>);float resolution = 0.1f; // 八叉树叶节点分辨率 (米)pcl::octree::OctreePointCloudVoxelCentroid<pcl::PointXYZ> octree(resolution);octree.setInputCloud(cloud_in);octree.addPointsFromInputCloud();pcl::PointCloud<pcl::PointXYZ>::VectorType centroids; // 使用 VectorType 获取质心octree.getVoxelCentroids(centroids);cloud_octree->points.assign(centroids.begin(), centroids.end());cloud_octree->width = static_cast<uint32_t>(centroids.size());cloud_octree->height = 1;cloud_octree->is_dense = true;Open3D (Python)
Python
import open3d as o3dimport numpy as np
# 假设 pcd 是输入的 open3d.geometry.PointCloud 对象
# 1. Voxel Downsampling [32, 38, 53]voxel_size = 0.05 # 体素大小 (米)pcd_voxel = pcd.voxel_down_sample(voxel_size)
# 2. Farthest Point Sampling (FPS) [38, 51]# 需要较新版本的 Open3D [51]num_points_fps = 1000pcd_fps = pcd.farthest_point_down_sample(num_points_fps)
# 3. Uniform Downsampling (按序) [60, 61, 62]every_k_points = 10pcd_uniform = pcd.uniform_down_sample(every_k_points)
# 4. Random Downsampling (使用 NumPy)num_points_random = 1000# o3d.utility.random.seed(0) # 可选:设置随机种子以保证可复现性 [65]indices = np.random.choice(len(pcd.points), num_points_random, replace=False)pcd_random = pcd.select_by_index(indices)
# 5. Poisson Disk Sampling (通常从mesh生成,也可用于已有pcd的降采样,但更复杂)# 示例:从mesh生成 [53, 64, 65]# mesh = o3d.io.read_triangle_mesh("mesh.ply")# num_points_poisson = 1000# pcd_poisson = mesh.sample_points_poisson_disk(num_points_poisson, init_factor=5)
# 6. Radius Outlier Removal (不是严格意义的降采样,但可减少点数) [3, 60, 61]nb_points_radius = 16radius = 0.1pcd_radius_filtered, ind_radius = pcd_voxel.remove_radius_outlier(nb_points=nb_points_radius, radius=radius)
# 7. Statistical Outlier Removal (同上) [3, 60, 61]nb_neighbors_stat = 20std_ratio = 2.0pcd_stat_filtered, ind_stat = pcd_voxel.remove_statistical_outlier(nb_neighbors=nb_neighbors_stat, std_ratio=std_ratio)库间差异与版本注意:
实现相同概念的降采样时,PCL 和 Open3D 的 API 和具体行为可能不同。例如,PCL 的 UniformSampling 使用 setRadiusSearch 参数来定义体素大小,而 Open3D 的 uniform_down_sample 是按点序选择。PCL 有直接的 RandomSample 类,而 Open3D 实现均匀随机采样通常需要借助 NumPy 进行索引选择。此外,某些功能(如 Open3D 的 farthest_point_down_sample)可能只在较新版本的库中可用。对于性能要求高的应用,可能需要关注库是否提供或支持外部的优化实现,如 CUDA 加速的 PCL 滤波器 或更高效的 FPS 算法(如 BFPS)。用户在使用时应仔细查阅对应库和版本的文档。
7. 结论与未来方向
Section titled “7. 结论与未来方向”7.1. 关键原理与权衡回顾
Section titled “7.1. 关键原理与权衡回顾”LiDAR 点云降采样是处理大规模三维数据的关键步骤,旨在降低计算和存储负担,同时保留必要的几何信息以支持下游应用。本综述探讨了多种降采样策略,从基础的随机采样、体素网格采样、最远点采样,到更高级的基于空间距离、法线、曲率、密度、八叉树以及聚类的方法,再到新兴的基于学习的策略。
选择合适的降采样方法涉及一系列核心权衡:
- 速度 vs. 精度/保真度:快速方法(如随机采样、体素网格)通常实现简单,但可能牺牲几何细节;复杂方法(如基于特征、学习的方法)可能更好地保留信息,但计算成本更高。
- 均匀性 vs. 特征保持:追求空间均匀性的方法(如体素网格、FPS)可能无法优先保留重要的局部特征(如边缘、高曲率点);而基于特征的方法可能导致采样点分布不均。
- 简单性 vs. 自适应性:简单方法通常需要手动调整参数(如体素大小、采样点数);自适应方法(基于密度、动态体素、学习方法)旨在减少手动调参,但实现更复杂。
- 任务无关 vs. 任务相关:大多数传统算法是任务无关的,而基于学习的方法则可以针对特定任务进行优化,但可能牺牲通用性。
7.2. 开放挑战与局限性
Section titled “7.2. 开放挑战与局限性”尽管降采样技术取得了显著进展,但仍面临诸多挑战:
- “没有万能法则”:如前所述,不存在一种 universally 最优的降采样方法。最优选择高度依赖于具体应用场景、数据特性和后续处理流程。
- 信息损失与细节保持的平衡:如何在大幅减少点数的同时,精确地保留对任务至关重要的几何细节(特别是对于复杂结构和密度变化剧烈的点云),仍然是一个核心难题。
- 参数调整:许多算法方法需要仔细调整参数(如体素大小、距离阈值、采样点数等),这通常需要经验或反复试验。
- 学习方法的挑战:基于学习的方法虽然潜力巨大,但面临训练数据需求、模型复杂性、训练稳定性、过拟合风险以及在不同数据集、传感器和噪声水平下的泛化能力问题。
- 动态场景处理:对于随时间变化的点云序列(如自动驾驶场景),如何在降采样时保持时间上的一致性,避免引入抖动或伪影,是一个需要关注的问题(现有研究较少涉及)。
7.3. 未来研究方向展望
Section titled “7.3. 未来研究方向展望”未来点云降采样的研究可能集中在以下几个方面:
-
更鲁棒、自适应的无参数算法:开发能够自动适应不同点云特性(密度、噪声、结构)且无需或只需很少参数调整的算法方法。
-
改进的学习方法:
- 提升泛化能力:研究能够在不同数据集、传感器类型和采集条件下稳定工作的学习模型。
- 结合几何先验:将更多的几何约束(如均匀性、覆盖性)融入学习框架,以平衡任务性能和几何保真度。
- 高效可微采样:继续研究更有效、更稳定的可微采样机制,促进端到端学习。
- 无监督/自监督学习:探索减少对大量标注数据依赖的采样学习方法。
-
任务驱动的联合优化:设计能够与下游任务(如检测、分割、配准)联合训练和优化的采样模块,实现真正的端到端性能提升。
-
面向多传感器融合的采样:研究专门处理来自不同传感器(具有不同密度、噪声特性)的异构点云的降采样和融合策略。
-
实时与硬件加速:开发适用于实时应用的高效降采样算法,并探索利用 GPU 或其他硬件加速技术。
-
理论分析:深入研究不同降采样方法造成的信息损失机制,建立更完善的理论框架来指导算法设计和选择。
总之,点云降采样作为三维数据处理流程中的基础环节,其研究仍在不断演进。从简单的算法策略到复杂的、任务驱动的学习方法,研究者们正持续探索如何在效率、保真度和任务性能之间取得更好的平衡。未来,随着三维传感技术的普及和应用的深化,开发更智能、更鲁棒、更高效的降采样技术将仍然是该领域的重要研究方向。
- 3D Point Cloud Subsampling: Random, Spatial, and Octree Methods - YouTube
- pcl/Handbook - ROS Wiki
- A Complete Guide to 3D LiDAR Point Cloud Data | SmartOne.ai
- LiDAR Point Clouds: Intro to 3D Perception - Think Autonomous
- Down-Sampling of Point Clouds for the Technical Diagnostics of Buildings and Structures
- Down-Sampling of Point Clouds (ASPRS)
- Comparison of normals from gradually downsampled tree point clouds. (a)… - ResearchGate
- Downsampling LiDAR Data - Micromine Origin and Beyond
- Point Cloud Compression - Compiling PCL - Read the Docs
- Thinning large LiDAR point cloud? - Geographic Information Systems Stack Exchange
- arXiv:2412.18873v1 [cs.CV] 25 Dec 2024
- Cross-PCR: A Robust Cross-Source Point Cloud Registration Framework - arXiv
- Recent Advancements in Learning Algorithms for Point Clouds: An Updated Overview
- Dynamic Downsampling Algorithm for 3D Point Cloud Map Based on Voxel Filtering - MDPI
- Downsampling and Upsampling in Machine Learning - Computer Vision Wiki - CloudFactory
- Downsample pointclouds from USGS (.LAZ) files in Python - GIS Stack Exchange
- A comparative analysis of point sampling strategies in point-based 3D object detection
- Curvature Informed Furthest Point Sampling - arXiv
- Exact Point Cloud Downsampling for Fast and Accurate Global Trajectory Optimization
- Dynamic Downsampling Algorithm for 3D Point Cloud Map Based on Voxel Filtering
- Dynamic Downsampling Algorithm for 3D Point Cloud Map Based on Voxel Filtering - ResearchGate
- Resolution-free Point Cloud Sampling Network with Data Distillation
- SampleNet: Differentiable Point Cloud Sampling - CVF Open Access
- (PDF) A comparative study on point cloud down-sampling strategies for deep learning-based crop organ segmentation - ResearchGate
- A comparative study on point cloud down-sampling strategies for deep learning-based crop organ segmentation - PubMed
- Comparison of the best and worst down-sampling strategies for… - ResearchGate
- Evaluating the Impact of Point Cloud Downsampling on the Robustness of LiDAR-based Object Detection - SZTAKI Publication Repository
- REPS: Reconstruction-based Point Cloud Sampling - arXiv
- Comparison of farthest-point sampling (FPS) and random sampling (RS) in terms of training speed and space consumption. - ResearchGate
- Semantic Point Cloud Segmentation with Deep-Learning-Based Approaches for the Construction Industry: A Survey - MDPI
- Semantic Point Cloud Segmentation with Deep-Learning-Based Approaches for the Construction Industry: A Survey - ResearchGate
- Point cloud - Open3D primary (unknown) documentation
- Point cloud — Open3D 0.14.1 documentation
- PointCloud - Open3D primary (unknown) documentation
- Curvature-Based Segmental Sampling for Point Cloud Registration - SPIE Digital Library
- Point cloud — Open3D 0.13.0 documentation
- A Strong Baseline for Point Cloud Registration via Direct Superpoints Matching - arXiv
- PointCloud — Open3D 0.17.0 documentation
- Point cloud — Open3D 0.9.0 documentation
- CloudCompare Wiki - Edit/Subsample
- Fast Point Cloud Sampling Network - Tianxin Huang
- zxy-bjtu/PointCloudToolBox: Point cloud processing tool library. - GitHub
- PointAS: an attention based sampling neural network for visual perception - PMC
- Downsampling a PointCloud using a VoxelGrid filter - Compiling PCL - Read the Docs
- Downsampling a PointCloud using a VoxelGrid filter — Point Cloud Library 0.0 documentation - Compiling PCL
- Downsampling a PointCloud using a VoxelGrid filter-PCL-Cpp - adioshun
- Can not downsample a point cloud in open3D - Stack Overflow
- PointCloud - Open3D primary (252c867) documentation
- pcl::UniformSampling Class Template Reference - Point Cloud Library
- What’s the principle of uniform_sampling in PCL? - Stack Overflow
- How do I downsample a point cloud to have a specific number of points so I can feed new data to a model based on PointNet? - Stack Overflow
- Voxelization — Open3D latest (664eff5) documentation
- How to Voxelize Meshes and Point Clouds in Python - Towards Data Science
- Downsampling point clouds with PCL - side-project
- pcl::FarthestPointSampling Class Template Reference - Point Cloud Library
- Module filters - Point Cloud Library (PCL)
- ruanych/opencv_3d: Point cloud related algorithm repository, developed based on OpenCV. Include Voxel Grid Filter Sampling, Random Sampling, Farthest Point Sampling (FPS), Total Least Squares Plane Estimate, Random Sample Consensus (RANSAC), Multi-plane Detection/Segmentation in Point Cloud… - GitHub
- LFPS: Learned Farthest Point Sampling - OpenReview
- More effective implementation of farthest point sampling · Issue #5797 · PointCloudLibrary/pcl - GitHub
- Point cloud outlier removal — Open3D latest (664eff5) documentation
- Point cloud outlier removal — Open3D 0.15.1 documentation
- open3d.geometry.uniform_down_sample — Open3D 0.6.0 documentation
- Downsample PCLPointCloud2 keeping it organized - Stack Overflow
- mxagar/open3d_guide: My personal guide to the great Python library Open3D. - GitHub
- How to use Open3D to sample point clouds to ensure that the results are the same every time - Stack Overflow
- ragibarnab/octree-point-cloud-downsampler - GitHub
- How to downsample a point cloud in a large area · Issue #5498 · PointCloudLibrary/pcl
- NUAAXQ/awesome-point-cloud-analysis-2023 - GitHub
- A Survey on Deep-Learning-Based LiDAR 3D Object Detection for Autonomous Driving
- pcl/Tutorials - ROS Wiki
- 3D is here: Point cloud library (PCL) - ResearchGate
- pcl::RandomSample Class Template Reference - Point Cloud Library
- Accelerating Lidar for Robotics with NVIDIA CUDA-based PCL
- PCL Tutorial: - The Point Cloud Library By Example - Jeff Delmerico
- pcl/CHANGES.md at master · PointCloudLibrary/pcl - GitHub
- pcl/CHANGES.md at master · PointCloudLibrary/pcl - GitHub
- jeffdelmerico/pointcloud_tutorial: Code examples for common operations on multidimensional data using both PCL and Open3D. - GitHub
- Getting Started / Basic Structures — Point Cloud Library 0.0 documentation - Compiling PCL
- how to make our own Point Type with PCL 1.9 - c++ - Stack Overflow
- Implement Farthest Point Sampling for Point Clouds · Issue #3715 · PointCloudLibrary/pcl
- Point cloud | Ecosyste.ms: Awesome
- pcl/test/filters/test_sampling.cpp at master · PointCloudLibrary/pcl - GitHub
- How to use Random Sample Consensus model — Point Cloud Library 0.0 documentation
- How to filter all points which are before a given 3d (general) plane in pcl - Stack Overflow
- Blackcipher101/PCL: Using Point Cloud Library to do stuff like filters down sample and many more - GitHub
- Sequential sampling on point clouds returning the same indices - Stack Overflow
- Introduction — Point Cloud Library 0.0 documentation - Compiling PCL
- Point Cloud Processing with Open3D: A Beginner’s Guide to Getting Started - YouTube
- Advanced Point Cloud Processing with Open3D and Python: Voxel Downsampling and Normal Estimation - YouTube
- open3d.geometry.PointCloud - Open3D primary (unknown) documentation
- Neighborhood Analysis, KD-Trees, and Octrees for Meshes and Point Clouds in Python
- Python Interface - Open3D 0.19.0 documentation
- Python Interface — Open3D 0.15.1 documentation
- Down sampling point clouds with open3d - python - Stack Overflow
- How to compare the difference between two point cloud, voxels, octrees or meshes? · Issue #1853 · isl-org/Open3D - GitHub