indoor_loading.py 3.33 KB
Newer Older
liyinhao's avatar
liyinhao committed
1
2
3
4
5
6
7
8
import os.path as osp

import numpy as np

from mmdet.datasets.registry import PIPELINES


@PIPELINES.register_module
liyinhao's avatar
liyinhao committed
9
10
class LoadPointsFromFile(object):
    """Load Points From File.
liyinhao's avatar
liyinhao committed
11

liyinhao's avatar
liyinhao committed
12
    Load sunrgbd and scannet points from file.
liyinhao's avatar
liyinhao committed
13
14
15

    Args:
        use_height (bool): Whether to use height.
liyinhao's avatar
liyinhao committed
16
        color_mean (List[float]): Mean color of the point cloud.
liyinhao's avatar
liyinhao committed
17
18
19
20
        load_dim (int): The dimension of the loaded points.
            Default: 6.
        use_dim (List[int]): Which dimensions of the points to be used.
            Default: [0, 1, 2].
liyinhao's avatar
liyinhao committed
21
22
    """

liyinhao's avatar
liyinhao committed
23
    def __init__(self, use_height, color_mean, load_dim=6, use_dim=[0, 1, 2]):
liyinhao's avatar
liyinhao committed
24
        self.use_height = use_height
liyinhao's avatar
liyinhao committed
25
        self.color_mean = color_mean
liyinhao's avatar
liyinhao committed
26
27
28
        assert max(use_dim) < load_dim
        self.load_dim = load_dim
        self.use_dim = use_dim
liyinhao's avatar
liyinhao committed
29
30

    def __call__(self, results):
liyinhao's avatar
liyinhao committed
31
        pts_filename = results.get('pts_filename', None)
liyinhao's avatar
liyinhao committed
32
        info = results.get('info', None)
liyinhao's avatar
liyinhao committed
33
        name = 'scannet' if info.get('image', None) is None else 'sunrgbd'
liyinhao's avatar
liyinhao committed
34
        assert osp.exists(pts_filename)
liyinhao's avatar
liyinhao committed
35
        if name == 'scannet':
liyinhao's avatar
liyinhao committed
36
            points = np.load(pts_filename)
liyinhao's avatar
liyinhao committed
37
        else:
liyinhao's avatar
liyinhao committed
38
39
40
41
            points = np.load(pts_filename)['pc']
        points = points.reshape(-1, self.load_dim)
        points[:, 3:6] = points[:, 3:6] - np.array(self.color_mean) / 256.0
        points = points[:, self.use_dim]
liyinhao's avatar
liyinhao committed
42

liyinhao's avatar
liyinhao committed
43
        if self.use_height:
liyinhao's avatar
liyinhao committed
44
45
46
47
            floor_height = np.percentile(points[:, 2], 0.99)
            height = points[:, 2] - floor_height
            points = np.concatenate([points, np.expand_dims(height, 1)], 1)
        results['points'] = points
liyinhao's avatar
liyinhao committed
48
49
50
51
        return results

    def __repr__(self):
        repr_str = self.__class__.__name__
liyinhao's avatar
liyinhao committed
52
        repr_str += '(use_height={})'.format(self.use_height)
liyinhao's avatar
liyinhao committed
53
        repr_str += '(mean_color={})'.format(self.color_mean)
liyinhao's avatar
liyinhao committed
54
55
        repr_str += '(load_dim={})'.format(self.load_dim)
        repr_str += '(use_dim={})'.format(self.use_dim)
liyinhao's avatar
liyinhao committed
56
57
        return repr_str

liyinhao's avatar
liyinhao committed
58
59
60
61
62
63
64
65
66
67
68
69

@PIPELINES.register_module
class LoadAnnotations3D(object):
    """Load Annotations3D.

    Load sunrgbd and scannet annotations.
    """

    def __init__(self):
        pass

    def __call__(self, results):
liyinhao's avatar
liyinhao committed
70
71
        ins_labelname = results.get('ins_labelname', None)
        sem_labelname = results.get('sem_labelname', None)
liyinhao's avatar
liyinhao committed
72
73
        info = results.get('info', None)
        if info['annos']['gt_num'] != 0:
liyinhao's avatar
liyinhao committed
74
            gt_bboxes_3d = info['annos']['gt_boxes_upright_depth']
liyinhao's avatar
liyinhao committed
75
76
            gt_labels = info['annos']['class'].reshape(-1, 1)
            gt_bboxes_3d_mask = np.ones_like(gt_labels)
liyinhao's avatar
liyinhao committed
77
        else:
liyinhao's avatar
liyinhao committed
78
            gt_bboxes_3d = np.zeros((1, 6), dtype=np.float32)
liyinhao's avatar
liyinhao committed
79
            gt_labels = np.zeros((1, 1))
liyinhao's avatar
liyinhao committed
80
            gt_bboxes_3d_mask = np.zeros((1, 1))
liyinhao's avatar
liyinhao committed
81
82
83
        name = 'scannet' if info.get('image', None) is None else 'sunrgbd'

        if name == 'scannet':
liyinhao's avatar
liyinhao committed
84
85
86
87
88
89
            assert osp.exists(ins_labelname)
            assert osp.exists(sem_labelname)
            pts_instance_mask = np.load(ins_labelname)
            pts_semantic_mask = np.load(sem_labelname)
            results['pts_instance_mask'] = pts_instance_mask
            results['pts_semantic_mask'] = pts_semantic_mask
liyinhao's avatar
liyinhao committed
90

liyinhao's avatar
liyinhao committed
91
        results['gt_bboxes_3d'] = gt_bboxes_3d
liyinhao's avatar
liyinhao committed
92
        results['gt_labels'] = gt_labels
liyinhao's avatar
liyinhao committed
93
        results['gt_bboxes_3d_mask'] = gt_bboxes_3d_mask
liyinhao's avatar
liyinhao committed
94
95
96
97
98
        return results

    def __repr__(self):
        repr_str = self.__class__.__name__
        return repr_str