lyft_dataset.py 4.01 KB
Newer Older
dingchang's avatar
dingchang committed
1
# Copyright (c) OpenMMLab. All rights reserved.
2
from typing import Callable, List, Union
3

wangtai's avatar
wangtai committed
4
5
import numpy as np

6
from mmdet3d.registry import DATASETS
zhangshilong's avatar
zhangshilong committed
7
from mmdet3d.structures import LiDARInstance3DBoxes
jshilong's avatar
jshilong committed
8
from .det3d_dataset import Det3DDataset
wangtai's avatar
wangtai committed
9
10
11


@DATASETS.register_module()
jshilong's avatar
jshilong committed
12
class LyftDataset(Det3DDataset):
wangtai's avatar
wangtai committed
13
    r"""Lyft Dataset.
wangtai's avatar
wangtai committed
14
15
16
17

    This class serves as the API for experiments on the Lyft Dataset.

    Please refer to
18
    `<https://www.kaggle.com/c/3d-object-detection-for-autonomous-vehicles/data>`_
zhangwenwei's avatar
zhangwenwei committed
19
    for data downloading.
wangtai's avatar
wangtai committed
20
21

    Args:
VVsssssk's avatar
VVsssssk committed
22
        data_root (str): Path of dataset root.
wangtai's avatar
wangtai committed
23
        ann_file (str): Path of annotation file.
24
        pipeline (List[dict]): Pipeline used for data processing.
25
26
27
            Defaults to [].
        modality (dict): Modality to specify the sensor data used as input.
            Defaults to dict(use_camera=False, use_lidar=True).
VVsssssk's avatar
VVsssssk committed
28
        box_type_3d (str): Type of 3D box of this dataset.
wangtai's avatar
wangtai committed
29
30
            Based on the `box_type_3d`, the dataset will encapsulate the box
            to its original format then converted them to `box_type_3d`.
31
            Defaults to 'LiDAR' in this dataset. Available options includes:
wangtai's avatar
wangtai committed
32

wangtai's avatar
wangtai committed
33
34
35
            - 'LiDAR': Box in LiDAR coordinates.
            - 'Depth': Box in depth coordinates, usually for indoor dataset.
            - 'Camera': Box in camera coordinates.
36
37
38
39
40
        filter_empty_gt (bool): Whether to filter the data with empty GT.
            If it's set to be True, the example with empty annotations after
            data pipeline will be dropped and a random example will be chosen
            in `__getitem__`. Defaults to True.
        test_mode (bool): Whether the dataset is in test mode.
wangtai's avatar
wangtai committed
41
            Defaults to False.
VVsssssk's avatar
VVsssssk committed
42
43
44
    """

    METAINFO = {
45
        'classes':
VVsssssk's avatar
VVsssssk committed
46
        ('car', 'truck', 'bus', 'emergency_vehicle', 'other_vehicle',
47
48
49
50
         'motorcycle', 'bicycle', 'pedestrian', 'animal'),
        'palette': [(106, 0, 228), (119, 11, 32), (165, 42, 42), (0, 0, 192),
                    (197, 226, 255), (0, 60, 100), (0, 0, 142), (255, 77, 255),
                    (153, 69, 1)]
wangtai's avatar
wangtai committed
51
52
53
    }

    def __init__(self,
VVsssssk's avatar
VVsssssk committed
54
55
                 data_root: str,
                 ann_file: str,
56
57
                 pipeline: List[Union[dict, Callable]] = [],
                 modality: dict = dict(use_camera=False, use_lidar=True),
VVsssssk's avatar
VVsssssk committed
58
59
60
                 box_type_3d: str = 'LiDAR',
                 filter_empty_gt: bool = True,
                 test_mode: bool = False,
61
                 **kwargs):
VVsssssk's avatar
VVsssssk committed
62
        assert box_type_3d.lower() in ['lidar']
wangtai's avatar
wangtai committed
63
64
65
66
67
68
69
        super().__init__(
            data_root=data_root,
            ann_file=ann_file,
            pipeline=pipeline,
            modality=modality,
            box_type_3d=box_type_3d,
            filter_empty_gt=filter_empty_gt,
70
71
            test_mode=test_mode,
            **kwargs)
wangtai's avatar
wangtai committed
72

VVsssssk's avatar
VVsssssk committed
73
    def parse_ann_info(self, info: dict) -> dict:
74
        """Process the `instances` in data info to `ann_info`.
wangtai's avatar
wangtai committed
75
76

        Args:
VVsssssk's avatar
VVsssssk committed
77
            info (dict): Data information of single data sample.
wangtai's avatar
wangtai committed
78
79

        Returns:
80
            dict: Annotation information consists of the following keys:
wangtai's avatar
wangtai committed
81

82
                - gt_bboxes_3d (:obj:`LiDARInstance3DBoxes`):
83
                  3D ground truth bboxes.
VVsssssk's avatar
VVsssssk committed
84
                - gt_labels_3d (np.ndarray): Labels of 3D ground truths.
wangtai's avatar
wangtai committed
85
        """
VVsssssk's avatar
VVsssssk committed
86
87
88
89
90
91
92
93
94
95
96
        ann_info = super().parse_ann_info(info)
        if ann_info is None:
            # empty instance
            anns_results = dict()
            anns_results['gt_bboxes_3d'] = np.zeros((0, 7), dtype=np.float32)
            anns_results['gt_labels_3d'] = np.zeros(0, dtype=np.int64)
            return anns_results
        gt_bboxes_3d = ann_info['gt_bboxes_3d']
        gt_labels_3d = ann_info['gt_labels_3d']

        # the nuscenes box center is [0.5, 0.5, 0.5], we change it to be
wangtai's avatar
wangtai committed
97
98
99
100
101
102
103
        # the same as KITTI (0.5, 0.5, 0)
        gt_bboxes_3d = LiDARInstance3DBoxes(
            gt_bboxes_3d,
            box_dim=gt_bboxes_3d.shape[-1],
            origin=(0.5, 0.5, 0.5)).convert_to(self.box_mode_3d)

        anns_results = dict(
VVsssssk's avatar
VVsssssk committed
104
            gt_bboxes_3d=gt_bboxes_3d, gt_labels_3d=gt_labels_3d)
wangtai's avatar
wangtai committed
105
        return anns_results