2. 点云基础

点云自动标注与3D真值生成的第一步,不是写标注规则,而是把“点”本身看清楚。点云不是图像,它没有天然的行列网格,而是一组带属性的三维采样点。理解点云的数据格式、坐标系、传感器来源、公开数据集以及可视化方法,决定了后续标注工具能否正确读写、显示、变换和导出真值。本节围绕这五个基础问题展开,为后续标注流水线打下可操作的基础。

一、点云数据格式:从无序点到可交换文件

点云在内存中通常以数组或张量形式存在,每个点至少包含三维坐标 (x, y, z),常见扩展属性包括强度 intensity、颜色 rgb、法向量 normal、时间戳 timestamp、环号 ring、扫描线 laser_id 等。落到磁盘上,就需要格式来约定字段顺序、编码方式和元数据。工程中最常见的格式如下:

格式类型典型字段适用场景
PCD文本/二进制x y z intensity rgb normalPCL 生态、研究标注
PLY文本/二进制顶点、颜色、面片重建、可视化交换
LAS/LAZ二进制压缩xyz、强度、回波、分类测绘、机载激光
BIN二进制x y z intensity(float32)KITTI 等自动驾驶
NPZ/NPYNumPy 二进制N×3 或 N×4 数组深度学习训练缓存

选择格式时重点看三件事:是否保留强度与颜色、是否支持二进制快速读取、是否携带坐标系与标定信息。PCD 头部会写明 FIELDS、SIZE、TYPE、WIDTH、HEIGHT、VIEWPOINT,这些元数据直接影响解析代码。例如一个典型的 PCD 头部:

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 120000
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 120000
DATA binary

如果标注工具忽略 VIEWPOINT 或把 intensity 当颜色通道,导出的真值就可能出现偏移或颜色错乱。因此,格式解析必须与字段语义绑定,而不是只读 xyz。

二、坐标系:点云真值的空间基准

点云标注中最容易出错的是坐标系。同一帧点云,在传感器坐标系、车辆坐标系、世界坐标系下的数值完全不同。常见坐标系包括:

  • 传感器坐标系:以激光雷达或相机光心为原点,x 向前、y 向左、z 向上(或按厂商定义)。
  • 车辆/机体坐标系:以车辆后轴中心或质心为原点,用于多传感器融合。
  • 世界坐标系:全局地图或 GNSS 基准,用于跨帧、跨场景真值对齐。
  • 图像坐标系:像素坐标 (u, v) 与深度,用于相机-激光雷达联合标注。

坐标系之间的转换由外参矩阵 T 描述,包含旋转 R 与平移 t。点 p 从传感器系到世界系的变换为 p_world = R · p_sensor + t。标注框通常定义在某一基准坐标系下,导出时必须明确写出 frame_id,否则下游训练会把不同坐标系的框混在一起。工程上建议在标注任务配置中固定一个“标注基准坐标系”,所有框、轨迹、分割掩码都先转到该系再保存。

常见误区:把相机坐标系下的 3D 框直接当作激光雷达坐标系输出。两者外参不同,框会整体偏移甚至旋转错误。导出前必须做一次坐标系一致性校验。

三、传感器类型:不同点云的性格差异

点云的密度、分布、噪声和视野由传感器决定。自动标注策略必须适配传感器类型,不能一套参数打天下。

  • 机械旋转式激光雷达:360° 水平视野,线束如 16/32/64/128 线,点云呈环状分布,近密远疏,适合自动驾驶与机器人。
  • 固态激光雷达:视场角有限,点云更均匀,体积小,适合补盲与量产车。
  • 深度相机:结构光或 ToF,近距离稠密,远距离噪声大,适合室内、人脸、抓取。
  • 双目立体视觉:通过视差生成点云,纹理丰富区域好,弱纹理区域空洞多。
  • 毫米波雷达:点稀疏但测速准,常与激光雷达融合,用于目标跟踪真值。

以 64 线机械激光雷达为例,垂直角分辨率约 0.4°,水平 0.2°,10 米处相邻线间距约 7 厘米,而 50 米处约 35 厘米。这意味着远处目标的点非常稀疏,标注框的尺寸和朝向估计必须考虑点密度衰减,否则真值会系统性偏小。

四、常见数据集:真值格式的参照系

公开数据集不仅提供点云,还定义了真值的组织方式,是设计标注 schema 的重要参考。

  • KITTI:Velodyne 64 线,提供 3D 框、2D 框、标定文件,BIN 格式,是自动驾驶 3D 检测的经典基准。
  • nuScenes:32 线激光雷达 + 6 相机 + 5 雷达,提供全局坐标系下的 3D 框、属性、轨迹,标注粒度细。
  • Waymo Open Dataset:高分辨率激光雷达与相机,提供 3D 框与跟踪 ID,规模大。
  • SemanticKITTI:在 KITTI 基础上提供逐点语义标签,适合点云分割真值。
  • Argoverse 2:包含激光雷达、相机与高精地图,强调运动预测与场景理解。

这些数据集的标注格式差异很大:KITTI 用 7 维框(中心 xyz、尺寸 lwh、偏航角 ry),nuScenes 用 10 维(增加速度与属性),SemanticKITTI 用逐点标签。设计自有真值格式时,建议至少保留:frame_id、timestamp、坐标系、框中心、尺寸、朝向、类别、跟踪 ID、可见性、遮挡状态。这样既能对齐主流数据集,又便于后续转换。

五、点云可视化方法:让标注可验证

可视化是标注质量的最后一道防线。没有可视化,标注员无法判断框是否贴合、分割是否越界、轨迹是否跳变。常用方法包括:

  • Open3D:Python 友好,支持点云、框、颜色、法向量显示,适合快速验证。
  • PCL + CloudCompare:桌面工具,适合大规模点云浏览、配准与对比。
  • RViz / Foxglove:ROS 生态,适合实时传感器数据与标注结果叠加。
  • Web 可视化:Three.js、deck.gl 可在浏览器中渲染点云与 3D 框,适合标注平台前端。

下面是一段 Open3D 可视化点云与 3D 框的示例代码,常用于标注结果抽检:

import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("frame_0001.pcd")
bbox = o3d.geometry.OrientedBoundingBox(
    center=[12.0, 1.5, 0.8],
    R=o3d.geometry.get_rotation_matrix_from_xyz([0, 0, 0.3]),
    extent=[4.5, 1.9, 1.6]
)
bbox.color = (1, 0, 0)
o3d.visualization.draw_geometries([pcd, bbox])
可视化时建议同时显示原始点云、标注框、坐标系箭头和地面网格。坐标系箭头能快速暴露外参错误,地面网格能帮助判断框的高度是否合理。

六、案例与复盘:一次坐标系错位的排查

某团队在标注一批固态激光雷达数据时,发现导出的 3D 框在可视化中整体偏向车辆右侧约 1.2 米。排查过程如下:先检查框中心数值,发现与点云聚类中心一致;再检查外参文件,发现标注工具读取的是相机到激光雷达的外参,而导出时又做了一次逆变换,导致双重变换。修正方法是统一在标注基准坐标系下保存,导出时只做一次到目标坐标系的变换,并在日志中打印变换矩阵与 frame_id。

这个案例说明:点云基础不是理论摆设,格式、坐标系、传感器、数据集和可视化五者环环相扣。格式决定字段能否读全,坐标系决定空间基准是否一致,传感器决定标注策略是否适配,数据集决定真值 schema 是否可迁移,可视化决定错误能否被及时发现。把这五点落实到标注工具的配置与校验流程中,后续的自动标注与真值生成才有可靠的地基。

点云基础五要素与真值生成关系 数据格式 PCD / PLY / LAS / BIN 字段与元数据 坐标系 传感器 / 车辆 / 世界 外参 R 与 t 传感器类型 机械 / 固态 / 深度相机 密度与噪声差异 常见数据集 KITTI / nuScenes SemanticKITTI 标注基准坐标系 统一 frame_id · 单次变换 · 一致性校验 点云可视化验证 Open3D · CloudCompare · RViz · Web 常见误区 坐标系混用 · 双重变换 真值输出 框 · 轨迹 · 逐点标签 格式读全 · 坐标对齐 · 传感器适配 · 数据集参照 · 可视化验证