|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| """Tests for tf_example_decoder.py."""
|
|
|
|
|
| from absl.testing import parameterized
|
| import numpy as np
|
| import tensorflow as tf, tf_keras
|
|
|
| from official.vision.dataloaders import tf_example_decoder
|
| from official.vision.dataloaders import tfexample_utils
|
|
|
|
|
| class TfExampleDecoderTest(tf.test.TestCase, parameterized.TestCase):
|
|
|
| @parameterized.parameters(
|
| (100, 100, 0, True, True),
|
| (100, 100, 1, True, True),
|
| (100, 100, 2, True, True),
|
| (100, 100, 0, False, True),
|
| (100, 100, 1, False, True),
|
| (100, 100, 2, False, True),
|
| (100, 100, 0, True, False),
|
| (100, 100, 1, True, False),
|
| (100, 100, 2, True, False),
|
| (100, 100, 0, False, False),
|
| (100, 100, 1, False, False),
|
| (100, 100, 2, False, False),
|
| )
|
| def test_result_shape(self, image_height, image_width, num_instances,
|
| regenerate_source_id, fill_image_size):
|
| decoder = tf_example_decoder.TfExampleDecoder(
|
| include_mask=True, regenerate_source_id=regenerate_source_id)
|
|
|
| serialized_example = tfexample_utils.create_detection_test_example(
|
| image_height=image_height,
|
| image_width=image_width,
|
| image_channel=3,
|
| num_instances=num_instances,
|
| fill_image_size=fill_image_size,
|
| ).SerializeToString()
|
| decoded_tensors = decoder.decode(
|
| tf.convert_to_tensor(value=serialized_example))
|
|
|
| results = tf.nest.map_structure(lambda x: x.numpy(), decoded_tensors)
|
|
|
| self.assertAllEqual(
|
| (image_height, image_width, 3), results['image'].shape)
|
| if not regenerate_source_id:
|
| self.assertEqual(tfexample_utils.DUMP_SOURCE_ID, results['source_id'])
|
| self.assertEqual(image_height, results['height'])
|
| self.assertEqual(image_width, results['width'])
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_classes'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_is_crowd'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_area'].shape)
|
| self.assertAllEqual(
|
| (num_instances, 4), results['groundtruth_boxes'].shape)
|
| self.assertAllEqual(
|
| (num_instances, image_height, image_width),
|
| results['groundtruth_instance_masks'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_instance_masks_png'].shape)
|
|
|
| def test_result_content(self):
|
| decoder = tf_example_decoder.TfExampleDecoder(
|
| include_mask=True, attribute_names=['attr1', 'attr2']
|
| )
|
|
|
| image_content = [[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
|
| [[0, 0, 0], [255, 255, 255], [255, 255, 255], [0, 0, 0]],
|
| [[0, 0, 0], [255, 255, 255], [255, 255, 255], [0, 0, 0]],
|
| [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]
|
| image = tfexample_utils.encode_image(np.uint8(image_content), fmt='PNG')
|
| image_height = 4
|
| image_width = 4
|
| num_instances = 2
|
| xmins = [0, 0.25]
|
| xmaxs = [0.5, 1.0]
|
| ymins = [0, 0]
|
| ymaxs = [0.5, 1.0]
|
| labels = [3, 1]
|
| attr1 = np.array([[0], [2]])
|
| attr2 = np.array([[1], [3]])
|
| areas = [
|
| 0.25 * image_height * image_width, 0.75 * image_height * image_width
|
| ]
|
| is_crowds = [1, 0]
|
| mask_content = [[[255, 255, 0, 0],
|
| [255, 255, 0, 0],
|
| [0, 0, 0, 0],
|
| [0, 0, 0, 0]],
|
| [[0, 255, 255, 255],
|
| [0, 255, 255, 255],
|
| [0, 255, 255, 255],
|
| [0, 255, 255, 255]]]
|
| masks = [
|
| tfexample_utils.encode_image(np.uint8(m), fmt='PNG')
|
| for m in list(mask_content)
|
| ]
|
| serialized_example = tf.train.Example(
|
| features=tf.train.Features(
|
| feature={
|
| 'image/encoded': tf.train.Feature(
|
| bytes_list=tf.train.BytesList(value=[image])
|
| ),
|
| 'image/source_id': tf.train.Feature(
|
| bytes_list=tf.train.BytesList(
|
| value=[tfexample_utils.DUMP_SOURCE_ID]
|
| )
|
| ),
|
| 'image/height': tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=[image_height])
|
| ),
|
| 'image/width': tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=[image_width])
|
| ),
|
| 'image/object/bbox/xmin': tf.train.Feature(
|
| float_list=tf.train.FloatList(value=xmins)
|
| ),
|
| 'image/object/bbox/xmax': tf.train.Feature(
|
| float_list=tf.train.FloatList(value=xmaxs)
|
| ),
|
| 'image/object/bbox/ymin': tf.train.Feature(
|
| float_list=tf.train.FloatList(value=ymins)
|
| ),
|
| 'image/object/bbox/ymax': tf.train.Feature(
|
| float_list=tf.train.FloatList(value=ymaxs)
|
| ),
|
| 'image/object/class/label': tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=labels)
|
| ),
|
| 'image/object/is_crowd': tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=is_crowds)
|
| ),
|
| 'image/object/area': tf.train.Feature(
|
| float_list=tf.train.FloatList(value=areas)
|
| ),
|
| 'image/object/mask': tf.train.Feature(
|
| bytes_list=tf.train.BytesList(value=masks)
|
| ),
|
| 'image/object/attribute/attr1': tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=attr1.flatten())
|
| ),
|
| 'image/object/attribute/attr2': tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=attr2.flatten())
|
| ),
|
| }
|
| )
|
| ).SerializeToString()
|
| decoded_tensors = decoder.decode(
|
| tf.convert_to_tensor(value=serialized_example))
|
|
|
| results = tf.nest.map_structure(lambda x: x.numpy(), decoded_tensors)
|
|
|
| self.assertAllEqual(
|
| (image_height, image_width, 3), results['image'].shape)
|
| self.assertAllEqual(image_content, results['image'])
|
| self.assertEqual(tfexample_utils.DUMP_SOURCE_ID, results['source_id'])
|
| self.assertEqual(image_height, results['height'])
|
| self.assertEqual(image_width, results['width'])
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_classes'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_is_crowd'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_area'].shape)
|
| self.assertAllEqual(
|
| (num_instances, 4), results['groundtruth_boxes'].shape)
|
| self.assertAllEqual(
|
| (num_instances, image_height, image_width),
|
| results['groundtruth_instance_masks'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_instance_masks_png'].shape)
|
| self.assertAllEqual(
|
| [3, 1], results['groundtruth_classes'])
|
| np.testing.assert_array_equal(
|
| attr1, results['groundtruth_attributes']['attr1']
|
| )
|
| np.testing.assert_array_equal(
|
| attr2, results['groundtruth_attributes']['attr2']
|
| )
|
| self.assertAllEqual([True, False], results['groundtruth_is_crowd'])
|
| self.assertNDArrayNear(
|
| [0.25 * image_height * image_width, 0.75 * image_height * image_width],
|
| results['groundtruth_area'], 1e-4)
|
| self.assertNDArrayNear(
|
| [[0, 0, 0.5, 0.5], [0, 0.25, 1.0, 1.0]],
|
| results['groundtruth_boxes'], 1e-4)
|
| self.assertNDArrayNear(
|
| mask_content, results['groundtruth_instance_masks'], 1e-4)
|
| self.assertAllEqual(
|
| masks, results['groundtruth_instance_masks_png'])
|
|
|
| def test_handling_missing_fields(self):
|
| decoder = tf_example_decoder.TfExampleDecoder(include_mask=True)
|
|
|
| image_content = [[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
|
| [[0, 0, 0], [255, 255, 255], [255, 255, 255], [0, 0, 0]],
|
| [[0, 0, 0], [255, 255, 255], [255, 255, 255], [0, 0, 0]],
|
| [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]
|
| image = tfexample_utils.encode_image(np.uint8(image_content), fmt='PNG')
|
| image_height = 4
|
| image_width = 4
|
| num_instances = 2
|
| xmins = [0, 0.25]
|
| xmaxs = [0.5, 1.0]
|
| ymins = [0, 0]
|
| ymaxs = [0.5, 1.0]
|
| labels = [3, 1]
|
| mask_content = [[[255, 255, 0, 0],
|
| [255, 255, 0, 0],
|
| [0, 0, 0, 0],
|
| [0, 0, 0, 0]],
|
| [[0, 255, 255, 255],
|
| [0, 255, 255, 255],
|
| [0, 255, 255, 255],
|
| [0, 255, 255, 255]]]
|
| masks = [
|
| tfexample_utils.encode_image(np.uint8(m), fmt='PNG')
|
| for m in list(mask_content)
|
| ]
|
| serialized_example = tf.train.Example(
|
| features=tf.train.Features(
|
| feature={
|
| 'image/encoded': (tf.train.Feature(
|
| bytes_list=tf.train.BytesList(value=[image]))),
|
| 'image/source_id': (tf.train.Feature(
|
| bytes_list=tf.train.BytesList(
|
| value=[tfexample_utils.DUMP_SOURCE_ID]))),
|
| 'image/height': (tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=[image_height]))),
|
| 'image/width': (tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=[image_width]))),
|
| 'image/object/bbox/xmin': (tf.train.Feature(
|
| float_list=tf.train.FloatList(value=xmins))),
|
| 'image/object/bbox/xmax': (tf.train.Feature(
|
| float_list=tf.train.FloatList(value=xmaxs))),
|
| 'image/object/bbox/ymin': (tf.train.Feature(
|
| float_list=tf.train.FloatList(value=ymins))),
|
| 'image/object/bbox/ymax': (tf.train.Feature(
|
| float_list=tf.train.FloatList(value=ymaxs))),
|
| 'image/object/class/label': (tf.train.Feature(
|
| int64_list=tf.train.Int64List(value=labels))),
|
| 'image/object/mask': (tf.train.Feature(
|
| bytes_list=tf.train.BytesList(value=masks))),
|
| })).SerializeToString()
|
| decoded_tensors = decoder.decode(
|
| tf.convert_to_tensor(serialized_example))
|
| results = tf.nest.map_structure(lambda x: x.numpy(), decoded_tensors)
|
|
|
| self.assertAllEqual(
|
| (image_height, image_width, 3), results['image'].shape)
|
| self.assertAllEqual(image_content, results['image'])
|
| self.assertEqual(tfexample_utils.DUMP_SOURCE_ID, results['source_id'])
|
| self.assertEqual(image_height, results['height'])
|
| self.assertEqual(image_width, results['width'])
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_classes'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_is_crowd'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_area'].shape)
|
| self.assertAllEqual(
|
| (num_instances, 4), results['groundtruth_boxes'].shape)
|
| self.assertAllEqual(
|
| (num_instances, image_height, image_width),
|
| results['groundtruth_instance_masks'].shape)
|
| self.assertAllEqual(
|
| (num_instances,), results['groundtruth_instance_masks_png'].shape)
|
| self.assertAllEqual(
|
| [3, 1], results['groundtruth_classes'])
|
| self.assertAllEqual(
|
| [False, False], results['groundtruth_is_crowd'])
|
| self.assertNDArrayNear(
|
| [0.25 * image_height * image_width, 0.75 * image_height * image_width],
|
| results['groundtruth_area'], 1e-4)
|
| self.assertNDArrayNear(
|
| [[0, 0, 0.5, 0.5], [0, 0.25, 1.0, 1.0]],
|
| results['groundtruth_boxes'], 1e-4)
|
| self.assertNDArrayNear(
|
| mask_content, results['groundtruth_instance_masks'], 1e-4)
|
| self.assertAllEqual(
|
| masks, results['groundtruth_instance_masks_png'])
|
|
|
|
|
| if __name__ == '__main__':
|
| tf.test.main()
|
|
|