3、点云数据基础:点云表示、获取方式与预处理
点云(Point Cloud)是三维空间中一组离散点的集合,每个点通常包含三维坐标(X, Y, Z)以及可选的属性信息(如颜色RGB、反射强度Intensity、法线方向等)。在PointNet缺陷检测模型中,点云是唯一的输入数据源,其质量直接决定了模型的上限。本章将系统讲解点云的数学表示、主流获取设备的工作原理,以及部署前必须完成的预处理流程。理解这些基础内容,是后续进行模型训练、量化与TensorRT部署的前提。
3.1 点云的数学表示与存储格式
点云在数学上定义为集合 P = {pi | i = 1, 2, ..., N},其中每个点 pi 是一个 d 维向量。在缺陷检测场景中,最常见的维度组合为:
- 仅坐标(d=3):p = (x, y, z),适用于形状缺陷检测,如凹坑、凸起、变形。
- 坐标+强度(d=4):p = (x, y, z, intensity),激光雷达常用,强度可反映材质反射率差异。
- 坐标+颜色(d=6):p = (x, y, z, r, g, b),深度相机或结构光扫描获得,颜色信息有助于检测表面纹理缺陷。
- 坐标+法线(d=6):p = (x, y, z, nx, ny, nz),法线方向对曲面连续性缺陷(如划痕、裂纹)非常敏感。
在PointNet模型中,输入通常为 N×3 或 N×6 的张量,其中 N 为固定点数(如1024或2048)。由于点云具有无序性(点的排列顺序不影响物体形状)和稀疏性(三维空间中大量区域为空),PointNet采用对称函数(max pooling)来聚合全局特征,这也是其不需要显式处理点序的原因。
| 存储格式 | 特点 | 适用场景 | 备注 |
|---|---|---|---|
| PLY | 支持顶点、法线、颜色、自定义属性 | 工业扫描、模型重建 | 文本/二进制两种模式 |
| PCD | PCL原生格式,支持多字段 | PCL库处理流程 | 版本兼容性需注意 |
| XYZ | 纯文本,每行一个点坐标 | 简单调试、快速验证 | 文件较大 |
| NPY/NPZ | NumPy数组,可直接加载为Tensor | 深度学习训练/推理 | 推荐用于部署前处理 |
| BIN | 二进制裸数据,KITTI等数据集常用 | 自动驾驶、大规模点云 | 需自定义解析器 |
3.2 点云获取方式:三大主流传感器原理
不同传感器获取点云的原理差异巨大,直接影响点云的密度、精度、噪声分布和适用场景。在缺陷检测项目中,选型错误会导致后续算法效果大打折扣。
3.2.1 激光雷达(LiDAR)
激光雷达通过发射激光束并测量反射光的时间差(ToF)或相位差来计算距离。机械式LiDAR通过旋转镜面实现360°扫描,固态LiDAR则通过光学相控阵或MEMS微镜实现定向扫描。其核心优势是测量距离远(可达200m+)、精度高(±2cm)、抗环境光干扰强,但缺点是点云稀疏(线数限制)、设备昂贵、对高反射率表面(如镜面)会产生飞点噪声。
3.2.2 结构光(Structured Light)
结构光方案通过投影仪向物体表面投射编码光栅图案,相机捕捉被物体表面调制后的畸变图案,通过三角测量原理计算深度。典型代表是微软Kinect v1和Intel RealSense D435(红外散斑模式)。其优点是近距离精度极高(可达0.1mm级)、点云密集、成本低,适合小型工件表面缺陷检测。缺点是有效距离短(通常0.2-1.5m)、易受环境红外干扰、对黑色或高光物体效果差。
3.2.3 深度相机(ToF / 双目)
ToF(Time-of-Flight)相机通过测量红外光脉冲的往返时间计算深度,如Kinect v2、Azure Kinect。双目相机则通过两个普通相机视差计算深度,如ZED系列。ToF相机帧率高(30-60fps)、无运动模糊,但分辨率较低(通常VGA级别);双目相机分辨率高、成本低,但计算量大且依赖纹理特征,对无纹理表面(如白色陶瓷)效果差。
| 对比维度 | 激光雷达 | 结构光 | ToF深度相机 | 双目相机 |
|---|---|---|---|---|
| 测量原理 | 激光飞行时间 | 三角测量+编码光 | 红外光飞行时间 | 视差三角测量 |
| 精度 | ±2cm | ±0.1mm~1mm | ±1cm | ±1mm~5mm |
| 有效距离 | 0.5m~200m | 0.2m~1.5m | 0.3m~5m | 0.5m~20m |
| 点云密度 | 稀疏(0.1~100点/m²) | 密集(百万级) | 中等(数十万级) | 中等(数十万级) |
| 环境光敏感度 | 低 | 高(红外干扰) | 中 | 中 |
| 典型缺陷检测场景 | 大型结构件变形、焊缝 | 精密零件表面划痕、凹坑 | 中等尺寸物体装配检测 | 物流分拣、机器人抓取 |
3.3 点云预处理:从原始数据到模型输入
原始点云通常包含大量噪声、离群点和冗余数据,直接输入PointNet会导致模型收敛缓慢、精度下降。预处理的目标是去噪、降采样、法线估计、归一化,最终输出固定点数、规范坐标范围的点云张量。
3.3.1 去噪(Denoising)
点云噪声主要来源于传感器测量误差、环境反射干扰、边缘飞点等。常用去噪方法包括:
- 统计滤波(Statistical Outlier Removal):计算每个点到其K近邻的平均距离,若平均距离超过全局均值+λ×标准差,则判定为离群点并剔除。λ通常取1.0~2.0。
- 半径滤波(Radius Outlier Removal):若某点在指定半径r内邻居数少于阈值t,则剔除。适合去除孤立飞点。
- 体素滤波(Voxel Filter):将空间划分为固定尺寸的立方体,每个体素内保留重心点。这既是去噪也是下采样。
// PCL统计滤波核心参数示例
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50); // K近邻点数
sor.setStddevMulThresh(1.0); // 标准差倍数阈值
sor.filter(*cloud_filtered);
3.3.2 下采样(Downsampling)
PointNet要求输入固定点数N,而原始点云可能包含数十万甚至百万点。下采样策略直接影响模型性能:
- 随机采样:最简单,但可能丢失关键几何特征。
- 体素下采样:均匀分布,保留整体形状,但可能平滑掉细小缺陷。
- 最远点采样(FPS):迭代选择距离已选点集最远的点,能较好保留几何结构,但计算量大。
- 法线空间采样:优先保留法线变化剧烈的区域(如边缘、尖角),适合缺陷检测。
在部署阶段,推荐使用体素下采样+随机采样的组合:先用体素滤波将点云密度降至约5万点,再随机采样至固定N点(如1024)。这样既控制计算量,又保留足够信息。
3.3.3 法线估计(Normal Estimation)
法线是点云的重要局部特征,对缺陷检测尤为关键——缺陷区域(如划痕、凹坑)的法线方向会发生突变。最常用的方法是PCA(主成分分析):
- 对每个点p,搜索其K近邻(K通常取20~50)。
- 计算近邻点的协方差矩阵 C = (1/K)Σ(pi-p̄)(pi-p̄)T。
- 对C进行特征值分解,最小特征值对应的特征向量即为该点的法线方向。
- 通过调整法线方向使其与视点方向一致(通常指向传感器)。
// Open3D法线估计示例
import open3d as o3d
pcd = o3d.io.read_point_cloud("scan.ply")
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.05, max_nn=30))
# 调整法线方向指向视点
pcd.orient_normals_towards_camera_location(camera_location=[0, 0, 1])
3.3.4 坐标归一化与中心化
PointNet对输入坐标的尺度敏感。建议将所有点云平移至质心为原点,并缩放至单位球体范围(最大半径=1)。这能加速模型收敛并提高泛化能力。
# 归一化代码示例
centroid = np.mean(points, axis=0)
points_centered = points - centroid
max_dist = np.max(np.linalg.norm(points_centered, axis=1))
points_normalized = points_centered / max_dist
- 读取原始点云(PLY/PCD/BIN)→ 转换为NumPy数组 (N, 3)
- 统计滤波去噪(K=50, λ=1.0)
- 体素下采样(体素尺寸=0.01m,根据工件尺寸调整)
- 随机采样至固定点数N=1024(若点数不足则重复采样补齐)
- PCA法线估计(K=30)→ 拼接为 (N, 6) 特征
- 质心平移 + 单位球缩放
- 保存为NPY文件,供TensorRT推理加载
3.4 实战案例:结构光扫描手机中框的缺陷检测预处理
背景与约束:某3C电子厂需要对手机金属中框进行表面缺陷检测,检测目标包括划痕(宽度>0.1mm)、凹坑(直径>0.3mm)和氧化斑点。产线节拍要求每件检测时间<3秒。选用Intel RealSense D435结构光相机,工作距离300mm,原始点云约30万点。
初始现象与问题:直接使用原始点云训练PointNet,模型在验证集上F1-score仅为0.72,且推理延迟高达45ms(GPU)。分析发现:
- 点云包含大量环境反射噪声(金属表面镜面反射导致飞点);
- 点数过多导致PointNet的max pooling特征被噪声淹没;
- 未进行法线估计,模型无法区分划痕(法线突变)与正常表面。
预处理优化过程:
- 去噪:采用统计滤波(K=30, λ=1.5),剔除飞点约2.1万个,点云降至27.9万点。
- 下采样:先体素滤波(体素尺寸0.15mm),点云降至约4.5万点;再随机采样至2048点。
- 法线估计:使用PCA(K=20),生成 (2048, 6) 特征。
- 归一化:质心平移+单位球缩放。
- 数据增强:对训练集进行随机旋转(±5°)、随机噪声注入(σ=0.005)以提升鲁棒性。
结果对比:
| 方案 | F1-score | 推理延迟(ms) | 显存占用(MB) |
|---|---|---|---|
| 原始点云直接输入 | 0.72 | 45 | 1280 |
| 去噪+下采样(1024点) | 0.85 | 18 | 512 |
| 去噪+下采样+法线(2048点) | 0.93 | 22 | 640 |
风险与代价:法线估计增加了约3ms的CPU预处理时间,但换来了8%的F1提升。最终方案采用2048点+法线特征,在TensorRT FP16优化下推理延迟降至11ms,满足产线节拍要求。
复盘经验:预处理不是越复杂越好,需要根据缺陷类型选择关键特征。对于划痕类缺陷,法线信息至关重要;对于凹坑类缺陷,仅坐标信息可能已足够。建议在项目初期进行消融实验,确定最优特征组合。