# 教程 2: 自定义数据集 ## 支持新的数据格式 为了支持新的数据格式,可以通过将新数据转换为现有的数据形式,或者直接将新数据转换为能够被模型直接调用的中间格式。此外,可以通过数据离线转换的方式(在调用脚本进行训练之前完成)或者通过数据在线转换的格式(调用新的数据集并在训练过程中进行数据转换)。在 MMDetection3D 中,对于那些不便于在线读取的数据,我们建议通过离线转换的方法将其转换为 KTIIT 数据集的格式,因此只需要在转换后修改配置文件中的数据标注文件的路径和标注数据所包含类别;对于那些与现有数据格式相似的新数据集,如 Lyft 数据集和 nuScenes 数据集,我们建议直接调用数据转换器和现有的数据集类别信息,在这个过程中,可以考虑通过继承的方式来减少实施数据转换的负担。 ### 将新数据的格式转换为现有数据的格式 对于那些不便于在线读取的数据,最简单的方法是将新数据集的格式转换为现有数据集的格式。 通常来说,我们需要一个数据转换器来重新组织原始数据的格式,并将对应的标注格式转换为 KITTI 数据集的风格;当现有数据集与新数据集存在差异时,可以通过定义一个从现有数据集类继承而来的新数据集类来处理具体的差异;最后,用户需要进一步修改配置文件来调用新的数据集。可以参考如何通过将 Waymo 数据集转换为 KITTI 数据集的风格并进一步训练模型的[例子](https://mmdetection3d.readthedocs.io/zh_CN/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='