ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

point-cloud-annotation-tool 实战:一套流程吃透3D点云标注,从零到KITTI格式交付

point-cloud-annotation-tool 实战:一套流程吃透3D点云标注,从零到KITTI格式交付 point-cloud-annotation-tool 实战一套流程吃透3D点云标注从零到KITTI格式交付【免费下载链接】point-cloud-annotation-tool项目地址: https://gitcode.com/gh_mirrors/po/point-cloud-annotation-tool从一段让人头秃的标注日常说起凌晨一点你刚把第 300 帧 KITTI 点云拉进点云查看器准备手动标出这一帧里的 6 辆车。你盯着密密麻麻的白色点云试图想象哪几个点构成一辆车好不容易画了个框一旋转视角发现框底还露着半条马路更糟的是你标完想保存结果工具导出的是自己定义的格式下游的检测训练脚本根本不认。这是每一个接触 3D 点云标注的工程师都绕不开的困局标注软件要么是笨重的商业套件要么是临时拼凑的脚本很难找到一个能看、能选、能改、能存成标准格式的开源工具。point-cloud-annotation-tool 正是冲着这个痛点来的一个基于 PCL 与 VTK 的轻量级 3D 点云标注工具支持 KITTI-bin 格式点云标注结果以 Apollo 3D 格式落盘专门为自动驾驶场景的地面目标标注而设计。下面这份实战指南会带你从安装构建一路走到交付一份能被算法直接吃进去的标注文件。动手之前先建立全局观工具的四个设计内核与其一上来就背快捷键不如先理解这个工具为什么这么设计。整个软件围绕四件事展开想清楚这四点后面所有操作都顺理成章设计内核解决什么问题通俗类比同名文件自动配对点云和标注文件总是成对出现钥匙和锁提前配好不用每次手动找点云选区即建框从一堆点里生成目标框框选照片里的脸直接套一个相框地面点标灰不参与选择地面点会干扰目标选取拍照时先把背景虚化掉标准格式输出标注结果要能被训练脚本消费写完文档直接导出 PDF而不是存 txt简单说它把看清点云、选中目标、拉出框、存标准格式这条链路压缩成了最低限度的交互成本。工具的核心类型预设为五种dontCare、cyclist、pedestrian、vehicle、unknown颜色由 PCL 内置的 GlasbeyLUT 查色表按类型自动分配同类目标天然同色一眼可辨。先看懂流水线一份标注背后的完整链路打开源码目录你看到的是一组分工明确的模块。理解这条链路比记住任何按钮都重要数据接入(KITTI-bin 解析) → 点云预处理(地面去除) → 目标选择(区域拾取) → 边界框生成与编辑(vtkAnnotationBoxSource vtkBoxWidgetRestricted) → 类型着色(GlasbeyLUT) → 格式导出(Apollo 3D / 同名 .txt)各模块的真实分工如下visualizer.cpp / visualizer.h主控中枢。负责打开文件、刷新点云、响应鼠标与键盘事件、把标注框挂到渲染器上。所有交互逻辑选择、拾取、删除都汇总在这里。Annotaion.cpp / Annotaion.h标注数据层。BoxLabel结构体承载类型 7 个数值Annotation负责从选中点计算包围盒、应用变换、切换类型与颜色Annotaions负责标注列表的增删、读写。vtkBoxWidgetRestricted.cpp交互编辑核心。它继承自 VTK 的vtkBoxWidget但把旋转约束在 Z 轴保证框永远立在地面上不会歪出天际——这对地面目标标注是刚需。vtkAnnotationBoxSource.cpp自定义的六面体几何源供标注框渲染使用。pcl/visualization/目录扩展 PCL 可视化能力包括PCLVisualizerExtented支持面积拾取事件、PointCloudColorHandlerLUT按点标签着色、MyCloudLUT等。view/flowlayout.cpp左侧类型按钮的流式布局类型按钮多了也不会挤成一团。注意到一个细节打开cloud.bin时程序会自动查找同目录下的cloud.bin.txt并加载已有标注。这意味着你随时可以打开点云接着上次的活干无需手动指定标注文件。动手第一步编译、加载、打出第一个框工具在 Ubuntu 16.04 与 Windows 10 上测试通过依赖 PCL 1.8、VTK 8.1 与 Qt5。如果你的环境缺少这些库先安装好再继续。git clone https://link.gitcode.com/i/f6e61c834f6feb86b8db64c7deff03e2 cd point-cloud-annotation-tool mkdir build cd build cmake .. makeCMake 里默认开启了BUILD_TEST单元测试示例与BUILD_TOOLS辅助工具两个开关不需要可以关掉以加速编译如果机器上有 ccache构建脚本会自动启用它来提速。拿到可执行文件后用最短路径完成你的第一个标注任务加载点云File → Open选择.bin或.pcd文件。程序读取 XYZI 四通道数据KITTI-bin 中每个点存 3 个 double 坐标 1 个 double 强度并自动尝试加载同名.txt标注。圈出目标在点云显示区按下鼠标拖拽框选一个目标。注意地面点灰色标记的点会被自动过滤不会混进选区。生成边界框点击左侧某个类型按钮如vehicle。程序会对选中的点计算最小包围盒立刻生成一个贴着目标的 3D 框。微调贴合度左键单击框体选中它出现可拖拽的交互手柄调整位置、长宽高与朝向让框与点云严丝合缝。保存File → Save标注以类型 7 个数值的格式写入同名.txt文件。这就是工具的主界面左侧是类型按钮与标注列表右侧是点云显示区左上角有 XYZ 坐标轴辅助定位。整个流程走下来一帧点云的标注时间可以压到分钟级。四大能力逐个拆解知道什么时候该用哪招能力一点云选择——选区操作的三种组合框选是这套工具的核心输入方式。按x切换选择模式后配合修饰键能玩出三种组合逻辑操作逻辑典型场景普通框选新建选区替换上一次选择第一次圈选目标Shift 框选并集把新框到的点并入选区一个目标分两次才圈全Ctrl 框选差集从当前选区中扣掉框内点把误选进框的地面点剔除ShiftCtrl 框选交集只保留两框重叠部分的点精确到某个局部多选之后你可以对同一批点反复追加或剔除直到选区与目标点云高度吻合再点类型按钮生成框。我的建议是宁可多框几次也别一次框太大因为选区直接决定了初始框的贴合度。能力二边界框生成与编辑——生成容易贴合难框生成用的是轴向包围盒策略遍历选中的点分别取 x、y、z 的最大最小值得到一个初始框。这个框够快但它是轴对齐的斜着停的车往往框不严。解决办法藏在adjustToAnchor这个函数里选中框后它会把框内的点作为锚点在保持当前朝向的前提下重新计算中心偏移与缩放让框自动贴紧点云。配合vtkBoxWidgetRestricted的手柄你可以像捏橡皮泥一样逐面调整而旋转被限制在 Z 轴框永远是站着的。能力三地面点去除——让干扰点隐身地面点是最常见的干扰源它们数量巨大、和车底的点混在一起直接影响框选精度。工具提供两种地面处理模式阈值模式Threshold在参数框里填一个 z 值如-1.5所有低于该高度的点都被标记为地面点一键标灰。适合地形基本平坦的场景快而直接。平面检测模式Plane Detect内部调用 PCL 的 RANSAC 平面分割SACSegmentationSACMODEL_PLANE自动拟合地平面可调距离阈值默认0.1。适合有坡度、阈值得频繁试错的场景。处理完地面点后框选目标时这些点会被自动过滤。实操建议先用平面检测跑一遍再用阈值微调两个 dock 面板可以同时打开。能力四类型与颜色管理——一套自适应的着色体系五种预设类型对应一个全局类型表。当你给目标换类型时选中框后点击其他类型按钮颜色会立即切换甚至如果你输入一个表中不存在的类型getTypeIndex会自动把它追加进去并分配新颜色。这意味着工具的类别体系是可扩展的不用改代码就能引入新类别。三个真实场景三种打法场景 A城市主干道——车流密集以量取胜这类场景车辆多、排列密集最容易犯的错是框与框互相打架。打法建议打开平面检测先干一版地面点用Shift并集模式逐步圈全每辆车宁可多点几次框生成后立刻Del清理误建的空框最后整体旋转视角检查相邻框是否有明显重叠重叠就微调。上图是一次典型的多目标标注结果同一帧里不同大小的车辆框与小型目标框共存类型颜色清晰可辨。场景 B带坡度的园区——平面检测失效怎么办坡道场景里 RANSAC 拟合出来的平面可能翘起来误伤目标底部。此时策略反转阈值模式 保守的 z 值只去除绝对低于路面的点对残留在框内的地面点用Ctrl差集框选手动剔除优先用adjustToAnchor的自动贴合减少手工拖拽。场景 C混合目标的交叉口——行人、骑行者和车辆同框当一辆车旁边同时站着行人和骑行者时先大后小是更好的顺序先框车辆这类大目标再框小目标避免小目标被大框的边缘误圈。需要标注忽略区域时直接选中点后选择dontCare类型即可无需额外心智负担。高频踩坑点与修复手册症状可能原因修复步骤打开文件后一片空白点云文件格式不是 KITTI-bin 或 PCD或路径含中文确认扩展名为.bin/.pcd把文件挪到纯英文路径点类型按钮没反应控制台提示 no points selected选区点数不足代码要求多于 3 个点重新框选选大一点的目标区域已有标注没显示.txt与.bin不同名确保标注文件名为点云名.txt放同一目录框拖不动、手柄不出现没有先左键单击选中框体单击框后再操作x确认处于正确的模式保存后重新打开框的位置偏移标注格式或字段顺序被改动保持类型 cx,cy,cz,length,width,height,yaw的原始顺序另外提醒一句vtkBoxWidget在某些 Windows 环境下初始化渲染窗口可能有兼容问题代码注释里也提到了这一历史 bug遇到偶发崩溃优先检查 VTK 版本是否为 8.1 及配套的 Qt 版本。让效率再翻倍快捷键、检查清单与协作流快捷键速查表快捷键作用x切换选择模式Shift 框选选区并集Ctrl 框选选区差集ShiftCtrl 框选选区交集Del删除当前选中的标注框每帧交付前的 30 秒自检目标是否都已生成框有没有漏标框与点云贴合度如何旋转视角从侧面复查是否有框重叠、框里混入地面点类型是否正确颜色是否和同类型目标一致保存后.txt行数是否与框数一致多人协作的落地建议如果是一个小组共同标注一个数据集先统一一份《标注规范》类型命名、框的判定标准、忽略区域的用法然后按序列帧分片到人因为标注文件是纯文本天然适合用 Git 逐帧管理 diff审核时只看.txt的变化即可比看图快得多。原理补课背后那几行关键代码标注文件长什么样每行一条标注形如vehicle 2.563 1.341 0.183 4.810 1.860 1.680 0.021字段依次是类型、中心点 x/y/z、长、宽、高、绕 Z 轴偏航角弧度。这个 7 元组在代码里用union同时映射为data[7]数组和具名结构体读取与序列化一行代码搞定与 Apollo 3D 标注格式兼容。初始框怎么来的轴向包围盒AABBfor (auto i : slice) { p1 min(p1, point[i]); // 分别求 x/y/z 最小值 p2 max(p2, point[i]); // 分别求 x/y/z 最大值 }选中点集的 x/y/z 极值组合出的框就是初始框。它简单可靠但不支持任意朝向所以后续才需要adjustToAnchor做贴合修正。地面怎么去的RANSAC 平面拟合平面检测模式把问题交给 PCL 的SACSegmentation随机采样三点拟合候选平面反复迭代把到平面距离小于阈值的点视为内点内点最多的平面即为地平面。理解这一点后你就会明白为什么阈值参数要按数据尺度调——阈值 0.1 与 1.0 的效果天差地别。为什么框不会歪Z 轴旋转限制vtkBoxWidgetRestricted重写了父类的Rotate方法把旋转轴限定为世界坐标 Z 轴。对自动驾驶点云来说目标都是站在地面上的允许任意轴旋转反而会造成框躺倒的灾难。数据变大的时候怎么办性能与扩展方向工具定位是单帧交互标注追求的是轻与快。如果数据集规模上来可以这样用分批标注按序列帧切分任务多人并行最后用脚本合并所有.txt预加载相邻帧把相邻帧的点云先转成 PCD减少重复解析开销关闭不必要的后台程序VTK 渲染对内存敏感点云越大越明显善用 BUILD_TOOLS仓库自带辅助工具目录tool/可以在此基础上扩展批处理脚本。面向未来这个代码结构留好了几个自然扩展点PCLVisualizerExtented已经暴露了面积拾取与键盘事件可以再挂一个预标注回调接入检测模型给框Annotaions的读写接口也可以平滑扩展成 JSON 等更丰富的格式。想进阶的读者建议从visualizer.cpp的交互事件处理读起那是理解整个软件神经系统的入口。最后给你一张可执行的行动清单如果你现在就想把点云标注这件事做利索花十分钟按上文编译出可执行文件用仓库配套的数据或任意 KITTI-bin 点云跑通加载 → 框选 → 生成 → 微调 → 保存完整闭环把快捷键表打印出来贴显示器上刻意练习半天挑一帧含车辆、行人、骑行者的混合场景验证地面去除 多类型标注的组合打法把规范化的.txt输出接到你的检测训练脚本里跑一次真实验证。3D 点云标注的门槛从来不在工具而在于把选、框、调、存这四步练到肌肉记忆。用对工具把精力留给真正重要的判断——哪些点构成一个目标、这个目标该叫什么。这份指南到这儿剩下的交给你的鼠标和下一帧点云。【免费下载链接】point-cloud-annotation-tool项目地址: https://gitcode.com/gh_mirrors/po/point-cloud-annotation-tool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表