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