2. 点云基础
点云自动标注与3D真值生成的第一步,不是写标注规则,而是把“点”本身看清楚。点云不是图像,它没有天然的行列网格,而是一组带属性的三维采样点。理解点云的数据格式、坐标系、传感器来源、公开数据集以及可视化方法,决定了后续标注工具能否正确读写、显示、变换和导出真值。本节围绕这五个基础问题展开,为后续标注流水线打下可操作的基础。
一、点云数据格式:从无序点到可交换文件
点云在内存中通常以数组或张量形式存在,每个点至少包含三维坐标 (x, y, z),常见扩展属性包括强度 intensity、颜色 rgb、法向量 normal、时间戳 timestamp、环号 ring、扫描线 laser_id 等。落到磁盘上,就需要格式来约定字段顺序、编码方式和元数据。工程中最常见的格式如下:
| 格式 | 类型 | 典型字段 | 适用场景 |
|---|---|---|---|
| PCD | 文本/二进制 | x y z intensity rgb normal | PCL 生态、研究标注 |
| PLY | 文本/二进制 | 顶点、颜色、面片 | 重建、可视化交换 |
| LAS/LAZ | 二进制压缩 | xyz、强度、回波、分类 | 测绘、机载激光 |
| BIN | 二进制 | x y z intensity(float32) | KITTI 等自动驾驶 |
| NPZ/NPY | NumPy 二进制 | 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,否则下游训练会把不同坐标系的框混在一起。工程上建议在标注任务配置中固定一个“标注基准坐标系”,所有框、轨迹、分割掩码都先转到该系再保存。
三、传感器类型:不同点云的性格差异
点云的密度、分布、噪声和视野由传感器决定。自动标注策略必须适配传感器类型,不能一套参数打天下。
- 机械旋转式激光雷达: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 是否可迁移,可视化决定错误能否被及时发现。把这五点落实到标注工具的配置与校验流程中,后续的自动标注与真值生成才有可靠的地基。