def __init__(self, root, sample_points=8192, block_size=10, num_classes=20, split='train', with_remission=False,
                 config_file='semantic-kitti.yaml', should_map=True, padding=0.01, random_sample=False, random_rate=0.1):
        self.root = root
        assert split in splits
        self.split = split
        self.padding = padding
        self.block_size = block_size
        self.sample_points = sample_points
        self.random_sample = random_sample
        self.with_remission = with_remission
        self.should_map = should_map
        self.config = yaml.safe_load(open(config_file, 'r'))
        self.scan = laserscan.SemLaserScan(nclasses=num_classes, sem_color_dict=self.config['color_map'])
        sequences = self.config['split'][split]

        self.points_name = []
        self.label_name = []
        for sequence in sequences:
            sequence = '{0:02d}'.format(int(sequence))
            points_path = os.path.join(self.root, 'sequences', sequence, 'velodyne')
            label_path = os.path.join(self.root, 'sequences', sequence, 'labels')
            seq_points_name = [os.path.join(points_path, pn) for pn in os.listdir(points_path) if pn.endswith('.bin')]
            seq_label_name = [os.path.join(label_path, ln) for ln in os.listdir(label_path) if ln.endswith('.label')]
            assert len(seq_points_name) == len(seq_label_name)
            seq_points_name.sort()
            seq_label_name.sort()
            self.points_name.extend(seq_points_name)
            self.label_name.extend(seq_label_name)

        if self.random_sample:
            random.Random(seed).shuffle(self.points_name)
            random.Random(seed).shuffle(self.label_name)
            total_length = len(self.points_name)
            self.points_name = self.points_name[:int(total_length * random_rate)]
            self.label_name = self.label_name[:int(total_length * random_rate)]

        label_weights_dict = mapped_content
        num_keys = len(label_weights_dict.keys())
        self.label_weights_lut = np.zeros((num_keys), dtype=np.float32)
        self.label_weights_lut[list(label_weights_dict.keys())] = list(label_weights_dict.values())
        self.label_weights_lut = np.power(np.amax(self.label_weights_lut[1:]) / self.label_weights_lut, 1 / 3.0)

        if should_map:
            remapdict = self.config["learning_map"]
            # make lookup table for mapping
            maxkey = max(remapdict.keys())
            # +100 hack making lut bigger just in case there are unknown labels
            self.remap_lut = np.zeros((maxkey + 100), dtype=np.int32)
            self.remap_lut[list(remapdict.keys())] = list(remapdict.values())
    def __init__(self, root, sample_points=8192, block_size=10, stride=3.3, num_classes=20, split='test', with_remission=False,
                 config_file='semantic-kitti.yaml', should_map=True):
        self.root = root
        assert split in splits
        self.split = split
        self.stride = stride
        self.block_size = block_size
        self.block_points = sample_points
        self.should_map = should_map
        self.with_remission = with_remission
        self.config = yaml.safe_load(open(config_file, 'r'))
        self.scan = laserscan.SemLaserScan(
            nclasses=num_classes, sem_color_dict=self.config['color_map'])
        sequences = self.config['split'][split]
        color = []
        for values in self.config['learning_map_inv'].values():
            color.append(self.config['color_map'][values])
        self.color_map = np.array(color)

        self.points_name = []
        self.label_name = []
        for sequence in sequences:
            sequence = '{0:02d}'.format(int(sequence))
            points_path = os.path.join(
                self.root, 'sequences', sequence, 'velodyne')
            label_path = os.path.join(self.root, 'sequences', sequence, 'labels')
            seq_points_name = [os.path.join(points_path, pn) for pn in os.listdir(points_path) if pn.endswith('.bin')]
            seq_points_name.sort()
            self.points_name.extend(seq_points_name)
            if split != 'test':
                seq_label_name = [os.path.join(label_path, ln) for ln in os.listdir(label_path) if ln.endswith('.label')]
                seq_label_name.sort()
                self.label_name.extend(seq_label_name)
        if should_map:
            remapdict = self.config["learning_map"]
            # make lookup table for mapping
            maxkey = max(remapdict.keys())
            # +100 hack making lut bigger just in case there are unknown labels
            self.remap_lut = np.zeros((maxkey + 100), dtype=np.int32)
            self.remap_lut[list(remapdict.keys())] = list(remapdict.values())