共计 1653 个字符,预计需要花费 5 分钟才能阅读完成。
为什么点云标注这么重要?
在自动驾驶和机器人领域,点云数据 是感知环境的核心输入。激光雷达扫描得到的数百万个空间点,能精确描绘出周围物体的形状和位置。但原始点云就像未分类的乐高积木——只有通过标注(比如框出车辆、行人),AI 模型才能学会识别这些物体。

新手最容易踩的坑包括:
- 效率低下:手动标注一帧数据可能耗时 30 分钟以上
- 格式混乱:不同工具输出的标注文件结构差异大
- 精度失控:坐标系转换错误导致标注偏移 10cm+(在自动驾驶中非常危险)
工具选型:哪款适合你?
1. LabelCloud
优点:
– 纯 Python 开发,可直接调用 Open3D
– 支持自定义标注类型(如Bounding Cube)
– 轻量级,适合快速验证
缺点:
– 缺少团队协作功能
– 对大规模点云(>50 万点)卡顿明显
2. Supervisely
优点:
– 提供云端协作平台
– 内置智能预标注(如自动拟合立方体)
– 支持视频级点云标注
缺点:
– 需要联网使用
– 高级功能收费
3. CVAT
优点:
– 开源免费
– 同时支持 2D/3D 标注
– 可部署到本地服务器
缺点:
– 3D 标注功能较基础
– 学习曲线陡峭
手把手实战:从加载到标注
第一步:用 Open3D 加载点云
import open3d as o3d
# 加载 PCD 文件(注意路径不要含中文)point_cloud = o3d.io.read_point_cloud("sample.pcd")
# 可视化设置
vis = o3d.visualization.Visualizer()
vis.create_window(width=800, height=600)
vis.add_geometry(point_cloud)
# 调整视角(FOV=60 度)ctr = vis.get_view_control()
ctr.set_front([0, 0, -1]) # 相机朝向
vis.run()
第二步:坐标系对齐
当点云歪斜时,需要旋转矩阵修正:
import numpy as np
# 构建旋转矩阵(绕 Z 轴转 30 度)theta = np.radians(30)
rot_mat = np.array([[np.cos(theta), -np.sin(theta), 0],
[np.sin(theta), np.cos(theta), 0],
[0, 0, 1]
])
# 应用变换
points = np.asarray(point_cloud.points)
points = np.dot(points, rot_mat.T)
point_cloud.points = o3d.utility.Vector3dVector(points)
第三步:理解标注文件
标准 JSON 格式示例:
{
"version": "1.0",
"objects": [
{
"class": "car",
"position": [1.2, 3.4, 0.8], // 中心点坐标
"dimensions": [4.5, 1.8, 1.6], // 长宽高
"rotation": 0.12 // 偏航角(弧度)}
]
}
避坑指南:血泪经验总结
坐标系转换
- 激光雷达坐标系通常是 X 前 Y 左 Z 上
- 相机坐标系是 Z 前 X 右 Y 下
- 转换时注意:
- 先平移后旋转
- 检查旋转顺序(建议 Z→Y→X)
动态物体处理
对于移动的行人:
1. 在第一帧手动标注
2. 使用卡尔曼滤波预测后续帧位置
3. 微调边界框避免累积误差
性能优化技巧
点云下采样
# 使用体素网格下采样(保持形状)down_pcd = point_cloud.voxel_down_sample(voxel_size=0.05)
加速查询
建立 KD 树后,搜索效率提升 10 倍 +:
pcd_tree = o3d.geometry.KDTreeFlann(point_cloud)
[k, idx, _] = pcd_tree.search_radius_vector_3d(query_point, radius=1.0)
延伸思考:半自动标注
用 PyTorch3D 实现思路:
1. 训练一个简单分类器预测粗略边界框
2. 将预测结果导入标注工具微调
3. 主动学习:把模型不确定的样本优先标注
完整代码示例见 GitHub 仓库(链接)。记住:好的标注数据比算法更重要!
正文完
发表至: 未分类
近两天内
