|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""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() |
|
|