3. 点云数据基础

点云(Point Cloud)是三维空间中一组离散点的集合,每个点通常包含三维坐标(X, Y, Z)以及可选的属性信息(如颜色RGB、反射强度Intensity、法线方向等)。在PointNet缺陷检测模型中,点云是唯一的输入数据源,其质量直接决定了模型的上限。本章将系统讲解点云的数学表示、主流获取设备的工作原理,以及部署前必须完成的预处理流程。理解这些基础内容,是后续进行模型训练、量化与TensorRT部署的前提。

点云数据基础:表示 → 获取 → 预处理 → 模型输入 点云表示 · 坐标 (X,Y,Z) · 强度/颜色 · 法线 (Nx,Ny,Nz) · 稀疏/无序性 获取方式 · 激光雷达 (LiDAR) · 结构光 (Structured Light) · 深度相机 (ToF/双目) · 工业CT/光栅投影 预处理 · 去噪 (统计滤波) · 下采样 (体素滤波) · 法线估计 (PCA) · 坐标归一化 PointNet输入 N×3 或 N×6 (坐标+法线) 固定点数N Tensor格式 关键工程链路 传感器原始数据 → 点云生成 → 预处理(去噪/降采样/法线) → 固定点数采样 → 归一化 → 送入PointNet

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等数据集常用 自动驾驶、大规模点云 需自定义解析器
部署建议:在TensorRT部署阶段,推荐将预处理后的点云直接保存为NPY格式(float32数组),避免在推理时进行文件格式解析,减少CPU开销和延迟抖动。

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)

点云噪声主要来源于传感器测量误差、环境反射干扰、边缘飞点等。常用去噪方法包括:

  1. 统计滤波(Statistical Outlier Removal):计算每个点到其K近邻的平均距离,若平均距离超过全局均值+λ×标准差,则判定为离群点并剔除。λ通常取1.0~2.0。
  2. 半径滤波(Radius Outlier Removal):若某点在指定半径r内邻居数少于阈值t,则剔除。适合去除孤立飞点。
  3. 体素滤波(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(主成分分析):

  1. 对每个点p,搜索其K近邻(K通常取20~50)。
  2. 计算近邻点的协方差矩阵 C = (1/K)Σ(pi-p̄)(pi-p̄)T。
  3. 对C进行特征值分解,最小特征值对应的特征向量即为该点的法线方向。
  4. 通过调整法线方向使其与视点方向一致(通常指向传感器)。
// 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
预处理流程清单(部署推荐):
  1. 读取原始点云(PLY/PCD/BIN)→ 转换为NumPy数组 (N, 3)
  2. 统计滤波去噪(K=50, λ=1.0)
  3. 体素下采样(体素尺寸=0.01m,根据工件尺寸调整)
  4. 随机采样至固定点数N=1024(若点数不足则重复采样补齐)
  5. PCA法线估计(K=30)→ 拼接为 (N, 6) 特征
  6. 质心平移 + 单位球缩放
  7. 保存为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特征被噪声淹没;
  • 未进行法线估计,模型无法区分划痕(法线突变)与正常表面。

预处理优化过程:

  1. 去噪:采用统计滤波(K=30, λ=1.5),剔除飞点约2.1万个,点云降至27.9万点。
  2. 下采样:先体素滤波(体素尺寸0.15mm),点云降至约4.5万点;再随机采样至2048点。
  3. 法线估计:使用PCA(K=20),生成 (2048, 6) 特征。
  4. 归一化:质心平移+单位球缩放。
  5. 数据增强:对训练集进行随机旋转(±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,满足产线节拍要求。

复盘经验:预处理不是越复杂越好,需要根据缺陷类型选择关键特征。对于划痕类缺陷,法线信息至关重要;对于凹坑类缺陷,仅坐标信息可能已足够。建议在项目初期进行消融实验,确定最优特征组合。

3.5 常见误区与总结

误区1:忽略点云密度一致性。训练集和测试集若来自不同距离或不同传感器参数,点云密度差异会导致模型失效。务必在预处理阶段统一体素尺寸和采样点数。
误区2:法线方向不一致。PCA估计的法线方向具有二义性(正负方向),若不统一指向视点,PointNet会将其视为不同特征。必须调用orient_normals_towards_camera_location或手动翻转。
误区3:过度下采样丢失小缺陷。若体素尺寸大于最小缺陷尺寸(如0.1mm划痕),下采样会直接抹除缺陷。建议体素尺寸不超过最小缺陷尺寸的1/3。