当前位置:   article > 正文

MMdet3d在s3dis数据集上面完成pointnet++的训练及其可视化_pts_semantic_mask_path = results['pts_semantic_mas

pts_semantic_mask_path = results['pts_semantic_mask_path'] keyerror: 'pts_se

一.S3dis数据集

        首先提供一个s3dis数据集链接: https://pan.baidu.com/s/13_MtdvoYWj1a358QoLecNg 提取码: AJZY

二.修改indoor3d_util.py函数内容为如下:

  1. def export(anno_path, out_filename):
  2. """将原始数据集的文件转化为点云、语义分割标签和实例分割掩码文件。
  3. 我们将同一房间中所有实例的点进行聚合。
  4. 参数列表:
  5. anno_path (str): 标注信息的路径,例如 Area_1/office_2/Annotations/
  6. out_filename (str): 保存点云和标签的路径
  7. file_format (str): txt 或 numpy,指定保存的文件格式
  8. 注意:
  9. 点云在处理过程中被整体移动了,保存下的点最小位于原点 (即没有负数坐标值)
  10. """
  11. points_list = []
  12. ins_idx = 1 # 实例标签从 1 开始,因此最终实例标签为 0 的点就是无标注的点
  13. # `anno_path` 的一个例子:Area_1/office_1/Annotations
  14. # 其中以 txt 文件存储有该房间中所有实例物体的点云
  15. for f in glob.glob(osp.join(anno_path, '*.txt')):
  16. # get class name of this instance
  17. one_class = osp.basename(f).split('_')[0]
  18. if one_class not in class_names: # 某些房间有 'staris' 类物体
  19. one_class = 'clutter'
  20. points = np.loadtxt(f)
  21. labels = np.ones((points.shape[0], 1)) * class2label[one_class]
  22. ins_labels = np.ones((points.shape[0], 1)) * ins_idx
  23. ins_idx += 1
  24. points_list.append(np.concatenate([points, labels, ins_labels], 1))
  25. data_label = np.concatenate(points_list, 0) # [N, 8], (pts, rgb, sem, ins)
  26. # 将点云对齐到原点
  27. xyz_min = np.amin(data_label, axis=0)[0:3]
  28. data_label[:, 0:3] -= xyz_min
  29. np.save(f'{out_filename}_point.npy', data_label[:, :6].astype(np.float32))
  30. np.save(f'{out_filename}_sem_label.npy', data_label[:, 6].astype(np.int64))
  31. np.save(f'{out_filename}_ins_label.npy', data_label[:, 7].astype(np.int64))

上述代码中,我们读取 Annotations/ 下的所有点云实例,将其合并得到整体房屋的点云,同时生成语义/实例分割的标签。 在提取完每个房间的数据后,点云、语义分割和实例分割的标签文件应以 .npy 的格式被保存下来。 

三.运行如下

1.首先运行如下指令进行进行 S3DIS 数据的提取。

python collect_indoor3d_data.py

提取完后目录如下:

  1. mmdetection3d
  2. ├── mmdet3d
  3. ├── tools
  4. ├── configs
  5. ├── data
  6. │ ├── s3dis
  7. │ │ ├── meta_data
  8. │ │ ├── Stanford3dDataset_v1.2_Aligned_Version
  9. │ │ │ ├── Area_1
  10. │ │ │ │ ├── conferenceRoom_1
  11. │ │ │ │ ├── office_1
  12. │ │ │ │ ├── ...
  13. │ │ │ ├── Area_2
  14. │ │ │ ├── Area_3
  15. │ │ │ ├── Area_4
  16. │ │ │ ├── Area_5
  17. │ │ │ ├── Area_6
  18. │ │ ├── indoor3d_util.py
  19. │ │ ├── collect_indoor3d_data.py
  20. │ │ ├── README.md

2.创建数据集

  1. python tools/create_data.py s3dis --root-path ./data/s3dis \
  2. --out-dir ./data/s3dis --extra-tag s3dis

上述指令首先读取以 .npy 格式存储的点云、语义分割和实例分割标签文件,然后进一步将它们以 .bin 格式保存。 同时,每个区域 .pkl 格式的信息文件也会被保存下来。

数据预处理后的目录结构如下所示:

  1. s3dis
  2. ├── meta_data
  3. ├── indoor3d_util.py
  4. ├── collect_indoor3d_data.py
  5. ├── README.md
  6. ├── Stanford3dDataset_v1.2_Aligned_Version
  7. ├── s3dis_data
  8. ├── points
  9. │ ├── xxxxx.bin
  10. ├── instance_mask
  11. │ ├── xxxxx.bin
  12. ├── semantic_mask
  13. │ ├── xxxxx.bin
  14. ├── seg_info
  15. │ ├── Area_1_label_weight.npy
  16. │ ├── Area_1_resampled_scene_idxs.npy
  17. │ ├── Area_2_label_weight.npy
  18. │ ├── Area_2_resampled_scene_idxs.npy
  19. │ ├── Area_3_label_weight.npy
  20. │ ├── Area_3_resampled_scene_idxs.npy
  21. │ ├── Area_4_label_weight.npy
  22. │ ├── Area_4_resampled_scene_idxs.npy
  23. │ ├── Area_5_label_weight.npy
  24. │ ├── Area_5_resampled_scene_idxs.npy
  25. │ ├── Area_6_label_weight.npy
  26. │ ├── Area_6_resampled_scene_idxs.npy
  27. ├── s3dis_infos_Area_1.pkl
  28. ├── s3dis_infos_Area_2.pkl
  29. ├── s3dis_infos_Area_3.pkl
  30. ├── s3dis_infos_Area_4.pkl
  31. ├── s3dis_infos_Area_5.pkl
  32. ├── s3dis_infos_Area_6.pkl
  • points/xxxxx.bin:提取的点云数据

  • instance_mask/xxxxx.bin:每个点云的实例标签,取值范围为 [0, ${实例个数}],其中 0 代表未标注的点。

  • semantic_mask/xxxxx.bin:每个点云的语义标签,取值范围为 [0, 12]。

  • s3dis_infos_Area_1.pkl:区域 1 的数据信息,每个房间的详细信息如下:

    • info[‘point_cloud’]: {‘num_features’: 6, ‘lidar_idx’: sample_idx}.

    • info[‘pts_path’]: points/xxxxx.bin 点云的路径。

    • info[‘pts_instance_mask_path’]: instance_mask/xxxxx.bin 实例标签的路径。

    • info[‘pts_semantic_mask_path’]: semantic_mask/xxxxx.bin 语义标签的路径。

  • seg_info:为支持语义分割任务所生成的信息文件。

    • Area_1_label_weight.npy:每一语义类别的权重系数。因为 S3DIS 中属于不同类的点的数量相差很大,一个常见的操作是在计算损失时对不同类别进行加权 (label re-weighting) 以得到更好的分割性能。

    • Area_1_resampled_scene_idxs.npy:每一个场景 (房间) 的重采样标签。在训练过程中,我们依据每个场景的点的数量,会对其进行不同次数的重采样,以保证训练数据均衡。

3.训练的指令

python tools/train.py configs/pointnet2/pointnet2_ssg_2xb16-cosine-50e_s3dis-seg.py

4.测试的指令

python tools/test.py configs/pointnet2/pointnet2_ssg_2xb16-cosine-50e_s3dis-seg.py work_dirs/pointnet2_ssg_2xb16-cosine-50e_s3dis-seg/epoch_50.pth

5.可视化指令

python demo/pcd_seg_demo.py data/s3dis/points/Area_1_conferenceRoom_1.bin configs/pointnet2/pointnet2_ssg_2xb16-cosine-50e_s3dis-seg.py work_dirs/pointnet2_ssg_2xb16-cosine-50e_s3dis-seg/epoch_50.pth --show

 data的测试是随机挑选的,我是选择了points的一个bin文件进行的测试.

如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/304061
推荐阅读
相关标签
  

闽ICP备14008679号