赞
踩
一.S3dis数据集
首先提供一个s3dis数据集链接: https://pan.baidu.com/s/13_MtdvoYWj1a358QoLecNg 提取码: AJZY
二.修改indoor3d_util.py函数内容为如下:
- def export(anno_path, out_filename):
- """将原始数据集的文件转化为点云、语义分割标签和实例分割掩码文件。
- 我们将同一房间中所有实例的点进行聚合。
- 参数列表:
- anno_path (str): 标注信息的路径,例如 Area_1/office_2/Annotations/
- out_filename (str): 保存点云和标签的路径
- file_format (str): txt 或 numpy,指定保存的文件格式
- 注意:
- 点云在处理过程中被整体移动了,保存下的点最小位于原点 (即没有负数坐标值)
- """
- points_list = []
- ins_idx = 1 # 实例标签从 1 开始,因此最终实例标签为 0 的点就是无标注的点
-
- # `anno_path` 的一个例子:Area_1/office_1/Annotations
- # 其中以 txt 文件存储有该房间中所有实例物体的点云
- for f in glob.glob(osp.join(anno_path, '*.txt')):
- # get class name of this instance
- one_class = osp.basename(f).split('_')[0]
- if one_class not in class_names: # 某些房间有 'staris' 类物体
- one_class = 'clutter'
- points = np.loadtxt(f)
- labels = np.ones((points.shape[0], 1)) * class2label[one_class]
- ins_labels = np.ones((points.shape[0], 1)) * ins_idx
- ins_idx += 1
- points_list.append(np.concatenate([points, labels, ins_labels], 1))
-
- data_label = np.concatenate(points_list, 0) # [N, 8], (pts, rgb, sem, ins)
- # 将点云对齐到原点
- xyz_min = np.amin(data_label, axis=0)[0:3]
- data_label[:, 0:3] -= xyz_min
-
- np.save(f'{out_filename}_point.npy', data_label[:, :6].astype(np.float32))
- np.save(f'{out_filename}_sem_label.npy', data_label[:, 6].astype(np.int64))
- np.save(f'{out_filename}_ins_label.npy', data_label[:, 7].astype(np.int64))
上述代码中,我们读取 Annotations/
下的所有点云实例,将其合并得到整体房屋的点云,同时生成语义/实例分割的标签。 在提取完每个房间的数据后,点云、语义分割和实例分割的标签文件应以 .npy
的格式被保存下来。
三.运行如下
1.首先运行如下指令进行进行 S3DIS 数据的提取。
python collect_indoor3d_data.py
提取完后目录如下:
- mmdetection3d
- ├── mmdet3d
- ├── tools
- ├── configs
- ├── data
- │ ├── s3dis
- │ │ ├── meta_data
- │ │ ├── Stanford3dDataset_v1.2_Aligned_Version
- │ │ │ ├── Area_1
- │ │ │ │ ├── conferenceRoom_1
- │ │ │ │ ├── office_1
- │ │ │ │ ├── ...
- │ │ │ ├── Area_2
- │ │ │ ├── Area_3
- │ │ │ ├── Area_4
- │ │ │ ├── Area_5
- │ │ │ ├── Area_6
- │ │ ├── indoor3d_util.py
- │ │ ├── collect_indoor3d_data.py
- │ │ ├── README.md
2.创建数据集
- python tools/create_data.py s3dis --root-path ./data/s3dis \
- --out-dir ./data/s3dis --extra-tag s3dis
上述指令首先读取以 .npy
格式存储的点云、语义分割和实例分割标签文件,然后进一步将它们以 .bin
格式保存。 同时,每个区域 .pkl
格式的信息文件也会被保存下来。
数据预处理后的目录结构如下所示:
- s3dis
- ├── meta_data
- ├── indoor3d_util.py
- ├── collect_indoor3d_data.py
- ├── README.md
- ├── Stanford3dDataset_v1.2_Aligned_Version
- ├── s3dis_data
- ├── points
- │ ├── xxxxx.bin
- ├── instance_mask
- │ ├── xxxxx.bin
- ├── semantic_mask
- │ ├── xxxxx.bin
- ├── seg_info
- │ ├── Area_1_label_weight.npy
- │ ├── Area_1_resampled_scene_idxs.npy
- │ ├── Area_2_label_weight.npy
- │ ├── Area_2_resampled_scene_idxs.npy
- │ ├── Area_3_label_weight.npy
- │ ├── Area_3_resampled_scene_idxs.npy
- │ ├── Area_4_label_weight.npy
- │ ├── Area_4_resampled_scene_idxs.npy
- │ ├── Area_5_label_weight.npy
- │ ├── Area_5_resampled_scene_idxs.npy
- │ ├── Area_6_label_weight.npy
- │ ├── Area_6_resampled_scene_idxs.npy
- ├── s3dis_infos_Area_1.pkl
- ├── s3dis_infos_Area_2.pkl
- ├── s3dis_infos_Area_3.pkl
- ├── s3dis_infos_Area_4.pkl
- ├── s3dis_infos_Area_5.pkl
- ├── 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文件进行的测试.
如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。