一、场景要素语义分割部分的文献阅读笔记
RandLA-Net是一种高效、轻量级的神经网络,其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率,并采用新的局部特征聚合模块有效地保留了几何细节,弥补了随机采样可能丢失关键特征的不足。其中,局部特征聚合器(Local Feature Aggregation,LFA)由局部空间编码、自适应注意力池化以及扩张残差块三个子模块组成。
局部特征聚合器的三个重要子模块:
- 局部空间编码(Local Spatial Encoding,LocSE)。 首先基于K最近邻算法找到各输入点的K个邻近点,然后逐输入点通过一个共享的多层感知机进行相对位置编码,继而进行特征堆叠和特征增强以获取每个输入点的邻域特征。局部空间编码单元显式地嵌入所有邻近点的空间三维坐标,这样可以明确地学习到输入点周围邻域的局部几何模式,从而有利于整个网络有效地学习复杂的局部结构。
- 自适应注意力池化(Attentive Pooling,AP)。首先将局部空间编码所提取到的邻域特征通过共享权重多层感知机和Softmax函数组合进行注意力得分计算,然后依据注意力分数对得到的局部特征进行加权求和以得到更为准确的特征向量组。
- 扩张残差块(Dilated Residual Block,DRB)。一个扩张残差块包含两次局部空间编码模块与自适应注意力池化模块组合,扩张残差块基于短接操作将输入特征和增强后的特征求和输出,其目的在于增加感受野、加快学习速度和持续提升模型精度。
RandLA-Net网络模型的随机采样结合了点概率标记的方法,点概率由距离和搜索权重计算,这样可以防止一个点被多次选中,也可以防止数量多的类别点被多次选中,而数量少的类别点很少被选中。同时,RandLA-Net网络模型在推理过程中会将输入点云进行下采样且记录原始点云与下采样后的最近邻关系,采用距离最近点标签预测一致的原则输出原始输入点云的预测结果,从而加快模型推理速度。
二、RandLA-Net点云语义分割项目代码逐行解析
项目环境配置:
操作系统:Ubuntu 20.04
Python解释器:Python 3.6(本实验中,若版本大于3.6则无法编译compile_op.sh文件)
CUDA版本:9.0
cuDNN版本:7.3.1
Tensorflow框架版本:1.11.0
配置顺序:CUDA/cuDNN -> tensorflow-1.11.0 -> 配置项目依赖及编译.sh文件
百度网盘链接:
https://pan.baidu.com/s/10hrjVJ3RUOlx_50OH2J2gw
模型测试结果可视化:
电力廊道场景应用下的文件结构说明:
① RandLA-Net-master\main_Power.py
该文件实现了Power类,该类主要完成数据集的划分(训练集、验证集和测试集)、生成输入数据流、数据预处理(数据增强、中心化等)等功能。
② RandLA-Net-master\RandLANet.py
该文件实现了Network类,该类主要完成模型超参数设置、模型推理结构、模型训练结构、模型精度评价结构等功能,包含了注意力池化(att_pooling)、近邻点坐标/特征聚合(gather_neighbour)、最近邻插值上采样(nearest_interpolation)、随机采样(random_sample)等编码模块。
③ RandLA-Net-master\tester_Power.py
该文件实现了ModelTester类,该类主要完成模型对测试数据的推理预测与存储对应预测结果点云。
④ RandLA-Net-master\helper_tool.py
该文件主要实现了ConfigPower类、DataProcessing类,二者实现模型训练超参数调试优化和数据预处理(点云数据网格下采样、KD树索引建立、原始点云与下采样后点云最近距离点索引存储)等功能函数。
⑤ RandLA-Net-master\helper_ply.py
该文件实现了.ply存储格式的点云数据读取和写入功能。
⑥ RandLA-Net-master\DataPreds_IOU.py
该文件实现了对点云预测结果的精度评价文件输出(.txt格式)以及预测点云标签三维空间分布数据生成。
⑦ RandLA-Net-master\utils\data_prepare_Power.py
该文件用于将S3DIS DataSet文件树数据集转换为.ply格式存储点云数据。该文件主要完成点云数据.ply格式转换、点云网格下采样、网格下采样后的KD树构建存储、存储原始所有点云在网格下采样点云中距离最近的点索引集合等功能,目的在于加快邻域点搜索和点云上采样还原。
⑧ RandLA-Net-master\data
该文件夹包含input_0.xxx、original_ply和Power三个文件夹。其中,Power文件夹存放S3DIS DataSet文件树结构的电力档段数据集,input_0.xxx存放网格下采样后的点云数据,original_ply存放转换为.ply格式存储的原始点云数据。
⑨ RandLA-Net-master\utils\meta
该文件夹包含anno_paths.txt和class_names.txt两个文件,anno_paths.txt文件存储电力档段的各要素点云集合文件夹名(如Area_0/Annotations),class_names.txt文件顺序存储要素类别名称。该文件夹用于点云类别标签转换赋值。
⑩ RandLA-Net-master\PowerTXT
存放由DataPreds_IOU.py文件生成的预测后三维点云类别标签空间分布数据和自定义精度评价文件(.txt格式)。
⑩① RandLA-Net-master\results\Log_2024-05-03_09-02-24\snapshots
存放模型的训练参数文件,其中checkpoint文件存放了多次保存的模型参数文件名称。
注意事项:
1、本百度网盘不包含任何点云数据,仅为项目代码;
2、电力档段激光点云数据文件与S3DIS Dataset文件树结构一致,具体的数据文件树结构转换代码详见基于PointNet / PointNet++深度学习模型的激光点云语义分割-CSDN博客;
3、由于点云采样的随机性与最近邻点标签上采样还原机制,点云类别标签预测会在每一次测试中体现出差异,因此设置多次验证取,对每个点取最多次预测的类别标签较为准确;
4、具体的命令行训练以及测试流程依据参考资料[1]的Semantic3D部分。
参考资料:
[1] GitHub - QingyongHu/RandLA-Net: 🔥RandLA-Net in Tensorflow (CVPR 2020, Oral & IEEE TPAMI 2021)
[2] RandLa-Net_哔哩哔哩_bilibili
[3] https://zhuanlan.zhihu.com/p/105433460
[4] 从零开始点云语义分割:RandLANet教程-CSDN博客
[5] https://www.tensorflow.org/api_docs/python/tf
[6] conda虚拟环境中安装cuda和cudnn,再也不用头疼版本号的问题了_conda cudnn-CSDN博客
RandLA-Net发表论文
/*1*/ RandLA-Net
https://arxiv.org/abs/1911.11236