三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从0到1跑通3D点云标注:这款开源工具的全流程实操指南

从0到1跑通3D点云标注:这款开源工具的全流程实操指南

从0到1跑通3D点云标注:这款开源工具的全流程实操指南

【免费下载链接】point-cloud-annotation-tool项目地址: https://gitcode.com/gh_mirrors/po/point-cloud-annotation-tool

point-cloud-annotation-tool 是一款面向自动驾驶场景的开源 3D点云标注工具,它直接读取 KITTI 格式的点云数据,通过可视化的方式完成 3D 边界框的框取、微调与导出。这篇文章将跟随一次真实标注任务的推进顺序,从搭建环境开始,一直走到保存出第一份可以直接交给算法团队使用的标注文件。

先讲个真实遭遇:为什么 3D 点云标注比 2D 难一个量级

做过 2D 图像标注的工程师,第一次接触点云时多半会栽跟头。图像里画一个框,肉眼就能看出框住了什么;到了点云里,同样的框却像悬浮在虚空中的透明盒子——目标到底有没有被完整包住,得旋转视角、缩放细节反复确认。一位做数据标注的同学曾和我吐槽:一个红绿灯路口的三维场景,他光调整边界框角度就花了一个下午。

把两者的差异摊开看,会更清楚难在哪:

对比维度2D 图像标注3D 点云标注
数据形态二维像素阵列三维空间坐标 + 强度值
标注对象平面矩形框带 6 自由度的长方体(中心、长宽高、偏航角)
视觉反馈所见即所得需要旋转视角验证贴合度
精度要求像素级即可毫米级,且必须与点云轮廓吻合
类别判断依赖颜色纹理依赖点云密度与几何形态

难点其实集中在三件事:怎么快速把框"扣"到目标上、怎么把框调到和点云严丝合缝、以及怎么保证一批人标出来的结果标准一致。point-cloud-annotation-tool 的设计思路,恰好是围绕这三个痛点逐个击破的。

先认识一下主角:三层结构与技术栈

这个项目没有把功能堆在一个大文件里,而是拆成了职责清晰的三层:

数据层 → Annotaion.cpp/h(标注数据的建模、加载、保存) 交互层 → vtkBoxWidgetRestricted + vtkAnnotationBoxSource(边界框的渲染与拖拽) 界面层 → visualizer.cpp/h + mainwindow.ui(Qt 界面、事件回调、工具栏)

几个值得留意的模块:

  • vtkBoxWidgetRestricted:在标准 vtkBoxWidget 基础上做了裁剪,把旋转自由度限制在 Z 轴方向。这对自动驾驶场景很有意义——车辆、行人在俯视视角下通常只需绕竖直轴转,锁死另外两个自由度能避免框被拖成歪斜的怪形状。
  • vtkAnnotationBoxSource:自定义的立方体渲染源,12 条棱线加 6 个半透明面,正面还用高亮做了区分,方便判断朝向。
  • PointCloudColorHandlerLUT:点云按标签着色,选中点、地面点、普通点用不同颜色区分,交互反馈一目了然。

技术栈并不花哨,但都是三维可视化领域的熟面孔:PCL 1.8负责点云读写与分割算法,VTK 8.1负责渲染与交互组件,Qt5搭建界面。这套组合在 Ubuntu 16.04 和 Windows 10 上都验证过可运行。

从截图能看到工具的核心布局:左侧是标注列表和分类按钮区,中央是点云渲染区,左下角是红绿蓝三维坐标轴。刚加载完点云、还没开始框选时,界面大概就是这个样子。

二十分钟跑通第一个标注任务

与其罗列功能清单,不如直接跟着走一遍完整流程。整个过程可以压缩成五个步骤。

第一步:把工程跑起来。依赖就三样——PCL 1.8、VTK 8.1、Qt5。构建命令极短:

git clone https://gitcode.com/gh_mirrors/po/point-cloud-annotation-tool cd point-cloud-annotation-tool mkdir build && cd build cmake .. && make

项目里已经内置了 ccache 支持,二次编译会快不少。

第二步:加载点云,同名标注自动出现。打开 File → Open,选择.bin(KITTI 格式)或.pcd文件。这里有个省事的约定:如果点云是cloud.bin,工具会自动寻找同目录下的cloud.bin.txt,存在就一并加载进来。这意味着你中途关掉程序,下次打开同一份点云,之前的标注框会原样复原。

第三步:框选目标。按住鼠标左键在点云上划一个矩形选区,把想要标注的目标点圈进去。圈完后,左侧 Types 区域的五个分类按钮就派上了用场——点击任意一个,选区内的点就会自动生成一个贴合它们的 3D 边界框,并染上对应的颜色。

分类按钮与颜色的对应关系是固定的:

类型按钮颜色用途
dontCare绿色标记不关注的区域
cyclist红色骑行者(含自行车整体)
pedestrian蓝色行人
vehicle紫色各类车辆
unknown橙色暂时无法判断的目标

颜色编码还有一个好处:类别一旦选错,扫一眼场景就知道哪里标岔了。

第四步:微调边界框。单击场景中的某个框即可选中,这时框上会出现可拖拽的控制手柄,支持平移、缩放和绕 Z 轴旋转。调整过程中框会实时跟随鼠标,随时能对照点云确认贴合程度。

第五步:保存标注。保存动作会把所有框写回同名.txt文件。每行一条标注,格式与 Apollo 3D 标注规范兼容:

vehicle 2.5 1.2 0.3 1.8 4.2 1.5 0.8 pedestrian 1.2 0.5 0.2 0.8 1.8 0.6 0.5

七个浮点数依次是中心点 x/y/z、长、宽、高、偏航角。这套格式的好处在于,导出的文件可以直接喂给主流的自动驾驶算法框架,不需要再做格式转换。

地面点去除:两种模式该怎么选

点云里数量最庞大的往往不是目标,而是地面。密密麻麻的地面点会严重干扰框选操作——所以动手标注前,通常要先做一步"地面点去除",把地面点从可选集合里摘出去。工具提供了两种模式:

模式实现原理适合场景参数建议
阈值模式直接把 z 坐标小于设定值的点标为地面有起伏、非平整的复杂地形默认 -1.5,按雷达安装高度调整
平面检测模式用 RANSAC 算法拟合地面平面,拟合出的内点即地面平坦道路、停车场等规则场景默认距离阈值 0.1,可适当放宽

实际使用中可以两条腿走路:先跑一次平面检测把大块地面吃掉,如果还剩一些零碎的近地点,再用阈值模式补一刀。被判定为地面的点会变色,而且框选时会被自动过滤,不会混进标注选区。

把效率再往上顶一档:选择模式、快捷键与质量控制

熟手和新手的差距,往往就差在几个快捷键上。这个工具的选择逻辑相当克制,核心就一套:

操作效果
x切换选择模式,进入后可配合修饰键做多选
左键框选新开选区,替换上一次选择
Ctrl+ 框选从当前选区中减掉框选部分
Shift+ 框选把框选部分并入当前选区
Ctrl+Shift+ 框选取交集
Del删除当前选中的标注框

这套加减集操作看似简单,实际是处理重叠目标、遮挡目标的神器。比如一辆车被树挡住了半边,可以先整片框选,再用 Ctrl 把树的部分减掉,剩下的点就是干净的车辆点云。

标完一个场景后,建议按这份清单过一遍再保存:

  • 所有框都与点云轮廓贴合,没有明显的悬空或吃进目标内部
  • 同一类目标颜色一致,没有标错类别
  • 无遗漏、无重复标注
  • 旋转视角从俯视、侧视、正视三个方向各检查一遍
  • 确认保存的 txt 与点云文件同名

上图是一个场景标注完成后的样子。可以看到大量紫色框和少量红色框共存的密集场景——多个框同时存在时,靠颜色区分类型比靠记忆高效得多。

多人协作与大批量数据的性能思路

标注从来不是一个人的活。团队协作时,比较顺的做法是:先统一标注规范(包括各类别的框选边界、遮挡目标怎么处理),再按区域或场景分片派单,最后由专人交叉抽检。由于每个文件是独立的 txt,合并成果时把文件汇总即可,天然支持并行作业。

当数据量上来之后,性能问题会逐渐浮现。几点可以落地的思路:

  • 编译层面:项目已默认启用 ccache,反复修改代码重新编译时能省下大量时间
  • 数据层面:把大规模点云按帧或按区域分片,一次只加载一小段,减少内存和 IO 压力
  • 操作层面:预先把相邻帧的点云缓存到内存,切换场景时秒级响应
  • 渲染层面:对超大点云启用抽稀或分级显示,拉远视角时降低渲染密度

遇到问题,先查这张表

实际使用中最常碰到的几个状况,基本都能在这张表里找到对应解法:

现象大概率原因处理办法
标注文件没有自动加载命名对不上确保 txt 与点云同名且在同一目录
打不开点云文件路径含中文或特殊字符改用纯英文路径
边界框拖不准仍处于普通交互模式x切到选择模式再操作
地面去不干净阈值或平面容差没调对平坦场景用平面检测,起伏场景加大阈值
操作卡顿、掉帧点云规模过大分批加载,或关闭后台多余程序

上手前,需要知道的三件事

其一,先搞清数据约定。工具默认的点云是xyz + intensity四维的 KITTI-bin 格式,标注文件是"点云名 + .txt"的伴生文件。命名规范决定了一切,别在这上面踩坑。

其二,快捷键是效率的杠杆。一套x+Ctrl/Shift选择逻辑,加上一个Del删除键,就覆盖了 90% 的常用操作。先花十分钟把快捷键练熟,比任何技巧都管用。

其三,环境依赖别贪新。项目在 PCL 1.8 与 VTK 8.1 的组合上验证过,升级大版本未必更省心。Ubuntu 16.04 和 Windows 10 都能跑,但建议先用一个干净的 Linux 环境起手,出问题的概率更低。

至于这份工具适合谁、不适合谁,可以做个简单的自测:

  • 如果你的团队在做 KITTI/Apollo 系数据集的预处理,需要快速产出合规标注 → 它很合适
  • 如果你是个人研究者,想手动标注少量场景做算法验证 → 它也够用
  • 如果你需要像素级联动(图像 + 点云同步标注),或希望用模型预标注自动兜底 → 它暂时覆盖不到

3D 点云标注的痛,经历过的人自然懂。好在工具并不复杂,动手比纠结重要得多——现在就拉一份点云,按上面的五步流程走一遍,二十分钟后,你就能拥有一份能直接送进训练流程的标注文件。🚀

【免费下载链接】point-cloud-annotation-tool项目地址: https://gitcode.com/gh_mirrors/po/point-cloud-annotation-tool

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表