|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Tests for Tensorflow instance utils.""" |
|
|
|
import numpy as np |
|
import tensorflow as tf |
|
|
|
from deeplab2.utils import panoptic_instances |
|
|
|
|
|
class TensorflowInstanceBoxesTest(tf.test.TestCase): |
|
|
|
def testFilterPanopticLabelsByIgnoreCategories(self): |
|
panoptic_divisor = 9 |
|
panoptic_labels = [ |
|
4 * panoptic_divisor + 3, |
|
2 * panoptic_divisor + 7, |
|
4 * panoptic_divisor, |
|
1 * panoptic_divisor + 2, |
|
4, |
|
8, |
|
4 * panoptic_divisor + 1, |
|
1 * panoptic_divisor, |
|
] |
|
panoptic_labels_tensor = tf.constant(panoptic_labels, dtype=tf.int32) |
|
|
|
ignore_categories = [0, 4] |
|
is_kept = panoptic_instances.instances_without_ignore_categories( |
|
panoptic_labels_tensor, ignore_categories, panoptic_divisor) |
|
with self.cached_session() as sess: |
|
is_kept_result = sess.run(is_kept) |
|
|
|
np.testing.assert_array_equal( |
|
is_kept_result, [False, True, False, True, False, False, False, True]) |
|
|
|
def testFilterByIgnoreCategoriesWithEmptyIgnore(self): |
|
panoptic_labels = [14, 19, 0, 2] |
|
panoptic_labels_tensor = tf.constant(panoptic_labels, dtype=tf.int32) |
|
panoptic_divisor = 7 |
|
|
|
is_kept_empty_ignore = panoptic_instances.instances_without_ignore_categories( |
|
panoptic_labels_tensor, [], panoptic_divisor) |
|
with self.cached_session() as sess: |
|
is_kept_empty_ignore_result = sess.run(is_kept_empty_ignore) |
|
|
|
np.testing.assert_array_equal(is_kept_empty_ignore_result, |
|
[True, True, True, True]) |
|
|
|
def testFilterByIgnoreCategoriesWithEmptyPanopticLabels(self): |
|
panoptic_labels = tf.zeros([0], dtype=tf.int32) |
|
ignore_categories = [2, 3] |
|
panoptic_divisor = 7 |
|
|
|
is_kept_empty_labels = panoptic_instances.instances_without_ignore_categories( |
|
panoptic_labels, ignore_categories, panoptic_divisor) |
|
with self.cached_session() as sess: |
|
is_kept_empty_labels_result = sess.run(is_kept_empty_labels) |
|
np.testing.assert_array_equal(is_kept_empty_labels_result, []) |
|
|
|
def testComputesInstanceBoxes(self): |
|
instance_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 2, 2], |
|
[5, 1, 2, 2], |
|
[1, 1, 1, 1], |
|
[0, 0, 0, 2], |
|
[0, 0, 0, 0], |
|
] |
|
instance_labels_tensor = tf.constant(instance_labels, dtype=tf.int64) |
|
|
|
category_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 1, 1], |
|
[1, 1, 1, 1], |
|
[2, 2, 2, 2], |
|
[0, 0, 0, 1], |
|
[3, 3, 3, 3], |
|
] |
|
category_labels_tensor = tf.constant(category_labels, dtype=tf.int64) |
|
|
|
panoptic_divisor = 13 |
|
panoptic_labels = ( |
|
instance_labels_tensor + panoptic_divisor * category_labels_tensor) |
|
|
|
ignore_categories = tf.constant([0, 3], dtype=tf.int64) |
|
|
|
unique_labels, box_coords = panoptic_instances.instance_boxes_from_masks( |
|
panoptic_labels, ignore_categories, panoptic_divisor) |
|
with self.cached_session() as sess: |
|
unique_labels_result, box_coords_result = sess.run( |
|
[unique_labels, box_coords]) |
|
|
|
np.testing.assert_array_equal(unique_labels_result, [14, 15, 18, 27]) |
|
np.testing.assert_array_equal( |
|
box_coords_result, |
|
[ |
|
[0, 1, 3, 3], |
|
[1, 2, 5, 4], |
|
[2, 0, 3, 1], |
|
[3, 0, 4, 4], |
|
]) |
|
|
|
def testIgnoresNothing(self): |
|
instance_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 2, 2], |
|
[5, 1, 2, 2], |
|
] |
|
instance_labels_tensor = tf.constant(instance_labels, dtype=tf.int64) |
|
|
|
category_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 1, 1], |
|
[1, 1, 1, 1], |
|
] |
|
category_labels_tensor = tf.constant(category_labels, dtype=tf.int64) |
|
|
|
panoptic_divisor = 7 |
|
panoptic_labels = ( |
|
instance_labels_tensor + panoptic_divisor * category_labels_tensor) |
|
|
|
unique_labels, box_coords = panoptic_instances.instance_boxes_from_masks( |
|
panoptic_labels, panoptic_divisor=panoptic_divisor) |
|
with self.cached_session() as sess: |
|
unique_labels_result, box_coords_result = sess.run( |
|
[unique_labels, box_coords]) |
|
|
|
np.testing.assert_array_equal(unique_labels_result, [0, 8, 9, 12]) |
|
np.testing.assert_array_equal( |
|
box_coords_result, |
|
[ |
|
[0, 0, 2, 4], |
|
[0, 1, 3, 3], |
|
[1, 2, 3, 4], |
|
[2, 0, 3, 1], |
|
]) |
|
|
|
def testIgnoresEverything(self): |
|
instance_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 2, 2], |
|
[5, 1, 2, 2], |
|
] |
|
instance_labels_tensor = tf.constant(instance_labels, dtype=tf.int64) |
|
|
|
category_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 2, 2], |
|
[1, 1, 2, 2], |
|
] |
|
category_labels_tensor = tf.constant(category_labels, dtype=tf.int64) |
|
|
|
panoptic_divisor = 11 |
|
panoptic_labels = ( |
|
instance_labels_tensor + panoptic_divisor * category_labels_tensor) |
|
|
|
ignore_categories = [0, 1, 2] |
|
|
|
unique_labels, box_coords = panoptic_instances.instance_boxes_from_masks( |
|
panoptic_labels, ignore_categories, panoptic_divisor) |
|
with self.cached_session() as sess: |
|
unique_labels_result, box_coords_result = sess.run( |
|
[unique_labels, box_coords]) |
|
|
|
self.assertSequenceEqual(unique_labels_result.shape, (0,)) |
|
self.assertSequenceEqual(box_coords_result.shape, (0, 4)) |
|
|
|
def testSingleInstance(self): |
|
instance_labels = [ |
|
[0, 0, 0], |
|
[0, 0, 0], |
|
] |
|
instance_labels_tensor = tf.constant(instance_labels, dtype=tf.int64) |
|
|
|
category_labels = [ |
|
[3, 3, 3], |
|
[3, 3, 3], |
|
] |
|
category_labels_tensor = tf.constant(category_labels, dtype=tf.int64) |
|
|
|
panoptic_divisor = 9 |
|
panoptic_labels = ( |
|
instance_labels_tensor + panoptic_divisor * category_labels_tensor) |
|
|
|
unique_labels, box_coords = panoptic_instances.instance_boxes_from_masks( |
|
panoptic_labels, panoptic_divisor=panoptic_divisor) |
|
with self.cached_session() as sess: |
|
unique_labels_result, box_coords_result = sess.run( |
|
[unique_labels, box_coords]) |
|
|
|
np.testing.assert_array_equal(unique_labels_result, [27]) |
|
np.testing.assert_array_equal(box_coords_result, [[0, 0, 2, 3]]) |
|
|
|
|
|
class InstanceScoringTest(tf.test.TestCase): |
|
|
|
def testGetsSemanticProbabilities(self): |
|
ignore_label = 3 |
|
semantic_labels = [ |
|
[0, 1, 1, 0, 0], |
|
[0, 1, 1, 1, 0], |
|
[1, 1, 1, 1, 1], |
|
[2, 2, 2, 2, 2], |
|
] |
|
semantic_tensor = tf.constant(semantic_labels, dtype=tf.int32) |
|
|
|
instances = [ |
|
[1, 2, 2, 1, 1], |
|
[1, 2, 3, 3, 1], |
|
[6, 2, 3, 3, 3], |
|
[2, 2, 2, 2, 2], |
|
] |
|
instances_tensor = tf.constant(instances, dtype=tf.int32) |
|
|
|
panoptic_divisor = 13 |
|
panoptic_labels = semantic_tensor * panoptic_divisor + instances_tensor |
|
|
|
category_0_probability = [ |
|
[1.0, 0.0, 0.0, 0.8, 0.9], |
|
[0.8, 0.0, 0.0, 0.2, 1.0], |
|
[0.1, 0.0, 0.2, 0.1, 0.2], |
|
[0.1, 0.1, 0.2, 0.0, 0.0], |
|
] |
|
category_1_probability = [ |
|
[0.0, 1.0, 0.9, 0.0, 0.1], |
|
[0.0, 1.0, 0.9, 0.9, 0.0], |
|
[0.8, 0.7, 0.7, 0.8, 0.9], |
|
[0.0, 0.2, 0.2, 0.0, 0.4], |
|
] |
|
category_2_probability = ( |
|
np.ones((4, 5), dtype=np.float32) - |
|
(np.array(category_0_probability) + np.array(category_1_probability))) |
|
semantic_probability = np.stack([ |
|
category_0_probability, category_1_probability, category_2_probability |
|
], |
|
axis=2) |
|
semantic_probability_tensor = tf.constant(semantic_probability, tf.float32) |
|
|
|
instance_panoptic_labels, _, instance_area = tf.unique_with_counts( |
|
tf.reshape(panoptic_labels, [20])) |
|
probs = panoptic_instances.per_instance_semantic_probabilities( |
|
panoptic_labels, instance_panoptic_labels, instance_area, |
|
semantic_probability_tensor, panoptic_divisor, ignore_label) |
|
|
|
probs_result = probs.numpy() |
|
|
|
np.testing.assert_array_almost_equal(probs_result, |
|
[0.9, 0.9, 0.84, 0.8, 0.76]) |
|
|
|
def testCombineInstanceScores(self): |
|
|
|
|
|
ignore_label = -1 |
|
semantic_labels = [ |
|
[0, 1, 1, 0], |
|
[0, 1, 1, 1], |
|
[1, 1, 1, 1], |
|
] |
|
semantic_tensor = tf.constant(semantic_labels, dtype=tf.int32) |
|
|
|
instances = [ |
|
[1, 2, 2, 1], |
|
[1, 2, 3, 3], |
|
[6, 2, 3, 3], |
|
] |
|
instances_tensor = tf.constant(instances, dtype=tf.int32) |
|
|
|
panoptic_divisor = 8 |
|
panoptic_labels = semantic_tensor * panoptic_divisor + instances_tensor |
|
|
|
category_0_probability = [ |
|
[1.0, 0.0, 0.0, 0.8], |
|
[0.8, 0.0, 0.0, 0.2], |
|
[0.1, 0.0, 0.2, 0.1], |
|
] |
|
category_1_probability = ( |
|
np.ones((3, 4), dtype=np.float32) - np.array(category_0_probability)) |
|
semantic_probability = np.stack([ |
|
category_0_probability, |
|
category_1_probability, |
|
], |
|
axis=2) |
|
semantic_probability_tensor = tf.constant(semantic_probability, tf.float32) |
|
|
|
instance_scores = [ |
|
[0.0, 0.5, 0.5, 0.0], |
|
[0.0, 0.5, 0.7, 0.7], |
|
[0.8, 0.5, 0.7, 0.7], |
|
] |
|
instance_scores_tensor = tf.constant(instance_scores, tf.float32) |
|
|
|
labels, combined_scores = panoptic_instances.combined_instance_scores( |
|
panoptic_labels, semantic_probability_tensor, instance_scores_tensor, |
|
panoptic_divisor, ignore_label) |
|
|
|
labels_result = labels.numpy() |
|
combined_scores_result = combined_scores.numpy() |
|
|
|
np.testing.assert_array_equal(labels_result, [1, 10, 11, 14]) |
|
np.testing.assert_array_almost_equal(combined_scores_result, |
|
[0, 0.5, 0.875 * 0.7, 0.9 * 0.8]) |
|
|
|
def testIgnoresLabel(self): |
|
|
|
|
|
ignore_label = 255 |
|
semantic_labels = [ |
|
[0, 1], |
|
[0, 255], |
|
] |
|
semantic_tensor = tf.constant(semantic_labels, dtype=tf.int32) |
|
|
|
instances = [ |
|
[1, 2], |
|
[1, 3], |
|
] |
|
instances_tensor = tf.constant(instances, dtype=tf.int32) |
|
|
|
panoptic_divisor = 256 |
|
panoptic_labels = semantic_tensor * panoptic_divisor + instances_tensor |
|
|
|
category_0_probability = [ |
|
[1.0, 0.0], |
|
[0.8, 0.0], |
|
] |
|
category_1_probability = ( |
|
np.ones((2, 2), dtype=np.float32) - np.array(category_0_probability)) |
|
semantic_probability = np.stack([ |
|
category_0_probability, |
|
category_1_probability, |
|
], |
|
axis=2) |
|
semantic_probability_tensor = tf.constant(semantic_probability, tf.float32) |
|
|
|
instance_scores = [ |
|
[1.0, 0.5], |
|
[1.0, 0.5], |
|
] |
|
instance_scores_tensor = tf.constant(instance_scores, tf.float32) |
|
|
|
labels, combined_scores = panoptic_instances.combined_instance_scores( |
|
panoptic_labels, semantic_probability_tensor, instance_scores_tensor, |
|
panoptic_divisor, ignore_label) |
|
|
|
labels_result = labels.numpy() |
|
combined_scores_result = combined_scores.numpy() |
|
|
|
np.testing.assert_array_equal(labels_result, [1, 258]) |
|
np.testing.assert_array_almost_equal(combined_scores_result, [0.9, 0.5]) |
|
|
|
|
|
class InstanceIsCrowdTest(tf.test.TestCase): |
|
|
|
def testGetsIsCrowdValues(self): |
|
is_crowd_map = tf.constant([ |
|
[1, 0, 0], |
|
[1, 0, 1], |
|
[0, 1, 1], |
|
], tf.uint8) |
|
is_crowd_map = tf.cast(is_crowd_map, tf.bool) |
|
id_map = tf.constant([ |
|
[0, 1, 1], |
|
[0, 2, 3], |
|
[4, 3, 3], |
|
], tf.int32) |
|
output_ids = tf.range(5) |
|
|
|
instance_is_crowd = panoptic_instances.per_instance_is_crowd( |
|
is_crowd_map, id_map, output_ids) |
|
|
|
is_crowd_result = instance_is_crowd.numpy() |
|
np.testing.assert_array_equal(is_crowd_result, |
|
[True, False, False, True, False]) |
|
|
|
def testGetsSubsetOfIsCrowdValues(self): |
|
is_crowd_map = tf.constant([ |
|
[1, 0, 0], |
|
[1, 0, 1], |
|
[0, 1, 1], |
|
], tf.uint8) |
|
is_crowd_map = tf.cast(is_crowd_map, tf.bool) |
|
id_map = tf.constant([ |
|
[0, 1, 1], |
|
[0, 2, 3], |
|
[4, 3, 3], |
|
], tf.int32) |
|
output_ids = [1, 3] |
|
|
|
instance_is_crowd = panoptic_instances.per_instance_is_crowd( |
|
is_crowd_map, id_map, output_ids) |
|
|
|
is_crowd_result = instance_is_crowd.numpy() |
|
np.testing.assert_array_equal(is_crowd_result, [False, True]) |
|
|
|
def testGetsIsCrowdValuesWithIdsInArbitraryOrder(self): |
|
is_crowd_map = tf.constant([ |
|
[1, 0, 0], |
|
[1, 0, 1], |
|
[1, 1, 1], |
|
], tf.uint8) |
|
is_crowd_map = tf.cast(is_crowd_map, tf.bool) |
|
id_map = tf.constant([ |
|
[0, 1, 1], |
|
[0, 2, 3], |
|
[4, 3, 3], |
|
], tf.int32) |
|
output_ids = [1, 3, 0, 2, 4] |
|
|
|
instance_is_crowd = panoptic_instances.per_instance_is_crowd( |
|
is_crowd_map, id_map, output_ids) |
|
|
|
is_crowd_result = instance_is_crowd.numpy() |
|
np.testing.assert_array_equal(is_crowd_result, |
|
[False, True, True, False, True]) |
|
|
|
|
|
if __name__ == '__main__': |
|
tf.test.main() |
|
|