目的:通过阅读源码了解标签映射方法
重点应该是第八部分和第九部分
主函数文件visualize.py
/====================/
代码第一部分
if name == ‘main’: (含义:如果我直接用./visualize.py 运行visualize.py 那么运行该部分内的代码,如果visualize.py 被另一个xxx.py 文件导入,我运行xxx.py文件 那么就不运行该部分代码)
parser = argparse.ArgumentParser(“./visualize.py”) (这个函数是命令行解析函数,通过该函数可以在终端向程序输入参数,或者从配置文件中读取参数)
比如 visualize.py 的运行命令 ./visualize.py --sequence 11 --dataset /media/pf/Elements/DATA/Snowy_Data/Open_dataset/WADS/11_20211109T212945Z_001/
–sequence 代表要读的序列号 该序列号文件下 存放 两个文件 labels velodyne
–dataset 代表序列号文件所在的路径 如 在/media/pf/Elements/DATA/Snowy_Data/Open_dataset/WADS/11_20211109T212945Z_001/ 这个路径下有一个 文件名为11(序列号)的文件,这个文件下放着标签文件夹和点云bin文件夹
就可视化来说 只需用到该部分中的–sequence --dataset
该部分最后
FLAGS, unparsed = parser.parse_known_args()(这个函数就算将传入的参数保存起来并传给FLAGS,没用到的参数就传给unparsed)
/========================/
第二部分是参数的打印
有效的参数就两个
print(“Dataset”, FLAGS.dataset)
print(“Sequence”, FLAGS.sequence)
/====================/
第三部分 读取配置文件
CFG = yaml.safe_load(open(FLAGS.config, ‘r’)) //semantic-kitti.yaml
疑问:配置文件中的content 是如何获得的。
降雪点 对应 标签 0 : “unlabeled” 0 : [0, 0, 0]黑色
/====================/
第四部分 固定序列名,判断序列文件下的点云文件夹是否存在
FLAGS.sequence = ‘{0:02d}’.format(int(FLAGS.sequence)) (‘{:02d}’.format(i)表示将i变为两位十进制数字的字符串,不够两位用0填充。)
scan_paths = os.path.join(FLAGS.dataset, “sequences”,
FLAGS.sequence, “velodyne”) (含义:/media/pf/Elements/DATA/Snowy_Data/Open_dataset/WADS/11_20211109T212945Z_001/ sequences/11/velodyne)
if os.path.isdir(scan_paths):
/========================/
第五部分 将点云所有bin文件名 填充到一个列表中
os.walk通过在目录树中游走输出在目录中的文件名,向上或者向下。
scan_names.sort()将文件名按顺序排列(由小到大)
//
第六部分获取对应的标签labels文件名
if not FLAGS.ignore_semantics: (ignore_semantics 默认为 false if not 返回true)
if FLAGS.predictions is not None:(FLAGS.predictions 默认为 FALSE 条件返回 false ,因此获取手工标签所在路径;如果FLAGS.predictions是 true 就读取预测后获得标签的路径)
label_paths = os.path.join(FLAGS.dataset, “sequences”,
FLAGS.sequence, “labels”)
判断标签路径是否存在
label_names = [os.path.join(dp, f) for dp, dn, fn in os.walk(
os.path.expanduser(label_paths)) for f in fn]
label_names.sort() (读取和数据集文件并列的手动标注的标签,并排序)
//
第七部分 检查标签文件数与bin文件数是否一致
if not FLAGS.ignore_safety:
assert(len(label_names) == len(scan_names))
//
第八部分 判断是否需要语义 不需要则直接投影 // 需要则加载配置文件中的BGR配置 再投影
if FLAGS.ignore_semantics:
scan = LaserScan(project=True) # project all opened scans to spheric proj
else:
color_dict = CFG[“color_map”]
nclasses = len(color_dict)
scan = SemLaserScan(nclasses, color_dict, project=True)
重点要学习SemLaserScan这个函数,它实现了投影功能,scan 是SemLaserScan实例化后的一个对象
//
第九部分 创建可视化
需要语义 semantics = true
探索SemLaserScan: Python中点云的语义标签映射与可视化

本文详细解读了visualize.py中的SemLaserScan类,介绍了如何通过命令行参数处理、配置文件加载,以及如何使用标签映射实现点云的语义和实例色彩渲染。核心内容涉及点云文件处理、标签读取与投影,以及LaserScanVis类中的可视化功能。
最低0.47元/天 解锁文章
4479

被折叠的 条评论
为什么被折叠?



