# Copyright (c) OpenMMLab. All rights reserved. from mmcv.transforms.processing import TestTimeAug from mmengine.dataset.sampler import DefaultSampler from mmengine.visualization.vis_backend import LocalVisBackend from mmdet3d.datasets.s3dis_dataset import S3DISSegDataset from mmdet3d.datasets.transforms.formating import Pack3DDetInputs from mmdet3d.datasets.transforms.loading import (LoadAnnotations3D, LoadPointsFromFile, NormalizePointsColor, PointSegClassMapping) from mmdet3d.datasets.transforms.transforms_3d import (IndoorPatchPointSample, RandomFlip3D) from mmdet3d.evaluation.metrics.seg_metric import SegMetric from mmdet3d.models.segmentors.seg3d_tta import Seg3DTTAModel from mmdet3d.visualization.local_visualizer import Det3DLocalVisualizer # For S3DIS seg we usually do 13-class segmentation class_names = ('ceiling', 'floor', 'wall', 'beam', 'column', 'window', 'door', 'table', 'chair', 'sofa', 'bookcase', 'board', 'clutter') metainfo = dict(classes=class_names) dataset_type = 'S3DISSegDataset' data_root = 'data/s3dis/' input_modality = dict(use_lidar=True, use_camera=False) data_prefix = dict( pts='points', pts_instance_mask='instance_mask', pts_semantic_mask='semantic_mask') # Example to use different file client # Method 1: simply set the data root and let the file I/O module # automatically infer from prefix (not support LMDB and Memcache yet) # data_root = 's3://openmmlab/datasets/detection3d/s3dis/' # Method 2: Use backend_args, file_client_args in versions before 1.1.0 # backend_args = dict( # backend='petrel', # path_mapping=dict({ # './data/': 's3://openmmlab/datasets/detection3d/', # 'data/': 's3://openmmlab/datasets/detection3d/' # })) backend_args = None num_points = 4096 train_area = [1, 2, 3, 4, 6] test_area = 5 train_pipeline = [ dict( type=LoadPointsFromFile, coord_type='DEPTH', shift_height=False, use_color=True, load_dim=6, use_dim=[0, 1, 2, 3, 4, 5], backend_args=backend_args), dict( type=LoadAnnotations3D, with_bbox_3d=False, with_label_3d=False, with_mask_3d=False, with_seg_3d=True, backend_args=backend_args), dict(type=PointSegClassMapping), dict( type=IndoorPatchPointSample, num_points=num_points, block_size=1.0, ignore_index=len(class_names), use_normalized_coord=True, enlarge_size=0.2, min_unique_num=None), dict(type=NormalizePointsColor, color_mean=None), dict(type=Pack3DDetInputs, keys=['points', 'pts_semantic_mask']) ] test_pipeline = [ dict( type=LoadPointsFromFile, coord_type='DEPTH', shift_height=False, use_color=True, load_dim=6, use_dim=[0, 1, 2, 3, 4, 5], backend_args=backend_args), dict( type=LoadAnnotations3D, with_bbox_3d=False, with_label_3d=False, with_mask_3d=False, with_seg_3d=True, backend_args=backend_args), dict(type=NormalizePointsColor, color_mean=None), dict(type=Pack3DDetInputs, keys=['points']) ] # construct a pipeline for data and gt loading in show function # please keep its loading function consistent with test_pipeline (e.g. client) # we need to load gt seg_mask! eval_pipeline = [ dict( type=LoadPointsFromFile, coord_type='DEPTH', shift_height=False, use_color=True, load_dim=6, use_dim=[0, 1, 2, 3, 4, 5], backend_args=backend_args), dict(type=NormalizePointsColor, color_mean=None), dict(type=Pack3DDetInputs, keys=['points']) ] tta_pipeline = [ dict( type=LoadPointsFromFile, coord_type='DEPTH', shift_height=False, use_color=True, load_dim=6, use_dim=[0, 1, 2, 3, 4, 5], backend_args=backend_args), dict( type=LoadAnnotations3D, with_bbox_3d=False, with_label_3d=False, with_mask_3d=False, with_seg_3d=True, backend_args=backend_args), dict(type=NormalizePointsColor, color_mean=None), dict( type=TestTimeAug, transforms=[[ dict( type=RandomFlip3D, sync_2d=False, flip_ratio_bev_horizontal=0., flip_ratio_bev_vertical=0.) ], [dict(type=Pack3DDetInputs, keys=['points'])]]) ] # train on area 1, 2, 3, 4, 6 # test on area 5 train_dataloader = dict( batch_size=8, num_workers=4, persistent_workers=True, sampler=dict(type=DefaultSampler, shuffle=True), dataset=dict( type=S3DISSegDataset, data_root=data_root, ann_files=[f's3dis_infos_Area_{i}.pkl' for i in train_area], metainfo=metainfo, data_prefix=data_prefix, pipeline=train_pipeline, modality=input_modality, ignore_index=len(class_names), scene_idxs=[ f'seg_info/Area_{i}_resampled_scene_idxs.npy' for i in train_area ], test_mode=False, backend_args=backend_args)) test_dataloader = dict( batch_size=1, num_workers=1, persistent_workers=True, drop_last=False, sampler=dict(type=DefaultSampler, shuffle=False), dataset=dict( type=S3DISSegDataset, data_root=data_root, ann_files=f's3dis_infos_Area_{test_area}.pkl', metainfo=metainfo, data_prefix=data_prefix, pipeline=test_pipeline, modality=input_modality, ignore_index=len(class_names), scene_idxs=f'seg_info/Area_{test_area}_resampled_scene_idxs.npy', test_mode=True, backend_args=backend_args)) val_dataloader = test_dataloader val_evaluator = dict(type=SegMetric) test_evaluator = val_evaluator vis_backends = [dict(type=LocalVisBackend)] visualizer = dict( type=Det3DLocalVisualizer, vis_backends=vis_backends, name='visualizer') tta_model = dict(type=Seg3DTTAModel)