|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| """Tests for segmentation "streaming" metrics."""
|
|
|
| from __future__ import absolute_import
|
| from __future__ import division
|
| from __future__ import print_function
|
|
|
| import collections
|
|
|
|
|
|
|
| import numpy as np
|
| import six
|
| import tensorflow as tf
|
|
|
| from deeplab.evaluation import streaming_metrics
|
| from deeplab.evaluation import test_utils
|
|
|
|
|
|
|
| _CLASS_COLOR_MAP = {
|
| (0, 0, 0): 0,
|
| (0, 0, 255): 1,
|
| (255, 0, 0): 2,
|
| (0, 255, 0): 3,
|
| (255, 0, 255): 4,
|
| (0, 255, 255): 5,
|
| (255, 255, 0): 6,
|
| }
|
|
|
|
|
| class StreamingPanopticQualityTest(tf.test.TestCase):
|
|
|
| def test_streaming_metric_on_single_image(self):
|
| offset = 256 * 256
|
|
|
| instance_class_map = {
|
| 0: 0,
|
| 47: 1,
|
| 97: 1,
|
| 133: 1,
|
| 150: 1,
|
| 174: 1,
|
| 198: 2,
|
| 215: 1,
|
| 244: 1,
|
| 255: 1,
|
| }
|
| gt_instances, gt_classes = test_utils.panoptic_segmentation_with_class_map(
|
| 'team_gt_instance.png', instance_class_map)
|
|
|
| pred_classes = test_utils.read_segmentation_with_rgb_color_map(
|
| 'team_pred_class.png', _CLASS_COLOR_MAP)
|
| pred_instances = test_utils.read_test_image(
|
| 'team_pred_instance.png', mode='L')
|
|
|
| gt_class_tensor = tf.placeholder(tf.uint16)
|
| gt_instance_tensor = tf.placeholder(tf.uint16)
|
| pred_class_tensor = tf.placeholder(tf.uint16)
|
| pred_instance_tensor = tf.placeholder(tf.uint16)
|
| qualities, update_pq = streaming_metrics.streaming_panoptic_quality(
|
| gt_class_tensor,
|
| gt_instance_tensor,
|
| pred_class_tensor,
|
| pred_instance_tensor,
|
| num_classes=3,
|
| max_instances_per_category=256,
|
| ignored_label=0,
|
| offset=offset)
|
| pq, sq, rq, total_tp, total_fn, total_fp = tf.unstack(qualities, 6, axis=0)
|
| feed_dict = {
|
| gt_class_tensor: gt_classes,
|
| gt_instance_tensor: gt_instances,
|
| pred_class_tensor: pred_classes,
|
| pred_instance_tensor: pred_instances
|
| }
|
|
|
| with self.session() as sess:
|
| sess.run(tf.local_variables_initializer())
|
| sess.run(update_pq, feed_dict=feed_dict)
|
| (result_pq, result_sq, result_rq, result_total_tp, result_total_fn,
|
| result_total_fp) = sess.run([pq, sq, rq, total_tp, total_fn, total_fp],
|
| feed_dict=feed_dict)
|
| np.testing.assert_array_almost_equal(
|
| result_pq, [2.06104, 0.7024, 0.54069], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_sq, [2.06104, 0.7526, 0.54069], decimal=4)
|
| np.testing.assert_array_almost_equal(result_rq, [1., 0.9333, 1.], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_total_tp, [1., 7., 1.], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_total_fn, [0., 1., 0.], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_total_fp, [0., 0., 0.], decimal=4)
|
|
|
| def test_streaming_metric_on_multiple_images(self):
|
| num_classes = 7
|
| offset = 256 * 256
|
|
|
| bird_gt_instance_class_map = {
|
| 92: 5,
|
| 176: 3,
|
| 255: 4,
|
| }
|
| cat_gt_instance_class_map = {
|
| 0: 0,
|
| 255: 6,
|
| }
|
| team_gt_instance_class_map = {
|
| 0: 0,
|
| 47: 1,
|
| 97: 1,
|
| 133: 1,
|
| 150: 1,
|
| 174: 1,
|
| 198: 2,
|
| 215: 1,
|
| 244: 1,
|
| 255: 1,
|
| }
|
| test_image = collections.namedtuple(
|
| 'TestImage',
|
| ['gt_class_map', 'gt_path', 'pred_inst_path', 'pred_class_path'])
|
| test_images = [
|
| test_image(bird_gt_instance_class_map, 'bird_gt.png',
|
| 'bird_pred_instance.png', 'bird_pred_class.png'),
|
| test_image(cat_gt_instance_class_map, 'cat_gt.png',
|
| 'cat_pred_instance.png', 'cat_pred_class.png'),
|
| test_image(team_gt_instance_class_map, 'team_gt_instance.png',
|
| 'team_pred_instance.png', 'team_pred_class.png'),
|
| ]
|
|
|
| gt_classes = []
|
| gt_instances = []
|
| pred_classes = []
|
| pred_instances = []
|
| for test_image in test_images:
|
| (image_gt_instances,
|
| image_gt_classes) = test_utils.panoptic_segmentation_with_class_map(
|
| test_image.gt_path, test_image.gt_class_map)
|
| gt_classes.append(image_gt_classes)
|
| gt_instances.append(image_gt_instances)
|
|
|
| pred_classes.append(
|
| test_utils.read_segmentation_with_rgb_color_map(
|
| test_image.pred_class_path, _CLASS_COLOR_MAP))
|
| pred_instances.append(
|
| test_utils.read_test_image(test_image.pred_inst_path, mode='L'))
|
|
|
| gt_class_tensor = tf.placeholder(tf.uint16)
|
| gt_instance_tensor = tf.placeholder(tf.uint16)
|
| pred_class_tensor = tf.placeholder(tf.uint16)
|
| pred_instance_tensor = tf.placeholder(tf.uint16)
|
| qualities, update_pq = streaming_metrics.streaming_panoptic_quality(
|
| gt_class_tensor,
|
| gt_instance_tensor,
|
| pred_class_tensor,
|
| pred_instance_tensor,
|
| num_classes=num_classes,
|
| max_instances_per_category=256,
|
| ignored_label=0,
|
| offset=offset)
|
| pq, sq, rq, total_tp, total_fn, total_fp = tf.unstack(qualities, 6, axis=0)
|
| with self.session() as sess:
|
| sess.run(tf.local_variables_initializer())
|
| for pred_class, pred_instance, gt_class, gt_instance in six.moves.zip(
|
| pred_classes, pred_instances, gt_classes, gt_instances):
|
| sess.run(
|
| update_pq,
|
| feed_dict={
|
| gt_class_tensor: gt_class,
|
| gt_instance_tensor: gt_instance,
|
| pred_class_tensor: pred_class,
|
| pred_instance_tensor: pred_instance
|
| })
|
| (result_pq, result_sq, result_rq, result_total_tp, result_total_fn,
|
| result_total_fp) = sess.run(
|
| [pq, sq, rq, total_tp, total_fn, total_fp],
|
| feed_dict={
|
| gt_class_tensor: 0,
|
| gt_instance_tensor: 0,
|
| pred_class_tensor: 0,
|
| pred_instance_tensor: 0
|
| })
|
| np.testing.assert_array_almost_equal(
|
| result_pq,
|
| [4.3107, 0.7024, 0.54069, 0.745353, 0.85768, 0.99107, 0.77410],
|
| decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_sq, [5.3883, 0.7526, 0.5407, 0.7454, 0.8577, 0.9911, 0.7741],
|
| decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_rq, [0.8, 0.9333, 1., 1., 1., 1., 1.], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_total_tp, [2., 7., 1., 1., 1., 1., 1.], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_total_fn, [0., 1., 0., 0., 0., 0., 0.], decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_total_fp, [1., 0., 0., 0., 0., 0., 0.], decimal=4)
|
|
|
|
|
| class StreamingParsingCoveringTest(tf.test.TestCase):
|
|
|
| def test_streaming_metric_on_single_image(self):
|
| offset = 256 * 256
|
|
|
| instance_class_map = {
|
| 0: 0,
|
| 47: 1,
|
| 97: 1,
|
| 133: 1,
|
| 150: 1,
|
| 174: 1,
|
| 198: 2,
|
| 215: 1,
|
| 244: 1,
|
| 255: 1,
|
| }
|
| gt_instances, gt_classes = test_utils.panoptic_segmentation_with_class_map(
|
| 'team_gt_instance.png', instance_class_map)
|
|
|
| pred_classes = test_utils.read_segmentation_with_rgb_color_map(
|
| 'team_pred_class.png', _CLASS_COLOR_MAP)
|
| pred_instances = test_utils.read_test_image(
|
| 'team_pred_instance.png', mode='L')
|
|
|
| gt_class_tensor = tf.placeholder(tf.uint16)
|
| gt_instance_tensor = tf.placeholder(tf.uint16)
|
| pred_class_tensor = tf.placeholder(tf.uint16)
|
| pred_instance_tensor = tf.placeholder(tf.uint16)
|
| coverings, update_ops = streaming_metrics.streaming_parsing_covering(
|
| gt_class_tensor,
|
| gt_instance_tensor,
|
| pred_class_tensor,
|
| pred_instance_tensor,
|
| num_classes=3,
|
| max_instances_per_category=256,
|
| ignored_label=0,
|
| offset=offset,
|
| normalize_by_image_size=False)
|
| (per_class_coverings, per_class_weighted_ious, per_class_gt_areas) = (
|
| tf.unstack(coverings, num=3, axis=0))
|
| feed_dict = {
|
| gt_class_tensor: gt_classes,
|
| gt_instance_tensor: gt_instances,
|
| pred_class_tensor: pred_classes,
|
| pred_instance_tensor: pred_instances
|
| }
|
|
|
| with self.session() as sess:
|
| sess.run(tf.local_variables_initializer())
|
| sess.run(update_ops, feed_dict=feed_dict)
|
| (result_per_class_coverings, result_per_class_weighted_ious,
|
| result_per_class_gt_areas) = (
|
| sess.run([
|
| per_class_coverings,
|
| per_class_weighted_ious,
|
| per_class_gt_areas,
|
| ],
|
| feed_dict=feed_dict))
|
|
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_coverings, [0.0, 0.7009696912, 0.5406896552],
|
| decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_weighted_ious, [0.0, 39864.14634, 3136], decimal=4)
|
| np.testing.assert_array_equal(result_per_class_gt_areas, [0, 56870, 5800])
|
|
|
| def test_streaming_metric_on_multiple_images(self):
|
| """Tests streaming parsing covering metric."""
|
| num_classes = 7
|
| offset = 256 * 256
|
|
|
| bird_gt_instance_class_map = {
|
| 92: 5,
|
| 176: 3,
|
| 255: 4,
|
| }
|
| cat_gt_instance_class_map = {
|
| 0: 0,
|
| 255: 6,
|
| }
|
| team_gt_instance_class_map = {
|
| 0: 0,
|
| 47: 1,
|
| 97: 1,
|
| 133: 1,
|
| 150: 1,
|
| 174: 1,
|
| 198: 2,
|
| 215: 1,
|
| 244: 1,
|
| 255: 1,
|
| }
|
| test_image = collections.namedtuple(
|
| 'TestImage',
|
| ['gt_class_map', 'gt_path', 'pred_inst_path', 'pred_class_path'])
|
| test_images = [
|
| test_image(bird_gt_instance_class_map, 'bird_gt.png',
|
| 'bird_pred_instance.png', 'bird_pred_class.png'),
|
| test_image(cat_gt_instance_class_map, 'cat_gt.png',
|
| 'cat_pred_instance.png', 'cat_pred_class.png'),
|
| test_image(team_gt_instance_class_map, 'team_gt_instance.png',
|
| 'team_pred_instance.png', 'team_pred_class.png'),
|
| ]
|
|
|
| gt_classes = []
|
| gt_instances = []
|
| pred_classes = []
|
| pred_instances = []
|
| for test_image in test_images:
|
| (image_gt_instances,
|
| image_gt_classes) = test_utils.panoptic_segmentation_with_class_map(
|
| test_image.gt_path, test_image.gt_class_map)
|
| gt_classes.append(image_gt_classes)
|
| gt_instances.append(image_gt_instances)
|
|
|
| pred_instances.append(
|
| test_utils.read_test_image(test_image.pred_inst_path, mode='L'))
|
| pred_classes.append(
|
| test_utils.read_segmentation_with_rgb_color_map(
|
| test_image.pred_class_path, _CLASS_COLOR_MAP))
|
|
|
| gt_class_tensor = tf.placeholder(tf.uint16)
|
| gt_instance_tensor = tf.placeholder(tf.uint16)
|
| pred_class_tensor = tf.placeholder(tf.uint16)
|
| pred_instance_tensor = tf.placeholder(tf.uint16)
|
| coverings, update_ops = streaming_metrics.streaming_parsing_covering(
|
| gt_class_tensor,
|
| gt_instance_tensor,
|
| pred_class_tensor,
|
| pred_instance_tensor,
|
| num_classes=num_classes,
|
| max_instances_per_category=256,
|
| ignored_label=0,
|
| offset=offset,
|
| normalize_by_image_size=False)
|
| (per_class_coverings, per_class_weighted_ious, per_class_gt_areas) = (
|
| tf.unstack(coverings, num=3, axis=0))
|
|
|
| with self.session() as sess:
|
| sess.run(tf.local_variables_initializer())
|
| for pred_class, pred_instance, gt_class, gt_instance in six.moves.zip(
|
| pred_classes, pred_instances, gt_classes, gt_instances):
|
| sess.run(
|
| update_ops,
|
| feed_dict={
|
| gt_class_tensor: gt_class,
|
| gt_instance_tensor: gt_instance,
|
| pred_class_tensor: pred_class,
|
| pred_instance_tensor: pred_instance
|
| })
|
| (result_per_class_coverings, result_per_class_weighted_ious,
|
| result_per_class_gt_areas) = (
|
| sess.run(
|
| [
|
| per_class_coverings,
|
| per_class_weighted_ious,
|
| per_class_gt_areas,
|
| ],
|
| feed_dict={
|
| gt_class_tensor: 0,
|
| gt_instance_tensor: 0,
|
| pred_class_tensor: 0,
|
| pred_instance_tensor: 0
|
| }))
|
|
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_coverings, [
|
| 0.0,
|
| 0.7009696912,
|
| 0.5406896552,
|
| 0.7453531599,
|
| 0.8576779026,
|
| 0.9910687881,
|
| 0.7741046032,
|
| ],
|
| decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_weighted_ious, [
|
| 0.0,
|
| 39864.14634,
|
| 3136,
|
| 1177.657993,
|
| 2498.41573,
|
| 33366.31289,
|
| 26671,
|
| ],
|
| decimal=4)
|
| np.testing.assert_array_equal(result_per_class_gt_areas, [
|
| 0.0,
|
| 56870,
|
| 5800,
|
| 1580,
|
| 2913,
|
| 33667,
|
| 34454,
|
| ])
|
|
|
| def test_streaming_metric_on_multiple_images_normalize_by_size(self):
|
| """Tests streaming parsing covering metric with image size normalization."""
|
| num_classes = 7
|
| offset = 256 * 256
|
|
|
| bird_gt_instance_class_map = {
|
| 92: 5,
|
| 176: 3,
|
| 255: 4,
|
| }
|
| cat_gt_instance_class_map = {
|
| 0: 0,
|
| 255: 6,
|
| }
|
| team_gt_instance_class_map = {
|
| 0: 0,
|
| 47: 1,
|
| 97: 1,
|
| 133: 1,
|
| 150: 1,
|
| 174: 1,
|
| 198: 2,
|
| 215: 1,
|
| 244: 1,
|
| 255: 1,
|
| }
|
| test_image = collections.namedtuple(
|
| 'TestImage',
|
| ['gt_class_map', 'gt_path', 'pred_inst_path', 'pred_class_path'])
|
| test_images = [
|
| test_image(bird_gt_instance_class_map, 'bird_gt.png',
|
| 'bird_pred_instance.png', 'bird_pred_class.png'),
|
| test_image(cat_gt_instance_class_map, 'cat_gt.png',
|
| 'cat_pred_instance.png', 'cat_pred_class.png'),
|
| test_image(team_gt_instance_class_map, 'team_gt_instance.png',
|
| 'team_pred_instance.png', 'team_pred_class.png'),
|
| ]
|
|
|
| gt_classes = []
|
| gt_instances = []
|
| pred_classes = []
|
| pred_instances = []
|
| for test_image in test_images:
|
| (image_gt_instances,
|
| image_gt_classes) = test_utils.panoptic_segmentation_with_class_map(
|
| test_image.gt_path, test_image.gt_class_map)
|
| gt_classes.append(image_gt_classes)
|
| gt_instances.append(image_gt_instances)
|
|
|
| pred_instances.append(
|
| test_utils.read_test_image(test_image.pred_inst_path, mode='L'))
|
| pred_classes.append(
|
| test_utils.read_segmentation_with_rgb_color_map(
|
| test_image.pred_class_path, _CLASS_COLOR_MAP))
|
|
|
| gt_class_tensor = tf.placeholder(tf.uint16)
|
| gt_instance_tensor = tf.placeholder(tf.uint16)
|
| pred_class_tensor = tf.placeholder(tf.uint16)
|
| pred_instance_tensor = tf.placeholder(tf.uint16)
|
| coverings, update_ops = streaming_metrics.streaming_parsing_covering(
|
| gt_class_tensor,
|
| gt_instance_tensor,
|
| pred_class_tensor,
|
| pred_instance_tensor,
|
| num_classes=num_classes,
|
| max_instances_per_category=256,
|
| ignored_label=0,
|
| offset=offset,
|
| normalize_by_image_size=True)
|
| (per_class_coverings, per_class_weighted_ious, per_class_gt_areas) = (
|
| tf.unstack(coverings, num=3, axis=0))
|
|
|
| with self.session() as sess:
|
| sess.run(tf.local_variables_initializer())
|
| for pred_class, pred_instance, gt_class, gt_instance in six.moves.zip(
|
| pred_classes, pred_instances, gt_classes, gt_instances):
|
| sess.run(
|
| update_ops,
|
| feed_dict={
|
| gt_class_tensor: gt_class,
|
| gt_instance_tensor: gt_instance,
|
| pred_class_tensor: pred_class,
|
| pred_instance_tensor: pred_instance
|
| })
|
| (result_per_class_coverings, result_per_class_weighted_ious,
|
| result_per_class_gt_areas) = (
|
| sess.run(
|
| [
|
| per_class_coverings,
|
| per_class_weighted_ious,
|
| per_class_gt_areas,
|
| ],
|
| feed_dict={
|
| gt_class_tensor: 0,
|
| gt_instance_tensor: 0,
|
| pred_class_tensor: 0,
|
| pred_instance_tensor: 0
|
| }))
|
|
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_coverings, [
|
| 0.0,
|
| 0.7009696912,
|
| 0.5406896552,
|
| 0.7453531599,
|
| 0.8576779026,
|
| 0.9910687881,
|
| 0.7741046032,
|
| ],
|
| decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_weighted_ious, [
|
| 0.0,
|
| 0.5002088756,
|
| 0.03935002196,
|
| 0.03086105851,
|
| 0.06547211033,
|
| 0.8743792686,
|
| 0.2549565051,
|
| ],
|
| decimal=4)
|
| np.testing.assert_array_almost_equal(
|
| result_per_class_gt_areas, [
|
| 0.0,
|
| 0.7135955832,
|
| 0.07277746408,
|
| 0.04140461216,
|
| 0.07633647799,
|
| 0.8822589099,
|
| 0.3293566581,
|
| ],
|
| decimal=4)
|
|
|
|
|
| if __name__ == '__main__':
|
| tf.test.main()
|
|
|