| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """Tests for utils.""" |
|
|
| import itertools |
|
|
| import numpy as np |
| import tensorflow as tf |
|
|
| from deeplab2.model import utils |
|
|
|
|
| class UtilsTest(tf.test.TestCase): |
|
|
| def test_resize_logits_graph_mode(self): |
| @tf.function |
| def graph_mode_wrapper(*args): |
| return utils.resize_and_rescale_offsets(*args) |
|
|
| resized_logits = graph_mode_wrapper(tf.ones((2, 33, 33, 2)), [65, 65]) |
| resized_logits_2 = graph_mode_wrapper(tf.ones((2, 33, 33, 2)), [33, 33]) |
| self.assertListEqual(resized_logits.shape.as_list(), [2, 65, 65, 2]) |
| self.assertListEqual(resized_logits_2.shape.as_list(), [2, 33, 33, 2]) |
|
|
| def test_resize_logits(self): |
| offset_logits = tf.convert_to_tensor([[[[2, 2], [2, 1], [2, 0]], |
| [[1, 2], [1, 1], [1, 0]], |
| [[0, 2], [0, 1], [0, 0]]]], |
| dtype=tf.float32) |
| target_size = [5, 5] |
| resized_logits = utils.resize_and_rescale_offsets(offset_logits, |
| target_size) |
|
|
| self.assertListEqual(resized_logits.shape.as_list(), [1, 5, 5, 2]) |
| for i in range(5): |
| for j in range(5): |
| np.testing.assert_array_almost_equal(resized_logits.numpy()[0, i, j, :], |
| [4 - i, 4 - j]) |
|
|
| def test_zero_padding(self): |
| input_tensor = tf.ones(shape=(2, 5, 5, 2)) |
| input_tensor_2 = tf.ones(shape=(5, 5, 2)) |
| padded_tensor = utils.add_zero_padding(input_tensor, kernel_size=5, rank=4) |
| padded_tensor_2 = utils.add_zero_padding( |
| input_tensor_2, kernel_size=5, rank=3) |
|
|
| self.assertEqual(tf.reduce_sum(padded_tensor), 100) |
| self.assertEqual(tf.reduce_sum(padded_tensor_2), 50) |
| self.assertListEqual(padded_tensor.shape.as_list(), [2, 9, 9, 2]) |
| self.assertListEqual(padded_tensor_2.shape.as_list(), [9, 9, 2]) |
| |
| self.assertEqual(tf.reduce_sum(padded_tensor-1), -224) |
| self.assertEqual(tf.reduce_sum(padded_tensor_2-1), -112) |
|
|
| def test_resize_function_error(self): |
| input_tensor = tf.random.uniform(shape=(2, 10, 10, 2)) |
| with self.assertRaises(ValueError): |
| _ = utils.resize_align_corners(input_tensor, [19, 19], |
| method='not_a_valid_method') |
|
|
| def test_resize_function_shape(self): |
| input_tensor = tf.random.uniform(shape=(2, 10, 10, 2)) |
| result_tensor = utils.resize_align_corners(input_tensor, [19, 19]) |
|
|
| self.assertListEqual(result_tensor.shape.as_list(), [2, 19, 19, 2]) |
|
|
| def test_resize_graph_mode(self): |
| @tf.function |
| def graph_mode_wrapper(*args): |
| return utils.resize_align_corners(*args) |
|
|
| result_tensor = graph_mode_wrapper(tf.ones((2, 33, 33, 2)), [65, 65]) |
| result_tensor_2 = graph_mode_wrapper(tf.ones((2, 33, 33, 2)), [33, 33]) |
| self.assertListEqual(result_tensor.shape.as_list(), [2, 65, 65, 2]) |
| self.assertListEqual(result_tensor_2.shape.as_list(), [2, 33, 33, 2]) |
|
|
| def test_resize_function_constant_input(self): |
| input_tensor = tf.ones(shape=(2, 10, 10, 2)) |
| result_tensor = utils.resize_align_corners(input_tensor, [19, 19]) |
|
|
| self.assertTrue(tf.keras.backend.all(result_tensor == 1)) |
|
|
| def test_resize_function_invalid_rank(self): |
| input_tensor = tf.keras.Input(shape=(None, 2)) |
| with self.assertRaisesRegex( |
| ValueError, 'should have rank of 4'): |
| _ = utils.resize_align_corners(input_tensor, [19, 19]) |
|
|
| def test_resize_function_v1_compatibility(self): |
| |
| input_shapes = [(2, 10, 10, 3), (2, 11, 11, 3)] |
| target_sizes = [[19, 19], [20, 20]] |
| methods = ['bilinear', 'nearest'] |
|
|
| for shape, target_size, method in itertools.product(input_shapes, |
| target_sizes, methods): |
| input_tensor = tf.random.uniform(shape=shape) |
|
|
| result_tensor = utils.resize_align_corners(input_tensor, target_size, |
| method) |
| if method == 'bilinear': |
| expected_tensor = tf.compat.v1.image.resize( |
| input_tensor, |
| target_size, |
| align_corners=True, |
| method=tf.compat.v1.image.ResizeMethod.BILINEAR) |
| else: |
| expected_tensor = tf.compat.v1.image.resize( |
| input_tensor, |
| target_size, |
| align_corners=True, |
| method=tf.compat.v1.image.ResizeMethod.NEAREST_NEIGHBOR) |
|
|
| np.testing.assert_equal(result_tensor.numpy(), expected_tensor.numpy()) |
|
|
| def test_resize_bilinear_v1_compatibility(self): |
| |
| input_shapes = [(2, 10, 10, 3), (2, 11, 11, 3), (1, 11, 11, 64)] |
| target_sizes = [[19, 19], [20, 20], [10, 10]] |
|
|
| for shape, target_size in itertools.product(input_shapes, target_sizes): |
| input_tensor = tf.random.uniform(shape=shape) |
| result_tensor = utils.resize_bilinear(input_tensor, target_size) |
| expected_tensor = tf.compat.v1.image.resize( |
| input_tensor, |
| target_size, |
| align_corners=True, |
| method=tf.compat.v1.image.ResizeMethod.BILINEAR) |
| self.assertAllClose(result_tensor, expected_tensor) |
|
|
| def test_make_divisible(self): |
| value, divisor, min_value = 17, 2, 8 |
| new_value = utils.make_divisible(value, divisor, min_value) |
| self.assertAllEqual(new_value, 18) |
|
|
| value, divisor, min_value = 17, 2, 22 |
| new_value = utils.make_divisible(value, divisor, min_value) |
| self.assertAllEqual(new_value, 22) |
|
|
| def test_transpose_and_reshape_for_attention_operation(self): |
| images = tf.zeros([2, 8, 11, 2]) |
| output = utils.transpose_and_reshape_for_attention_operation(images) |
| self.assertEqual(output.get_shape().as_list(), [2, 11, 16]) |
|
|
| def test_reshape_and_transpose_for_attention_operation(self): |
| images = tf.zeros([2, 11, 16]) |
| output = utils.reshape_and_transpose_for_attention_operation(images, |
| num_heads=8) |
| self.assertEqual(output.get_shape().as_list(), [2, 8, 11, 2]) |
|
|
| def test_safe_setattr_raise_error(self): |
| layer = tf.keras.layers.Conv2D(1, 1) |
| with self.assertRaises(ValueError): |
| utils.safe_setattr(layer, 'filters', 3) |
|
|
| utils.safe_setattr(layer, 'another_conv', tf.keras.layers.Conv2D(1, 1)) |
| with self.assertRaises(ValueError): |
| utils.safe_setattr(layer, 'another_conv', tf.keras.layers.Conv2D(1, 1)) |
|
|
| def test_pad_sequence_with_none(self): |
| sequence = [1, 2] |
| output_2 = utils.pad_sequence_with_none(sequence, target_length=2) |
| self.assertEqual(output_2, [1, 2]) |
| output_3 = utils.pad_sequence_with_none(sequence, target_length=3) |
| self.assertEqual(output_3, [1, 2, None]) |
|
|
| def test_strided_downsample(self): |
| inputs = tf.zeros([2, 11, 11]) |
| output = utils.strided_downsample(inputs, target_size=[6, 6]) |
| self.assertEqual(output.get_shape().as_list(), [2, 6, 6]) |
|
|
| def test_get_stuff_class_ids(self): |
| |
| num_thing_stuff_classes = 5 |
| thing_class_ids = [3, 4] |
| void_label_list = [5, 0] |
| expected_stuff_class_ids_list = [ |
| [0, 1, 2], [1, 2, 5] |
| ] |
| for void_label, expected_stuff_class_ids in zip( |
| void_label_list, expected_stuff_class_ids_list): |
| stuff_class_ids = utils.get_stuff_class_ids( |
| num_thing_stuff_classes, thing_class_ids, void_label) |
| np.testing.assert_equal(stuff_class_ids, |
| expected_stuff_class_ids) |
|
|
| if __name__ == '__main__': |
| tf.test.main() |
|
|