共计 1512 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
刚开始接触 3D 点云标注时,我用 Excel 手动记录每个物体的坐标和尺寸,不仅效率低下(标注一帧数据需要 2 小时),还经常出现多视角不一致的问题。更头疼的是,当点云密度达到 10 万 + 时,普通笔记本直接卡死。这种原始方式在 KITTI 这样包含 7481 帧训练数据的数据集上根本不可行。

工具横评
| 工具名称 | 安装方式 | 标注类型支持 | 扩展性 | 内存占用(百万点) |
|---|---|---|---|---|
| CloudCompare | 原生安装(1 分钟) | bbox/ 语义分割 / 测量工具 | 插件丰富 /Python 绑定 | 1.2GB |
| LabelMe3D | Docker(5 分钟) | bbox/ 关键点 | REST API 支持 | 800MB |
| Supervisely | 云服务(即开即用) | 全类型支持 | 完整 SDK | – |
| CVAT | Docker-compose(10 分钟) | bbox/3D 立方体 | 任务队列管理 | 1.5GB |
| SemanticSeg | 源码编译(30 分钟 +) | 专业级语义分割 | 学术论文复现专用 | 2GB+ |
注:测试环境为 Intel i7+16GB 内存,点云规模约 50 万点
实战演示:CloudCompare 标注 KITTI 数据
- 下载并安装 CloudCompare(推荐 2.12.alpha 版本,对大型点云优化更好)
- 导入 bin 文件:
File > Open选择Velodyne points格式 - 创建标注:按
Shift+A调出标注工具栏,选择3D box模式 - 调整视角:按住鼠标滚轮旋转,
Shift+ 滚轮平移,Ctrl+ 滚轮缩放 - 保存结果:使用
Tools > Save导出为 PCD 格式
# open3d 半自动标注示例(带异常处理)import open3d as o3d
import numpy as np
import logging
logging.basicConfig(filename='labeling.log', level=logging.INFO)
try:
pcd = o3d.io.read_point_cloud("000001.bin", format='xyz')
# 自动地面分割
plane_model, inliers = pcd.segment_plane(
distance_threshold=0.2,
ransac_n=3,
num_iterations=100
)
# 可视化调整
vis = o3d.visualization.VisualizerWithEditing()
vis.create_window()
vis.add_geometry(pcd)
vis.run() # 进入交互模式
vis.destroy_window()
# 获取用户框选结果
bbox = vis.get_cropped_geometry()
o3d.io.write_point_cloud("labeled.pcd", bbox)
except Exception as e:
logging.error(f"标注失败: {str(e)}", exc_info=True)
生产建议
- 点云密度处理:
- 车载激光雷达数据建议先体素降采样(0.1m 粒度)
-
标注完成后再用原始高密度点云微调
-
多人协作方案:
- 使用 Git LFS 管理标注文件
- 每个标注员创建独立分支
-
通过
diff --point-cloud命令检查冲突 -
质量校验:
- 用 Frustum 校验多视角一致性
- 运行脚本检查 bbox 重叠率(应 <5%)
- 随机抽样人工复核(建议 10% 比例)
动手挑战
用 PyTorch3D 实现标注结果的可视化验证:
1. 加载 KITTI 的标注 json 文件
2. 将 bbox 转换为 8 个顶点坐标
3. 使用 pytorch3d.structures.join_meshes_as_scene 创建场景
4. 添加相机视角动画(参考 KITTI 的 calib 参数)
5. 输出 GIF 验证标注合理性
提示:遇到 CUDA 内存不足时,尝试减小 batch_size 参数
正文完
发表至: 未分类
近三天内
