# Copyright (c) OpenMMLab. All rights reserved. import unittest import numpy as np import torch from mmengine.testing import assert_allclose from mmdet3d.datasets.transforms import PointSegClassMapping from mmdet3d.datasets.transforms.loading import (LoadAnnotations3D, LoadPointsFromFile) from mmdet3d.structures import DepthPoints, LiDARPoints from mmdet3d.testing import create_dummy_data_info class TestLoadPointsFromFile(unittest.TestCase): def test_load_points_from_file(self): use_dim = 3 backend_args = None load_points_transform = LoadPointsFromFile( coord_type='LIDAR', load_dim=4, use_dim=use_dim, backend_args=backend_args) data_info = create_dummy_data_info() info = load_points_transform(data_info) self.assertIn('points', info) self.assertIsInstance(info['points'], LiDARPoints) load_points_transform = LoadPointsFromFile( coord_type='DEPTH', load_dim=4, use_dim=use_dim, backend_args=backend_args) info = load_points_transform(data_info) self.assertIsInstance(info['points'], DepthPoints) self.assertEqual(info['points'].shape[-1], use_dim) load_points_transform = LoadPointsFromFile( coord_type='DEPTH', load_dim=4, use_dim=use_dim, shift_height=True, backend_args=backend_args) info = load_points_transform(data_info) # extra height dim self.assertEqual(info['points'].shape[-1], use_dim + 1) repr_str = repr(load_points_transform) self.assertIn('shift_height=True', repr_str) self.assertIn('use_color=False', repr_str) self.assertIn('load_dim=4', repr_str) class TestLoadAnnotations3D(unittest.TestCase): def test_load_points_from_file(self): backend_args = None load_anns_transform = LoadAnnotations3D( with_bbox_3d=True, with_label_3d=True, with_panoptic_3d=True, seg_offset=2**16, dataset_type='semantickitti', seg_3d_dtype='np.uint32', backend_args=backend_args) self.assertIs(load_anns_transform.with_seg, False) self.assertIs(load_anns_transform.with_bbox_3d, True) self.assertIs(load_anns_transform.with_label_3d, True) data_info = create_dummy_data_info() info = load_anns_transform(data_info) self.assertIn('gt_bboxes_3d', info) assert_allclose(info['gt_bboxes_3d'].tensor.sum(), torch.tensor(7.2650)) self.assertIn('gt_labels_3d', info) assert_allclose(info['gt_labels_3d'], torch.tensor([1])) self.assertIn('pts_semantic_mask', info) self.assertIn('pts_instance_mask', info) assert_allclose( info['pts_semantic_mask'], np.array([ 50, 50, 50, 70, 70, 50, 0, 50, 70, 50, 50, 70, 71, 52, 70, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 70, 50, 71, 50, 70, 70, 80, 50, 70, 70, 70, 71, 70, 50, 50, 70, 50, 80, 70, 50, 70, 50, 70, 70, 50 ])) assert_allclose( info['pts_instance_mask'], np.array([ 50, 50, 50, 70, 70, 50, 0, 50, 70, 50, 50, 70, 71, 52, 70, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 70, 50, 71, 50, 70, 70, 80, 50, 70, 70, 70, 71, 70, 50, 50, 70, 50, 80, 70, 50, 70, 50, 70, 70, 50 ])) repr_str = repr(load_anns_transform) self.assertIn('with_bbox_3d=True', repr_str) self.assertIn('with_label_3d=True', repr_str) self.assertIn('with_bbox_depth=False', repr_str) self.assertIn('with_panoptic_3d=True', repr_str) class TestPointSegClassMapping(unittest.TestCase): def test_point_seg_class_mapping(self): results = dict() results['pts_semantic_mask'] = np.array([1, 2, 3, 4, 5]) results['seg_label_mapping'] = np.array([3, 0, 1, 2, 3, 3]) point_seg_mapping_transform = PointSegClassMapping() results = point_seg_mapping_transform(results) assert_allclose(results['pts_semantic_mask'], np.array([0, 1, 2, 3, 3]))