From 16c9a2f51035d9dcb29c63168b4ff68aab88eb3b Mon Sep 17 00:00:00 2001 From: wHao-Wu Date: Tue, 27 Jul 2021 11:54:18 +0800 Subject: [PATCH 1/2] [Doc] Add tutorials/customize_dataset.md --- docs_zh-CN/tutorials/customize_dataset.md | 359 +++++++++++++++++++++- 1 file changed, 358 insertions(+), 1 deletion(-) diff --git a/docs_zh-CN/tutorials/customize_dataset.md b/docs_zh-CN/tutorials/customize_dataset.md index 643eccd34d..e3b0147c9b 100644 --- a/docs_zh-CN/tutorials/customize_dataset.md +++ b/docs_zh-CN/tutorials/customize_dataset.md @@ -1 +1,358 @@ -# 教程 2: 自定义数据集 \ No newline at end of file +# 教程 2: 自定义数据集 + +## 支持新的数据格式 + +为了支持新的数据格式,可以通过将新数据转换为现有的数据形式,或者直接将新数据转换为能够被模型直接调用的中间格式。此外,可以通过数据离线转换的方式(在调用脚本进行训练之前完成)或者通过数据在线转换的格式(调用新的数据集并在训练过程中进行数据转换)。在 MMDetection3D 中,对于那些不便于在线读取的数据,我们建议通过离线转换的方法将其转换为 KTIIT 数据集的格式,因此只需要在转换后修改配置文件中的数据标注文件的路径和标注数据所包含类别;对于那些与现有数据格式相似的新数据集,如 Lyft 数据集和 nuScenes 数据集,我们建议直接调用数据转换器和现有的数据集类别信息,在这个过程中,可以考虑通过继承的方式来减少实施数据转换的负担。 + +### 将新数据的格式转换为现有数据的格式 + +对于那些不便于在线读取的数据,最简单的方法是将新数据集的格式转换为现有数据集的格式。 + +通常来说,我们需要一个数据转换器来重新组织原始数据的格式,并将对应的标注格式转换为 KITTI 数据集的风格;当现有数据集与新数据集存在差异时,可以通过定义一个从现有数据集类继承而来的新数据集类来处理具体的差异;最后,用户需要进一步修改配置文件来调用新的数据集。可以参考如何通过将 Waymo 数据集转换为 KITTI 数据集的风格并进一步训练模型的[例子](https://mmdetection3d.readthedocs.io/en/latest/2_new_data_model.html)。 + +### 将新数据集的格式转换为一种当前可支持的中间格式 + +如果不想采用将标注格式转为为现有格式的方式,也可以通过以下的方式来完成新数据集的转换。 +实际上,我们将所支持的所有数据集都转换成 pickle 文件的格式,这些文件整理了所有应用于模型训练和推理的有用的信息。 + +数据集的标注信息是通过一个字典列表来描述的,每个字典包含对应数据帧的标注信息。 +下面展示了一个基础例子(应用在 KITTI 数据集上),每一帧包含了几项关键字,如 `image`、`point_cloud`、`calib` 和 `annos` 等。只要能够根据这些信息来直接读取到数据,其原始数据的组织方式就可以不同于现有的数据组织方式。通过这种设计,我们提供一种可替代的方案来自定义数据集。 + +```python + +[ + {'image': {'image_idx': 0, 'image_path': 'training/image_2/000000.png', 'image_shape': array([ 370, 1224], dtype=int32)}, + 'point_cloud': {'num_features': 4, 'velodyne_path': 'training/velodyne/000000.bin'}, + 'calib': {'P0': array([[707.0493, 0. , 604.0814, 0. ], + [ 0. , 707.0493, 180.5066, 0. ], + [ 0. , 0. , 1. , 0. ], + [ 0. , 0. , 0. , 1. ]]), + 'P1': array([[ 707.0493, 0. , 604.0814, -379.7842], + [ 0. , 707.0493, 180.5066, 0. ], + [ 0. , 0. , 1. , 0. ], + [ 0. , 0. , 0. , 1. ]]), + 'P2': array([[ 7.070493e+02, 0.000000e+00, 6.040814e+02, 4.575831e+01], + [ 0.000000e+00, 7.070493e+02, 1.805066e+02, -3.454157e-01], + [ 0.000000e+00, 0.000000e+00, 1.000000e+00, 4.981016e-03], + [ 0.000000e+00, 0.000000e+00, 0.000000e+00, 1.000000e+00]]), + 'P3': array([[ 7.070493e+02, 0.000000e+00, 6.040814e+02, -3.341081e+02], + [ 0.000000e+00, 7.070493e+02, 1.805066e+02, 2.330660e+00], + [ 0.000000e+00, 0.000000e+00, 1.000000e+00, 3.201153e-03], + [ 0.000000e+00, 0.000000e+00, 0.000000e+00, 1.000000e+00]]), + 'R0_rect': array([[ 0.9999128 , 0.01009263, -0.00851193, 0. ], + [-0.01012729, 0.9999406 , -0.00403767, 0. ], + [ 0.00847068, 0.00412352, 0.9999556 , 0. ], + [ 0. , 0. , 0. , 1. ]]), + 'Tr_velo_to_cam': array([[ 0.00692796, -0.9999722 , -0.00275783, -0.02457729], + [-0.00116298, 0.00274984, -0.9999955 , -0.06127237], + [ 0.9999753 , 0.00693114, -0.0011439 , -0.3321029 ], + [ 0. , 0. , 0. , 1. ]]), + 'Tr_imu_to_velo': array([[ 9.999976e-01, 7.553071e-04, -2.035826e-03, -8.086759e-01], + [-7.854027e-04, 9.998898e-01, -1.482298e-02, 3.195559e-01], + [ 2.024406e-03, 1.482454e-02, 9.998881e-01, -7.997231e-01], + [ 0.000000e+00, 0.000000e+00, 0.000000e+00, 1.000000e+00]])}, + 'annos': {'name': array(['Pedestrian'], dtype=' Date: Wed, 28 Jul 2021 09:38:01 +0800 Subject: [PATCH 2/2] refine doc --- docs_zh-CN/tutorials/customize_dataset.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs_zh-CN/tutorials/customize_dataset.md b/docs_zh-CN/tutorials/customize_dataset.md index e3b0147c9b..ca4328ba74 100644 --- a/docs_zh-CN/tutorials/customize_dataset.md +++ b/docs_zh-CN/tutorials/customize_dataset.md @@ -56,7 +56,7 @@ ] ``` -在此之上,用户可以通过继承 `Custom3DDataset` 来实现新的数据集类,并重载相关的方法,如 [KITTI 数据集](https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/datasets/kitti_dataset.py)和 [ScanNetDataset 数据集](https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/datasets/scannet_dataset.py)所示。 +在此之上,用户可以通过继承 `Custom3DDataset` 来实现新的数据集类,并重载相关的方法,如 [KITTI 数据集](https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/datasets/kitti_dataset.py)和 [ScanNet 数据集](https://github.com/open-mmlab/mmdetection3d/blob/master/mmdet3d/datasets/scannet_dataset.py)所示。 ### 自定义数据集的例子 @@ -125,7 +125,7 @@ class MyDataset(Custom3DDataset): test_mode=test_mode) def get_ann_info(self, index): - # Use index to get the annos, thus the evalhook could also use this api + # 通过下标来获取标注信息,evalhook 也能够通过此接口来获取标注信息 info = self.data_infos[index] if info['annos']['gt_num'] != 0: gt_bboxes_3d = info['annos']['gt_boxes_upright_depth'].astype( @@ -135,7 +135,7 @@ class MyDataset(Custom3DDataset): gt_bboxes_3d = np.zeros((0, 6), dtype=np.float32) gt_labels_3d = np.zeros((0, ), dtype=np.long) - # to target box structure + # 转换为目标标注框的结构 gt_bboxes_3d = DepthInstance3DBoxes( gt_bboxes_3d, box_dim=gt_bboxes_3d.shape[-1], @@ -166,9 +166,9 @@ dataset_A_train = dict( ) ``` -### 使用 dataset wrappers 来自定义数据集 +### 使用数据集包装器来自定义数据集 -与 MMDetection 类似,MMDetection3D 也提供了许多 dataset 包装器来统合数据集或者修改数据集的分布,并应用到模型的训练中。 +与 MMDetection 类似,MMDetection3D 也提供了许多数据集包装器来统合数据集或者修改数据集的分布,并应用到模型的训练中。 目前 MMDetection3D 支持3种数据集包装器 - `RepeatDataset`:简单地重复整个数据集 @@ -183,7 +183,7 @@ dataset_A_train = dict( dataset_A_train = dict( type='RepeatDataset', times=N, - dataset=dict( # This is the original config of Dataset_A + dataset=dict( # 这是 Dataset_A 的原始配置文件 type='Dataset_A', ... pipeline=train_pipeline @@ -199,7 +199,7 @@ dataset_A_train = dict( dataset_A_train = dict( type='ClassBalancedDataset', oversample_thr=1e-3, - dataset=dict( # This is the original config of Dataset_A + dataset=dict( # 这是 Dataset_A 的原始配置文件 type='Dataset_A', ... pipeline=train_pipeline