def test_map_semantic_img_fast_pytorch_uint16_stress_test(): """ Test fast method on large example. Map 60,000 classes to a different 60,000 classes with a fast array conversion. np.int16 cannot hold anything over 32767 / 32768. Should take less than 1 millisecond. """ semantic_img = np.array(range(60000)).reshape(3000, 20).astype(np.int64) semantic_img = torch.from_numpy(semantic_img).type(torch.LongTensor) label_mapping = {} for i in range(60000): label_mapping[i] = i + 1 label_mapping_copy = copy.deepcopy(label_mapping) label_mapping_arr = form_label_mapping_array_pytorch(label_mapping) label_mapping_arr_copy = label_mapping_arr.clone() assert label_mapping == label_mapping_copy start = time.time() mapped_img = map_semantic_img_fast_pytorch(semantic_img, label_mapping_arr) end = time.time() assert torch.allclose(label_mapping_arr_copy, label_mapping_arr) assert mapped_img.shape == torch.Size([3000, 20]) assert mapped_img.dtype == torch.int64 print(f'Took {end-start} sec.') gt_mapped_img = np.array(range(60000)).reshape(3000, 20).astype( np.uint16) + 1 assert np.allclose(gt_mapped_img, mapped_img.numpy())
def test_form_label_mapping_array_pytorch_fromzero(): """ Count from zero, with 8-bit unsigned int data type. """ label_mapping = {0: 1, 1: 2, 3: 4} label_mapping_arr = form_label_mapping_array_pytorch(label_mapping) assert label_mapping_arr.shape == torch.Size([4]) assert label_mapping_arr.dtype == torch.int64 gt_label_mapping_arr = np.array([1, 2, 0, 4], dtype=np.uint8) assert np.allclose(label_mapping_arr.numpy(), gt_label_mapping_arr)
def test_map_semantic_img_fast_pytorch(): """ Test fast method on simple conversion from 2x3 grayscale -> 2x3 grayscale. """ semantic_img = np.array([[254, 0, 1], [7, 8, 9]], dtype=np.uint8) semantic_img = torch.from_numpy(semantic_img).type(torch.LongTensor) label_mapping = {254: 253, 0: 255, 1: 0, 7: 6, 8: 7, 9: 8} label_mapping_arr = form_label_mapping_array_pytorch(label_mapping) mapped_img = map_semantic_img_fast_pytorch(semantic_img, label_mapping_arr) gt_mapped_img = np.array([[253, 255, 0], [6, 7, 8]], dtype=np.uint8) assert np.allclose(gt_mapped_img, mapped_img.numpy()) assert mapped_img.dtype == torch.int64
def test_form_label_mapping_array_pytorch_from_nonzero(): """ """ label_mapping = {655: 300, 654: 255, 653: 100} label_mapping_arr = form_label_mapping_array_pytorch(label_mapping) assert label_mapping_arr.shape == torch.Size([656]) assert label_mapping_arr.dtype == torch.int64 gt_label_mapping_arr = np.zeros((656), dtype=np.uint16) gt_label_mapping_arr[655] = 300 gt_label_mapping_arr[654] = 255 gt_label_mapping_arr[653] = 100 print(label_mapping) assert np.allclose(label_mapping_arr.numpy(), gt_label_mapping_arr)
def _form_label_mapping_arrs(self) -> Mapping[str, np.ndarray]: """ Cache conversion maps so we will later be able to perform fast grayscale->grayscale mapping for training data transformation. Each map is implemented as an integer array (given integer index, give back integer value stored at that location). Returns: label_mapping_arr_dict: map dataset names to numpy arrays. """ label_mapping_arr_dict = {} from mseg.utils.mask_utils import form_label_mapping_array_pytorch for dataset in self.train_datasets: label_mapping_arr_dict[dataset] = form_label_mapping_array_pytorch( self.id_to_uid_maps[dataset]) return label_mapping_arr_dict