工具地址:
https://github.com/jbehley/point_labeler
https://github.com/jbehley/point_labeler
目前开源的点云语义标注工具并不多,这一款算是比较好用且不太会遇到编译问题的。
还有一款是semantic-segmentation-editor
简介
它最大的优点就是:可以同时标注在一定区块内的所有点云。也是SemantiKITT所用的标注工具。
需要提供
- 点云原始文件(.bin格式,放在velodyne文件夹)[必需]
- 每个点的位姿信息(poses.txt)[必需]
- 标定文件 (calib.txt) [必需]
- 标签文件(.label格式,标签的解析方法参考semantickitti,或者看下面的代码,放在labels文件夹)[可选]
- 图像文件(放在image_2文件夹)[可选]
因此文件组织形式如下:
这里需要标定文件主要是因为这个工具还能在标定时,查看对应的图像。不过没有图像数据时,只需要向calib.txt填入:
P0: 1 0 0 0 0 1 0 0 0 0 1 0
P1: 1 0 0 0 0 1 0 0 0 0 1 0
P2: 1 0 0 0 0 1 0 0 0 0 1 0
P3: 1 0 0 0 0 1 0 0 0 0 1 0
Tr: 1 0 0 0 0 1 0 0 0 0 1 0
label文件的读取如下:
label = np.fromfile(filename,dtype=np.uint32)
label = label.reshape((-1))
sem_label = label & 0xFFFF # semantic label in lower half
pred_label = label - 1
inst_label = label >> 16 # instance id in upper half
使用
软件操作
这部分直接看github上的wiki
也可以搜其他博客,基本上都是对改文档的机翻。
位姿问题
这部分主要是针对没有位姿的情况。
这时候有两种方法。
1. 计算位姿
如果真的想同时标注多张点云(这也是官方推荐的),而手里的数据集又没有pose,这里推荐一个slam库-kiss-icp(也是官方推荐的)。安装很方便,跟着库里的教程就可以很容易的得到位姿信息,你只需要提供点云数据。
2. 单张标注
在笔者实际使用时,发现方法1标注起来有点困难,点云太过于密集了,还有一些“重叠”,总之暂时选择了单张标注,也有可能是生成的位姿不够准确
注意:在选择这种方法时,勾选选项卡左侧的 `show single scan` ,反之则不要。
这时候只需要往poses.txt中填入
1 0 0 0 0 1 0 0 0 0 1 0
1 0 0 0 0 1 0 0 0 0 1 0
...
1 0 0 0 0 1 0 0 0 0 1 0
1 0 0 0 0 1 0 0 0 0 1 0
行数需要和点云文件数完全相等,否则会报错。
软件参数讲解
主要就是在bin/settings.cfg中的:
tile size: 150.0
max scans: 300
min range: 0.75
max range: 100
在讲解前需要先了解下该工具的运行逻辑。代码首先会读取位姿,根据tile_size将整一个数据集分为若干段(下图左上角缩略图):
通过点击缩略图的小方块(tile)就可以直接跳到对应tile所包含的点云,不过要先勾选 `follow pose` ,不然很有可能找不到点云在哪了。
有了上述知识,就比较好理解参数:
- tile_size 每个tile的大小,越小分辨率越高。
- max_scan 每个tile中加载的最大点云,注意,这里并不是指文件数,而是对应的点云数目。比如max_scan = 50,程序就为提前在GPU上分配 50 * 150k点云(即每帧默认代表15w点云内存)所需要的内存。在max_scan过小时,会提示你该tile下没有加载全部点云,这时候重新打开就好了
- min_range, max_range 对每一帧的点云进行距离筛选,主要是去掉车自身点云以及太远的,这个看个人需要设置。
对于单帧标注的方案,因为位姿每一帧都相同,因此会导致路径下所有点云都会被加载到一起,这时候GPU内存可能就会吃不消了,我自己的方法是手动把数据集进行切分,即将一部分放到另一个文件夹下。当然也可以向poses.txt中填入不同的位姿信息,从而利用tile完成数据集的分割。不过这个方法笔者没试过。
软件存在的问题
笔者在semanticKITTI数据集sequence00(有官方位姿、标签)上测试时,发现一打开点云非常混乱:
完全无法进行标注,但是一帧一帧看时正常的,目前还不知道原因。(在其他根据kiss-icp算出位姿的数据集则没有这种情况,最多就是上文提到的点云过于密集与重叠)