# Copyright (c) OpenMMLab. All rights reserved. from typing import Dict, List import numpy as np from mmdet3d.registry import DATASETS from mmdet3d.structures import LiDARInstance3DBoxes from .det3d_dataset import Det3DDataset @DATASETS.register_module() class LyftDataset(Det3DDataset): r"""Lyft Dataset. This class serves as the API for experiments on the Lyft Dataset. Please refer to ``_ for data downloading. Args: data_root (str): Path of dataset root. ann_file (str): Path of annotation file. pipeline (list[dict], optional): Pipeline used for data processing. Defaults to None. modality (dict, optional): Modality to specify the sensor data used as input. Defaults to None. box_type_3d (str): 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 'LiDAR' in this dataset. Available options includes - 'LiDAR': Box in LiDAR coordinates. - 'Depth': Box in depth coordinates, usually for indoor dataset. - 'Camera': Box in camera coordinates. filter_empty_gt (bool): Whether to filter empty GT. Defaults to True. test_mode (bool): Whether the dataset is in test mode. Defaults to False. """ METAINFO = { 'CLASSES': ('car', 'truck', 'bus', 'emergency_vehicle', 'other_vehicle', 'motorcycle', 'bicycle', 'pedestrian', 'animal') } def __init__(self, data_root: str, ann_file: str, pipeline: List[dict] = None, modality: Dict = dict(use_camera=False, use_lidar=True), box_type_3d: str = 'LiDAR', filter_empty_gt: bool = True, test_mode: bool = False, **kwargs): assert box_type_3d.lower() in ['lidar'] 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, test_mode=test_mode, **kwargs) def parse_ann_info(self, info: dict) -> dict: """Get annotation info according to the given index. Args: info (dict): Data information of single data sample. Returns: dict: annotation information consists of the following keys: - gt_bboxes_3d (:obj:`LiDARInstance3DBoxes`): 3D ground truth bboxes. - gt_labels_3d (np.ndarray): Labels of 3D ground truths. """ 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 # 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( gt_bboxes_3d=gt_bboxes_3d, gt_labels_3d=gt_labels_3d) return anns_results