|
|
|
|
|
import os.path as osp |
|
|
from typing import Callable, List, Union |
|
|
|
|
|
from mmengine.dataset import BaseDataset |
|
|
|
|
|
from mmdet3d.registry import DATASETS |
|
|
|
|
|
|
|
|
@DATASETS.register_module() |
|
|
class NuScenesSegDataset(BaseDataset): |
|
|
r"""NuScenes Dataset. |
|
|
|
|
|
This class serves as the API for experiments on the NuScenes Dataset. |
|
|
|
|
|
Please refer to `NuScenes Dataset <https://www.nuscenes.org/download>`_ |
|
|
for data downloading. |
|
|
|
|
|
Args: |
|
|
data_root (str): Path of dataset root. |
|
|
ann_file (str): Path of annotation file. |
|
|
pipeline (list[dict]): Pipeline used for data processing. |
|
|
Defaults to []. |
|
|
test_mode (bool): Store `True` when building test or val dataset. |
|
|
""" |
|
|
METAINFO = { |
|
|
'classes': |
|
|
('noise', 'barrier', 'bicycle', 'bus', 'car', 'construction_vehicle', |
|
|
'motorcycle', 'pedestrian', 'traffic_cone', 'trailer', 'truck', |
|
|
'driveable_surface', 'other_flat', 'sidewalk', 'terrain', 'manmade', |
|
|
'vegetation'), |
|
|
'ignore_index': |
|
|
0, |
|
|
'label_mapping': |
|
|
dict([(1, 0), (5, 0), (7, 0), (8, 0), (10, 0), (11, 0), (13, 0), |
|
|
(19, 0), (20, 0), (0, 0), (29, 0), (31, 0), (9, 1), (14, 2), |
|
|
(15, 3), (16, 3), (17, 4), (18, 5), (21, 6), (2, 7), (3, 7), |
|
|
(4, 7), (6, 7), (12, 8), (22, 9), (23, 10), (24, 11), (25, 12), |
|
|
(26, 13), (27, 14), (28, 15), (30, 16)]), |
|
|
'palette': [ |
|
|
[0, 0, 0], |
|
|
[255, 120, 50], |
|
|
[255, 192, 203], |
|
|
[255, 255, 0], |
|
|
[0, 150, 245], |
|
|
[0, 255, 255], |
|
|
[255, 127, 0], |
|
|
[255, 0, 0], |
|
|
[255, 240, 150], |
|
|
[135, 60, 0], |
|
|
[160, 32, 240], |
|
|
[255, 0, 255], |
|
|
[139, 137, 137], |
|
|
[75, 0, 75], |
|
|
[150, 240, 80], |
|
|
[230, 230, 250], |
|
|
[0, 175, 0], |
|
|
] |
|
|
} |
|
|
|
|
|
def __init__(self, |
|
|
data_root: str, |
|
|
ann_file: str, |
|
|
pipeline: List[Union[dict, Callable]] = [], |
|
|
test_mode: bool = False, |
|
|
**kwargs) -> None: |
|
|
metainfo = dict(label2cat={ |
|
|
i: cat_name |
|
|
for i, cat_name in enumerate(self.METAINFO['classes']) |
|
|
}) |
|
|
super().__init__( |
|
|
ann_file=ann_file, |
|
|
data_root=data_root, |
|
|
metainfo=metainfo, |
|
|
pipeline=pipeline, |
|
|
test_mode=test_mode, |
|
|
**kwargs) |
|
|
|
|
|
def parse_data_info(self, info: dict) -> Union[List[dict], dict]: |
|
|
"""Process the raw data info. |
|
|
|
|
|
The only difference with it in `Det3DDataset` |
|
|
is the specific process for `plane`. |
|
|
|
|
|
Args: |
|
|
info (dict): Raw info dict. |
|
|
|
|
|
Returns: |
|
|
List[dict] or dict: Has `ann_info` in training stage. And |
|
|
all path has been converted to absolute path. |
|
|
""" |
|
|
|
|
|
data_list = [] |
|
|
info['lidar_points']['lidar_path'] = \ |
|
|
osp.join( |
|
|
self.data_prefix.get('pts', ''), |
|
|
info['lidar_points']['lidar_path']) |
|
|
|
|
|
for cam_id, img_info in info['images'].items(): |
|
|
if 'img_path' in img_info: |
|
|
if cam_id in self.data_prefix: |
|
|
cam_prefix = self.data_prefix[cam_id] |
|
|
else: |
|
|
cam_prefix = self.data_prefix.get('img', '') |
|
|
img_info['img_path'] = osp.join(cam_prefix, |
|
|
img_info['img_path']) |
|
|
|
|
|
if 'pts_semantic_mask_path' in info: |
|
|
info['pts_semantic_mask_path'] = \ |
|
|
osp.join(self.data_prefix.get('pts_semantic_mask', ''), |
|
|
info['pts_semantic_mask_path']) |
|
|
|
|
|
|
|
|
|
|
|
info['seg_label_mapping'] = self.metainfo['label_mapping'] |
|
|
|
|
|
|
|
|
if self.test_mode: |
|
|
info['eval_ann_info'] = dict() |
|
|
|
|
|
data_list.append(info) |
|
|
return data_list |
|
|
|