Spaces:
Runtime error
Runtime error
| # coding=utf-8 | |
| # Copyright 2021 The Deeplab2 Authors. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """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): | |
| 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]) | |
| # Count zero elements. | |
| 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): | |
| 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): | |
| # Test for odd and even input, and output shapes. | |
| 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): | |
| # Test for odd and even input, and output shapes. | |
| 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 does not include `void` class. | |
| 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() | |