|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Tests for sample_generator.""" |
|
|
|
import os |
|
|
|
from absl import flags |
|
import numpy as np |
|
from PIL import Image |
|
import tensorflow as tf |
|
|
|
from deeplab2 import common |
|
from deeplab2.data import data_utils |
|
from deeplab2.data import dataset |
|
from deeplab2.data import sample_generator |
|
|
|
image_utils = tf.keras.preprocessing.image |
|
|
|
flags.DEFINE_string( |
|
'panoptic_annotation_data', |
|
'deeplab2/data/testdata/', |
|
'Path to annotated test image.') |
|
flags.DEFINE_bool('update_golden_data', False, |
|
'Whether or not to update the golden data for testing.') |
|
|
|
FLAGS = flags.FLAGS |
|
|
|
_FILENAME_PREFIX = 'dummy_000000_000000' |
|
_IMAGE_FOLDER = 'leftImg8bit/' |
|
_TARGET_FOLDER = 'targets/' |
|
|
|
|
|
def _get_groundtruth_image(computed_image_array, groundtruth_image_filename): |
|
if FLAGS.update_golden_data: |
|
image = Image.fromarray(tf.squeeze(computed_image_array).numpy()) |
|
with tf.io.gfile.GFile(groundtruth_image_filename, mode='wb') as fp: |
|
image.save(fp) |
|
return computed_image_array |
|
|
|
with tf.io.gfile.GFile(groundtruth_image_filename, mode='rb') as fp: |
|
image = data_utils.read_image(fp.read()) |
|
|
|
|
|
image = np.squeeze(image_utils.img_to_array(image)) |
|
return image |
|
|
|
|
|
def _get_groundtruth_array(computed_image_array, groundtruth_image_filename): |
|
if FLAGS.update_golden_data: |
|
with tf.io.gfile.GFile(groundtruth_image_filename, mode='wb') as fp: |
|
np.save(fp, computed_image_array) |
|
return computed_image_array |
|
with tf.io.gfile.GFile(groundtruth_image_filename, mode='rb') as fp: |
|
|
|
|
|
array = np.squeeze(np.load(fp)) |
|
return array |
|
|
|
|
|
class PanopticSampleGeneratorTest(tf.test.TestCase): |
|
|
|
def setUp(self): |
|
super().setUp() |
|
self._test_img_data_dir = os.path.join( |
|
FLAGS.test_srcdir, |
|
FLAGS.panoptic_annotation_data, |
|
_IMAGE_FOLDER) |
|
self._test_gt_data_dir = os.path.join( |
|
FLAGS.test_srcdir, |
|
FLAGS.panoptic_annotation_data) |
|
self._test_target_data_dir = os.path.join( |
|
FLAGS.test_srcdir, |
|
FLAGS.panoptic_annotation_data, |
|
_TARGET_FOLDER) |
|
image_path = self._test_img_data_dir + _FILENAME_PREFIX + '_leftImg8bit.png' |
|
with tf.io.gfile.GFile(image_path, 'rb') as image_file: |
|
rgb_image = data_utils.read_image(image_file.read()) |
|
self._rgb_image = tf.convert_to_tensor(np.array(rgb_image)) |
|
label_path = self._test_gt_data_dir + 'dummy_gt_for_vps.png' |
|
with tf.io.gfile.GFile(label_path, 'rb') as label_file: |
|
label = data_utils.read_image(label_file.read()) |
|
self._label = tf.expand_dims(tf.convert_to_tensor( |
|
np.dot(np.array(label), [1, 256, 256 * 256])), -1) |
|
|
|
def test_input_generator(self): |
|
tf.random.set_seed(0) |
|
np.random.seed(0) |
|
small_instances = {'threshold': 4096, 'weight': 3.0} |
|
generator = sample_generator.PanopticSampleGenerator( |
|
dataset.CITYSCAPES_PANOPTIC_INFORMATION._asdict(), |
|
focus_small_instances=small_instances, |
|
is_training=True, |
|
crop_size=[769, 769], |
|
thing_id_mask_annotations=True) |
|
input_sample = { |
|
'image': self._rgb_image, |
|
'image_name': 'test_image', |
|
'label': self._label, |
|
'height': 800, |
|
'width': 800 |
|
} |
|
sample = generator(input_sample) |
|
|
|
self.assertIn(common.IMAGE, sample) |
|
self.assertIn(common.GT_SEMANTIC_KEY, sample) |
|
self.assertIn(common.GT_PANOPTIC_KEY, sample) |
|
self.assertIn(common.GT_INSTANCE_CENTER_KEY, sample) |
|
self.assertIn(common.GT_INSTANCE_REGRESSION_KEY, sample) |
|
self.assertIn(common.GT_IS_CROWD, sample) |
|
self.assertIn(common.GT_THING_ID_MASK_KEY, sample) |
|
self.assertIn(common.GT_THING_ID_CLASS_KEY, sample) |
|
self.assertIn(common.SEMANTIC_LOSS_WEIGHT_KEY, sample) |
|
self.assertIn(common.CENTER_LOSS_WEIGHT_KEY, sample) |
|
self.assertIn(common.REGRESSION_LOSS_WEIGHT_KEY, sample) |
|
|
|
self.assertListEqual(sample[common.IMAGE].shape.as_list(), [769, 769, 3]) |
|
self.assertListEqual(sample[common.GT_SEMANTIC_KEY].shape.as_list(), |
|
[769, 769]) |
|
self.assertListEqual(sample[common.GT_PANOPTIC_KEY].shape.as_list(), |
|
[769, 769]) |
|
self.assertListEqual(sample[common.GT_INSTANCE_CENTER_KEY].shape.as_list(), |
|
[769, 769]) |
|
self.assertListEqual( |
|
sample[common.GT_INSTANCE_REGRESSION_KEY].shape.as_list(), |
|
[769, 769, 2]) |
|
self.assertListEqual(sample[common.GT_IS_CROWD].shape.as_list(), [769, 769]) |
|
self.assertListEqual(sample[common.GT_THING_ID_MASK_KEY].shape.as_list(), |
|
[769, 769]) |
|
self.assertListEqual(sample[common.GT_THING_ID_CLASS_KEY].shape.as_list(), |
|
[128]) |
|
self.assertListEqual( |
|
sample[common.SEMANTIC_LOSS_WEIGHT_KEY].shape.as_list(), [769, 769]) |
|
self.assertListEqual(sample[common.CENTER_LOSS_WEIGHT_KEY].shape.as_list(), |
|
[769, 769]) |
|
self.assertListEqual( |
|
sample[common.REGRESSION_LOSS_WEIGHT_KEY].shape.as_list(), |
|
[769, 769]) |
|
|
|
gt_sem = sample[common.GT_SEMANTIC_KEY] |
|
gt_pan = sample[common.GT_PANOPTIC_KEY] |
|
gt_center = tf.cast(sample[common.GT_INSTANCE_CENTER_KEY] * 255, tf.uint8) |
|
gt_is_crowd = sample[common.GT_IS_CROWD] |
|
gt_thing_id_mask = sample[common.GT_THING_ID_MASK_KEY] |
|
gt_thing_id_class = sample[common.GT_THING_ID_CLASS_KEY] |
|
image = tf.cast(sample[common.IMAGE], tf.uint8) |
|
|
|
|
|
semantic_weights = tf.cast(sample[common.SEMANTIC_LOSS_WEIGHT_KEY] * 85, |
|
tf.uint8) |
|
center_weights = tf.cast(sample[common.CENTER_LOSS_WEIGHT_KEY] * 255, |
|
tf.uint8) |
|
offset_weights = tf.cast(sample[common.REGRESSION_LOSS_WEIGHT_KEY] * 255, |
|
tf.uint8) |
|
|
|
np.testing.assert_almost_equal( |
|
image.numpy(), |
|
_get_groundtruth_image( |
|
image, |
|
self._test_target_data_dir + 'rgb_target.png')) |
|
np.testing.assert_almost_equal( |
|
gt_sem.numpy(), |
|
_get_groundtruth_image( |
|
gt_sem, |
|
self._test_target_data_dir + 'semantic_target.png')) |
|
|
|
|
|
_ = _get_groundtruth_image( |
|
gt_pan, self._test_target_data_dir + 'panoptic_target.png') |
|
np.testing.assert_almost_equal( |
|
gt_pan.numpy(), |
|
_get_groundtruth_array( |
|
gt_pan, |
|
self._test_target_data_dir + 'panoptic_target.npy')) |
|
np.testing.assert_almost_equal( |
|
gt_thing_id_mask.numpy(), |
|
_get_groundtruth_array( |
|
gt_thing_id_mask, |
|
self._test_target_data_dir + 'thing_id_mask_target.npy')) |
|
np.testing.assert_almost_equal( |
|
gt_thing_id_class.numpy(), |
|
_get_groundtruth_array( |
|
gt_thing_id_class, |
|
self._test_target_data_dir + 'thing_id_class_target.npy')) |
|
np.testing.assert_almost_equal( |
|
gt_center.numpy(), |
|
_get_groundtruth_image( |
|
gt_center, |
|
self._test_target_data_dir + 'center_target.png')) |
|
np.testing.assert_almost_equal( |
|
sample[common.GT_INSTANCE_REGRESSION_KEY].numpy(), |
|
_get_groundtruth_array( |
|
sample[common.GT_INSTANCE_REGRESSION_KEY].numpy(), |
|
self._test_target_data_dir + 'offset_target.npy')) |
|
np.testing.assert_array_equal( |
|
gt_is_crowd.numpy(), |
|
_get_groundtruth_array(gt_is_crowd.numpy(), |
|
self._test_target_data_dir + 'is_crowd.npy')) |
|
np.testing.assert_almost_equal( |
|
semantic_weights.numpy(), |
|
_get_groundtruth_image( |
|
semantic_weights, |
|
self._test_target_data_dir + 'semantic_weights.png')) |
|
np.testing.assert_almost_equal( |
|
center_weights.numpy(), |
|
_get_groundtruth_image( |
|
center_weights, |
|
self._test_target_data_dir + 'center_weights.png')) |
|
np.testing.assert_almost_equal( |
|
offset_weights.numpy(), |
|
_get_groundtruth_image( |
|
offset_weights, |
|
self._test_target_data_dir + 'offset_weights.png')) |
|
|
|
def test_input_generator_eval(self): |
|
tf.random.set_seed(0) |
|
np.random.seed(0) |
|
small_instances = {'threshold': 4096, 'weight': 3.0} |
|
generator = sample_generator.PanopticSampleGenerator( |
|
dataset.CITYSCAPES_PANOPTIC_INFORMATION._asdict(), |
|
focus_small_instances=small_instances, |
|
is_training=False, |
|
crop_size=[800, 800]) |
|
input_sample = { |
|
'image': self._rgb_image, |
|
'image_name': 'test_image', |
|
'label': self._label, |
|
'height': 800, |
|
'width': 800 |
|
} |
|
sample = generator(input_sample) |
|
|
|
self.assertIn(common.GT_SEMANTIC_RAW, sample) |
|
self.assertIn(common.GT_PANOPTIC_RAW, sample) |
|
self.assertIn(common.GT_IS_CROWD_RAW, sample) |
|
|
|
gt_sem_raw = sample[common.GT_SEMANTIC_RAW] |
|
gt_pan_raw = sample[common.GT_PANOPTIC_RAW] |
|
gt_is_crowd_raw = sample[common.GT_IS_CROWD_RAW] |
|
|
|
self.assertListEqual(gt_sem_raw.shape.as_list(), [800, 800]) |
|
self.assertListEqual(gt_pan_raw.shape.as_list(), [800, 800]) |
|
self.assertListEqual(gt_is_crowd_raw.shape.as_list(), [800, 800]) |
|
|
|
np.testing.assert_almost_equal( |
|
gt_sem_raw.numpy(), |
|
_get_groundtruth_image( |
|
gt_sem_raw, |
|
self._test_target_data_dir + 'eval_semantic_target.png')) |
|
np.testing.assert_almost_equal( |
|
gt_pan_raw.numpy(), |
|
_get_groundtruth_array( |
|
gt_pan_raw, |
|
self._test_target_data_dir + 'eval_panoptic_target.npy')) |
|
np.testing.assert_almost_equal( |
|
gt_is_crowd_raw.numpy(), |
|
_get_groundtruth_array(gt_is_crowd_raw, self._test_target_data_dir + |
|
'eval_is_crowd.npy')) |
|
|
|
|
|
if __name__ == '__main__': |
|
tf.test.main() |
|
|