| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """Tests for preprocess_utils.""" |
| import numpy as np |
| import tensorflow as tf |
|
|
| from deeplab2.data.preprocessing import preprocess_utils |
|
|
|
|
| class PreprocessUtilsTest(tf.test.TestCase): |
|
|
| def testNoFlipWhenProbIsZero(self): |
| numpy_image = np.dstack([[[5., 6.], |
| [9., 0.]], |
| [[4., 3.], |
| [3., 5.]]]) |
| image = tf.convert_to_tensor(numpy_image) |
|
|
| actual, is_flipped = preprocess_utils.flip_dim([image], prob=0, dim=0) |
| self.assertAllEqual(numpy_image, actual) |
| self.assertFalse(is_flipped) |
| actual, is_flipped = preprocess_utils.flip_dim([image], prob=0, dim=1) |
| self.assertAllEqual(numpy_image, actual) |
| self.assertFalse(is_flipped) |
| actual, is_flipped = preprocess_utils.flip_dim([image], prob=0, dim=2) |
| self.assertAllEqual(numpy_image, actual) |
| self.assertFalse(is_flipped) |
|
|
| def testFlipWhenProbIsOne(self): |
| numpy_image = np.dstack([[[5., 6.], |
| [9., 0.]], |
| [[4., 3.], |
| [3., 5.]]]) |
| dim0_flipped = np.dstack([[[9., 0.], |
| [5., 6.]], |
| [[3., 5.], |
| [4., 3.]]]) |
| dim1_flipped = np.dstack([[[6., 5.], |
| [0., 9.]], |
| [[3., 4.], |
| [5., 3.]]]) |
| dim2_flipped = np.dstack([[[4., 3.], |
| [3., 5.]], |
| [[5., 6.], |
| [9., 0.]]]) |
| image = tf.convert_to_tensor(numpy_image) |
|
|
| actual, is_flipped = preprocess_utils.flip_dim([image], prob=1, dim=0) |
| self.assertAllEqual(dim0_flipped, actual) |
| self.assertTrue(is_flipped) |
| actual, is_flipped = preprocess_utils.flip_dim([image], prob=1, dim=1) |
| self.assertAllEqual(dim1_flipped, actual) |
| self.assertTrue(is_flipped) |
| actual, is_flipped = preprocess_utils.flip_dim([image], prob=1, dim=2) |
| self.assertAllEqual(dim2_flipped, actual) |
| self.assertTrue(is_flipped) |
|
|
| def testFlipMultipleImagesConsistentlyWhenProbIsOne(self): |
| numpy_image = np.dstack([[[5., 6.], |
| [9., 0.]], |
| [[4., 3.], |
| [3., 5.]]]) |
| numpy_label = np.dstack([[[0., 1.], |
| [2., 3.]]]) |
| image_dim1_flipped = np.dstack([[[6., 5.], |
| [0., 9.]], |
| [[3., 4.], |
| [5., 3.]]]) |
| label_dim1_flipped = np.dstack([[[1., 0.], |
| [3., 2.]]]) |
| image = tf.convert_to_tensor(numpy_image) |
| label = tf.convert_to_tensor(numpy_label) |
|
|
| image, label, is_flipped = preprocess_utils.flip_dim( |
| [image, label], prob=1, dim=1) |
| self.assertAllEqual(image_dim1_flipped, image) |
| self.assertAllEqual(label_dim1_flipped, label) |
| self.assertTrue(is_flipped) |
|
|
| def testReturnRandomFlipsOnMultipleEvals(self): |
| numpy_image = np.dstack([[[5., 6.], |
| [9., 0.]], |
| [[4., 3.], |
| [3., 5.]]]) |
| dim1_flipped = np.dstack([[[6., 5.], |
| [0., 9.]], |
| [[3., 4.], |
| [5., 3.]]]) |
| image = tf.convert_to_tensor(numpy_image) |
| original_image, not_flipped = preprocess_utils.flip_dim( |
| [image], prob=0, dim=1) |
| flip_image, is_flipped = preprocess_utils.flip_dim( |
| [image], prob=1.0, dim=1) |
| self.assertAllEqual(numpy_image, original_image) |
| self.assertFalse(not_flipped) |
| self.assertAllEqual(dim1_flipped, flip_image) |
| self.assertTrue(is_flipped) |
|
|
| def testReturnCorrectCropOfSingleImage(self): |
| np.random.seed(0) |
|
|
| height, width = 10, 20 |
| image = np.random.randint(0, 256, size=(height, width, 3)) |
|
|
| crop_height, crop_width = 2, 4 |
|
|
| [cropped] = preprocess_utils.random_crop([tf.convert_to_tensor(image)], |
| crop_height, |
| crop_width) |
|
|
| |
| is_found = False |
| for x in range(0, width - crop_width + 1): |
| for y in range(0, height - crop_height + 1): |
| if np.isclose(image[y:y+crop_height, x:x+crop_width, :], |
| cropped).all(): |
| is_found = True |
| break |
|
|
| self.assertTrue(is_found) |
|
|
| def testRandomCropMaintainsNumberOfChannels(self): |
| np.random.seed(0) |
|
|
| crop_height, crop_width = 10, 20 |
| image = np.random.randint(0, 256, size=(100, 200, 3)) |
|
|
| tf.random.set_seed(37) |
| [cropped] = preprocess_utils.random_crop( |
| [tf.convert_to_tensor(image)], crop_height, crop_width) |
|
|
| self.assertListEqual(cropped.shape.as_list(), [crop_height, crop_width, 3]) |
|
|
| def testReturnDifferentCropAreasOnTwoEvals(self): |
| tf.random.set_seed(0) |
|
|
| crop_height, crop_width = 2, 3 |
| image = np.random.randint(0, 256, size=(100, 200, 3)) |
| [cropped0] = preprocess_utils.random_crop( |
| [tf.convert_to_tensor(image)], crop_height, crop_width) |
| [cropped1] = preprocess_utils.random_crop( |
| [tf.convert_to_tensor(image)], crop_height, crop_width) |
|
|
| self.assertFalse(np.isclose(cropped0.numpy(), cropped1.numpy()).all()) |
|
|
| def testReturnConsistenCropsOfImagesInTheList(self): |
| tf.random.set_seed(0) |
|
|
| height, width = 10, 20 |
| crop_height, crop_width = 2, 3 |
| labels = np.linspace(0, height * width-1, height * width) |
| labels = labels.reshape((height, width, 1)) |
| image = np.tile(labels, (1, 1, 3)) |
|
|
| [cropped_image, cropped_label] = preprocess_utils.random_crop( |
| [tf.convert_to_tensor(image), tf.convert_to_tensor(labels)], |
| crop_height, crop_width) |
|
|
| for i in range(3): |
| self.assertAllEqual(cropped_image[:, :, i], tf.squeeze(cropped_label)) |
|
|
| def testDieOnRandomCropWhenImagesWithDifferentWidth(self): |
| crop_height, crop_width = 2, 3 |
| image1 = tf.convert_to_tensor(np.random.rand(4, 5, 3)) |
| image2 = tf.convert_to_tensor(np.random.rand(4, 6, 1)) |
|
|
| with self.assertRaises(tf.errors.InvalidArgumentError): |
| _ = preprocess_utils.random_crop([image1, image2], crop_height, |
| crop_width) |
|
|
| def testDieOnRandomCropWhenImagesWithDifferentHeight(self): |
| crop_height, crop_width = 2, 3 |
| image1 = tf.convert_to_tensor(np.random.rand(4, 5, 3)) |
| image2 = tf.convert_to_tensor(np.random.rand(5, 5, 1)) |
|
|
| with self.assertRaises(tf.errors.InvalidArgumentError): |
| _ = preprocess_utils.random_crop([image1, image2], crop_height, |
| crop_width) |
|
|
| def testDieOnRandomCropWhenCropSizeIsGreaterThanImage(self): |
| crop_height, crop_width = 5, 9 |
| image1 = tf.convert_to_tensor(np.random.rand(4, 5, 3)) |
| image2 = tf.convert_to_tensor(np.random.rand(4, 5, 1)) |
|
|
| with self.assertRaises(tf.errors.InvalidArgumentError): |
| _ = preprocess_utils.random_crop([image1, image2], crop_height, |
| crop_width) |
|
|
| def testRandomScaleFitsInRange(self): |
| scale_value = preprocess_utils.get_random_scale(1., 2., 0.) |
| self.assertGreaterEqual(scale_value, 1.) |
| self.assertLessEqual(scale_value, 2.) |
|
|
| def testDeterminedRandomScaleReturnsNumber(self): |
| scale = preprocess_utils.get_random_scale(1., 1., 0.) |
| self.assertEqual(scale, 1.) |
|
|
| def testResizeTensorsToRange(self): |
| test_shapes = [[60, 40], |
| [15, 30], |
| [15, 50]] |
| min_size = 50 |
| max_size = 100 |
| factor = None |
| expected_shape_list = [(75, 50, 3), |
| (50, 100, 3), |
| (30, 100, 3)] |
| for i, test_shape in enumerate(test_shapes): |
| image = tf.random.normal([test_shape[0], test_shape[1], 3]) |
| new_tensor_list = preprocess_utils.resize_to_range( |
| image=image, |
| label=None, |
| min_size=min_size, |
| max_size=max_size, |
| factor=factor, |
| align_corners=True) |
| self.assertEqual(new_tensor_list[0].shape, expected_shape_list[i]) |
|
|
| def testResizeTensorsToRangeWithFactor(self): |
| test_shapes = [[60, 40], |
| [15, 30], |
| [15, 50]] |
| min_size = 50 |
| max_size = 98 |
| factor = 8 |
| expected_image_shape_list = [(81, 57, 3), |
| (49, 97, 3), |
| (33, 97, 3)] |
| expected_label_shape_list = [(81, 57, 1), |
| (49, 97, 1), |
| (33, 97, 1)] |
| for i, test_shape in enumerate(test_shapes): |
| image = tf.random.normal([test_shape[0], test_shape[1], 3]) |
| label = tf.random.normal([test_shape[0], test_shape[1], 1]) |
| new_tensor_list = preprocess_utils.resize_to_range( |
| image=image, |
| label=label, |
| min_size=min_size, |
| max_size=max_size, |
| factor=factor, |
| align_corners=True) |
| self.assertEqual(new_tensor_list[0].shape, expected_image_shape_list[i]) |
| self.assertEqual(new_tensor_list[1].shape, expected_label_shape_list[i]) |
|
|
| def testResizeTensorsToRangeWithSimilarMinMaxSizes(self): |
| test_shapes = [[60, 40], |
| [15, 30], |
| [15, 50]] |
| |
| min_size = 96 |
| max_size = 98 |
| factor = 8 |
| expected_image_shape_list = [(97, 65, 3), |
| (49, 97, 3), |
| (33, 97, 3)] |
| expected_label_shape_list = [(97, 65, 1), |
| (49, 97, 1), |
| (33, 97, 1)] |
| for i, test_shape in enumerate(test_shapes): |
| image = tf.random.normal([test_shape[0], test_shape[1], 3]) |
| label = tf.random.normal([test_shape[0], test_shape[1], 1]) |
| new_tensor_list = preprocess_utils.resize_to_range( |
| image=image, |
| label=label, |
| min_size=min_size, |
| max_size=max_size, |
| factor=factor, |
| align_corners=True) |
| self.assertEqual(new_tensor_list[0].shape, expected_image_shape_list[i]) |
| self.assertEqual(new_tensor_list[1].shape, expected_label_shape_list[i]) |
|
|
| def testResizeTensorsToRangeWithEqualMaxSize(self): |
| test_shapes = [[97, 38], |
| [96, 97]] |
| |
| min_size = 97 |
| max_size = 97 |
| factor = 8 |
| expected_image_shape_list = [(97, 41, 3), |
| (97, 97, 3)] |
| expected_label_shape_list = [(97, 41, 1), |
| (97, 97, 1)] |
| for i, test_shape in enumerate(test_shapes): |
| image = tf.random.normal([test_shape[0], test_shape[1], 3]) |
| label = tf.random.normal([test_shape[0], test_shape[1], 1]) |
| new_tensor_list = preprocess_utils.resize_to_range( |
| image=image, |
| label=label, |
| min_size=min_size, |
| max_size=max_size, |
| factor=factor, |
| align_corners=True) |
| self.assertEqual(new_tensor_list[0].shape, expected_image_shape_list[i]) |
| self.assertEqual(new_tensor_list[1].shape, expected_label_shape_list[i]) |
|
|
| def testResizeTensorsToRangeWithPotentialErrorInTFCeil(self): |
| test_shape = [3936, 5248] |
| |
| min_size = 1441 |
| max_size = 1441 |
| factor = 16 |
| expected_image_shape = (1089, 1441, 3) |
| expected_label_shape = (1089, 1441, 1) |
| image = tf.random.normal([test_shape[0], test_shape[1], 3]) |
| label = tf.random.normal([test_shape[0], test_shape[1], 1]) |
| new_tensor_list = preprocess_utils.resize_to_range( |
| image=image, |
| label=label, |
| min_size=min_size, |
| max_size=max_size, |
| factor=factor, |
| align_corners=True) |
| self.assertEqual(new_tensor_list[0].shape, expected_image_shape) |
| self.assertEqual(new_tensor_list[1].shape, expected_label_shape) |
|
|
| def testResizeTensorWithOnlyMaxSize(self): |
| test_shapes = [[97, 38], |
| [96, 18]] |
|
|
| max_size = (97, 28) |
| |
| expected_image_shape_list = [(71, 28, 3), |
| (96, 18, 3)] |
| for i, test_shape in enumerate(test_shapes): |
| image = tf.random.normal([test_shape[0], test_shape[1], 3]) |
| new_tensor_list = preprocess_utils.resize_to_range( |
| image=image, |
| label=None, |
| min_size=None, |
| max_size=max_size, |
| align_corners=True) |
| self.assertEqual(new_tensor_list[0].shape, expected_image_shape_list[i]) |
|
|
|
|
| if __name__ == '__main__': |
| tf.test.main() |
|
|