def test_load_points_from_indoor_file(): sunrgbd_info = mmcv.load('./tests/data/sunrgbd/sunrgbd_infos.pkl') sunrgbd_load_points_from_file = LoadPointsFromFile(6, shift_height=True) sunrgbd_results = dict() data_path = './tests/data/sunrgbd' sunrgbd_info = sunrgbd_info[0] sunrgbd_results['pts_filename'] = osp.join(data_path, sunrgbd_info['pts_path']) sunrgbd_results = sunrgbd_load_points_from_file(sunrgbd_results) sunrgbd_point_cloud = sunrgbd_results['points'] assert sunrgbd_point_cloud.shape == (100, 4) scannet_info = mmcv.load('./tests/data/scannet/scannet_infos.pkl') scannet_load_data = LoadPointsFromFile(shift_height=True) scannet_results = dict() data_path = './tests/data/scannet' scannet_info = scannet_info[0] scannet_results['pts_filename'] = osp.join(data_path, scannet_info['pts_path']) scannet_results = scannet_load_data(scannet_results) scannet_point_cloud = scannet_results['points'] repr_str = repr(scannet_load_data) expected_repr_str = 'LoadPointsFromFile(shift_height=True, ' \ 'file_client_args={\'backend\': \'disk\'}), ' \ 'load_dim=6, use_dim=[0, 1, 2])' assert repr_str == expected_repr_str assert scannet_point_cloud.shape == (100, 4)
def test_load_points_from_outdoor_file(): data_path = 'tests/data/kitti/a.bin' load_points_from_file = LoadPointsFromFile(coord_type='LIDAR', load_dim=4, use_dim=4) results = dict() results['pts_filename'] = data_path results = load_points_from_file(results) points = results['points'].tensor.numpy() assert points.shape == (50, 4) assert np.allclose(points.sum(), 2637.479) load_points_from_file = LoadPointsFromFile(coord_type='LIDAR', load_dim=4, use_dim=[0, 1, 2, 3]) results = dict() results['pts_filename'] = data_path results = load_points_from_file(results) new_points = results['points'].tensor.numpy() assert new_points.shape == (50, 4) assert np.allclose(points.sum(), 2637.479) np.equal(points, new_points) with pytest.raises(AssertionError): LoadPointsFromFile(coord_type='LIDAR', load_dim=4, use_dim=5)
def test_load_points_from_indoor_file(): sunrgbd_info = mmcv.load('./tests/data/sunrgbd/sunrgbd_infos.pkl') sunrgbd_load_points_from_file = LoadPointsFromFile( coord_type='DEPTH', load_dim=6, shift_height=True) sunrgbd_results = dict() data_path = './tests/data/sunrgbd' sunrgbd_info = sunrgbd_info[0] sunrgbd_results['pts_filename'] = osp.join(data_path, sunrgbd_info['pts_path']) sunrgbd_results = sunrgbd_load_points_from_file(sunrgbd_results) sunrgbd_point_cloud = sunrgbd_results['points'].tensor.numpy() assert sunrgbd_point_cloud.shape == (100, 4) scannet_info = mmcv.load('./tests/data/scannet/scannet_infos.pkl') scannet_load_data = LoadPointsFromFile( coord_type='DEPTH', shift_height=True) scannet_results = dict() data_path = './tests/data/scannet' scannet_info = scannet_info[0] scannet_results['pts_filename'] = osp.join(data_path, scannet_info['pts_path']) scannet_results = scannet_load_data(scannet_results) scannet_point_cloud = scannet_results['points'].tensor.numpy() repr_str = repr(scannet_load_data) expected_repr_str = 'LoadPointsFromFile(shift_height=True, ' \ 'use_color=False, ' \ 'file_client_args={\'backend\': \'disk\'}, ' \ 'load_dim=6, use_dim=[0, 1, 2])' assert repr_str == expected_repr_str assert scannet_point_cloud.shape == (100, 4) # test load point cloud with both shifted height and color scannet_load_data = LoadPointsFromFile( coord_type='DEPTH', load_dim=6, use_dim=[0, 1, 2, 3, 4, 5], shift_height=True, use_color=True) scannet_results = dict() scannet_results['pts_filename'] = osp.join(data_path, scannet_info['pts_path']) scannet_results = scannet_load_data(scannet_results) scannet_point_cloud = scannet_results['points'] assert scannet_point_cloud.points_dim == 7 assert scannet_point_cloud.attribute_dims == dict( height=3, color=[4, 5, 6]) scannet_point_cloud = scannet_point_cloud.tensor.numpy() assert scannet_point_cloud.shape == (100, 7)
def test_load_points_from_outdoor_file(): data_path = 'tests/data/kitti/a.bin' load_points_from_file = LoadPointsFromFile(4, 4) results = dict() results['pts_filename'] = data_path results = load_points_from_file(results) points = results['points'] assert points.shape == (50, 4) assert np.allclose(points.sum(), 2637.479) load_points_from_file = LoadPointsFromFile(4, [0, 1, 2, 3]) results = dict() results['pts_filename'] = data_path results = load_points_from_file(results) new_points = results['points'] assert new_points.shape == (50, 4) assert np.allclose(points.sum(), 2637.479) np.equal(points, new_points) with pytest.raises(AssertionError): LoadPointsFromFile(4, 5)
def test_voxelization(): voxel_size = [0.5, 0.5, 0.5] point_cloud_range = [0, -40, -3, 70.4, 40, 1] max_num_points = 1000 self = VoxelGenerator(voxel_size, point_cloud_range, max_num_points) data_path = './tests/data/kitti/training/velodyne_reduced/000000.bin' load_points_from_file = LoadPointsFromFile( coord_type='LIDAR', load_dim=4, use_dim=4) results = dict() results['pts_filename'] = data_path results = load_points_from_file(results) points = results['points'].tensor.numpy() voxels_generator = self.generate(points) coors, voxels, num_points_per_voxel = voxels_generator expected_coors = coors expected_voxels = voxels expected_num_points_per_voxel = num_points_per_voxel points = torch.tensor(points) max_num_points = -1 dynamic_voxelization = Voxelization(voxel_size, point_cloud_range, max_num_points) max_num_points = 1000 hard_voxelization = Voxelization(voxel_size, point_cloud_range, max_num_points) # test hard_voxelization on cpu coors, voxels, num_points_per_voxel = hard_voxelization.forward(points) coors = coors.detach().numpy() voxels = voxels.detach().numpy() num_points_per_voxel = num_points_per_voxel.detach().numpy() assert np.all(coors == expected_coors) assert np.all(voxels == expected_voxels) assert np.all(num_points_per_voxel == expected_num_points_per_voxel) # test dynamic_voxelization on cpu coors = dynamic_voxelization.forward(points) coors = coors.detach().numpy() points = points.detach().numpy() for i in range(expected_voxels.shape[0]): indices = _get_voxel_points_indices(points, coors, expected_voxels[i]) num_points_current_voxel = points[indices].shape[0] assert num_points_current_voxel > 0 assert np.all( points[indices] == expected_coors[i][:num_points_current_voxel]) assert num_points_current_voxel == expected_num_points_per_voxel[i] if not torch.cuda.is_available(): pytest.skip('test requires GPU and torch+cuda') # test hard_voxelization on gpu points = torch.tensor(points).contiguous().to(device='cuda:0') coors, voxels, num_points_per_voxel = hard_voxelization.forward(points) coors = coors.cpu().detach().numpy() voxels = voxels.cpu().detach().numpy() num_points_per_voxel = num_points_per_voxel.cpu().detach().numpy() assert np.all(coors == expected_coors) assert np.all(voxels == expected_voxels) assert np.all(num_points_per_voxel == expected_num_points_per_voxel) # test dynamic_voxelization on gpu coors = dynamic_voxelization.forward(points) coors = coors.cpu().detach().numpy() points = points.cpu().detach().numpy() for i in range(expected_voxels.shape[0]): indices = _get_voxel_points_indices(points, coors, expected_voxels[i]) num_points_current_voxel = points[indices].shape[0] assert num_points_current_voxel > 0 assert np.all( points[indices] == expected_coors[i][:num_points_current_voxel]) assert num_points_current_voxel == expected_num_points_per_voxel[i]
def test_voxelization_nondeterministic(): if not torch.cuda.is_available(): pytest.skip('test requires GPU and torch+cuda') voxel_size = [0.5, 0.5, 0.5] point_cloud_range = [0, -40, -3, 70.4, 40, 1] data_path = './tests/data/kitti/training/velodyne_reduced/000000.bin' load_points_from_file = LoadPointsFromFile(coord_type='LIDAR', load_dim=4, use_dim=4) results = dict() results['pts_filename'] = data_path results = load_points_from_file(results) points = results['points'].tensor.numpy() points = torch.tensor(points) max_num_points = -1 dynamic_voxelization = Voxelization(voxel_size, point_cloud_range, max_num_points) max_num_points = 10 max_voxels = 50 hard_voxelization = Voxelization(voxel_size, point_cloud_range, max_num_points, max_voxels, deterministic=False) # test hard_voxelization (non-deterministic version) on gpu points = torch.tensor(points).contiguous().to(device='cuda:0') voxels, coors, num_points_per_voxel = hard_voxelization.forward(points) coors = coors.cpu().detach().numpy().tolist() voxels = voxels.cpu().detach().numpy().tolist() num_points_per_voxel = num_points_per_voxel.cpu().detach().numpy().tolist() coors_all = dynamic_voxelization.forward(points) coors_all = coors_all.cpu().detach().numpy().tolist() coors_set = set([tuple(c) for c in coors]) coors_all_set = set([tuple(c) for c in coors_all]) assert len(coors_set) == len(coors) assert len(coors_set - coors_all_set) == 0 points = points.cpu().detach().numpy().tolist() coors_points_dict = {} for c, ps in zip(coors_all, points): if tuple(c) not in coors_points_dict: coors_points_dict[tuple(c)] = set() coors_points_dict[tuple(c)].add(tuple(ps)) for c, ps, n in zip(coors, voxels, num_points_per_voxel): ideal_voxel_points_set = coors_points_dict[tuple(c)] voxel_points_set = set([tuple(p) for p in ps[:n]]) assert len(voxel_points_set) == n if n < max_num_points: assert voxel_points_set == ideal_voxel_points_set for p in ps[n:]: assert max(p) == min(p) == 0 else: assert len(voxel_points_set - ideal_voxel_points_set) == 0 # test hard_voxelization (non-deterministic version) on gpu # with all input point in range points = torch.tensor(points).contiguous().to(device='cuda:0')[:max_voxels] coors_all = dynamic_voxelization.forward(points) valid_mask = coors_all.ge(0).all(-1) points = points[valid_mask] coors_all = coors_all[valid_mask] coors_all = coors_all.cpu().detach().numpy().tolist() voxels, coors, num_points_per_voxel = hard_voxelization.forward(points) coors = coors.cpu().detach().numpy().tolist() coors_set = set([tuple(c) for c in coors]) coors_all_set = set([tuple(c) for c in coors_all]) assert len(coors_set) == len(coors) == len(coors_all_set)