从零实现RandLA-Net点云分割自定义数据集训练全流程解析当我们需要处理自制点云数据时官方提供的标准流程往往难以直接套用。本文将深入探讨如何针对非标准点云数据如无RGB信息、标签格式不同等调整RandLA-Net框架从数据预处理到模型训练提供完整的解决方案。1. 环境配置与数据准备在开始之前我们需要搭建适合RandLA-Net运行的环境。推荐使用Python 3.7和TensorFlow 1.15虽然RandLA-Net原始版本基于TF1.x但后续我们会讨论如何迁移到TF2.x。基础环境安装conda create -n randla-net python3.7 conda activate randla-net pip install tensorflow-gpu1.15 sklearn open3d对于自定义点云数据常见的问题包括数据格式不一致txt vs. ply缺少RGB颜色信息标签存储方式不同单独文件 vs. 内嵌在点云数据中假设我们的数据格式为每行包含x,y,z,label无RGB信息典型预处理流程如下步骤处理内容注意事项数据加载从txt读取点云检查坐标范围和单位下采样网格下采样减少点数根据点密度调整grid_size标签映射转换标签索引确保类别连续编号数据存储保存为ply格式包含必要属性字段2. 数据预处理代码深度改造原始代码假设数据具有RGB信息且标签存储在单独文件中我们需要对data_prepare.py进行多处修改def adapt_custom_data(pc_path, output_folder, grid_size0.05): # 加载无RGB的txt点云 data np.loadtxt(pc_path) # 格式: x,y,z,label points data[:, :3] labels data[:, -1].astype(np.uint8) # 为无RGB数据填充零值 dummy_colors np.zeros((points.shape[0], 3), dtypenp.uint8) # 网格下采样 sub_points, sub_colors, sub_labels grid_sub_sampling( points.astype(np.float32), dummy_colors, labels, grid_size ) # 保存处理后的数据 write_ply( os.path.join(output_folder, f{os.path.basename(pc_path)[:-4]}.ply), [sub_points, sub_colors, sub_labels], [x, y, z, red, green, blue, class] )关键修改点解析数据加载直接读取包含标签的txt文件而非分离的点云和标签文件颜色处理为无RGB数据创建全零的color通道标签处理保持原始标签索引不变但需确保后续训练配置匹配注意grid_size参数需要根据点云密度调整。对于密集扫描数据如激光雷达建议0.05-0.1对于稀疏数据如摄影测量可能需要0.01-0.03。3. 模型配置与训练集划分在main.py中我们需要调整几个关键部分类别定义修改self.label_to_names { 0: unclassified, 1: ground, 2: vegetation, 3: building # 根据实际标签添加更多类别 } self.num_classes len(self.label_to_names)数据集划分策略# 随机划分而非固定文件名 all_files [f for f in os.listdir(self.original_folder) if f.endswith(.txt)] np.random.shuffle(all_files) self.val_split all_files[:int(0.2*len(all_files))] # 20%验证 self.test_split all_files[int(0.2*len(all_files)):int(0.3*len(all_files))] # 10%测试对于类别不平衡问题可调整损失权重# 根据各类别点数自动计算权重 class_counts np.bincount(train_labels) self.class_weight 1 / (class_counts 1e-6) self.class_weight self.class_weight / np.sum(self.class_weight)4. 训练优化与调试技巧实际训练中可能遇到的典型问题及解决方案常见错误排查表错误现象可能原因解决方案损失不下降学习率过高/过低尝试1e-4到1e-2范围调整内存溢出点云过大/批次过大减小batch_size或grid_size预测全为同一类类别极度不平衡调整class_weight或采样策略验证集性能差数据划分不合理检查数据分布是否一致训练参数优化建议# 在config.py中调整关键参数 cfg { batch_size: 4, # 根据GPU内存调整 max_epoch: 100, # 足够收敛的轮次 learning_rate: 1e-3, # 初始学习率 decay_rate: 0.95, # 学习率衰减 decay_step: 2e5, # 衰减步长 augment_scale_anisotropic: True, # 数据增强 augment_symmetries: [True, True, False] }进阶技巧使用KNN插值将预测结果映射回原始点云添加CRF后处理提升边界精度在稀疏区域采用非均匀采样策略实际项目中我发现将grid_size设置为点云平均间距的2-3倍效果最佳。对于高密度区域可以分块处理后再合并结果这样既保证细节又控制内存消耗。