1.软件的安装
    (1)下载后随便你解压到那个文件夹下(软件github地址)
    github链接
    (2)在终端中运行:

curl https://install.meteor.com/ | sh
cd semantic-segmentation-editor-master
meteor npm install
meteor npm start #安装好后,以后每次运行,只需执行该命令(必须移动到软件文件夹下)

启动完成后你的终端会如下显示,最后一行是一个网址,用浏览器打开就能进入软件的标注界面了。

启动该软件时,会自动的在Home目录下创建 sse-images 和 sse-internal两个文件夹,其中第一个存放原始数据需手动放入,第二个自动动存放标注后的数据。

在浏览器中打开http://localhost:3000/将如下图所示,可以看到浏览器中显示了我们放入 sse-images 文件夹中的图片。

2.软件功能界面介绍
点击任意一张pcd图片,将会出现如下的主界面:

2.1 软件操作介绍
(1)按住鼠标左键并滑动鼠标可旋转视图
(2)点击鼠标右键可选择想要分类的点云,下面是选取完成后的情况:

(3)点击左侧标签对选取好的点云进行分类,这里随意选择了‘Road’,下面是标记完成的情况:

通过以上三步,就能完成相应的标注工作,标注完成后,点击Road右侧按钮可对标注完成的点云进行隐藏,方便我标注其他点云,美中不足的是标签类别是固定的,但提供了这么多标签,一般情况下应该够用了!

再介绍一些细节的功能,让大家更深入的了解该软件
选择工具

虽然可以通过右键点击选择想要标注的点云,但效率太慢,所以这里提供了区域框选,只需长按右键便可生成框选区域。包括三种框选模式:
(1)H:可画出任意曲线,自动框选曲线内的所有点云
(2)J:可画出矩形框,自动框选矩形框内所有点云
(3)K:可画出圆形框,自动框选圆形框内所有点云
选择模式

在标注时,会有一些点被意外的框选进来,我们需要对其删除。这里提供了三种选择模式:
(1)Y:该模式下画框只能选择点云(点云变为红色)
(2)U:该模式下画框,对已经选择上的点云会删除(点云变为白色),对未选择上的点云会选择上(点云变为红色)。
(3)I:该模式下画框只能删除以选择的点云(点云变为白色)
视角的选择
在标注时,很难通过鼠标滑动旋转到最方便标注的视角。这时可以通过按住Ctrl,然后用鼠标左键点击想要标注的点云区域,将会自动的旋转到比较方便的标注视角,然后通过滑轮放大或缩小到合适的比例进行标注。

我所用到的大概就是以上的功能,如果大家对这个软件有更深入的了解,可以在评论区分享出来,让大家学习!

3.标注后数据介绍
假设已经完成了标注(我是将所有点云全部标注为‘Road’,仅作示意),你会发现在 sse-internal 文件夹中会生成一些文件,但这些文件(我也不认识)总之不是我们想要的标注完成的文件,真正的标注文件需要手动下载(下图中右边按钮)。

我们把下载下来的pcd文件与原pcd文件进行对比可以发现,每个坐标点xyz之后都被标记为0(因为‘Road’位于第0个位置)相当于我们对点云完成了分类,了解过深度学习技术的朋友应该知道,我们可以利用这个0-标签对其做分割、分类等操作。但该软件有个BUG,标注后的pcd文件,点云个数变为原本的3倍,需要手动更改!

深度学习中,最繁杂且缺少技术含量的事情应该就是为采集的数据上标签。工欲善其事必先利其器,好的标注方法势必会让我们的工作变得更加高效。这里就介绍一种较为方便的点云标注工具。

代码的开源地址:https://github.com/MR-520DAI/semantic-segmentation-editor

安装和使用教程:https://blog.csdn.net/qq_43049432/article/details/99314008

上述博客已经介绍的十分清楚了,可以放心食用。

手动标记保存之后,得到的pcd文件前后如下图所示:

值得注意的是,该软件的一个缺陷就是在进行标记及保存之后的点云文件是不带颜色信息的(该工具原始目标任务是针对室外激光雷达点云的),颜色信息只能通过后处理手段加上去。此外,如果使用PCL自带的XYZL点云类型进行显示可视化需要注意:保存得到的pcd文件数据类型为(TYPE F F F I I)见上图有右侧所示。我在实际读取过程中就发现会报错,解决办法是将(TYPE F F F I I 批量替换成 TYPE F F F U U).

import os
from os import listdir, pathpath_str = 'E:\\标注原始文件'  # your directory path
txts = [f for f in listdir(path_str)if f.endswith('.pcd') and path.isfile(path.join(path_str, f))]for txt in txts:with open(os.path.join(path_str, txt), 'r') as f:lines = f.readlines()lines[3] = lines[3].replace('I','U')with open(os.path.join(path_str,os.path.splitext(txt)[0]+".pcd"), 'w') as f:f.write(''.join(lines[0:]))

终于熬到了最后,接下来就介绍如何将标记好的点云数据集,生成网络的输入训练数据(或如何融合到现有的数据集中进行训练)

1、PCD文件生成TXT文件
这一步主要是将PCD文件的头信息进行去掉,得到只含有点坐标,颜色和标签的数据文件。

import os
from os import listdir, pathpath_str = 'E:\\标注原始文件'  # your directory path
txts = [f for f in listdir(path_str)if f.endswith('.txt') and path.isfile(path.join(path_str, f))]for txt in txts:with open(os.path.join(path_str, txt), 'r') as f:lines = f.readlines()with open(os.path.join(path_str,os.path.splitext(txt)[0]+".txt"), 'w') as f:f.write(''.join(lines[11:]))

2、中心化和尺度缩放
这一步的主要目的是将点云中心移动到坐标原点,并将所有点的坐标的绝对值限制在1以内(对于小型数据集仿照的ShapeNet数据格式)

# 输入的data数据为点云的坐标信息和标签信息(或者额外的颜色信息与法向量信息)
def change_scale(data):#centre xyz_min = np.min(data[:,0:3],axis=0)xyz_max = np.max(data[:,0:3],axis=0)xyz_move = xyz_min+(xyz_max-xyz_min)/2data[:,0:3] = data[:,0:3]-xyz_move#scalescale = np.max(data[:,0:3])data[:,0:3] = data[:,0:3]/scalereturn data

3、点云的降采样
这一步的主要目的是将每个点云文件点进行规范化到固定的点数,本文中我们采用随机采样的方式。当然如果有好的想法,采样的方式是可以按照需求进行改进的。

def sample_data(data, num_sample):""" data is in N x ...we want to keep num_samplexC of them.if N > num_sample, we will randomly keep num_sample of them.if N < num_sample, we will randomly duplicate samples."""N = data.shape[0]if (N == num_sample):return data, range(N)elif (N > num_sample):sample = np.random.choice(N, num_sample)return data[sample, ...], sampleelse:sample = np.random.choice(N, num_sample-N)dup_data = data[sample, ...]return np.concatenate([data, dup_data], 0), list(range(N))+list(sample)

4、划分训练集与测试集并保存为.H5文件
这一步就是将处理好的数据划分为训练集和测试集,并将其保存为.H5文件。

# train and test number, save data
def save_data(data, ratio):""" data is in N x 4 (XYZL) ...ratio of training set to test set if ratio = 0.8  train data is 80%, test data is 20%"""if not os.path.exists('train.h5'):with h5py.File('train.h5') as f:f['data'] = data[0:int(data.shape[0]*ratio),0:3]f['labels'] = data[0:int(data.shape[0]*ratio),4]if not os.path.exists('test.h5'):with h5py.File('test.h5') as f:f['data'] = data[int(data.shape[0]*ratio):,0:3]f['labels'] = data[int(data.shape[0]*ratio):,4]

到此就完成。当然上面的代码只是方法的演示,针对不同数据需要进行不同的调整。最后给一个相对完整的代码,同样是仅供参考:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 25 21:53:03 2019
@author: xxx
"""
import os
import sys
import numpy as np
import h5py
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)def getDataFiles(list_filename):return [line.rstrip() for line in open(list_filename)]def loadDataFile(path):data = np.loadtxt(path)point_xyz = data[:,0:3]# 下面的ins_label, sem_label和obj_lable # 需要根据自己的实际进行赋值(以下只是我的一个示例,就不再解释)ins_label = (data[:,3]).astype(int)find_index = np.where(ins_label>=1)sem_label = np.zeros((data.shape[0]), dtype=int)obj_lable = data[:,4]sem_label[find_index] = obj_lable[find_index]+1return point_xyz, ins_label, sem_label, obj_labledef change_scale(data):#centre xyz_min = np.min(data[:,0:3],axis=0)xyz_max = np.max(data[:,0:3],axis=0)xyz_move = xyz_min+(xyz_max-xyz_min)/2data[:,0:3] = data[:,0:3]-xyz_move#scalescale = np.max(data[:,0:3])
#    change_data[:,0:3] = data[:,0:3]/scale
#    return data[:,0:3]/scalereturn data[:,0:3]def sample_data(data, num_sample):""" data is in N x ...we want to keep num_samplexC of them.if N > num_sample, we will randomly keep num_sample of them.if N < num_sample, we will randomly duplicate samples."""N = data.shape[0]if (N == num_sample):return data, range(N)elif (N > num_sample):sample = np.random.choice(N, num_sample)return data[sample, ...], sampleelse:sample = np.random.choice(N, num_sample-N)dup_data = data[sample, ...]return np.concatenate([data, dup_data], 0), list(range(N))+list(sample)if __name__ == "__main__":DATA_FILES =getDataFiles(os.path.join(BASE_DIR, 'file_path.txt'))num_sample = 4096*2DATA_ALL = []for fn in range(len(DATA_FILES)):print(DATA_FILES[fn])current_data, current_ins_label, current_sem_label,current_obj_lable = loadDataFile(DATA_FILES[fn])change_data = change_scale(current_data)
#        data_sample,index = sample_data(change_data, num_sample)data_label = np.column_stack((change_data,current_ins_label,current_sem_label,current_obj_lable))DATA_ALL.append(data_label)output = np.vstack(DATA_ALL)output = output.reshape(-1,num_sample,6)# 这里没将训练测试集单独分开        if not os.path.exists('4096_4096_no_scale.h5'):with h5py.File('4096_4096_no_scale.h5') as f:
#            sample = np.random.choice(8192, 2048)f['data'] = output[:,:,0:3]f['pid'] = output[:,:,3]f['seglabel'] = output[:,:,4]f['obj'] = output[:,:,5]

参考链接:https://blog.csdn.net/qq_43049432/article/details/99314008

点云语义分割标注工具及生成训练数据相关推荐

  1. 【工具】Semantic Segmentation Editor 语义分割标注工具

    [工具]Semantic Segmentation Editor 语义分割标注工具 一.简介 二.界面 1.工具栏 ① 上方横排工具栏 Ctrl + Z 撤销 Ctrl + Y 重做 Alt 操纵工具 ...

  2. 语义分割标注工具——labelme

    参考下面网址: 感谢up主:https://www.bilibili.com/video/BV1xT4y1j7A9?from=search&seid=2903997967250679674 在 ...

  3. python工具方法 18 labelme语义分割标注数据批量转换为png

    本实例代码主要使用labelme.utils.shapes_to_label方法实现批量将将labelme的语义分割标注数据转换为图片,支持将标注保存为实例分割训练图.语义分割训练图.语义分割+原图效 ...

  4. 利用深度学习的点云语义分割(一)

                                               Semantic Segmentation of Point Clouds using Deep Learning ...

  5. 三维点云语义分割总览

    点云PCL免费知识星球,点云论文速读. 标题:三维点云语义分割总览 作者:吉祥街 欢迎各位加入免费知识星球,获取PDF文档,欢迎转发朋友圈,分享快乐. 希望有更多的小伙伴能够加入我们,一起开启论文阅读 ...

  6. 激光雷达:点云语义分割算法

    作者 | 巫婆塔里的工程师@知乎 来源 | https://zhuanlan.zhihu.com/p/412161451 编辑 | 焉知智能汽车 1. 前言 之前的文章中介绍了基于LiDAR点云的物体 ...

  7. 大场景三维点云语义分割模型

    大场景三维点云语义分割模型 基于2D的方法 SqueezeSeg系列 一.简介 二.核心思路总结 三.要点分析 四.总结 VIASEG: VISUAL INFORMATION ASSISTED LIG ...

  8. CVPR2020:4D点云语义分割网络(SpSequenceNet)

    CVPR2020:4D点云语义分割网络(SpSequenceNet) SpSequenceNet: Semantic Segmentation Network on 4D Point Clouds 论 ...

  9. 深度学习点云语义分割:CVPR2019论文阅读

    深度学习点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...

最新文章

  1. 常用和不常用端口一览表收藏
  2. 戴尔服务器r210显示3,Dell服务器R210
  3. 9.9学python靠谱吗-宅家亲测:9.9的python体验课,到底值不值?
  4. 做毕设时遇到的一些问题,以及一些小技巧
  5. 【AS3代码】添加/删除XML子元素及属性
  6. python定时发送邮件_Python3实现带附件的定时发送邮件功能
  7. 【Eviews】第九周实验-二次/对数拟合、预测
  8. antdesignvue upload vue3个人笔记待更新
  9. java 反射 本类,关于Java反射中基本类型的class有关问题
  10. 【Flink】Flink 资源相关 Slot SlotPool
  11. 马云曾卖鲜花,柳传志卖冰箱!摆摊吧,程序员!
  12. Windows 2008-TS测试-TS GateWay
  13. 论文阅读笔记——Internet的流量管制(Traffic Policing)
  14. 程序员应该如何学习线性代数
  15. 2021最新阿里代码规范(前端篇)
  16. 【网络安全】物理层(网线、接口、信号、MB/s和Mb/s)
  17. matlab怎么栅格化地图,用栅格化的思维进行地图散点数据绘制
  18. 职高学计算机考大学容易吗,男生读职高什么专业好 能不能考大学
  19. 【LintCode 题解】小米面试算法题:搜索旋转排序数组
  20. 软件构造第11次课复习——工厂模式

热门文章

  1. 《第一行代码》总结之实战酷欧天气、发布应用(九)
  2. Codis学习笔记--Java连接codis
  3. u盘计算机无法找到该项目,在电脑中删除文件时提示“找不到该项目”怎么办?...
  4. 原创 | 自学编程,我该如何寻找自学资源?
  5. 如何将视频压缩?快来看看这些方法
  6. IO流之 File 类和字节流
  7. 全球无缝隙天气预报产品体系
  8. eclipse指定运行环境jdk的路径
  9. 在QQ通讯录之前拦截短信
  10. 密码必须包含至少一个大写一个小写一个数字一个特殊字符的正则