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

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

wuyuefeng's avatar
wuyuefeng committed
6
from mmdet3d.core.bbox import DepthInstance3DBoxes
7
from mmdet3d.registry import DATASETS
jshilong's avatar
jshilong committed
8
from .det3d_dataset import Det3DDataset
liyinhao's avatar
liyinhao committed
9
10
11


@DATASETS.register_module()
jshilong's avatar
jshilong committed
12
class SUNRGBDDataset(Det3DDataset):
zhangwenwei's avatar
zhangwenwei committed
13
    r"""SUNRGBD Dataset.
liyinhao's avatar
liyinhao committed
14

wangtai's avatar
wangtai committed
15
16
    This class serves as the API for experiments on the SUNRGBD Dataset.

zhangwenwei's avatar
zhangwenwei committed
17
18
    See the `download page <http://rgbd.cs.princeton.edu/challenge.html>`_
    for data downloading.
wangtai's avatar
wangtai committed
19
20
21
22

    Args:
        data_root (str): Path of dataset root.
        ann_file (str): Path of annotation file.
jshilong's avatar
jshilong committed
23
24
25
26
        metainfo (dict, optional): Meta information for dataset, such as class
            information. Defaults to None.
        data_prefix (dict, optional): Prefix for data. Defaults to
            `dict(pts='points',img='sunrgbd_trainval')`.
wangtai's avatar
wangtai committed
27
28
29
        pipeline (list[dict], optional): Pipeline used for data processing.
            Defaults to None.
        modality (dict, optional): Modality to specify the sensor data used
jshilong's avatar
jshilong committed
30
            as input. Defaults to `dict(use_camera=True, use_lidar=True)`.
wangtai's avatar
wangtai committed
31
32
33
34
35
        box_type_3d (str, optional): Type of 3D box of this dataset.
            Based on the `box_type_3d`, the dataset will encapsulate the box
            to its original format then converted them to `box_type_3d`.
            Defaults to 'Depth' in this dataset. Available options includes

wangtai's avatar
wangtai committed
36
37
38
            - 'LiDAR': Box in LiDAR coordinates.
            - 'Depth': Box in depth coordinates, usually for indoor dataset.
            - 'Camera': Box in camera coordinates.
wangtai's avatar
wangtai committed
39
40
41
42
43
        filter_empty_gt (bool, optional): Whether to filter empty GT.
            Defaults to True.
        test_mode (bool, optional): Whether the dataset is in test mode.
            Defaults to False.
    """
jshilong's avatar
jshilong committed
44
45
46
47
    METAINFO = {
        'CLASSES': ('bed', 'table', 'sofa', 'chair', 'toilet', 'desk',
                    'dresser', 'night_stand', 'bookshelf', 'bathtub')
    }
liyinhao's avatar
liyinhao committed
48
49

    def __init__(self,
jshilong's avatar
jshilong committed
50
51
52
53
54
55
                 data_root: str,
                 ann_file: str,
                 metainfo: Optional[dict] = None,
                 data_prefix: dict = dict(
                     pts='points', img='sunrgbd_trainval'),
                 pipeline: List[Union[dict, Callable]] = [],
56
                 modality=dict(use_camera=True, use_lidar=True),
jshilong's avatar
jshilong committed
57
58
59
                 box_type_3d: str = 'Depth',
                 filter_empty_gt: bool = True,
                 test_mode: bool = False,
60
                 **kwargs):
61
62
63
        super().__init__(
            data_root=data_root,
            ann_file=ann_file,
jshilong's avatar
jshilong committed
64
65
            metainfo=metainfo,
            data_prefix=data_prefix,
66
67
68
69
            pipeline=pipeline,
            modality=modality,
            box_type_3d=box_type_3d,
            filter_empty_gt=filter_empty_gt,
70
71
            test_mode=test_mode,
            **kwargs)
72
73
        assert 'use_camera' in self.modality and \
            'use_lidar' in self.modality
74
75
        assert self.modality['use_camera'] or self.modality['use_lidar']

jshilong's avatar
jshilong committed
76
77
    def parse_ann_info(self, info: dict) -> dict:
        """Process the `instances` in data info to `ann_info`
78
79

        Args:
jshilong's avatar
jshilong committed
80
            info (dict): Info dict.
81
82

        Returns:
jshilong's avatar
jshilong committed
83
            dict: Processed `ann_info`
84
        """
jshilong's avatar
jshilong committed
85
        ann_info = super().parse_ann_info(info)
jshilong's avatar
jshilong committed
86
87
88
89
90
91
        # empty gt
        if ann_info is None:
            ann_info = dict()
            ann_info['gt_bboxes_3d'] = np.zeros((0, 6), dtype=np.float32)
            ann_info['gt_labels_3d'] = np.zeros((0, ), dtype=np.int64)

wuyuefeng's avatar
wuyuefeng committed
92
        # to target box structure
jshilong's avatar
jshilong committed
93
94
95
        ann_info['gt_bboxes_3d'] = DepthInstance3DBoxes(
            ann_info['gt_bboxes_3d'],
            origin=(0.5, 0.5, 0.5)).convert_to(self.box_mode_3d)
96

jshilong's avatar
jshilong committed
97
        return ann_info