From d8c6bd1602b3992f4a4ff2d60605280a4fd55604 Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 10:32:14 +0300 Subject: [PATCH 01/12] chore: exclude video file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 69435bb8..6c754e95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.pyc .ipynb_checkpoints +*.avi From ae1bfe7735ea8c4b1c7e6ec892eddd8b2e39449d Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 10:33:09 +0300 Subject: [PATCH 02/12] chore: exclude generated file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6c754e95..e6ca97b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.pyc .ipynb_checkpoints *.avi +train.record From 52a4adbfb4bd3bc659931f7c0754a6c8258d9e25 Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 12:02:38 +0300 Subject: [PATCH 03/12] feat: validate video file path --- extract_towncentre.py | 20 +++++++++++++++----- test_extract_towncentre.py | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 test_extract_towncentre.py diff --git a/extract_towncentre.py b/extract_towncentre.py index 5d3f64a4..779d86c8 100644 --- a/extract_towncentre.py +++ b/extract_towncentre.py @@ -15,9 +15,9 @@ def video2im(src, train_path='images', test_path='test_images', factor=2): frame = 0 cap = cv2.VideoCapture(src) length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - + print('Total Frame Count:', length ) - + while True: check, img = cap.read() if check: @@ -25,17 +25,27 @@ def video2im(src, train_path='images', test_path='test_images', factor=2): path = train_path else: path = test_path - + img = cv2.resize(img, (1920 // factor, 1080 // factor)) cv2.imwrite(os.path.join(path, str(frame) + ".jpg"), img) frame += 1 print('Processed: ',frame, end = '\r') - + else: break - + cap.release() +def validate_video_path(path='TownCentreXVID.avi'): + """ + returns a tuple. first element of the tuple indicates whether the validation succeeded + second element is an optional logging message + """ + if os.path.exists(path): + return (True, f"Processing {path}...") + else: + return (False, f"{path} does not exist") + if __name__ == '__main__': video2im('TownCentreXVID.avi') diff --git a/test_extract_towncentre.py b/test_extract_towncentre.py new file mode 100644 index 00000000..9cdbc295 --- /dev/null +++ b/test_extract_towncentre.py @@ -0,0 +1,24 @@ +import unittest +from extract_towncentre import validate_video_path +import tempfile + +class TestExtractTownCentre(unittest.TestCase): + def test_validate_video_path_invalid(self): + file = "/tmp/xyz" + result = validate_video_path("/tmp/xyz") + self.assertIsNotNone(result, "validation should not produce a None result") + status, msg = result + self.assertFalse(status, "validation should fail for an non-existent path") + self.assertEqual(msg, f"{file} does not exist") + + def test_validate_video_path_valid(self): + file = tempfile.NamedTemporaryFile(suffix=".vid") + result = validate_video_path(file.name) + self.assertIsNotNone(result, "validation should not produce a None result") + status, msg = result + self.assertTrue(status, f"validation should succeed for valid path {file.name}") + self.assertEqual(msg, f"Processing {file.name}...") + file.close() + +if __name__ == '__main__': + unittest.main() From 0cea20480ac73d271824a52b75757b660c0960b9 Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 14:51:35 +0300 Subject: [PATCH 04/12] feat: getting video path from script args or using default location --- extract_towncentre.py | 25 ++++++++++++++++++++++--- test_extract_towncentre.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/extract_towncentre.py b/extract_towncentre.py index 779d86c8..27919265 100644 --- a/extract_towncentre.py +++ b/extract_towncentre.py @@ -1,10 +1,11 @@ import os import cv2 import numpy as np +import logging as log #Dataset from http://www.robots.ox.ac.uk/ActiveVision/Research/Projects/2009bbenfold_headpose/project.html#datasets -def video2im(src, train_path='images', test_path='test_images', factor=2): +def video2im(src='TownCentreXVID.avi', train_path='images', test_path='test_images', factor=2): """ Extracts all frames from a video and saves them as jpgs """ @@ -37,7 +38,7 @@ def video2im(src, train_path='images', test_path='test_images', factor=2): cap.release() -def validate_video_path(path='TownCentreXVID.avi'): +def validate_video_path(path): """ returns a tuple. first element of the tuple indicates whether the validation succeeded second element is an optional logging message @@ -47,5 +48,23 @@ def validate_video_path(path='TownCentreXVID.avi'): else: return (False, f"{path} does not exist") +# validator=validate_video_path, processor=video2i +def process_video_cmd_args(argv, validator=validate_video_path, processor=video2im): + """ + calls video2im() with validated path or none (default path to be used) when there are no args passed + """ + try: + path = argv[1] + status, msg = validator(path) + if status: + processor(src=path) + else: + log.error(msg) + except IndexError: + log.warning('Video file path was not passed to script arguements, trying default location, name') + processor() + + if __name__ == '__main__': - video2im('TownCentreXVID.avi') + import sys + process_video_cmd_args(sys.argv, validate_video_path, video2im) diff --git a/test_extract_towncentre.py b/test_extract_towncentre.py index 9cdbc295..0bb7c233 100644 --- a/test_extract_towncentre.py +++ b/test_extract_towncentre.py @@ -1,6 +1,7 @@ import unittest -from extract_towncentre import validate_video_path +from extract_towncentre import validate_video_path, process_video_cmd_args import tempfile +from unittest.mock import Mock class TestExtractTownCentre(unittest.TestCase): def test_validate_video_path_invalid(self): @@ -20,5 +21,32 @@ def test_validate_video_path_valid(self): self.assertEqual(msg, f"Processing {file.name}...") file.close() + def test_process_video_cmd_args_no_cmd_args(self): + extract_mock = Mock() + # when no args are passed, only the script name is present + argv = ['script/path'] + process_video_cmd_args(argv, extract_mock.validate_video_path, extract_mock.video2im,) + extract_mock.video2im.assert_called_once() + extract_mock.validate_video_path.assert_not_called() + + def test_process_video_cmd_args_with_invalid_cmd_args(self): + extract_mock = Mock() + mock_path = 'video-file' + extract_mock.validate_video_path = Mock(return_value=(False, f"Bad {mock_path}")) + argv = ['script/path', mock_path] + process_video_cmd_args(argv, extract_mock.validate_video_path, extract_mock.video2im,) + extract_mock.video2im.assert_not_called() + extract_mock.validate_video_path.assert_called_once_with(mock_path) + + def test_process_video_cmd_args_with_valid_cmd_args(self): + extract_mock = Mock() + mock_path = 'video-file' + extract_mock.validate_video_path = Mock(return_value=(True, f"Good {mock_path}")) + argv = ['script/path', mock_path] + process_video_cmd_args(argv, extract_mock.validate_video_path, extract_mock.video2im,) + extract_mock.video2im.assert_called_once_with(src=mock_path) + extract_mock.validate_video_path.assert_called_once_with(mock_path) + + if __name__ == '__main__': unittest.main() From ba7d6324fd120ff2153dd102cadcdbbf4f6cefde Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 15:24:24 +0300 Subject: [PATCH 05/12] feat: handling existing image output directories --- extract_towncentre.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/extract_towncentre.py b/extract_towncentre.py index 27919265..8092c329 100644 --- a/extract_towncentre.py +++ b/extract_towncentre.py @@ -10,8 +10,14 @@ def video2im(src='TownCentreXVID.avi', train_path='images', test_path='test_imag Extracts all frames from a video and saves them as jpgs """ - os.mkdir(train_path) - os.mkdir(test_path) + try: + os.mkdir(train_path) + os.mkdir(test_path) + except FileExistsError as fee: + log.error(f"Error creating output directories - {fee.strerror}: {fee.filename}") + log.getLogger(__name__).setLevel(log.INFO) + log.info("delete or rename offending directory") + return frame = 0 cap = cv2.VideoCapture(src) @@ -58,6 +64,7 @@ def process_video_cmd_args(argv, validator=validate_video_path, processor=video2 status, msg = validator(path) if status: processor(src=path) + log.info(msg) else: log.error(msg) except IndexError: From 6750a790beaf0b7cc30a080d889e21abc373967f Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 16:06:33 +0300 Subject: [PATCH 06/12] chore: excluding generated images --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 69435bb8..1f7d1c83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.pyc .ipynb_checkpoints +images +test_images From 450cac91f8c5b6bfda984ae8d2e03228ad2633be Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 16:08:34 +0300 Subject: [PATCH 07/12] fix: futurewarning: object_detection/utils/dataset_util.py:75: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. if not xml: --- object_detection/utils/dataset_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/object_detection/utils/dataset_util.py b/object_detection/utils/dataset_util.py index 014a9118..f0ffb08c 100644 --- a/object_detection/utils/dataset_util.py +++ b/object_detection/utils/dataset_util.py @@ -72,7 +72,7 @@ def recursive_parse_xml_to_dict(xml): Returns: Python dictionary holding XML contents. """ - if not xml: + if xml is not None: return {xml.tag: xml.text} result = {} for child in xml: From e13b49ea776ed99cb56e1eba0ae385617a388241 Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Tue, 3 Sep 2019 16:14:51 +0300 Subject: [PATCH 08/12] chore: excluding generated file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a5fb9b9a..fb2bd5a6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ images test_images *.avi train.record +val.record From e14a05d59ad7e42b63dbff72a1ad46d66edb53c0 Mon Sep 17 00:00:00 2001 From: Eric Njogu Date: Wed, 4 Sep 2019 12:03:58 +0300 Subject: [PATCH 09/12] fix: remove out of date tensorflow object-detection API Suggested workaround and documentation update: - clone/download tensorflow models repo - https://github.com/tensorflow/models - carry out installation as set out in https://github.com/tensorflow/models/tree/master/research/object_detection - create soft link in this project's root dir to research/object-detection directory in the cloned/downloaded tensor-flow models repo --- object_detection/BUILD | 136 - object_detection/CONTRIBUTING.md | 13 - object_detection/README.md | 155 - object_detection/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 136 -> 0 bytes .../__pycache__/exporter.cpython-35.pyc | Bin 12767 -> 0 bytes object_detection/anchor_generators/BUILD | 56 - .../anchor_generators/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 168 -> 0 bytes .../grid_anchor_generator.cpython-35.pyc | Bin 7639 -> 0 bytes ...tiple_grid_anchor_generator.cpython-35.pyc | Bin 14944 -> 0 bytes .../grid_anchor_generator.py | 194 -- .../grid_anchor_generator_test.py | 76 - .../multiple_grid_anchor_generator.py | 338 -- .../multiple_grid_anchor_generator_test.py | 267 -- object_detection/box_coders/BUILD | 102 - object_detection/box_coders/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 161 -> 0 bytes .../faster_rcnn_box_coder.cpython-35.pyc | Bin 3463 -> 0 bytes .../keypoint_box_coder.cpython-35.pyc | Bin 5373 -> 0 bytes .../mean_stddev_box_coder.cpython-35.pyc | Bin 2176 -> 0 bytes .../square_box_coder.cpython-35.pyc | Bin 3994 -> 0 bytes .../box_coders/faster_rcnn_box_coder.py | 118 - .../box_coders/faster_rcnn_box_coder_test.py | 94 - .../box_coders/keypoint_box_coder.py | 171 -- .../box_coders/keypoint_box_coder_test.py | 140 - .../box_coders/mean_stddev_box_coder.py | 70 - .../box_coders/mean_stddev_box_coder_test.py | 58 - .../box_coders/square_box_coder.py | 126 - .../box_coders/square_box_coder_test.py | 97 - object_detection/builders/BUILD | 305 -- object_detection/builders/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 159 -> 0 bytes .../anchor_generator_builder.cpython-35.pyc | Bin 2431 -> 0 bytes .../box_coder_builder.cpython-35.pyc | Bin 1601 -> 0 bytes .../box_predictor_builder.cpython-35.pyc | Bin 2832 -> 0 bytes .../hyperparams_builder.cpython-35.pyc | Bin 4799 -> 0 bytes .../image_resizer_builder.cpython-35.pyc | Bin 2646 -> 0 bytes .../__pycache__/losses_builder.cpython-35.pyc | Bin 5028 -> 0 bytes .../matcher_builder.cpython-35.pyc | Bin 1353 -> 0 bytes .../__pycache__/model_builder.cpython-35.pyc | Bin 9438 -> 0 bytes .../post_processing_builder.cpython-35.pyc | Bin 4256 -> 0 bytes ...milarity_calculator_builder.cpython-35.pyc | Bin 1523 -> 0 bytes .../builders/anchor_generator_builder.py | 82 - .../builders/anchor_generator_builder_test.py | 257 -- .../builders/box_coder_builder.py | 65 - .../builders/box_coder_builder_test.py | 136 - .../builders/box_predictor_builder.py | 108 - .../builders/box_predictor_builder_test.py | 393 --- .../builders/hyperparams_builder.py | 168 - .../builders/hyperparams_builder_test.py | 449 --- .../builders/image_resizer_builder.py | 96 - .../builders/image_resizer_builder_test.py | 96 - .../builders/input_reader_builder.py | 75 - .../builders/input_reader_builder_test.py | 144 - object_detection/builders/losses_builder.py | 211 -- .../builders/losses_builder_test.py | 438 --- object_detection/builders/matcher_builder.py | 51 - .../builders/matcher_builder_test.py | 97 - object_detection/builders/model_builder.py | 327 -- .../builders/model_builder_test.py | 741 ----- .../builders/optimizer_builder.py | 119 - .../builders/optimizer_builder_test.py | 213 -- .../builders/post_processing_builder.py | 123 - .../builders/post_processing_builder_test.py | 107 - .../builders/preprocessor_builder.py | 324 -- .../builders/preprocessor_builder_test.py | 558 ---- .../region_similarity_calculator_builder.py | 56 - ...gion_similarity_calculator_builder_test.py | 67 - object_detection/core/BUILD | 368 --- object_detection/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-35.pyc | Bin 155 -> 0 bytes .../anchor_generator.cpython-35.pyc | Bin 5159 -> 0 bytes ...d_positive_negative_sampler.cpython-35.pyc | Bin 3239 -> 0 bytes .../core/__pycache__/box_coder.cpython-35.pyc | Bin 4992 -> 0 bytes .../core/__pycache__/box_list.cpython-35.pyc | Bin 7479 -> 0 bytes .../__pycache__/box_list_ops.cpython-35.pyc | Bin 34759 -> 0 bytes .../__pycache__/box_predictor.cpython-35.pyc | Bin 20818 -> 0 bytes .../__pycache__/data_decoder.cpython-35.pyc | Bin 1082 -> 0 bytes .../__pycache__/keypoint_ops.cpython-35.pyc | Bin 10555 -> 0 bytes .../core/__pycache__/losses.cpython-35.pyc | Bin 24741 -> 0 bytes .../core/__pycache__/matcher.cpython-35.pyc | Bin 8549 -> 0 bytes .../minibatch_sampler.cpython-35.pyc | Bin 2946 -> 0 bytes .../core/__pycache__/model.cpython-35.pyc | Bin 11243 -> 0 bytes .../post_processing.cpython-35.pyc | Bin 14936 -> 0 bytes .../__pycache__/preprocessor.cpython-35.pyc | Bin 87800 -> 0 bytes ...egion_similarity_calculator.cpython-35.pyc | Bin 3992 -> 0 bytes .../standard_fields.cpython-35.pyc | Bin 8595 -> 0 bytes .../target_assigner.cpython-35.pyc | Bin 17439 -> 0 bytes object_detection/core/anchor_generator.py | 142 - .../balanced_positive_negative_sampler.py | 92 - ...balanced_positive_negative_sampler_test.py | 83 - object_detection/core/batcher.py | 136 - object_detection/core/batcher_test.py | 158 - object_detection/core/box_coder.py | 151 - object_detection/core/box_coder_test.py | 61 - object_detection/core/box_list.py | 207 -- object_detection/core/box_list_ops.py | 984 ------ object_detection/core/box_list_ops_test.py | 962 ------ object_detection/core/box_list_test.py | 134 - object_detection/core/box_predictor.py | 566 ---- object_detection/core/box_predictor_test.py | 323 -- object_detection/core/data_decoder.py | 41 - object_detection/core/data_parser.py | 41 - object_detection/core/keypoint_ops.py | 282 -- object_detection/core/keypoint_ops_test.py | 200 -- object_detection/core/losses.py | 621 ---- object_detection/core/losses_test.py | 875 ------ object_detection/core/matcher.py | 213 -- object_detection/core/matcher_test.py | 150 - object_detection/core/minibatch_sampler.py | 90 - .../core/minibatch_sampler_test.py | 82 - object_detection/core/model.py | 265 -- object_detection/core/post_processing.py | 395 --- object_detection/core/post_processing_test.py | 959 ------ object_detection/core/prefetcher.py | 61 - object_detection/core/prefetcher_test.py | 101 - object_detection/core/preprocessor.py | 2562 ---------------- object_detection/core/preprocessor_test.py | 2288 -------------- .../core/region_similarity_calculator.py | 114 - .../core/region_similarity_calculator_test.py | 75 - object_detection/core/standard_fields.py | 205 -- object_detection/core/target_assigner.py | 455 --- object_detection/core/target_assigner_test.py | 717 ----- object_detection/data/kitti_label_map.pbtxt | 9 - object_detection/data/mscoco_label_map.pbtxt | 400 --- .../data/oid_bbox_trainable_label_map.pbtxt | 2725 ----------------- object_detection/data/pascal_label_map.pbtxt | 99 - object_detection/data/pet_label_map.pbtxt | 184 -- object_detection/data_decoders/BUILD | 29 - object_detection/data_decoders/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 164 -> 0 bytes .../tf_example_decoder.cpython-35.pyc | Bin 6446 -> 0 bytes .../data_decoders/tf_example_decoder.py | 186 -- .../data_decoders/tf_example_decoder_test.py | 350 --- object_detection/dataset_tools/BUILD | 107 - .../dataset_tools/create_kitti_tf_record.py | 310 -- .../create_kitti_tf_record_test.py | 130 - .../dataset_tools/create_oid_tf_record.py | 104 - .../dataset_tools/create_pascal_tf_record.py | 184 -- .../create_pascal_tf_record_test.py | 118 - .../dataset_tools/create_pet_tf_record.py | 272 -- .../dataset_tools/oid_tfrecord_creation.py | 113 - .../oid_tfrecord_creation_test.py | 203 -- object_detection/eval.py | 133 - object_detection/eval_util.py | 516 ---- object_detection/evaluator.py | 212 -- object_detection/export_inference_graph.py | 119 - object_detection/exporter.py | 426 --- object_detection/exporter_test.py | 604 ---- ...rcnn_inception_resnet_v2_atrous_oid.config | 146 - object_detection/g3doc/configuring_jobs.md | 162 - .../g3doc/defining_your_own_model.md | 137 - object_detection/g3doc/detection_model_zoo.md | 101 - .../g3doc/evaluation_protocols.md | 94 - object_detection/g3doc/exporting_models.md | 22 - .../g3doc/img/dogs_detections_output.jpg | Bin 372894 -> 0 bytes object_detection/g3doc/img/example_cat.jpg | Bin 243955 -> 0 bytes .../g3doc/img/groupof_case_eval.png | Bin 242500 -> 0 bytes .../g3doc/img/kites_detections_output.jpg | Bin 386066 -> 0 bytes .../g3doc/img/nongroupof_case_eval.png | Bin 265455 -> 0 bytes .../g3doc/img/oid_bus_72e19c28aac34ed8.jpg | Bin 249313 -> 0 bytes .../g3doc/img/oid_monkey_3b4168c89cecbc5b.jpg | Bin 281143 -> 0 bytes object_detection/g3doc/img/oxford_pet.png | Bin 276715 -> 0 bytes object_detection/g3doc/img/tensorboard.png | Bin 79342 -> 0 bytes object_detection/g3doc/img/tensorboard2.png | Bin 236549 -> 0 bytes object_detection/g3doc/img/tf-od-api-logo.png | Bin 200506 -> 0 bytes object_detection/g3doc/installation.md | 79 - .../g3doc/oid_inference_and_evaluation.md | 255 -- object_detection/g3doc/preparing_inputs.md | 57 - object_detection/g3doc/running_locally.md | 81 - object_detection/g3doc/running_notebook.md | 15 - object_detection/g3doc/running_on_cloud.md | 128 - object_detection/g3doc/running_pets.md | 314 -- .../g3doc/using_your_own_dataset.md | 157 - object_detection/inference.py | 209 -- object_detection/inference/BUILD | 40 - .../inference/detection_inference.py | 141 - .../inference/detection_inference_test.py | 176 -- .../inference/infer_detections.py | 96 - object_detection/matchers/BUILD | 51 - object_detection/matchers/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 159 -> 0 bytes .../__pycache__/argmax_matcher.cpython-35.pyc | Bin 6678 -> 0 bytes .../bipartite_matcher.cpython-35.pyc | Bin 1753 -> 0 bytes object_detection/matchers/argmax_matcher.py | 189 -- .../matchers/argmax_matcher_test.py | 237 -- .../matchers/bipartite_matcher.py | 53 - .../matchers/bipartite_matcher_test.py | 71 - object_detection/meta_architectures/BUILD | 109 - .../meta_architectures/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 169 -> 0 bytes .../faster_rcnn_meta_arch.cpython-35.pyc | Bin 66219 -> 0 bytes .../__pycache__/rfcn_meta_arch.cpython-35.pyc | Bin 12204 -> 0 bytes .../__pycache__/ssd_meta_arch.cpython-35.pyc | Bin 27458 -> 0 bytes .../faster_rcnn_meta_arch.py | 1677 ---------- .../faster_rcnn_meta_arch_test.py | 96 - .../faster_rcnn_meta_arch_test_lib.py | 1257 -------- .../meta_architectures/rfcn_meta_arch.py | 283 -- .../meta_architectures/rfcn_meta_arch_test.py | 65 - .../meta_architectures/ssd_meta_arch.py | 700 ----- .../meta_architectures/ssd_meta_arch_test.py | 298 -- object_detection/metrics/BUILD | 55 - .../metrics/offline_eval_map_corloc.py | 173 -- .../metrics/offline_eval_map_corloc_test.py | 58 - object_detection/metrics/tf_example_parser.py | 155 - .../metrics/tf_example_parser_test.py | 186 -- object_detection/models/BUILD | 229 -- object_detection/models/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 157 -> 0 bytes ...ilenet_v1_feature_extractor.cpython-35.pyc | Bin 4243 -> 0 bytes ...resnet_v2_feature_extractor.cpython-35.pyc | Bin 7633 -> 0 bytes ...eption_v2_feature_extractor.cpython-35.pyc | Bin 7645 -> 0 bytes ..._rcnn_nas_feature_extractor.cpython-35.pyc | Bin 8338 -> 0 bytes ...resnet_v1_feature_extractor.cpython-35.pyc | Bin 8347 -> 0 bytes .../feature_map_generators.cpython-35.pyc | Bin 5967 -> 0 bytes ...eption_v2_feature_extractor.cpython-35.pyc | Bin 3920 -> 0 bytes ...eption_v3_feature_extractor.cpython-35.pyc | Bin 3935 -> 0 bytes ...ilenet_v1_feature_extractor.cpython-35.pyc | Bin 4001 -> 0 bytes ...dded_ssd_mobilenet_v1_feature_extractor.py | 124 - ...ssd_mobilenet_v1_feature_extractor_test.py | 119 - ...n_inception_resnet_v2_feature_extractor.py | 215 -- ...eption_resnet_v2_feature_extractor_test.py | 109 - ...ter_rcnn_inception_v2_feature_extractor.py | 251 -- ...cnn_inception_v2_feature_extractor_test.py | 126 - .../faster_rcnn_nas_feature_extractor.py | 316 -- .../faster_rcnn_nas_feature_extractor_test.py | 109 - ...faster_rcnn_resnet_v1_feature_extractor.py | 249 -- ...r_rcnn_resnet_v1_feature_extractor_test.py | 137 - .../models/feature_map_generators.py | 170 - .../models/feature_map_generators_test.py | 151 - .../models/ssd_feature_extractor_test.py | 94 - .../ssd_inception_v2_feature_extractor.py | 111 - ...ssd_inception_v2_feature_extractor_test.py | 123 - .../ssd_inception_v3_feature_extractor.py | 111 - ...ssd_inception_v3_feature_extractor_test.py | 123 - .../ssd_mobilenet_v1_feature_extractor.py | 114 - ...ssd_mobilenet_v1_feature_extractor_test.py | 139 - .../object_detection_tutorial.ipynb | 298 -- object_detection/protos/BUILD | 341 --- object_detection/protos/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 143 -> 0 bytes .../anchor_generator_pb2.cpython-35.pyc | Bin 3275 -> 0 bytes .../argmax_matcher_pb2.cpython-35.pyc | Bin 3108 -> 0 bytes .../bipartite_matcher_pb2.cpython-35.pyc | Bin 1714 -> 0 bytes .../__pycache__/box_coder_pb2.cpython-35.pyc | Bin 4230 -> 0 bytes .../box_predictor_pb2.cpython-35.pyc | Bin 10451 -> 0 bytes .../__pycache__/eval_pb2.cpython-35.pyc | Bin 4582 -> 0 bytes .../faster_rcnn_box_coder_pb2.cpython-35.pyc | Bin 2772 -> 0 bytes .../faster_rcnn_pb2.cpython-35.pyc | Bin 11793 -> 0 bytes .../grid_anchor_generator_pb2.cpython-35.pyc | Bin 3616 -> 0 bytes .../hyperparams_pb2.cpython-35.pyc | Bin 10986 -> 0 bytes .../image_resizer_pb2.cpython-35.pyc | Bin 5664 -> 0 bytes .../input_reader_pb2.cpython-35.pyc | Bin 5257 -> 0 bytes .../keypoint_box_coder_pb2.cpython-35.pyc | Bin 2962 -> 0 bytes .../__pycache__/losses_pb2.cpython-35.pyc | Bin 14020 -> 0 bytes .../__pycache__/matcher_pb2.cpython-35.pyc | Bin 3078 -> 0 bytes .../mean_stddev_box_coder_pb2.cpython-35.pyc | Bin 1738 -> 0 bytes .../__pycache__/model_pb2.cpython-35.pyc | Bin 2960 -> 0 bytes .../__pycache__/optimizer_pb2.cpython-35.pyc | Bin 13125 -> 0 bytes .../__pycache__/pipeline_pb2.cpython-35.pyc | Bin 3916 -> 0 bytes .../post_processing_pb2.cpython-35.pyc | Bin 4609 -> 0 bytes .../preprocessor_pb2.cpython-35.pyc | Bin 43024 -> 0 bytes ...n_similarity_calculator_pb2.cpython-35.pyc | Bin 4259 -> 0 bytes .../square_box_coder_pb2.cpython-35.pyc | Bin 2501 -> 0 bytes .../ssd_anchor_generator_pb2.cpython-35.pyc | Bin 4888 -> 0 bytes .../protos/__pycache__/ssd_pb2.cpython-35.pyc | Bin 7906 -> 0 bytes .../string_int_label_map_pb2.cpython-35.pyc | Bin 3161 -> 0 bytes .../__pycache__/train_pb2.cpython-35.pyc | Bin 6377 -> 0 bytes .../protos/anchor_generator.proto | 15 - .../protos/anchor_generator_pb2.py | 90 - object_detection/protos/argmax_matcher.proto | 25 - object_detection/protos/argmax_matcher_pb2.py | 97 - .../protos/bipartite_matcher.proto | 8 - .../protos/bipartite_matcher_pb2.py | 62 - object_detection/protos/box_coder.proto | 19 - object_detection/protos/box_coder_pb2.py | 114 - object_detection/protos/box_predictor.proto | 101 - object_detection/protos/box_predictor_pb2.py | 375 --- object_detection/protos/eval.proto | 47 - object_detection/protos/eval_pb2.py | 146 - object_detection/protos/faster_rcnn.proto | 149 - .../protos/faster_rcnn_box_coder.proto | 17 - .../protos/faster_rcnn_box_coder_pb2.py | 90 - object_detection/protos/faster_rcnn_pb2.py | 326 -- .../protos/grid_anchor_generator.proto | 34 - .../protos/grid_anchor_generator_pb2.py | 118 - object_detection/protos/hyperparams.proto | 103 - object_detection/protos/hyperparams_pb2.py | 541 ---- object_detection/protos/image_resizer.proto | 44 - object_detection/protos/image_resizer_pb2.py | 232 -- object_detection/protos/input_reader.proto | 60 - object_detection/protos/input_reader_pb2.py | 207 -- .../protos/keypoint_box_coder.proto | 19 - .../protos/keypoint_box_coder_pb2.py | 97 - object_detection/protos/losses.proto | 130 - object_detection/protos/losses_pb2.py | 644 ---- object_detection/protos/matcher.proto | 15 - object_detection/protos/matcher_pb2.py | 90 - .../protos/mean_stddev_box_coder.proto | 8 - .../protos/mean_stddev_box_coder_pb2.py | 62 - object_detection/protos/model.proto | 14 - object_detection/protos/model_pb2.py | 90 - object_detection/protos/optimizer.proto | 83 - object_detection/protos/optimizer_pb2.py | 591 ---- object_detection/protos/pipeline.proto | 18 - object_detection/protos/pipeline_pb2.py | 107 - object_detection/protos/post_processing.proto | 46 - .../protos/post_processing_pb2.py | 173 -- object_detection/protos/preprocessor.proto | 405 --- object_detection/protos/preprocessor_pb2.py | 1985 ------------ .../protos/region_similarity_calculator.proto | 25 - .../region_similarity_calculator_pb2.py | 194 -- .../protos/square_box_coder.proto | 14 - .../protos/square_box_coder_pb2.py | 83 - object_detection/protos/ssd.proto | 85 - .../protos/ssd_anchor_generator.proto | 55 - .../protos/ssd_anchor_generator_pb2.py | 153 - object_detection/protos/ssd_pb2.py | 233 -- .../protos/string_int_label_map.proto | 24 - .../protos/string_int_label_map_pb2.py | 123 - object_detection/protos/train.proto | 69 - object_detection/protos/train_pb2.py | 186 -- object_detection/samples/cloud/cloud.yml | 11 - ...cnn_inception_resnet_v2_atrous_coco.config | 147 - ...cnn_inception_resnet_v2_atrous_pets.config | 146 - .../faster_rcnn_inception_v2_coco.config | 145 - .../faster_rcnn_inception_v2_pets.config | 145 - .../configs/faster_rcnn_nas_coco.config | 148 - .../configs/faster_rcnn_resnet101_coco.config | 145 - .../faster_rcnn_resnet101_kitti.config | 143 - .../configs/faster_rcnn_resnet101_pets.config | 144 - .../faster_rcnn_resnet101_voc07.config | 137 - .../configs/faster_rcnn_resnet152_coco.config | 145 - .../configs/faster_rcnn_resnet152_pets.config | 144 - .../configs/faster_rcnn_resnet50_coco.config | 145 - .../configs/faster_rcnn_resnet50_pets.config | 144 - .../configs/rfcn_resnet101_coco.config | 142 - .../configs/rfcn_resnet101_pets.config | 141 - .../configs/ssd_inception_v2_coco.config | 191 -- .../configs/ssd_inception_v2_pets.config | 190 -- .../configs/ssd_mobilenet_v1_coco.config | 197 -- .../configs/ssd_mobilenet_v1_pets.config | 196 -- object_detection/test_images/image1.jpg | Bin 129862 -> 0 bytes object_detection/test_images/image2.jpg | Bin 1415684 -> 0 bytes object_detection/test_images/image_info.txt | 6 - object_detection/train.py | 163 - object_detection/trainer.py | 332 -- object_detection/trainer_test.py | 204 -- object_detection/utils/BUILD | 324 -- object_detection/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-35.pyc | Bin 142 -> 0 bytes .../__pycache__/dataset_util.cpython-35.pyc | Bin 2668 -> 0 bytes .../__pycache__/label_map_util.cpython-35.pyc | Bin 5208 -> 0 bytes .../utils/__pycache__/ops.cpython-35.pyc | Bin 28034 -> 0 bytes .../__pycache__/shape_utils.cpython-35.pyc | Bin 4607 -> 0 bytes .../__pycache__/static_shape.cpython-35.pyc | Bin 1572 -> 0 bytes .../visualization_utils.cpython-35.pyc | Bin 18093 -> 0 bytes object_detection/utils/category_util.py | 72 - object_detection/utils/category_util_test.py | 54 - object_detection/utils/config_util.py | 452 --- object_detection/utils/config_util_test.py | 401 --- object_detection/utils/dataset_util.py | 86 - object_detection/utils/dataset_util_test.py | 37 - object_detection/utils/label_map_util.py | 166 - object_detection/utils/label_map_util_test.py | 217 -- object_detection/utils/learning_schedules.py | 151 - .../utils/learning_schedules_test.py | 78 - object_detection/utils/metrics.py | 144 - object_detection/utils/metrics_test.py | 79 - object_detection/utils/np_box_list.py | 133 - object_detection/utils/np_box_list_ops.py | 555 ---- .../utils/np_box_list_ops_test.py | 414 --- object_detection/utils/np_box_list_test.py | 135 - object_detection/utils/np_box_ops.py | 97 - object_detection/utils/np_box_ops_test.py | 68 - .../utils/object_detection_evaluation.py | 616 ---- .../utils/object_detection_evaluation_test.py | 436 --- object_detection/utils/ops.py | 741 ----- object_detection/utils/ops_test.py | 1132 ------- .../utils/per_image_evaluation.py | 312 -- .../utils/per_image_evaluation_test.py | 276 -- object_detection/utils/shape_utils.py | 136 - object_detection/utils/shape_utils_test.py | 127 - object_detection/utils/static_shape.py | 71 - object_detection/utils/static_shape_test.py | 50 - object_detection/utils/test_utils.py | 139 - object_detection/utils/test_utils_test.py | 73 - object_detection/utils/variables_helper.py | 133 - .../utils/variables_helper_test.py | 185 -- object_detection/utils/visualization_utils.py | 524 ---- .../utils/visualization_utils_test.py | 197 -- 392 files changed, 63894 deletions(-) delete mode 100644 object_detection/BUILD delete mode 100644 object_detection/CONTRIBUTING.md delete mode 100644 object_detection/README.md delete mode 100644 object_detection/__init__.py delete mode 100644 object_detection/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/__pycache__/exporter.cpython-35.pyc delete mode 100644 object_detection/anchor_generators/BUILD delete mode 100644 object_detection/anchor_generators/__init__.py delete mode 100644 object_detection/anchor_generators/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/anchor_generators/__pycache__/grid_anchor_generator.cpython-35.pyc delete mode 100644 object_detection/anchor_generators/__pycache__/multiple_grid_anchor_generator.cpython-35.pyc delete mode 100644 object_detection/anchor_generators/grid_anchor_generator.py delete mode 100644 object_detection/anchor_generators/grid_anchor_generator_test.py delete mode 100644 object_detection/anchor_generators/multiple_grid_anchor_generator.py delete mode 100644 object_detection/anchor_generators/multiple_grid_anchor_generator_test.py delete mode 100644 object_detection/box_coders/BUILD delete mode 100644 object_detection/box_coders/__init__.py delete mode 100644 object_detection/box_coders/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/box_coders/__pycache__/faster_rcnn_box_coder.cpython-35.pyc delete mode 100644 object_detection/box_coders/__pycache__/keypoint_box_coder.cpython-35.pyc delete mode 100644 object_detection/box_coders/__pycache__/mean_stddev_box_coder.cpython-35.pyc delete mode 100644 object_detection/box_coders/__pycache__/square_box_coder.cpython-35.pyc delete mode 100644 object_detection/box_coders/faster_rcnn_box_coder.py delete mode 100644 object_detection/box_coders/faster_rcnn_box_coder_test.py delete mode 100644 object_detection/box_coders/keypoint_box_coder.py delete mode 100644 object_detection/box_coders/keypoint_box_coder_test.py delete mode 100644 object_detection/box_coders/mean_stddev_box_coder.py delete mode 100644 object_detection/box_coders/mean_stddev_box_coder_test.py delete mode 100644 object_detection/box_coders/square_box_coder.py delete mode 100644 object_detection/box_coders/square_box_coder_test.py delete mode 100644 object_detection/builders/BUILD delete mode 100644 object_detection/builders/__init__.py delete mode 100644 object_detection/builders/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/anchor_generator_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/box_coder_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/box_predictor_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/hyperparams_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/image_resizer_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/losses_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/matcher_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/model_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/post_processing_builder.cpython-35.pyc delete mode 100644 object_detection/builders/__pycache__/region_similarity_calculator_builder.cpython-35.pyc delete mode 100644 object_detection/builders/anchor_generator_builder.py delete mode 100644 object_detection/builders/anchor_generator_builder_test.py delete mode 100644 object_detection/builders/box_coder_builder.py delete mode 100644 object_detection/builders/box_coder_builder_test.py delete mode 100644 object_detection/builders/box_predictor_builder.py delete mode 100644 object_detection/builders/box_predictor_builder_test.py delete mode 100644 object_detection/builders/hyperparams_builder.py delete mode 100644 object_detection/builders/hyperparams_builder_test.py delete mode 100644 object_detection/builders/image_resizer_builder.py delete mode 100644 object_detection/builders/image_resizer_builder_test.py delete mode 100644 object_detection/builders/input_reader_builder.py delete mode 100644 object_detection/builders/input_reader_builder_test.py delete mode 100644 object_detection/builders/losses_builder.py delete mode 100644 object_detection/builders/losses_builder_test.py delete mode 100644 object_detection/builders/matcher_builder.py delete mode 100644 object_detection/builders/matcher_builder_test.py delete mode 100644 object_detection/builders/model_builder.py delete mode 100644 object_detection/builders/model_builder_test.py delete mode 100644 object_detection/builders/optimizer_builder.py delete mode 100644 object_detection/builders/optimizer_builder_test.py delete mode 100644 object_detection/builders/post_processing_builder.py delete mode 100644 object_detection/builders/post_processing_builder_test.py delete mode 100644 object_detection/builders/preprocessor_builder.py delete mode 100644 object_detection/builders/preprocessor_builder_test.py delete mode 100644 object_detection/builders/region_similarity_calculator_builder.py delete mode 100644 object_detection/builders/region_similarity_calculator_builder_test.py delete mode 100644 object_detection/core/BUILD delete mode 100644 object_detection/core/__init__.py delete mode 100644 object_detection/core/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/anchor_generator.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/balanced_positive_negative_sampler.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/box_coder.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/box_list.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/box_list_ops.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/box_predictor.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/data_decoder.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/keypoint_ops.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/losses.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/matcher.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/minibatch_sampler.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/model.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/post_processing.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/preprocessor.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/region_similarity_calculator.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/standard_fields.cpython-35.pyc delete mode 100644 object_detection/core/__pycache__/target_assigner.cpython-35.pyc delete mode 100644 object_detection/core/anchor_generator.py delete mode 100644 object_detection/core/balanced_positive_negative_sampler.py delete mode 100644 object_detection/core/balanced_positive_negative_sampler_test.py delete mode 100644 object_detection/core/batcher.py delete mode 100644 object_detection/core/batcher_test.py delete mode 100644 object_detection/core/box_coder.py delete mode 100644 object_detection/core/box_coder_test.py delete mode 100644 object_detection/core/box_list.py delete mode 100644 object_detection/core/box_list_ops.py delete mode 100644 object_detection/core/box_list_ops_test.py delete mode 100644 object_detection/core/box_list_test.py delete mode 100644 object_detection/core/box_predictor.py delete mode 100644 object_detection/core/box_predictor_test.py delete mode 100644 object_detection/core/data_decoder.py delete mode 100644 object_detection/core/data_parser.py delete mode 100644 object_detection/core/keypoint_ops.py delete mode 100644 object_detection/core/keypoint_ops_test.py delete mode 100644 object_detection/core/losses.py delete mode 100644 object_detection/core/losses_test.py delete mode 100644 object_detection/core/matcher.py delete mode 100644 object_detection/core/matcher_test.py delete mode 100644 object_detection/core/minibatch_sampler.py delete mode 100644 object_detection/core/minibatch_sampler_test.py delete mode 100644 object_detection/core/model.py delete mode 100644 object_detection/core/post_processing.py delete mode 100644 object_detection/core/post_processing_test.py delete mode 100644 object_detection/core/prefetcher.py delete mode 100644 object_detection/core/prefetcher_test.py delete mode 100644 object_detection/core/preprocessor.py delete mode 100644 object_detection/core/preprocessor_test.py delete mode 100644 object_detection/core/region_similarity_calculator.py delete mode 100644 object_detection/core/region_similarity_calculator_test.py delete mode 100644 object_detection/core/standard_fields.py delete mode 100644 object_detection/core/target_assigner.py delete mode 100644 object_detection/core/target_assigner_test.py delete mode 100644 object_detection/data/kitti_label_map.pbtxt delete mode 100644 object_detection/data/mscoco_label_map.pbtxt delete mode 100644 object_detection/data/oid_bbox_trainable_label_map.pbtxt delete mode 100644 object_detection/data/pascal_label_map.pbtxt delete mode 100644 object_detection/data/pet_label_map.pbtxt delete mode 100644 object_detection/data_decoders/BUILD delete mode 100644 object_detection/data_decoders/__init__.py delete mode 100644 object_detection/data_decoders/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/data_decoders/__pycache__/tf_example_decoder.cpython-35.pyc delete mode 100644 object_detection/data_decoders/tf_example_decoder.py delete mode 100644 object_detection/data_decoders/tf_example_decoder_test.py delete mode 100644 object_detection/dataset_tools/BUILD delete mode 100644 object_detection/dataset_tools/create_kitti_tf_record.py delete mode 100644 object_detection/dataset_tools/create_kitti_tf_record_test.py delete mode 100644 object_detection/dataset_tools/create_oid_tf_record.py delete mode 100644 object_detection/dataset_tools/create_pascal_tf_record.py delete mode 100644 object_detection/dataset_tools/create_pascal_tf_record_test.py delete mode 100644 object_detection/dataset_tools/create_pet_tf_record.py delete mode 100644 object_detection/dataset_tools/oid_tfrecord_creation.py delete mode 100644 object_detection/dataset_tools/oid_tfrecord_creation_test.py delete mode 100644 object_detection/eval.py delete mode 100644 object_detection/eval_util.py delete mode 100644 object_detection/evaluator.py delete mode 100644 object_detection/export_inference_graph.py delete mode 100644 object_detection/exporter.py delete mode 100644 object_detection/exporter_test.py delete mode 100644 object_detection/faster_rcnn_inception_resnet_v2_atrous_oid.config delete mode 100644 object_detection/g3doc/configuring_jobs.md delete mode 100644 object_detection/g3doc/defining_your_own_model.md delete mode 100644 object_detection/g3doc/detection_model_zoo.md delete mode 100644 object_detection/g3doc/evaluation_protocols.md delete mode 100644 object_detection/g3doc/exporting_models.md delete mode 100644 object_detection/g3doc/img/dogs_detections_output.jpg delete mode 100644 object_detection/g3doc/img/example_cat.jpg delete mode 100644 object_detection/g3doc/img/groupof_case_eval.png delete mode 100644 object_detection/g3doc/img/kites_detections_output.jpg delete mode 100644 object_detection/g3doc/img/nongroupof_case_eval.png delete mode 100644 object_detection/g3doc/img/oid_bus_72e19c28aac34ed8.jpg delete mode 100644 object_detection/g3doc/img/oid_monkey_3b4168c89cecbc5b.jpg delete mode 100644 object_detection/g3doc/img/oxford_pet.png delete mode 100644 object_detection/g3doc/img/tensorboard.png delete mode 100644 object_detection/g3doc/img/tensorboard2.png delete mode 100644 object_detection/g3doc/img/tf-od-api-logo.png delete mode 100644 object_detection/g3doc/installation.md delete mode 100644 object_detection/g3doc/oid_inference_and_evaluation.md delete mode 100644 object_detection/g3doc/preparing_inputs.md delete mode 100644 object_detection/g3doc/running_locally.md delete mode 100644 object_detection/g3doc/running_notebook.md delete mode 100644 object_detection/g3doc/running_on_cloud.md delete mode 100644 object_detection/g3doc/running_pets.md delete mode 100644 object_detection/g3doc/using_your_own_dataset.md delete mode 100644 object_detection/inference.py delete mode 100644 object_detection/inference/BUILD delete mode 100644 object_detection/inference/detection_inference.py delete mode 100644 object_detection/inference/detection_inference_test.py delete mode 100644 object_detection/inference/infer_detections.py delete mode 100644 object_detection/matchers/BUILD delete mode 100644 object_detection/matchers/__init__.py delete mode 100644 object_detection/matchers/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/matchers/__pycache__/argmax_matcher.cpython-35.pyc delete mode 100644 object_detection/matchers/__pycache__/bipartite_matcher.cpython-35.pyc delete mode 100644 object_detection/matchers/argmax_matcher.py delete mode 100644 object_detection/matchers/argmax_matcher_test.py delete mode 100644 object_detection/matchers/bipartite_matcher.py delete mode 100644 object_detection/matchers/bipartite_matcher_test.py delete mode 100644 object_detection/meta_architectures/BUILD delete mode 100644 object_detection/meta_architectures/__init__.py delete mode 100644 object_detection/meta_architectures/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/meta_architectures/__pycache__/faster_rcnn_meta_arch.cpython-35.pyc delete mode 100644 object_detection/meta_architectures/__pycache__/rfcn_meta_arch.cpython-35.pyc delete mode 100644 object_detection/meta_architectures/__pycache__/ssd_meta_arch.cpython-35.pyc delete mode 100644 object_detection/meta_architectures/faster_rcnn_meta_arch.py delete mode 100644 object_detection/meta_architectures/faster_rcnn_meta_arch_test.py delete mode 100644 object_detection/meta_architectures/faster_rcnn_meta_arch_test_lib.py delete mode 100644 object_detection/meta_architectures/rfcn_meta_arch.py delete mode 100644 object_detection/meta_architectures/rfcn_meta_arch_test.py delete mode 100644 object_detection/meta_architectures/ssd_meta_arch.py delete mode 100644 object_detection/meta_architectures/ssd_meta_arch_test.py delete mode 100644 object_detection/metrics/BUILD delete mode 100644 object_detection/metrics/offline_eval_map_corloc.py delete mode 100644 object_detection/metrics/offline_eval_map_corloc_test.py delete mode 100644 object_detection/metrics/tf_example_parser.py delete mode 100644 object_detection/metrics/tf_example_parser_test.py delete mode 100644 object_detection/models/BUILD delete mode 100644 object_detection/models/__init__.py delete mode 100644 object_detection/models/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/embedded_ssd_mobilenet_v1_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/faster_rcnn_inception_resnet_v2_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/faster_rcnn_inception_v2_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/faster_rcnn_nas_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/faster_rcnn_resnet_v1_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/feature_map_generators.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/ssd_inception_v2_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/ssd_inception_v3_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/__pycache__/ssd_mobilenet_v1_feature_extractor.cpython-35.pyc delete mode 100644 object_detection/models/embedded_ssd_mobilenet_v1_feature_extractor.py delete mode 100644 object_detection/models/embedded_ssd_mobilenet_v1_feature_extractor_test.py delete mode 100644 object_detection/models/faster_rcnn_inception_resnet_v2_feature_extractor.py delete mode 100644 object_detection/models/faster_rcnn_inception_resnet_v2_feature_extractor_test.py delete mode 100644 object_detection/models/faster_rcnn_inception_v2_feature_extractor.py delete mode 100644 object_detection/models/faster_rcnn_inception_v2_feature_extractor_test.py delete mode 100644 object_detection/models/faster_rcnn_nas_feature_extractor.py delete mode 100644 object_detection/models/faster_rcnn_nas_feature_extractor_test.py delete mode 100644 object_detection/models/faster_rcnn_resnet_v1_feature_extractor.py delete mode 100644 object_detection/models/faster_rcnn_resnet_v1_feature_extractor_test.py delete mode 100644 object_detection/models/feature_map_generators.py delete mode 100644 object_detection/models/feature_map_generators_test.py delete mode 100644 object_detection/models/ssd_feature_extractor_test.py delete mode 100644 object_detection/models/ssd_inception_v2_feature_extractor.py delete mode 100644 object_detection/models/ssd_inception_v2_feature_extractor_test.py delete mode 100644 object_detection/models/ssd_inception_v3_feature_extractor.py delete mode 100644 object_detection/models/ssd_inception_v3_feature_extractor_test.py delete mode 100644 object_detection/models/ssd_mobilenet_v1_feature_extractor.py delete mode 100644 object_detection/models/ssd_mobilenet_v1_feature_extractor_test.py delete mode 100644 object_detection/object_detection_tutorial.ipynb delete mode 100644 object_detection/protos/BUILD delete mode 100644 object_detection/protos/__init__.py delete mode 100644 object_detection/protos/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/anchor_generator_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/argmax_matcher_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/bipartite_matcher_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/box_coder_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/box_predictor_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/eval_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/faster_rcnn_box_coder_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/faster_rcnn_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/grid_anchor_generator_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/hyperparams_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/image_resizer_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/input_reader_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/keypoint_box_coder_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/losses_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/matcher_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/mean_stddev_box_coder_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/model_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/optimizer_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/pipeline_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/post_processing_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/preprocessor_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/region_similarity_calculator_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/square_box_coder_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/ssd_anchor_generator_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/ssd_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/string_int_label_map_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/__pycache__/train_pb2.cpython-35.pyc delete mode 100644 object_detection/protos/anchor_generator.proto delete mode 100644 object_detection/protos/anchor_generator_pb2.py delete mode 100644 object_detection/protos/argmax_matcher.proto delete mode 100644 object_detection/protos/argmax_matcher_pb2.py delete mode 100644 object_detection/protos/bipartite_matcher.proto delete mode 100644 object_detection/protos/bipartite_matcher_pb2.py delete mode 100644 object_detection/protos/box_coder.proto delete mode 100644 object_detection/protos/box_coder_pb2.py delete mode 100644 object_detection/protos/box_predictor.proto delete mode 100644 object_detection/protos/box_predictor_pb2.py delete mode 100644 object_detection/protos/eval.proto delete mode 100644 object_detection/protos/eval_pb2.py delete mode 100644 object_detection/protos/faster_rcnn.proto delete mode 100644 object_detection/protos/faster_rcnn_box_coder.proto delete mode 100644 object_detection/protos/faster_rcnn_box_coder_pb2.py delete mode 100644 object_detection/protos/faster_rcnn_pb2.py delete mode 100644 object_detection/protos/grid_anchor_generator.proto delete mode 100644 object_detection/protos/grid_anchor_generator_pb2.py delete mode 100644 object_detection/protos/hyperparams.proto delete mode 100644 object_detection/protos/hyperparams_pb2.py delete mode 100644 object_detection/protos/image_resizer.proto delete mode 100644 object_detection/protos/image_resizer_pb2.py delete mode 100644 object_detection/protos/input_reader.proto delete mode 100644 object_detection/protos/input_reader_pb2.py delete mode 100644 object_detection/protos/keypoint_box_coder.proto delete mode 100644 object_detection/protos/keypoint_box_coder_pb2.py delete mode 100644 object_detection/protos/losses.proto delete mode 100644 object_detection/protos/losses_pb2.py delete mode 100644 object_detection/protos/matcher.proto delete mode 100644 object_detection/protos/matcher_pb2.py delete mode 100644 object_detection/protos/mean_stddev_box_coder.proto delete mode 100644 object_detection/protos/mean_stddev_box_coder_pb2.py delete mode 100644 object_detection/protos/model.proto delete mode 100644 object_detection/protos/model_pb2.py delete mode 100644 object_detection/protos/optimizer.proto delete mode 100644 object_detection/protos/optimizer_pb2.py delete mode 100644 object_detection/protos/pipeline.proto delete mode 100644 object_detection/protos/pipeline_pb2.py delete mode 100644 object_detection/protos/post_processing.proto delete mode 100644 object_detection/protos/post_processing_pb2.py delete mode 100644 object_detection/protos/preprocessor.proto delete mode 100644 object_detection/protos/preprocessor_pb2.py delete mode 100644 object_detection/protos/region_similarity_calculator.proto delete mode 100644 object_detection/protos/region_similarity_calculator_pb2.py delete mode 100644 object_detection/protos/square_box_coder.proto delete mode 100644 object_detection/protos/square_box_coder_pb2.py delete mode 100644 object_detection/protos/ssd.proto delete mode 100644 object_detection/protos/ssd_anchor_generator.proto delete mode 100644 object_detection/protos/ssd_anchor_generator_pb2.py delete mode 100644 object_detection/protos/ssd_pb2.py delete mode 100644 object_detection/protos/string_int_label_map.proto delete mode 100644 object_detection/protos/string_int_label_map_pb2.py delete mode 100644 object_detection/protos/train.proto delete mode 100644 object_detection/protos/train_pb2.py delete mode 100644 object_detection/samples/cloud/cloud.yml delete mode 100644 object_detection/samples/configs/faster_rcnn_inception_resnet_v2_atrous_coco.config delete mode 100644 object_detection/samples/configs/faster_rcnn_inception_resnet_v2_atrous_pets.config delete mode 100644 object_detection/samples/configs/faster_rcnn_inception_v2_coco.config delete mode 100644 object_detection/samples/configs/faster_rcnn_inception_v2_pets.config delete mode 100644 object_detection/samples/configs/faster_rcnn_nas_coco.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet101_coco.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet101_kitti.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet101_pets.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet101_voc07.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet152_coco.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet152_pets.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet50_coco.config delete mode 100644 object_detection/samples/configs/faster_rcnn_resnet50_pets.config delete mode 100644 object_detection/samples/configs/rfcn_resnet101_coco.config delete mode 100644 object_detection/samples/configs/rfcn_resnet101_pets.config delete mode 100644 object_detection/samples/configs/ssd_inception_v2_coco.config delete mode 100644 object_detection/samples/configs/ssd_inception_v2_pets.config delete mode 100644 object_detection/samples/configs/ssd_mobilenet_v1_coco.config delete mode 100644 object_detection/samples/configs/ssd_mobilenet_v1_pets.config delete mode 100644 object_detection/test_images/image1.jpg delete mode 100644 object_detection/test_images/image2.jpg delete mode 100644 object_detection/test_images/image_info.txt delete mode 100644 object_detection/train.py delete mode 100644 object_detection/trainer.py delete mode 100644 object_detection/trainer_test.py delete mode 100644 object_detection/utils/BUILD delete mode 100644 object_detection/utils/__init__.py delete mode 100644 object_detection/utils/__pycache__/__init__.cpython-35.pyc delete mode 100644 object_detection/utils/__pycache__/dataset_util.cpython-35.pyc delete mode 100644 object_detection/utils/__pycache__/label_map_util.cpython-35.pyc delete mode 100644 object_detection/utils/__pycache__/ops.cpython-35.pyc delete mode 100644 object_detection/utils/__pycache__/shape_utils.cpython-35.pyc delete mode 100644 object_detection/utils/__pycache__/static_shape.cpython-35.pyc delete mode 100644 object_detection/utils/__pycache__/visualization_utils.cpython-35.pyc delete mode 100644 object_detection/utils/category_util.py delete mode 100644 object_detection/utils/category_util_test.py delete mode 100644 object_detection/utils/config_util.py delete mode 100644 object_detection/utils/config_util_test.py delete mode 100644 object_detection/utils/dataset_util.py delete mode 100644 object_detection/utils/dataset_util_test.py delete mode 100644 object_detection/utils/label_map_util.py delete mode 100644 object_detection/utils/label_map_util_test.py delete mode 100644 object_detection/utils/learning_schedules.py delete mode 100644 object_detection/utils/learning_schedules_test.py delete mode 100644 object_detection/utils/metrics.py delete mode 100644 object_detection/utils/metrics_test.py delete mode 100644 object_detection/utils/np_box_list.py delete mode 100644 object_detection/utils/np_box_list_ops.py delete mode 100644 object_detection/utils/np_box_list_ops_test.py delete mode 100644 object_detection/utils/np_box_list_test.py delete mode 100644 object_detection/utils/np_box_ops.py delete mode 100644 object_detection/utils/np_box_ops_test.py delete mode 100644 object_detection/utils/object_detection_evaluation.py delete mode 100644 object_detection/utils/object_detection_evaluation_test.py delete mode 100644 object_detection/utils/ops.py delete mode 100644 object_detection/utils/ops_test.py delete mode 100644 object_detection/utils/per_image_evaluation.py delete mode 100644 object_detection/utils/per_image_evaluation_test.py delete mode 100644 object_detection/utils/shape_utils.py delete mode 100644 object_detection/utils/shape_utils_test.py delete mode 100644 object_detection/utils/static_shape.py delete mode 100644 object_detection/utils/static_shape_test.py delete mode 100644 object_detection/utils/test_utils.py delete mode 100644 object_detection/utils/test_utils_test.py delete mode 100644 object_detection/utils/variables_helper.py delete mode 100644 object_detection/utils/variables_helper_test.py delete mode 100644 object_detection/utils/visualization_utils.py delete mode 100644 object_detection/utils/visualization_utils_test.py diff --git a/object_detection/BUILD b/object_detection/BUILD deleted file mode 100644 index df835b74..00000000 --- a/object_detection/BUILD +++ /dev/null @@ -1,136 +0,0 @@ -# Tensorflow Object Detection API: main runnables. - -package( - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) - -# Apache 2.0 -py_binary( - name = "train", - srcs = [ - "train.py", - ], - deps = [ - ":trainer", - "//tensorflow", - "//tensorflow_models/object_detection/builders:input_reader_builder", - "//tensorflow_models/object_detection/builders:model_builder", - "//tensorflow_models/object_detection/utils:config_util", - ], -) - -py_library( - name = "trainer", - srcs = ["trainer.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/builders:optimizer_builder", - "//tensorflow_models/object_detection/builders:preprocessor_builder", - "//tensorflow_models/object_detection/core:batcher", - "//tensorflow_models/object_detection/core:preprocessor", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/utils:ops", - "//tensorflow_models/object_detection/utils:variables_helper", - "//tensorflow_models/slim:model_deploy", - ], -) - -py_test( - name = "trainer_test", - srcs = ["trainer_test.py"], - deps = [ - ":trainer", - "//tensorflow", - "//tensorflow_models/object_detection/core:losses", - "//tensorflow_models/object_detection/core:model", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/protos:train_py_pb2", - ], -) - -py_library( - name = "eval_util", - srcs = [ - "eval_util.py", - ], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:box_list", - "//tensorflow_models/object_detection/core:box_list_ops", - "//tensorflow_models/object_detection/core:keypoint_ops", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/utils:label_map_util", - "//tensorflow_models/object_detection/utils:ops", - "//tensorflow_models/object_detection/utils:visualization_utils", - ], -) - -py_library( - name = "evaluator", - srcs = ["evaluator.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection:eval_util", - "//tensorflow_models/object_detection/core:prefetcher", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/protos:eval_py_pb2", - "//tensorflow_models/object_detection/utils:object_detection_evaluation", - ], -) - -py_binary( - name = "eval", - srcs = [ - "eval.py", - ], - deps = [ - ":evaluator", - "//tensorflow", - "//tensorflow_models/object_detection/builders:input_reader_builder", - "//tensorflow_models/object_detection/builders:model_builder", - "//tensorflow_models/object_detection/utils:config_util", - "//tensorflow_models/object_detection/utils:label_map_util", - ], -) - -py_library( - name = "exporter", - srcs = [ - "exporter.py", - ], - deps = [ - "//tensorflow", - "//tensorflow/python/tools:freeze_graph_lib", - "//tensorflow_models/object_detection/builders:model_builder", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/data_decoders:tf_example_decoder", - ], -) - -py_test( - name = "exporter_test", - srcs = [ - "exporter_test.py", - ], - deps = [ - ":exporter", - "//tensorflow", - "//tensorflow_models/object_detection/builders:model_builder", - "//tensorflow_models/object_detection/core:model", - "//tensorflow_models/object_detection/protos:pipeline_py_pb2", - ], -) - -py_binary( - name = "export_inference_graph", - srcs = [ - "export_inference_graph.py", - ], - deps = [ - ":exporter", - "//tensorflow", - "//tensorflow_models/object_detection/protos:pipeline_py_pb2", - ], -) diff --git a/object_detection/CONTRIBUTING.md b/object_detection/CONTRIBUTING.md deleted file mode 100644 index e3d87e3c..00000000 --- a/object_detection/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contributing to the Tensorflow Object Detection API - -Patches to Tensorflow Object Detection API are welcome! - -We require contributors to fill out either the individual or corporate -Contributor License Agreement (CLA). - - * If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an [individual CLA](http://code.google.com/legal/individual-cla-v1.0.html). - * If you work for a company that wants to allow you to contribute your work, then you'll need to sign a [corporate CLA](http://code.google.com/legal/corporate-cla-v1.0.html). - -Please follow the -[Tensorflow contributing guidelines](https://github.com/tensorflow/tensorflow/blob/master/CONTRIBUTING.md) -when submitting pull requests. diff --git a/object_detection/README.md b/object_detection/README.md deleted file mode 100644 index a0d8ddf2..00000000 --- a/object_detection/README.md +++ /dev/null @@ -1,155 +0,0 @@ - -# Tensorflow Object Detection API -Creating accurate machine learning models capable of localizing and identifying -multiple objects in a single image remains a core challenge in computer vision. -The TensorFlow Object Detection API is an open source framework built on top of -TensorFlow that makes it easy to construct, train and deploy object detection -models. At Google we’ve certainly found this codebase to be useful for our -computer vision needs, and we hope that you will as well. -

- -

-Contributions to the codebase are welcome and we would love to hear back from -you if you find this API useful. Finally if you use the Tensorflow Object -Detection API for a research publication, please consider citing: - -``` -"Speed/accuracy trade-offs for modern convolutional object detectors." -Huang J, Rathod V, Sun C, Zhu M, Korattikara A, Fathi A, Fischer I, Wojna Z, -Song Y, Guadarrama S, Murphy K, CVPR 2017 -``` -\[[link](https://arxiv.org/abs/1611.10012)\]\[[bibtex]( -https://scholar.googleusercontent.com/scholar.bib?q=info:l291WsrB-hQJ:scholar.google.com/&output=citation&scisig=AAGBfm0AAAAAWUIIlnPZ_L9jxvPwcC49kDlELtaeIyU-&scisf=4&ct=citation&cd=-1&hl=en&scfhb=1)\] - -

- -

- -## Maintainers - -* Jonathan Huang, github: [jch1](https://github.com/jch1) -* Vivek Rathod, github: [tombstone](https://github.com/tombstone) -* Derek Chow, github: [derekjchow](https://github.com/derekjchow) -* Chen Sun, github: [jesu9](https://github.com/jesu9) -* Menglong Zhu, github: [dreamdragon](https://github.com/dreamdragon) - - -## Table of contents - -Quick Start: - - * - Quick Start: Jupyter notebook for off-the-shelf inference
- * Quick Start: Training a pet detector
- -Setup: - - * Installation
- * - Configuring an object detection pipeline
- * Preparing inputs
- -Running: - - * Running locally
- * Running on the cloud
- -Extras: - - * Tensorflow detection model zoo
- * - Exporting a trained model for inference
- * - Defining your own model architecture
- * - Bringing in your own dataset
- * - Supported object detection evaluation protocols
- * - Inference and evaluation on the Open Images dataset
- -## Getting Help - -To get help with issues you may encounter using the Tensorflow Object Detection -API, create a new question on [StackOverflow](https://stackoverflow.com/) with -the tags "tensorflow" and "object-detection". - -Please report bugs (actually broken code, not usage questions) to the -tensorflow/models Github -[issue tracker](https://github.com/tensorflow/models/issues), prefixing the -issue name with "object_detection". - - - -## Release information - -### November 17, 2017 - -As a part of the Open Images V3 release we have released: - -* An implementation of the Open Images evaluation metric and the [protocol](g3doc/evaluation_protocols.md#open-images). -* Additional tools to separate inference of detection and evaluation (see [this tutorial](g3doc/oid_inference_and_evaluation.md)). -* A new detection model trained on the Open Images V2 data release (see [Open Images model](g3doc/detection_model_zoo.md#open-images-models)). - -See more information on the [Open Images website](https://github.com/openimages/dataset)! - -Thanks to contributors: Stefan Popov, Alina Kuznetsova - -### November 6, 2017 - -We have re-released faster versions of our (pre-trained) models in the -model zoo. In addition to what -was available before, we are also adding Faster R-CNN models trained on COCO -with Inception V2 and Resnet-50 feature extractors, as well as a Faster R-CNN -with Resnet-101 model trained on the KITTI dataset. - -Thanks to contributors: Jonathan Huang, Vivek Rathod, Derek Chow, -Tal Remez, Chen Sun. - -### October 31, 2017 - -We have released a new state-of-the-art model for object detection using -the Faster-RCNN with the -[NASNet-A image featurization](https://arxiv.org/abs/1707.07012). This -model achieves mAP of 43.1% on the test-dev validation dataset for COCO, -improving on the best available model in the zoo by 6% in terms -of absolute mAP. - -Thanks to contributors: Barret Zoph, Vijay Vasudevan, Jonathon Shlens, Quoc Le - -### August 11, 2017 - -We have released an update to the [Android Detect -demo](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android) -which will now run models trained using the Tensorflow Object -Detection API on an Android device. By default, it currently runs a -frozen SSD w/Mobilenet detector trained on COCO, but we encourage -you to try out other detection models! - -Thanks to contributors: Jonathan Huang, Andrew Harp - - -### June 15, 2017 - -In addition to our base Tensorflow detection model definitions, this -release includes: - -* A selection of trainable detection models, including: - * Single Shot Multibox Detector (SSD) with MobileNet, - * SSD with Inception V2, - * Region-Based Fully Convolutional Networks (R-FCN) with Resnet 101, - * Faster RCNN with Resnet 101, - * Faster RCNN with Inception Resnet v2 -* Frozen weights (trained on the COCO dataset) for each of the above models to - be used for out-of-the-box inference purposes. -* A [Jupyter notebook](object_detection_tutorial.ipynb) for performing - out-of-the-box inference with one of our released models -* Convenient [local training](g3doc/running_locally.md) scripts as well as - distributed training and evaluation pipelines via - [Google Cloud](g3doc/running_on_cloud.md). - - -Thanks to contributors: Jonathan Huang, Vivek Rathod, Derek Chow, -Chen Sun, Menglong Zhu, Matthew Tang, Anoop Korattikara, Alireza Fathi, Ian Fischer, Zbigniew Wojna, Yang Song, Sergio Guadarrama, Jasper Uijlings, -Viacheslav Kovalevskyi, Kevin Murphy - diff --git a/object_detection/__init__.py b/object_detection/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/object_detection/__pycache__/__init__.cpython-35.pyc b/object_detection/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index a9a896675d5f83c401ab0c7d3a0f509dee0d9ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 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 diff --git a/object_detection/anchor_generators/__pycache__/grid_anchor_generator.cpython-35.pyc b/object_detection/anchor_generators/__pycache__/grid_anchor_generator.cpython-35.pyc deleted file mode 100644 index 1d43e0c52f6da6a8356d10f001d60c84ce50e3eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7639 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 i0yEBhxDHx=-=Ty^3A diff --git a/object_detection/anchor_generators/__pycache__/multiple_grid_anchor_generator.cpython-35.pyc b/object_detection/anchor_generators/__pycache__/multiple_grid_anchor_generator.cpython-35.pyc deleted file mode 100644 index e3e39400f6f8b16afcb6be267324da9331364702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14944 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 diff --git a/object_detection/anchor_generators/grid_anchor_generator.py b/object_detection/anchor_generators/grid_anchor_generator.py deleted file mode 100644 index d2ea2c07..00000000 --- a/object_detection/anchor_generators/grid_anchor_generator.py +++ /dev/null @@ -1,194 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Generates grid anchors on the fly as used in Faster RCNN. - -Generates grid anchors on the fly as described in: -"Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks" -Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. -""" - -import tensorflow as tf - -from object_detection.core import anchor_generator -from object_detection.core import box_list -from object_detection.utils import ops - - -class GridAnchorGenerator(anchor_generator.AnchorGenerator): - """Generates a grid of anchors at given scales and aspect ratios.""" - - def __init__(self, - scales=(0.5, 1.0, 2.0), - aspect_ratios=(0.5, 1.0, 2.0), - base_anchor_size=None, - anchor_stride=None, - anchor_offset=None): - """Constructs a GridAnchorGenerator. - - Args: - scales: a list of (float) scales, default=(0.5, 1.0, 2.0) - aspect_ratios: a list of (float) aspect ratios, default=(0.5, 1.0, 2.0) - base_anchor_size: base anchor size as height, width ( - (length-2 float32 list, default=[256, 256]) - anchor_stride: difference in centers between base anchors for adjacent - grid positions (length-2 float32 list, default=[16, 16]) - anchor_offset: center of the anchor with scale and aspect ratio 1 for the - upper left element of the grid, this should be zero for - feature networks with only VALID padding and even receptive - field size, but may need additional calculation if other - padding is used (length-2 float32 tensor, default=[0, 0]) - """ - # Handle argument defaults - if base_anchor_size is None: - base_anchor_size = [256, 256] - base_anchor_size = tf.constant(base_anchor_size, tf.float32) - if anchor_stride is None: - anchor_stride = [16, 16] - anchor_stride = tf.constant(anchor_stride, dtype=tf.float32) - if anchor_offset is None: - anchor_offset = [0, 0] - anchor_offset = tf.constant(anchor_offset, dtype=tf.float32) - - self._scales = scales - self._aspect_ratios = aspect_ratios - self._base_anchor_size = base_anchor_size - self._anchor_stride = anchor_stride - self._anchor_offset = anchor_offset - - def name_scope(self): - return 'GridAnchorGenerator' - - def num_anchors_per_location(self): - """Returns the number of anchors per spatial location. - - Returns: - a list of integers, one for each expected feature map to be passed to - the `generate` function. - """ - return [len(self._scales) * len(self._aspect_ratios)] - - def _generate(self, feature_map_shape_list): - """Generates a collection of bounding boxes to be used as anchors. - - Args: - feature_map_shape_list: list of pairs of convnet layer resolutions in the - format [(height_0, width_0)]. For example, setting - feature_map_shape_list=[(8, 8)] asks for anchors that correspond - to an 8x8 layer. For this anchor generator, only lists of length 1 are - allowed. - - Returns: - boxes: a BoxList holding a collection of N anchor boxes - Raises: - ValueError: if feature_map_shape_list, box_specs_list do not have the same - length. - ValueError: if feature_map_shape_list does not consist of pairs of - integers - """ - if not (isinstance(feature_map_shape_list, list) - and len(feature_map_shape_list) == 1): - raise ValueError('feature_map_shape_list must be a list of length 1.') - if not all([isinstance(list_item, tuple) and len(list_item) == 2 - for list_item in feature_map_shape_list]): - raise ValueError('feature_map_shape_list must be a list of pairs.') - grid_height, grid_width = feature_map_shape_list[0] - scales_grid, aspect_ratios_grid = ops.meshgrid(self._scales, - self._aspect_ratios) - scales_grid = tf.reshape(scales_grid, [-1]) - aspect_ratios_grid = tf.reshape(aspect_ratios_grid, [-1]) - return tile_anchors(grid_height, - grid_width, - scales_grid, - aspect_ratios_grid, - self._base_anchor_size, - self._anchor_stride, - self._anchor_offset) - - -def tile_anchors(grid_height, - grid_width, - scales, - aspect_ratios, - base_anchor_size, - anchor_stride, - anchor_offset): - """Create a tiled set of anchors strided along a grid in image space. - - This op creates a set of anchor boxes by placing a "basis" collection of - boxes with user-specified scales and aspect ratios centered at evenly - distributed points along a grid. The basis collection is specified via the - scale and aspect_ratios arguments. For example, setting scales=[.1, .2, .2] - and aspect ratios = [2,2,1/2] means that we create three boxes: one with scale - .1, aspect ratio 2, one with scale .2, aspect ratio 2, and one with scale .2 - and aspect ratio 1/2. Each box is multiplied by "base_anchor_size" before - placing it over its respective center. - - Grid points are specified via grid_height, grid_width parameters as well as - the anchor_stride and anchor_offset parameters. - - Args: - grid_height: size of the grid in the y direction (int or int scalar tensor) - grid_width: size of the grid in the x direction (int or int scalar tensor) - scales: a 1-d (float) tensor representing the scale of each box in the - basis set. - aspect_ratios: a 1-d (float) tensor representing the aspect ratio of each - box in the basis set. The length of the scales and aspect_ratios tensors - must be equal. - base_anchor_size: base anchor size as [height, width] - (float tensor of shape [2]) - anchor_stride: difference in centers between base anchors for adjacent grid - positions (float tensor of shape [2]) - anchor_offset: center of the anchor with scale and aspect ratio 1 for the - upper left element of the grid, this should be zero for - feature networks with only VALID padding and even receptive - field size, but may need some additional calculation if other - padding is used (float tensor of shape [2]) - Returns: - a BoxList holding a collection of N anchor boxes - """ - ratio_sqrts = tf.sqrt(aspect_ratios) - heights = scales / ratio_sqrts * base_anchor_size[0] - widths = scales * ratio_sqrts * base_anchor_size[1] - - # Get a grid of box centers - y_centers = tf.to_float(tf.range(grid_height)) - y_centers = y_centers * anchor_stride[0] + anchor_offset[0] - x_centers = tf.to_float(tf.range(grid_width)) - x_centers = x_centers * anchor_stride[1] + anchor_offset[1] - x_centers, y_centers = ops.meshgrid(x_centers, y_centers) - - widths_grid, x_centers_grid = ops.meshgrid(widths, x_centers) - heights_grid, y_centers_grid = ops.meshgrid(heights, y_centers) - bbox_centers = tf.stack([y_centers_grid, x_centers_grid], axis=3) - bbox_sizes = tf.stack([heights_grid, widths_grid], axis=3) - bbox_centers = tf.reshape(bbox_centers, [-1, 2]) - bbox_sizes = tf.reshape(bbox_sizes, [-1, 2]) - bbox_corners = _center_size_bbox_to_corners_bbox(bbox_centers, bbox_sizes) - return box_list.BoxList(bbox_corners) - - -def _center_size_bbox_to_corners_bbox(centers, sizes): - """Converts bbox center-size representation to corners representation. - - Args: - centers: a tensor with shape [N, 2] representing bounding box centers - sizes: a tensor with shape [N, 2] representing bounding boxes - - Returns: - corners: tensor with shape [N, 4] representing bounding boxes in corners - representation - """ - return tf.concat([centers - .5 * sizes, centers + .5 * sizes], 1) diff --git a/object_detection/anchor_generators/grid_anchor_generator_test.py b/object_detection/anchor_generators/grid_anchor_generator_test.py deleted file mode 100644 index 80a82a39..00000000 --- a/object_detection/anchor_generators/grid_anchor_generator_test.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.grid_anchor_generator.""" - -import tensorflow as tf - -from object_detection.anchor_generators import grid_anchor_generator - - -class GridAnchorGeneratorTest(tf.test.TestCase): - - def test_construct_single_anchor(self): - """Builds a 1x1 anchor grid to test the size of the output boxes.""" - scales = [0.5, 1.0, 2.0] - aspect_ratios = [0.25, 1.0, 4.0] - anchor_offset = [7, -3] - exp_anchor_corners = [[-121, -35, 135, 29], [-249, -67, 263, 61], - [-505, -131, 519, 125], [-57, -67, 71, 61], - [-121, -131, 135, 125], [-249, -259, 263, 253], - [-25, -131, 39, 125], [-57, -259, 71, 253], - [-121, -515, 135, 509]] - - anchor_generator = grid_anchor_generator.GridAnchorGenerator( - scales, aspect_ratios, - anchor_offset=anchor_offset) - anchors = anchor_generator.generate(feature_map_shape_list=[(1, 1)]) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertAllClose(anchor_corners_out, exp_anchor_corners) - - def test_construct_anchor_grid(self): - base_anchor_size = [10, 10] - anchor_stride = [19, 19] - anchor_offset = [0, 0] - scales = [0.5, 1.0, 2.0] - aspect_ratios = [1.0] - - exp_anchor_corners = [[-2.5, -2.5, 2.5, 2.5], [-5., -5., 5., 5.], - [-10., -10., 10., 10.], [-2.5, 16.5, 2.5, 21.5], - [-5., 14., 5, 24], [-10., 9., 10, 29], - [16.5, -2.5, 21.5, 2.5], [14., -5., 24, 5], - [9., -10., 29, 10], [16.5, 16.5, 21.5, 21.5], - [14., 14., 24, 24], [9., 9., 29, 29]] - - anchor_generator = grid_anchor_generator.GridAnchorGenerator( - scales, - aspect_ratios, - base_anchor_size=base_anchor_size, - anchor_stride=anchor_stride, - anchor_offset=anchor_offset) - - anchors = anchor_generator.generate(feature_map_shape_list=[(2, 2)]) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertAllClose(anchor_corners_out, exp_anchor_corners) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/anchor_generators/multiple_grid_anchor_generator.py b/object_detection/anchor_generators/multiple_grid_anchor_generator.py deleted file mode 100644 index b49f12dc..00000000 --- a/object_detection/anchor_generators/multiple_grid_anchor_generator.py +++ /dev/null @@ -1,338 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Generates grid anchors on the fly corresponding to multiple CNN layers. - -Generates grid anchors on the fly corresponding to multiple CNN layers as -described in: -"SSD: Single Shot MultiBox Detector" -Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, -Cheng-Yang Fu, Alexander C. Berg -(see Section 2.2: Choosing scales and aspect ratios for default boxes) -""" - -import numpy as np - -import tensorflow as tf - -from object_detection.anchor_generators import grid_anchor_generator -from object_detection.core import anchor_generator -from object_detection.core import box_list_ops - - -class MultipleGridAnchorGenerator(anchor_generator.AnchorGenerator): - """Generate a grid of anchors for multiple CNN layers.""" - - def __init__(self, - box_specs_list, - base_anchor_size=None, - anchor_strides=None, - anchor_offsets=None, - clip_window=None): - """Constructs a MultipleGridAnchorGenerator. - - To construct anchors, at multiple grid resolutions, one must provide a - list of feature_map_shape_list (e.g., [(8, 8), (4, 4)]), and for each grid - size, a corresponding list of (scale, aspect ratio) box specifications. - - For example: - box_specs_list = [[(.1, 1.0), (.1, 2.0)], # for 8x8 grid - [(.2, 1.0), (.3, 1.0), (.2, 2.0)]] # for 4x4 grid - - To support the fully convolutional setting, we pass grid sizes in at - generation time, while scale and aspect ratios are fixed at construction - time. - - Args: - box_specs_list: list of list of (scale, aspect ratio) pairs with the - outside list having the same number of entries as feature_map_shape_list - (which is passed in at generation time). - base_anchor_size: base anchor size as [height, width] - (length-2 float tensor, default=[1.0, 1.0]). - The height and width values are normalized to the - minimum dimension of the input height and width, so that - when the base anchor height equals the base anchor - width, the resulting anchor is square even if the input - image is not square. - anchor_strides: list of pairs of strides in pixels (in y and x directions - respectively). For example, setting anchor_strides=[(25, 25), (50, 50)] - means that we want the anchors corresponding to the first layer to be - strided by 25 pixels and those in the second layer to be strided by 50 - pixels in both y and x directions. If anchor_strides=None, they are set - to be the reciprocal of the corresponding feature map shapes. - anchor_offsets: list of pairs of offsets in pixels (in y and x directions - respectively). The offset specifies where we want the center of the - (0, 0)-th anchor to lie for each layer. For example, setting - anchor_offsets=[(10, 10), (20, 20)]) means that we want the - (0, 0)-th anchor of the first layer to lie at (10, 10) in pixel space - and likewise that we want the (0, 0)-th anchor of the second layer to - lie at (25, 25) in pixel space. If anchor_offsets=None, then they are - set to be half of the corresponding anchor stride. - clip_window: a tensor of shape [4] specifying a window to which all - anchors should be clipped. If clip_window is None, then no clipping - is performed. - - Raises: - ValueError: if box_specs_list is not a list of list of pairs - ValueError: if clip_window is not either None or a tensor of shape [4] - """ - if isinstance(box_specs_list, list) and all( - [isinstance(list_item, list) for list_item in box_specs_list]): - self._box_specs = box_specs_list - else: - raise ValueError('box_specs_list is expected to be a ' - 'list of lists of pairs') - if base_anchor_size is None: - base_anchor_size = tf.constant([256, 256], dtype=tf.float32) - self._base_anchor_size = base_anchor_size - self._anchor_strides = anchor_strides - self._anchor_offsets = anchor_offsets - if clip_window is not None and clip_window.get_shape().as_list() != [4]: - raise ValueError('clip_window must either be None or a shape [4] tensor') - self._clip_window = clip_window - self._scales = [] - self._aspect_ratios = [] - for box_spec in self._box_specs: - if not all([isinstance(entry, tuple) and len(entry) == 2 - for entry in box_spec]): - raise ValueError('box_specs_list is expected to be a ' - 'list of lists of pairs') - scales, aspect_ratios = zip(*box_spec) - self._scales.append(scales) - self._aspect_ratios.append(aspect_ratios) - - for arg, arg_name in zip([self._anchor_strides, self._anchor_offsets], - ['anchor_strides', 'anchor_offsets']): - if arg and not (isinstance(arg, list) and - len(arg) == len(self._box_specs)): - raise ValueError('%s must be a list with the same length ' - 'as self._box_specs' % arg_name) - if arg and not all([ - isinstance(list_item, tuple) and len(list_item) == 2 - for list_item in arg - ]): - raise ValueError('%s must be a list of pairs.' % arg_name) - - def name_scope(self): - return 'MultipleGridAnchorGenerator' - - def num_anchors_per_location(self): - """Returns the number of anchors per spatial location. - - Returns: - a list of integers, one for each expected feature map to be passed to - the Generate function. - """ - return [len(box_specs) for box_specs in self._box_specs] - - def _generate(self, feature_map_shape_list, im_height=1, im_width=1): - """Generates a collection of bounding boxes to be used as anchors. - - The number of anchors generated for a single grid with shape MxM where we - place k boxes over each grid center is k*M^2 and thus the total number of - anchors is the sum over all grids. In our box_specs_list example - (see the constructor docstring), we would place two boxes over each grid - point on an 8x8 grid and three boxes over each grid point on a 4x4 grid and - thus end up with 2*8^2 + 3*4^2 = 176 anchors in total. The layout of the - output anchors follows the order of how the grid sizes and box_specs are - specified (with box_spec index varying the fastest, followed by width - index, then height index, then grid index). - - Args: - feature_map_shape_list: list of pairs of convnet layer resolutions in the - format [(height_0, width_0), (height_1, width_1), ...]. For example, - setting feature_map_shape_list=[(8, 8), (7, 7)] asks for anchors that - correspond to an 8x8 layer followed by a 7x7 layer. - im_height: the height of the image to generate the grid for. If both - im_height and im_width are 1, the generated anchors default to - normalized coordinates, otherwise absolute coordinates are used for the - grid. - im_width: the width of the image to generate the grid for. If both - im_height and im_width are 1, the generated anchors default to - normalized coordinates, otherwise absolute coordinates are used for the - grid. - - Returns: - boxes: a BoxList holding a collection of N anchor boxes - Raises: - ValueError: if feature_map_shape_list, box_specs_list do not have the same - length. - ValueError: if feature_map_shape_list does not consist of pairs of - integers - """ - if not (isinstance(feature_map_shape_list, list) - and len(feature_map_shape_list) == len(self._box_specs)): - raise ValueError('feature_map_shape_list must be a list with the same ' - 'length as self._box_specs') - if not all([isinstance(list_item, tuple) and len(list_item) == 2 - for list_item in feature_map_shape_list]): - raise ValueError('feature_map_shape_list must be a list of pairs.') - - im_height = tf.to_float(im_height) - im_width = tf.to_float(im_width) - - if not self._anchor_strides: - anchor_strides = [(1.0 / tf.to_float(pair[0]), 1.0 / tf.to_float(pair[1])) - for pair in feature_map_shape_list] - else: - anchor_strides = [(tf.to_float(stride[0]) / im_height, - tf.to_float(stride[1]) / im_width) - for stride in self._anchor_strides] - if not self._anchor_offsets: - anchor_offsets = [(0.5 * stride[0], 0.5 * stride[1]) - for stride in anchor_strides] - else: - anchor_offsets = [(tf.to_float(offset[0]) / im_height, - tf.to_float(offset[1]) / im_width) - for offset in self._anchor_offsets] - - for arg, arg_name in zip([anchor_strides, anchor_offsets], - ['anchor_strides', 'anchor_offsets']): - if not (isinstance(arg, list) and len(arg) == len(self._box_specs)): - raise ValueError('%s must be a list with the same length ' - 'as self._box_specs' % arg_name) - if not all([isinstance(list_item, tuple) and len(list_item) == 2 - for list_item in arg]): - raise ValueError('%s must be a list of pairs.' % arg_name) - - anchor_grid_list = [] - min_im_shape = tf.minimum(im_height, im_width) - scale_height = min_im_shape / im_height - scale_width = min_im_shape / im_width - base_anchor_size = [ - scale_height * self._base_anchor_size[0], - scale_width * self._base_anchor_size[1] - ] - for grid_size, scales, aspect_ratios, stride, offset in zip( - feature_map_shape_list, self._scales, self._aspect_ratios, - anchor_strides, anchor_offsets): - anchor_grid_list.append( - grid_anchor_generator.tile_anchors( - grid_height=grid_size[0], - grid_width=grid_size[1], - scales=scales, - aspect_ratios=aspect_ratios, - base_anchor_size=base_anchor_size, - anchor_stride=stride, - anchor_offset=offset)) - concatenated_anchors = box_list_ops.concatenate(anchor_grid_list) - num_anchors = concatenated_anchors.num_boxes_static() - if num_anchors is None: - num_anchors = concatenated_anchors.num_boxes() - if self._clip_window is not None: - concatenated_anchors = box_list_ops.clip_to_window( - concatenated_anchors, self._clip_window, filter_nonoverlapping=False) - # TODO(jonathanhuang): make reshape an option for the clip_to_window op - concatenated_anchors.set( - tf.reshape(concatenated_anchors.get(), [num_anchors, 4])) - - stddevs_tensor = 0.01 * tf.ones( - [num_anchors, 4], dtype=tf.float32, name='stddevs') - concatenated_anchors.add_field('stddev', stddevs_tensor) - - return concatenated_anchors - - -def create_ssd_anchors(num_layers=6, - min_scale=0.2, - max_scale=0.95, - scales=None, - aspect_ratios=(1.0, 2.0, 3.0, 1.0 / 2, 1.0 / 3), - interpolated_scale_aspect_ratio=1.0, - base_anchor_size=None, - anchor_strides=None, - anchor_offsets=None, - reduce_boxes_in_lowest_layer=True): - """Creates MultipleGridAnchorGenerator for SSD anchors. - - This function instantiates a MultipleGridAnchorGenerator that reproduces - ``default box`` construction proposed by Liu et al in the SSD paper. - See Section 2.2 for details. Grid sizes are assumed to be passed in - at generation time from finest resolution to coarsest resolution --- this is - used to (linearly) interpolate scales of anchor boxes corresponding to the - intermediate grid sizes. - - Anchors that are returned by calling the `generate` method on the returned - MultipleGridAnchorGenerator object are always in normalized coordinates - and clipped to the unit square: (i.e. all coordinates lie in [0, 1]x[0, 1]). - - Args: - num_layers: integer number of grid layers to create anchors for (actual - grid sizes passed in at generation time) - min_scale: scale of anchors corresponding to finest resolution (float) - max_scale: scale of anchors corresponding to coarsest resolution (float) - scales: As list of anchor scales to use. When not None and not emtpy, - min_scale and max_scale are not used. - aspect_ratios: list or tuple of (float) aspect ratios to place on each - grid point. - interpolated_scale_aspect_ratio: An additional anchor is added with this - aspect ratio and a scale interpolated between the scale for a layer - and the scale for the next layer (1.0 for the last layer). - This anchor is not included if this value is 0. - base_anchor_size: base anchor size as [height, width]. - The height and width values are normalized to the minimum dimension of the - input height and width, so that when the base anchor height equals the - base anchor width, the resulting anchor is square even if the input image - is not square. - anchor_strides: list of pairs of strides in pixels (in y and x directions - respectively). For example, setting anchor_strides=[(25, 25), (50, 50)] - means that we want the anchors corresponding to the first layer to be - strided by 25 pixels and those in the second layer to be strided by 50 - pixels in both y and x directions. If anchor_strides=None, they are set to - be the reciprocal of the corresponding feature map shapes. - anchor_offsets: list of pairs of offsets in pixels (in y and x directions - respectively). The offset specifies where we want the center of the - (0, 0)-th anchor to lie for each layer. For example, setting - anchor_offsets=[(10, 10), (20, 20)]) means that we want the - (0, 0)-th anchor of the first layer to lie at (10, 10) in pixel space - and likewise that we want the (0, 0)-th anchor of the second layer to lie - at (25, 25) in pixel space. If anchor_offsets=None, then they are set to - be half of the corresponding anchor stride. - reduce_boxes_in_lowest_layer: a boolean to indicate whether the fixed 3 - boxes per location is used in the lowest layer. - - Returns: - a MultipleGridAnchorGenerator - """ - if base_anchor_size is None: - base_anchor_size = [1.0, 1.0] - base_anchor_size = tf.constant(base_anchor_size, dtype=tf.float32) - box_specs_list = [] - if scales is None or not scales: - scales = [min_scale + (max_scale - min_scale) * i / (num_layers - 1) - for i in range(num_layers)] + [1.0] - else: - # Add 1.0 to the end, which will only be used in scale_next below and used - # for computing an interpolated scale for the largest scale in the list. - scales += [1.0] - - for layer, scale, scale_next in zip( - range(num_layers), scales[:-1], scales[1:]): - layer_box_specs = [] - if layer == 0 and reduce_boxes_in_lowest_layer: - layer_box_specs = [(0.1, 1.0), (scale, 2.0), (scale, 0.5)] - else: - for aspect_ratio in aspect_ratios: - layer_box_specs.append((scale, aspect_ratio)) - # Add one more anchor, with a scale between the current scale, and the - # scale for the next layer, with a specified aspect ratio (1.0 by - # default). - if interpolated_scale_aspect_ratio > 0.0: - layer_box_specs.append((np.sqrt(scale*scale_next), - interpolated_scale_aspect_ratio)) - box_specs_list.append(layer_box_specs) - - return MultipleGridAnchorGenerator(box_specs_list, base_anchor_size, - anchor_strides, anchor_offsets) diff --git a/object_detection/anchor_generators/multiple_grid_anchor_generator_test.py b/object_detection/anchor_generators/multiple_grid_anchor_generator_test.py deleted file mode 100644 index 03ec970b..00000000 --- a/object_detection/anchor_generators/multiple_grid_anchor_generator_test.py +++ /dev/null @@ -1,267 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for anchor_generators.multiple_grid_anchor_generator_test.py.""" - -import numpy as np - -import tensorflow as tf - -from object_detection.anchor_generators import multiple_grid_anchor_generator as ag - - -class MultipleGridAnchorGeneratorTest(tf.test.TestCase): - - def test_construct_single_anchor_grid(self): - """Builds a 1x1 anchor grid to test the size of the output boxes.""" - exp_anchor_corners = [[-121, -35, 135, 29], [-249, -67, 263, 61], - [-505, -131, 519, 125], [-57, -67, 71, 61], - [-121, -131, 135, 125], [-249, -259, 263, 253], - [-25, -131, 39, 125], [-57, -259, 71, 253], - [-121, -515, 135, 509]] - - box_specs_list = [[(.5, .25), (1.0, .25), (2.0, .25), - (.5, 1.0), (1.0, 1.0), (2.0, 1.0), - (.5, 4.0), (1.0, 4.0), (2.0, 4.0)]] - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([256, 256], dtype=tf.float32), - anchor_strides=[(16, 16)], - anchor_offsets=[(7, -3)]) - anchors = anchor_generator.generate(feature_map_shape_list=[(1, 1)]) - anchor_corners = anchors.get() - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertAllClose(anchor_corners_out, exp_anchor_corners) - - def test_construct_anchor_grid(self): - box_specs_list = [[(0.5, 1.0), (1.0, 1.0), (2.0, 1.0)]] - - exp_anchor_corners = [[-2.5, -2.5, 2.5, 2.5], [-5., -5., 5., 5.], - [-10., -10., 10., 10.], [-2.5, 16.5, 2.5, 21.5], - [-5., 14., 5, 24], [-10., 9., 10, 29], - [16.5, -2.5, 21.5, 2.5], [14., -5., 24, 5], - [9., -10., 29, 10], [16.5, 16.5, 21.5, 21.5], - [14., 14., 24, 24], [9., 9., 29, 29]] - - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([10, 10], dtype=tf.float32), - anchor_strides=[(19, 19)], - anchor_offsets=[(0, 0)]) - anchors = anchor_generator.generate(feature_map_shape_list=[(2, 2)]) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertAllClose(anchor_corners_out, exp_anchor_corners) - - def test_construct_anchor_grid_non_square(self): - box_specs_list = [[(1.0, 1.0)]] - - exp_anchor_corners = [[0., -0.25, 1., 0.75], [0., 0.25, 1., 1.25]] - - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, base_anchor_size=tf.constant([1, 1], dtype=tf.float32)) - anchors = anchor_generator.generate(feature_map_shape_list=[(tf.constant( - 1, dtype=tf.int32), tf.constant(2, dtype=tf.int32))]) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertAllClose(anchor_corners_out, exp_anchor_corners) - - def test_construct_anchor_grid_normalized(self): - box_specs_list = [[(1.0, 1.0)]] - - exp_anchor_corners = [[0., 0., 1., 0.5], [0., 0.5, 1., 1.]] - - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, base_anchor_size=tf.constant([1, 1], dtype=tf.float32)) - anchors = anchor_generator.generate( - feature_map_shape_list=[(tf.constant(1, dtype=tf.int32), tf.constant( - 2, dtype=tf.int32))], - im_height=320, - im_width=640) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertAllClose(anchor_corners_out, exp_anchor_corners) - - def test_construct_multiple_grids(self): - box_specs_list = [[(1.0, 1.0), (2.0, 1.0), (1.0, 0.5)], - [(1.0, 1.0), (1.0, 0.5)]] - - # height and width of box with .5 aspect ratio - h = np.sqrt(2) - w = 1.0/np.sqrt(2) - exp_small_grid_corners = [[-.25, -.25, .75, .75], - [.25-.5*h, .25-.5*w, .25+.5*h, .25+.5*w], - [-.25, .25, .75, 1.25], - [.25-.5*h, .75-.5*w, .25+.5*h, .75+.5*w], - [.25, -.25, 1.25, .75], - [.75-.5*h, .25-.5*w, .75+.5*h, .25+.5*w], - [.25, .25, 1.25, 1.25], - [.75-.5*h, .75-.5*w, .75+.5*h, .75+.5*w]] - # only test first entry of larger set of anchors - exp_big_grid_corners = [[.125-.5, .125-.5, .125+.5, .125+.5], - [.125-1.0, .125-1.0, .125+1.0, .125+1.0], - [.125-.5*h, .125-.5*w, .125+.5*h, .125+.5*w],] - - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.25, .25), (.5, .5)], - anchor_offsets=[(.125, .125), (.25, .25)]) - anchors = anchor_generator.generate(feature_map_shape_list=[(4, 4), (2, 2)]) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertEquals(anchor_corners_out.shape, (56, 4)) - big_grid_corners = anchor_corners_out[0:3, :] - small_grid_corners = anchor_corners_out[48:, :] - self.assertAllClose(small_grid_corners, exp_small_grid_corners) - self.assertAllClose(big_grid_corners, exp_big_grid_corners) - - def test_construct_multiple_grids_with_clipping(self): - box_specs_list = [[(1.0, 1.0), (2.0, 1.0), (1.0, 0.5)], - [(1.0, 1.0), (1.0, 0.5)]] - - # height and width of box with .5 aspect ratio - h = np.sqrt(2) - w = 1.0/np.sqrt(2) - exp_small_grid_corners = [[0, 0, .75, .75], - [0, 0, .25+.5*h, .25+.5*w], - [0, .25, .75, 1], - [0, .75-.5*w, .25+.5*h, 1], - [.25, 0, 1, .75], - [.75-.5*h, 0, 1, .25+.5*w], - [.25, .25, 1, 1], - [.75-.5*h, .75-.5*w, 1, 1]] - - clip_window = tf.constant([0, 0, 1, 1], dtype=tf.float32) - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - clip_window=clip_window) - anchors = anchor_generator.generate(feature_map_shape_list=[(4, 4), (2, 2)]) - anchor_corners = anchors.get() - - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - small_grid_corners = anchor_corners_out[48:, :] - self.assertAllClose(small_grid_corners, exp_small_grid_corners) - - def test_invalid_box_specs(self): - # not all box specs are pairs - box_specs_list = [[(1.0, 1.0), (2.0, 1.0), (1.0, 0.5)], - [(1.0, 1.0), (1.0, 0.5, .3)]] - with self.assertRaises(ValueError): - ag.MultipleGridAnchorGenerator(box_specs_list) - - # box_specs_list is not a list of lists - box_specs_list = [(1.0, 1.0), (2.0, 1.0), (1.0, 0.5)] - with self.assertRaises(ValueError): - ag.MultipleGridAnchorGenerator(box_specs_list) - - def test_invalid_generate_arguments(self): - box_specs_list = [[(1.0, 1.0), (2.0, 1.0), (1.0, 0.5)], - [(1.0, 1.0), (1.0, 0.5)]] - - # incompatible lengths with box_specs_list - with self.assertRaises(ValueError): - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.25, .25)], - anchor_offsets=[(.125, .125), (.25, .25)]) - anchor_generator.generate(feature_map_shape_list=[(4, 4), (2, 2)]) - with self.assertRaises(ValueError): - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.25, .25), (.5, .5)], - anchor_offsets=[(.125, .125), (.25, .25)]) - anchor_generator.generate(feature_map_shape_list=[(4, 4), (2, 2), (1, 1)]) - with self.assertRaises(ValueError): - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.5, .5)], - anchor_offsets=[(.25, .25)]) - anchor_generator.generate(feature_map_shape_list=[(4, 4), (2, 2)]) - - # not pairs - with self.assertRaises(ValueError): - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.25, .25), (.5, .5)], - anchor_offsets=[(.125, .125), (.25, .25)]) - anchor_generator.generate(feature_map_shape_list=[(4, 4, 4), (2, 2)]) - with self.assertRaises(ValueError): - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.25, .25, .1), (.5, .5)], - anchor_offsets=[(.125, .125), (.25, .25)]) - anchor_generator.generate(feature_map_shape_list=[(4, 4), (2, 2)]) - with self.assertRaises(ValueError): - anchor_generator = ag.MultipleGridAnchorGenerator( - box_specs_list, - base_anchor_size=tf.constant([1.0, 1.0], dtype=tf.float32), - anchor_strides=[(.25, .25), (.5, .5)], - anchor_offsets=[(.125, .125), (.25, .25)]) - anchor_generator.generate(feature_map_shape_list=[(4), (2, 2)]) - - -class CreateSSDAnchorsTest(tf.test.TestCase): - - def test_create_ssd_anchors_returns_correct_shape(self): - anchor_generator = ag.create_ssd_anchors( - num_layers=6, - min_scale=0.2, - max_scale=0.95, - aspect_ratios=(1.0, 2.0, 3.0, 1.0 / 2, 1.0 / 3), - reduce_boxes_in_lowest_layer=True) - - feature_map_shape_list = [(38, 38), (19, 19), (10, 10), - (5, 5), (3, 3), (1, 1)] - anchors = anchor_generator.generate( - feature_map_shape_list=feature_map_shape_list) - anchor_corners = anchors.get() - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertEquals(anchor_corners_out.shape, (7308, 4)) - - anchor_generator = ag.create_ssd_anchors( - num_layers=6, min_scale=0.2, max_scale=0.95, - aspect_ratios=(1.0, 2.0, 3.0, 1.0/2, 1.0/3), - reduce_boxes_in_lowest_layer=False) - - feature_map_shape_list = [(38, 38), (19, 19), (10, 10), - (5, 5), (3, 3), (1, 1)] - anchors = anchor_generator.generate( - feature_map_shape_list=feature_map_shape_list) - anchor_corners = anchors.get() - with self.test_session(): - anchor_corners_out = anchor_corners.eval() - self.assertEquals(anchor_corners_out.shape, (11640, 4)) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/box_coders/BUILD b/object_detection/box_coders/BUILD deleted file mode 100644 index ecb3cc7a..00000000 --- a/object_detection/box_coders/BUILD +++ /dev/null @@ -1,102 +0,0 @@ -# Tensorflow Object Detection API: Box Coder implementations. - -package( - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) - -# Apache 2.0 -py_library( - name = "faster_rcnn_box_coder", - srcs = [ - "faster_rcnn_box_coder.py", - ], - deps = [ - "//tensorflow_models/object_detection/core:box_coder", - "//tensorflow_models/object_detection/core:box_list", - ], -) - -py_test( - name = "faster_rcnn_box_coder_test", - srcs = [ - "faster_rcnn_box_coder_test.py", - ], - deps = [ - ":faster_rcnn_box_coder", - "//tensorflow", - "//tensorflow_models/object_detection/core:box_list", - ], -) - -py_library( - name = "keypoint_box_coder", - srcs = [ - "keypoint_box_coder.py", - ], - deps = [ - "//tensorflow_models/object_detection/core:box_coder", - "//tensorflow_models/object_detection/core:box_list", - "//tensorflow_models/object_detection/core:standard_fields", - ], -) - -py_test( - name = "keypoint_box_coder_test", - srcs = [ - "keypoint_box_coder_test.py", - ], - deps = [ - ":keypoint_box_coder", - "//tensorflow", - "//tensorflow_models/object_detection/core:box_list", - "//tensorflow_models/object_detection/core:standard_fields", - ], -) - -py_library( - name = "mean_stddev_box_coder", - srcs = [ - "mean_stddev_box_coder.py", - ], - deps = [ - "//tensorflow_models/object_detection/core:box_coder", - "//tensorflow_models/object_detection/core:box_list", - ], -) - -py_test( - name = "mean_stddev_box_coder_test", - srcs = [ - "mean_stddev_box_coder_test.py", - ], - deps = [ - ":mean_stddev_box_coder", - "//tensorflow", - "//tensorflow_models/object_detection/core:box_list", - ], -) - -py_library( - name = "square_box_coder", - srcs = [ - "square_box_coder.py", - ], - deps = [ - "//tensorflow_models/object_detection/core:box_coder", - "//tensorflow_models/object_detection/core:box_list", - ], -) - -py_test( - name = "square_box_coder_test", - srcs = [ - "square_box_coder_test.py", - ], - deps = [ - ":square_box_coder", - "//tensorflow", - "//tensorflow_models/object_detection/core:box_list", - ], -) diff --git a/object_detection/box_coders/__init__.py b/object_detection/box_coders/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/object_detection/box_coders/__pycache__/__init__.cpython-35.pyc b/object_detection/box_coders/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index 975284e4ae6b066f22572f05be57f7561144ca9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmWgV<>i{qWEaH%1dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnFF*Z^{M=Oiq#|?u z+|-oJ(p>%G(xS4|%$%IWyyR5c$3aBfDl!B~Tdp7pgvBQkh zB&*~GxIsd^08hZn@BqF8F3`RL5)$7TJ84U!O5p6AojG&noHOI^o0Dv=tu=nOZ}$FP zXY3F5$m5`Y3r&9k;WO5Qw3u(R$YMR)^h+!%v4O*S4zp;^G2=4pl`+P@3j5fvFu%&a z$J#2B4m+x{?@Fv!BR~7Cn)uCP>?5I5srcQ!ZkHb<6YeFxRP9D%rJf%qQIw1|PXkGo zVch513*UusW<2h!&U5+*kqoTpR%KEE>MSNT-5c!vjqloL`;pqv=x*eC-iqojW& zFlH^X8yBiERAWJ^aUhlClN~82sH^Gv=i0uhy&fZ_SWv(?cHl{ zzIz>SNg-M)!brCpCjb!ZwydmcczH64Tn2kzTUzra$9eQU7^CxZ{a-ePl` z&5*Fo?mJ9hDyF}=#J2DbAHAhx|=GOms*%GZsRDI7x1tV}me~V>2DM3tyana>%tz$+Vlqa)s}{F2C{RYu6G8~4@ZNJ9;pX1j3Tg2c7R}zG*O-8;0PTzA0uXG z31r8zEP+(46{0s%+=wsd_fcs~G#rVe=B3LzdaRLfC$&ud;cK&FgI5V6!p-{5p(gmAnVrdfuzEStIYkuEu5# z+k(->`6)K5vRMhEGDc07B4&wfX%@_yuPs#Y025NJ6LpRprv7BJX3@t1J^L=!&*0EZ zf^$${w6Mml0R={D3k!!7xqoDiz(_auV66HM-6;6mZ( zM=D<44T7gK)*z~qL*xez65+bVqD2j$?I0wa5p{{>f+`g~_e>cvR|S=mf|Z7lCxp)v z0@w)ws8!8)U#4zeO>oyQ%b<(;XAr5g>YdN`Kl${tZf2*4U~|$}H7w2QsS>fqeI>K9 zPK9^Bb=rVCE1S%+YO%?zJ}umftUg(G?LcJqSY*{=HmeqMnH6N#7{MlJQ#9%aIa}x! z$SG5G^J9Jw8qFbCbIaPY8(;t;&N^q;t+U1F__-ByDx56IbPj&1XogJfr;rJZ zIkJfv1bYKFAdU$4D6w+5|6sV1qZ@GFh6zz=3HNO<5qv8YfcrLhNmR-$0QYUMltO`_ z4MH|Zb{-rlRCS{&Lj@MVH+o>^CMZH-U<%f577S`q*}b?mKWzwhsu-Oy?8@gh=Vu?8 z+njH(v_fA4^R1GEQ!K|C7;dm7-3;R@$G?7vO5sajH$vq=9ivgs48rRQPQlWA$pAzC z3-bRry`IA1QEcdJEOP&bH0lf>q0W-nfas&qbE{QX1Q>MzBCC$@H2^G7o1`)fDapxD z5zVsd2lD? z{1Lv?xLMP6zZr?Bn5nw1pLnjT@Qa0IwV}e-43$n56)ts|M2Cc-_CrB+QBe&g3sa4o zR>eNOzTq^v(c|#nz*N@AFUv#xgvejSg@0H7wwEZW=*}}QL!GB(HN25MKvNlKtDPx?C25TS diff --git a/object_detection/box_coders/__pycache__/keypoint_box_coder.cpython-35.pyc b/object_detection/box_coders/__pycache__/keypoint_box_coder.cpython-35.pyc deleted file mode 100644 index f0c7151d1bcaeb5205cab42f3435921a570a58b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5373 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 DPW4MS diff --git a/object_detection/box_coders/__pycache__/square_box_coder.cpython-35.pyc b/object_detection/box_coders/__pycache__/square_box_coder.cpython-35.pyc deleted file mode 100644 index 6f3a5280a7a858374505b16a3d3c9f61dec9bb00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3994 zcmb7HOLH5?5uRNvUMq+XJxtn)?6Ko26AA?~QDQkPg{4TAU8-`yDbvw`wrgv+I|P_RgO5p7h8tI} zx_`6x5C6Hw*nio%&q4non*Jk5z}O+E#R8i}7CW>}zrvyl8#wIHVHV9fW?W^5RgCec z#y$;dEU2^Zu(r;m!%ph#+X_2uke-8fL;T%l?BK;nD9MkKG53=|s*dYkX7S@Bijp(U z)4n93Fz#{f_vJwFKx$uwM>60?5+ZwU#DB;23zcs5`5k`Nb|XkEK zqF|#)rG{h}r2TC!;(+&M*z2d;u9A8v{WLt4(WJuKC!! zPgJ>u`|1|wcIfaFR;EyxMz1QlD`WC=;O5rmrbRODk(n1wdnA1^()kICRVGfM<^oQp zxNY+!jwWsrOP=fCm@H%w$uIjD_J!uUpPa=!P54kHr(q!ZP^#lZ4RA2Y!vS&S0PfQq z9c6s_iO}TDFCKThv@6bx?BIw3^dJwCqZ2q$Bkq(AflM(%8l)1Q#y&@~u#j)bPOrm{ zg)ep6c!^ZFq#}%mqZGS~p2Ud|T=<&@p-vM;s!l^e4hg5&pyR#-4p_HsWlb348DlVL z&>+H+-riq!|MS<$lYO7$7GDLOhiLk95D63kCZGmChZTZB0P3*s04j&cDg$nS835*6 za13~Y1`QAEENHU8HT?oVSF)8HDUXuzV{*>)S5HiADLnV?YF{9)aDpKY0oRH&Ok$oK zm$4(ScDg<=Xg>N&_C7|_&p>7tQ%_lHIxq(ie_mngeU_R!0M4H*mX;?lVjqKxUs?vC zD)k`*MKi`coU{hm*TvMrE=jCYHS*zWz+3T)Cqe3Pe7{#cy=QtHfESVU5Js%fd;Bx_ zoDOr34-*{{n2dx_s1ivooI?OmAn>J8r%=TC(_^k>N^)H!?lun+#GhhcB&AtSLFb>4 zb;~^5E>)Ne9Lo5vPDUzE;m9O#?qwzYWPp4QG#_co&#!*D+u7abIsHv%_nYE`Ux-l4 z@{G?!G?Gu0O4Ob)^8AqrSY%@XvwIw-`3b@r#+skfLXA01MN-72oe+`$YD9+^eqrX_?vY$H_=9pKeyO3 z>jgq?A>_8AW!-9X-K>`9rmBH!$oJ27`pH1<9I5*|0~v&)!HyoOQyE4PRfwG& z-ig}DQSaqrcjxomo$998%?j9=#|5k=&!o{}i}RJ%kBUw7M1R)OC#cNx{JBH~H5;$6sP_{7mN zI?k?MU@x7cny@-+lt$7)S|F@dv#wb!`%Sdz#t$5+3>Za#nt`{2P9B-As-kZ;Yg=k{ z(a(1`8#k%ec_@R@EH&lAo^D>+uN3krz39V>f{|{s>VN3WY<7ae#@N>mn^)Kzw94i+ zDitR-n^oDY#%`cu%qY5Q02q#LE8}xczs!yk)42T6ww0!<@hX2`-@wbFpAX4@A`8>uPKJmf~vtE zC1XxI`ERx@FnF@yOHspOuhUmf=ji0IC-eq zCg*f!r^f&Yo^)CL$sZ1$e)f46xJr6z1q!leszj`D1<0(bQ{g{vubCvys>ZCWUYsy% zPKr%L)*P2zyDu{P3@s8_y^zT2#e8P^Tc?*8}378=mRTk-OvJVOPHE_1TPm$(- zHh{>p8fktT^Msc&&2Iy3GaxKyAkA+Bd!)QZZ0H1VZUBn}EA#-Zjd>0^8aWsNCSY8l zhs~|c0!51v@Kerh%-0OU^0|%qI!o*9q*0uKwuB|X6xKj+o%NgoRt8zs>Ayb4HH-fM zkf0InT|5EuA*DYht8U`2dV|OYNLC-=^@MC!ZxPENp+dJ@#Y{fR%Yve7xqU6iL$f@&x=m}| zCh`suPUKx8?-6Me*&=d>$OlAzPUL-%%$W?rICI8^P6lF3eKCF&6@dv2p1e%cR?Hc<{=ABde0jS`*Iq0J((^Lc^9D&U!XwbjTAoL*nqsEzc|qcPo?0gp8~A4e z54m)r2uEo&eQkLg)%l)Y~EtnnZ}(LTA~m{7A@_L{Y3*DC)9hh!eu diff --git a/object_detection/box_coders/faster_rcnn_box_coder.py b/object_detection/box_coders/faster_rcnn_box_coder.py deleted file mode 100644 index af25e21a..00000000 --- a/object_detection/box_coders/faster_rcnn_box_coder.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Faster RCNN box coder. - -Faster RCNN box coder follows the coding schema described below: - ty = (y - ya) / ha - tx = (x - xa) / wa - th = log(h / ha) - tw = log(w / wa) - where x, y, w, h denote the box's center coordinates, width and height - respectively. Similarly, xa, ya, wa, ha denote the anchor's center - coordinates, width and height. tx, ty, tw and th denote the anchor-encoded - center, width and height respectively. - - See http://arxiv.org/abs/1506.01497 for details. -""" - -import tensorflow as tf - -from object_detection.core import box_coder -from object_detection.core import box_list - -EPSILON = 1e-8 - - -class FasterRcnnBoxCoder(box_coder.BoxCoder): - """Faster RCNN box coder.""" - - def __init__(self, scale_factors=None): - """Constructor for FasterRcnnBoxCoder. - - Args: - scale_factors: List of 4 positive scalars to scale ty, tx, th and tw. - If set to None, does not perform scaling. For Faster RCNN, - the open-source implementation recommends using [10.0, 10.0, 5.0, 5.0]. - """ - if scale_factors: - assert len(scale_factors) == 4 - for scalar in scale_factors: - assert scalar > 0 - self._scale_factors = scale_factors - - @property - def code_size(self): - return 4 - - def _encode(self, boxes, anchors): - """Encode a box collection with respect to anchor collection. - - Args: - boxes: BoxList holding N boxes to be encoded. - anchors: BoxList of anchors. - - Returns: - a tensor representing N anchor-encoded boxes of the format - [ty, tx, th, tw]. - """ - # Convert anchors to the center coordinate representation. - ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() - ycenter, xcenter, h, w = boxes.get_center_coordinates_and_sizes() - # Avoid NaN in division and log below. - ha += EPSILON - wa += EPSILON - h += EPSILON - w += EPSILON - - tx = (xcenter - xcenter_a) / wa - ty = (ycenter - ycenter_a) / ha - tw = tf.log(w / wa) - th = tf.log(h / ha) - # Scales location targets as used in paper for joint training. - if self._scale_factors: - ty *= self._scale_factors[0] - tx *= self._scale_factors[1] - th *= self._scale_factors[2] - tw *= self._scale_factors[3] - return tf.transpose(tf.stack([ty, tx, th, tw])) - - def _decode(self, rel_codes, anchors): - """Decode relative codes to boxes. - - Args: - rel_codes: a tensor representing N anchor-encoded boxes. - anchors: BoxList of anchors. - - Returns: - boxes: BoxList holding N bounding boxes. - """ - ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() - - ty, tx, th, tw = tf.unstack(tf.transpose(rel_codes)) - if self._scale_factors: - ty /= self._scale_factors[0] - tx /= self._scale_factors[1] - th /= self._scale_factors[2] - tw /= self._scale_factors[3] - w = tf.exp(tw) * wa - h = tf.exp(th) * ha - ycenter = ty * ha + ycenter_a - xcenter = tx * wa + xcenter_a - ymin = ycenter - h / 2. - xmin = xcenter - w / 2. - ymax = ycenter + h / 2. - xmax = xcenter + w / 2. - return box_list.BoxList(tf.transpose(tf.stack([ymin, xmin, ymax, xmax]))) diff --git a/object_detection/box_coders/faster_rcnn_box_coder_test.py b/object_detection/box_coders/faster_rcnn_box_coder_test.py deleted file mode 100644 index b2135f06..00000000 --- a/object_detection/box_coders/faster_rcnn_box_coder_test.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.box_coder.faster_rcnn_box_coder.""" - -import tensorflow as tf - -from object_detection.box_coders import faster_rcnn_box_coder -from object_detection.core import box_list - - -class FasterRcnnBoxCoderTest(tf.test.TestCase): - - def test_get_correct_relative_codes_after_encoding(self): - boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - expected_rel_codes = [[-0.5, -0.416666, -0.405465, -0.182321], - [-0.083333, -0.222222, -0.693147, -1.098612]] - boxes = box_list.BoxList(tf.constant(boxes)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = faster_rcnn_box_coder.FasterRcnnBoxCoder() - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - rel_codes_out, = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_get_correct_relative_codes_after_encoding_with_scaling(self): - boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - scale_factors = [2, 3, 4, 5] - expected_rel_codes = [[-1., -1.25, -1.62186, -0.911608], - [-0.166667, -0.666667, -2.772588, -5.493062]] - boxes = box_list.BoxList(tf.constant(boxes)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = faster_rcnn_box_coder.FasterRcnnBoxCoder( - scale_factors=scale_factors) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - rel_codes_out, = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_get_correct_boxes_after_decoding(self): - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - rel_codes = [[-0.5, -0.416666, -0.405465, -0.182321], - [-0.083333, -0.222222, -0.693147, -1.098612]] - expected_boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - anchors = box_list.BoxList(tf.constant(anchors)) - coder = faster_rcnn_box_coder.FasterRcnnBoxCoder() - boxes = coder.decode(rel_codes, anchors) - with self.test_session() as sess: - boxes_out, = sess.run([boxes.get()]) - self.assertAllClose(boxes_out, expected_boxes) - - def test_get_correct_boxes_after_decoding_with_scaling(self): - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - rel_codes = [[-1., -1.25, -1.62186, -0.911608], - [-0.166667, -0.666667, -2.772588, -5.493062]] - scale_factors = [2, 3, 4, 5] - expected_boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - anchors = box_list.BoxList(tf.constant(anchors)) - coder = faster_rcnn_box_coder.FasterRcnnBoxCoder( - scale_factors=scale_factors) - boxes = coder.decode(rel_codes, anchors) - with self.test_session() as sess: - boxes_out, = sess.run([boxes.get()]) - self.assertAllClose(boxes_out, expected_boxes) - - def test_very_small_Width_nan_after_encoding(self): - boxes = [[10.0, 10.0, 10.0000001, 20.0]] - anchors = [[15.0, 12.0, 30.0, 18.0]] - expected_rel_codes = [[-0.833333, 0., -21.128731, 0.510826]] - boxes = box_list.BoxList(tf.constant(boxes)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = faster_rcnn_box_coder.FasterRcnnBoxCoder() - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - rel_codes_out, = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/box_coders/keypoint_box_coder.py b/object_detection/box_coders/keypoint_box_coder.py deleted file mode 100644 index 67df3b82..00000000 --- a/object_detection/box_coders/keypoint_box_coder.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Keypoint box coder. - -The keypoint box coder follows the coding schema described below (this is -similar to the FasterRcnnBoxCoder, except that it encodes keypoints in addition -to box coordinates): - ty = (y - ya) / ha - tx = (x - xa) / wa - th = log(h / ha) - tw = log(w / wa) - tky0 = (ky0 - ya) / ha - tkx0 = (kx0 - xa) / wa - tky1 = (ky1 - ya) / ha - tkx1 = (kx1 - xa) / wa - ... - where x, y, w, h denote the box's center coordinates, width and height - respectively. Similarly, xa, ya, wa, ha denote the anchor's center - coordinates, width and height. tx, ty, tw and th denote the anchor-encoded - center, width and height respectively. ky0, kx0, ky1, kx1, ... denote the - keypoints' coordinates, and tky0, tkx0, tky1, tkx1, ... denote the - anchor-encoded keypoint coordinates. -""" - -import tensorflow as tf - -from object_detection.core import box_coder -from object_detection.core import box_list -from object_detection.core import standard_fields as fields - -EPSILON = 1e-8 - - -class KeypointBoxCoder(box_coder.BoxCoder): - """Keypoint box coder.""" - - def __init__(self, num_keypoints, scale_factors=None): - """Constructor for KeypointBoxCoder. - - Args: - num_keypoints: Number of keypoints to encode/decode. - scale_factors: List of 4 positive scalars to scale ty, tx, th and tw. - In addition to scaling ty and tx, the first 2 scalars are used to scale - the y and x coordinates of the keypoints as well. If set to None, does - not perform scaling. - """ - self._num_keypoints = num_keypoints - - if scale_factors: - assert len(scale_factors) == 4 - for scalar in scale_factors: - assert scalar > 0 - self._scale_factors = scale_factors - self._keypoint_scale_factors = None - if scale_factors is not None: - self._keypoint_scale_factors = tf.expand_dims(tf.tile( - [tf.to_float(scale_factors[0]), tf.to_float(scale_factors[1])], - [num_keypoints]), 1) - - @property - def code_size(self): - return 4 + self._num_keypoints * 2 - - def _encode(self, boxes, anchors): - """Encode a box and keypoint collection with respect to anchor collection. - - Args: - boxes: BoxList holding N boxes and keypoints to be encoded. Boxes are - tensors with the shape [N, 4], and keypoints are tensors with the shape - [N, num_keypoints, 2]. - anchors: BoxList of anchors. - - Returns: - a tensor representing N anchor-encoded boxes of the format - [ty, tx, th, tw, tky0, tkx0, tky1, tkx1, ...] where tky0 and tkx0 - represent the y and x coordinates of the first keypoint, tky1 and tkx1 - represent the y and x coordinates of the second keypoint, and so on. - """ - # Convert anchors to the center coordinate representation. - ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() - ycenter, xcenter, h, w = boxes.get_center_coordinates_and_sizes() - keypoints = boxes.get_field(fields.BoxListFields.keypoints) - keypoints = tf.transpose(tf.reshape(keypoints, - [-1, self._num_keypoints * 2])) - num_boxes = boxes.num_boxes() - - # Avoid NaN in division and log below. - ha += EPSILON - wa += EPSILON - h += EPSILON - w += EPSILON - - tx = (xcenter - xcenter_a) / wa - ty = (ycenter - ycenter_a) / ha - tw = tf.log(w / wa) - th = tf.log(h / ha) - - tiled_anchor_centers = tf.tile( - tf.stack([ycenter_a, xcenter_a]), [self._num_keypoints, 1]) - tiled_anchor_sizes = tf.tile( - tf.stack([ha, wa]), [self._num_keypoints, 1]) - tkeypoints = (keypoints - tiled_anchor_centers) / tiled_anchor_sizes - - # Scales location targets as used in paper for joint training. - if self._scale_factors: - ty *= self._scale_factors[0] - tx *= self._scale_factors[1] - th *= self._scale_factors[2] - tw *= self._scale_factors[3] - tkeypoints *= tf.tile(self._keypoint_scale_factors, [1, num_boxes]) - - tboxes = tf.stack([ty, tx, th, tw]) - return tf.transpose(tf.concat([tboxes, tkeypoints], 0)) - - def _decode(self, rel_codes, anchors): - """Decode relative codes to boxes and keypoints. - - Args: - rel_codes: a tensor with shape [N, 4 + 2 * num_keypoints] representing N - anchor-encoded boxes and keypoints - anchors: BoxList of anchors. - - Returns: - boxes: BoxList holding N bounding boxes and keypoints. - """ - ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() - - num_codes = tf.shape(rel_codes)[0] - result = tf.unstack(tf.transpose(rel_codes)) - ty, tx, th, tw = result[:4] - tkeypoints = result[4:] - if self._scale_factors: - ty /= self._scale_factors[0] - tx /= self._scale_factors[1] - th /= self._scale_factors[2] - tw /= self._scale_factors[3] - tkeypoints /= tf.tile(self._keypoint_scale_factors, [1, num_codes]) - - w = tf.exp(tw) * wa - h = tf.exp(th) * ha - ycenter = ty * ha + ycenter_a - xcenter = tx * wa + xcenter_a - ymin = ycenter - h / 2. - xmin = xcenter - w / 2. - ymax = ycenter + h / 2. - xmax = xcenter + w / 2. - decoded_boxes_keypoints = box_list.BoxList( - tf.transpose(tf.stack([ymin, xmin, ymax, xmax]))) - - tiled_anchor_centers = tf.tile( - tf.stack([ycenter_a, xcenter_a]), [self._num_keypoints, 1]) - tiled_anchor_sizes = tf.tile( - tf.stack([ha, wa]), [self._num_keypoints, 1]) - keypoints = tkeypoints * tiled_anchor_sizes + tiled_anchor_centers - keypoints = tf.reshape(tf.transpose(keypoints), - [-1, self._num_keypoints, 2]) - decoded_boxes_keypoints.add_field(fields.BoxListFields.keypoints, keypoints) - return decoded_boxes_keypoints diff --git a/object_detection/box_coders/keypoint_box_coder_test.py b/object_detection/box_coders/keypoint_box_coder_test.py deleted file mode 100644 index 330641e5..00000000 --- a/object_detection/box_coders/keypoint_box_coder_test.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.box_coder.keypoint_box_coder.""" - -import tensorflow as tf - -from object_detection.box_coders import keypoint_box_coder -from object_detection.core import box_list -from object_detection.core import standard_fields as fields - - -class KeypointBoxCoderTest(tf.test.TestCase): - - def test_get_correct_relative_codes_after_encoding(self): - boxes = [[10., 10., 20., 15.], - [0.2, 0.1, 0.5, 0.4]] - keypoints = [[[15., 12.], [10., 15.]], - [[0.5, 0.3], [0.2, 0.4]]] - num_keypoints = len(keypoints[0]) - anchors = [[15., 12., 30., 18.], - [0.1, 0.0, 0.7, 0.9]] - expected_rel_codes = [ - [-0.5, -0.416666, -0.405465, -0.182321, - -0.5, -0.5, -0.833333, 0.], - [-0.083333, -0.222222, -0.693147, -1.098612, - 0.166667, -0.166667, -0.333333, -0.055556] - ] - boxes = box_list.BoxList(tf.constant(boxes)) - boxes.add_field(fields.BoxListFields.keypoints, tf.constant(keypoints)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = keypoint_box_coder.KeypointBoxCoder(num_keypoints) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - rel_codes_out, = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_get_correct_relative_codes_after_encoding_with_scaling(self): - boxes = [[10., 10., 20., 15.], - [0.2, 0.1, 0.5, 0.4]] - keypoints = [[[15., 12.], [10., 15.]], - [[0.5, 0.3], [0.2, 0.4]]] - num_keypoints = len(keypoints[0]) - anchors = [[15., 12., 30., 18.], - [0.1, 0.0, 0.7, 0.9]] - scale_factors = [2, 3, 4, 5] - expected_rel_codes = [ - [-1., -1.25, -1.62186, -0.911608, - -1.0, -1.5, -1.666667, 0.], - [-0.166667, -0.666667, -2.772588, -5.493062, - 0.333333, -0.5, -0.666667, -0.166667] - ] - boxes = box_list.BoxList(tf.constant(boxes)) - boxes.add_field(fields.BoxListFields.keypoints, tf.constant(keypoints)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = keypoint_box_coder.KeypointBoxCoder( - num_keypoints, scale_factors=scale_factors) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - rel_codes_out, = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_get_correct_boxes_after_decoding(self): - anchors = [[15., 12., 30., 18.], - [0.1, 0.0, 0.7, 0.9]] - rel_codes = [ - [-0.5, -0.416666, -0.405465, -0.182321, - -0.5, -0.5, -0.833333, 0.], - [-0.083333, -0.222222, -0.693147, -1.098612, - 0.166667, -0.166667, -0.333333, -0.055556] - ] - expected_boxes = [[10., 10., 20., 15.], - [0.2, 0.1, 0.5, 0.4]] - expected_keypoints = [[[15., 12.], [10., 15.]], - [[0.5, 0.3], [0.2, 0.4]]] - num_keypoints = len(expected_keypoints[0]) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = keypoint_box_coder.KeypointBoxCoder(num_keypoints) - boxes = coder.decode(rel_codes, anchors) - with self.test_session() as sess: - boxes_out, keypoints_out = sess.run( - [boxes.get(), boxes.get_field(fields.BoxListFields.keypoints)]) - self.assertAllClose(boxes_out, expected_boxes) - self.assertAllClose(keypoints_out, expected_keypoints) - - def test_get_correct_boxes_after_decoding_with_scaling(self): - anchors = [[15., 12., 30., 18.], - [0.1, 0.0, 0.7, 0.9]] - rel_codes = [ - [-1., -1.25, -1.62186, -0.911608, - -1.0, -1.5, -1.666667, 0.], - [-0.166667, -0.666667, -2.772588, -5.493062, - 0.333333, -0.5, -0.666667, -0.166667] - ] - scale_factors = [2, 3, 4, 5] - expected_boxes = [[10., 10., 20., 15.], - [0.2, 0.1, 0.5, 0.4]] - expected_keypoints = [[[15., 12.], [10., 15.]], - [[0.5, 0.3], [0.2, 0.4]]] - num_keypoints = len(expected_keypoints[0]) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = keypoint_box_coder.KeypointBoxCoder( - num_keypoints, scale_factors=scale_factors) - boxes = coder.decode(rel_codes, anchors) - with self.test_session() as sess: - boxes_out, keypoints_out = sess.run( - [boxes.get(), boxes.get_field(fields.BoxListFields.keypoints)]) - self.assertAllClose(boxes_out, expected_boxes) - self.assertAllClose(keypoints_out, expected_keypoints) - - def test_very_small_width_nan_after_encoding(self): - boxes = [[10., 10., 10.0000001, 20.]] - keypoints = [[[10., 10.], [10.0000001, 20.]]] - anchors = [[15., 12., 30., 18.]] - expected_rel_codes = [[-0.833333, 0., -21.128731, 0.510826, - -0.833333, -0.833333, -0.833333, 0.833333]] - boxes = box_list.BoxList(tf.constant(boxes)) - boxes.add_field(fields.BoxListFields.keypoints, tf.constant(keypoints)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = keypoint_box_coder.KeypointBoxCoder(2) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - rel_codes_out, = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/box_coders/mean_stddev_box_coder.py b/object_detection/box_coders/mean_stddev_box_coder.py deleted file mode 100644 index 726b4a61..00000000 --- a/object_detection/box_coders/mean_stddev_box_coder.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Mean stddev box coder. - -This box coder use the following coding schema to encode boxes: -rel_code = (box_corner - anchor_corner_mean) / anchor_corner_stddev. -""" -from object_detection.core import box_coder -from object_detection.core import box_list - - -class MeanStddevBoxCoder(box_coder.BoxCoder): - """Mean stddev box coder.""" - - @property - def code_size(self): - return 4 - - def _encode(self, boxes, anchors): - """Encode a box collection with respect to anchor collection. - - Args: - boxes: BoxList holding N boxes to be encoded. - anchors: BoxList of N anchors. We assume that anchors has an associated - stddev field. - - Returns: - a tensor representing N anchor-encoded boxes - Raises: - ValueError: if the anchors BoxList does not have a stddev field - """ - if not anchors.has_field('stddev'): - raise ValueError('anchors must have a stddev field') - box_corners = boxes.get() - means = anchors.get() - stddev = anchors.get_field('stddev') - return (box_corners - means) / stddev - - def _decode(self, rel_codes, anchors): - """Decode. - - Args: - rel_codes: a tensor representing N anchor-encoded boxes. - anchors: BoxList of anchors. We assume that anchors has an associated - stddev field. - - Returns: - boxes: BoxList holding N bounding boxes - Raises: - ValueError: if the anchors BoxList does not have a stddev field - """ - if not anchors.has_field('stddev'): - raise ValueError('anchors must have a stddev field') - means = anchors.get() - stddevs = anchors.get_field('stddev') - box_corners = rel_codes * stddevs + means - return box_list.BoxList(box_corners) diff --git a/object_detection/box_coders/mean_stddev_box_coder_test.py b/object_detection/box_coders/mean_stddev_box_coder_test.py deleted file mode 100644 index 0d3a8952..00000000 --- a/object_detection/box_coders/mean_stddev_box_coder_test.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.box_coder.mean_stddev_boxcoder.""" - -import tensorflow as tf - -from object_detection.box_coders import mean_stddev_box_coder -from object_detection.core import box_list - - -class MeanStddevBoxCoderTest(tf.test.TestCase): - - def testGetCorrectRelativeCodesAfterEncoding(self): - box_corners = [[0.0, 0.0, 0.5, 0.5], [0.0, 0.0, 0.5, 0.5]] - boxes = box_list.BoxList(tf.constant(box_corners)) - expected_rel_codes = [[0.0, 0.0, 0.0, 0.0], [-5.0, -5.0, -5.0, -3.0]] - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], [0.5, 0.5, 1.0, 0.8]]) - prior_stddevs = tf.constant(2 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - coder = mean_stddev_box_coder.MeanStddevBoxCoder() - rel_codes = coder.encode(boxes, priors) - with self.test_session() as sess: - rel_codes_out = sess.run(rel_codes) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def testGetCorrectBoxesAfterDecoding(self): - rel_codes = tf.constant([[0.0, 0.0, 0.0, 0.0], [-5.0, -5.0, -5.0, -3.0]]) - expected_box_corners = [[0.0, 0.0, 0.5, 0.5], [0.0, 0.0, 0.5, 0.5]] - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], [0.5, 0.5, 1.0, 0.8]]) - prior_stddevs = tf.constant(2 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - coder = mean_stddev_box_coder.MeanStddevBoxCoder() - decoded_boxes = coder.decode(rel_codes, priors) - decoded_box_corners = decoded_boxes.get() - with self.test_session() as sess: - decoded_out = sess.run(decoded_box_corners) - self.assertAllClose(decoded_out, expected_box_corners) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/box_coders/square_box_coder.py b/object_detection/box_coders/square_box_coder.py deleted file mode 100644 index ee46b689..00000000 --- a/object_detection/box_coders/square_box_coder.py +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Square box coder. - -Square box coder follows the coding schema described below: -l = sqrt(h * w) -la = sqrt(ha * wa) -ty = (y - ya) / la -tx = (x - xa) / la -tl = log(l / la) -where x, y, w, h denote the box's center coordinates, width, and height, -respectively. Similarly, xa, ya, wa, ha denote the anchor's center -coordinates, width and height. tx, ty, tl denote the anchor-encoded -center, and length, respectively. Because the encoded box is a square, only -one length is encoded. - -This has shown to provide performance improvements over the Faster RCNN box -coder when the objects being detected tend to be square (e.g. faces) and when -the input images are not distorted via resizing. -""" - -import tensorflow as tf - -from object_detection.core import box_coder -from object_detection.core import box_list - -EPSILON = 1e-8 - - -class SquareBoxCoder(box_coder.BoxCoder): - """Encodes a 3-scalar representation of a square box.""" - - def __init__(self, scale_factors=None): - """Constructor for SquareBoxCoder. - - Args: - scale_factors: List of 3 positive scalars to scale ty, tx, and tl. - If set to None, does not perform scaling. For faster RCNN, - the open-source implementation recommends using [10.0, 10.0, 5.0]. - - Raises: - ValueError: If scale_factors is not length 3 or contains values less than - or equal to 0. - """ - if scale_factors: - if len(scale_factors) != 3: - raise ValueError('The argument scale_factors must be a list of length ' - '3.') - if any(scalar <= 0 for scalar in scale_factors): - raise ValueError('The values in scale_factors must all be greater ' - 'than 0.') - self._scale_factors = scale_factors - - @property - def code_size(self): - return 3 - - def _encode(self, boxes, anchors): - """Encodes a box collection with respect to an anchor collection. - - Args: - boxes: BoxList holding N boxes to be encoded. - anchors: BoxList of anchors. - - Returns: - a tensor representing N anchor-encoded boxes of the format - [ty, tx, tl]. - """ - # Convert anchors to the center coordinate representation. - ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() - la = tf.sqrt(ha * wa) - ycenter, xcenter, h, w = boxes.get_center_coordinates_and_sizes() - l = tf.sqrt(h * w) - # Avoid NaN in division and log below. - la += EPSILON - l += EPSILON - - tx = (xcenter - xcenter_a) / la - ty = (ycenter - ycenter_a) / la - tl = tf.log(l / la) - # Scales location targets for joint training. - if self._scale_factors: - ty *= self._scale_factors[0] - tx *= self._scale_factors[1] - tl *= self._scale_factors[2] - return tf.transpose(tf.stack([ty, tx, tl])) - - def _decode(self, rel_codes, anchors): - """Decodes relative codes to boxes. - - Args: - rel_codes: a tensor representing N anchor-encoded boxes. - anchors: BoxList of anchors. - - Returns: - boxes: BoxList holding N bounding boxes. - """ - ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() - la = tf.sqrt(ha * wa) - - ty, tx, tl = tf.unstack(tf.transpose(rel_codes)) - if self._scale_factors: - ty /= self._scale_factors[0] - tx /= self._scale_factors[1] - tl /= self._scale_factors[2] - l = tf.exp(tl) * la - ycenter = ty * la + ycenter_a - xcenter = tx * la + xcenter_a - ymin = ycenter - l / 2. - xmin = xcenter - l / 2. - ymax = ycenter + l / 2. - xmax = xcenter + l / 2. - return box_list.BoxList(tf.transpose(tf.stack([ymin, xmin, ymax, xmax]))) diff --git a/object_detection/box_coders/square_box_coder_test.py b/object_detection/box_coders/square_box_coder_test.py deleted file mode 100644 index 7f739c6b..00000000 --- a/object_detection/box_coders/square_box_coder_test.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.box_coder.square_box_coder.""" - -import tensorflow as tf - -from object_detection.box_coders import square_box_coder -from object_detection.core import box_list - - -class SquareBoxCoderTest(tf.test.TestCase): - - def test_correct_relative_codes_with_default_scale(self): - boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - scale_factors = None - expected_rel_codes = [[-0.790569, -0.263523, -0.293893], - [-0.068041, -0.272166, -0.89588]] - - boxes = box_list.BoxList(tf.constant(boxes)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = square_box_coder.SquareBoxCoder(scale_factors=scale_factors) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - (rel_codes_out,) = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_correct_relative_codes_with_non_default_scale(self): - boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - scale_factors = [2, 3, 4] - expected_rel_codes = [[-1.581139, -0.790569, -1.175573], - [-0.136083, -0.816497, -3.583519]] - boxes = box_list.BoxList(tf.constant(boxes)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = square_box_coder.SquareBoxCoder(scale_factors=scale_factors) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - (rel_codes_out,) = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_correct_relative_codes_with_small_width(self): - boxes = [[10.0, 10.0, 10.0000001, 20.0]] - anchors = [[15.0, 12.0, 30.0, 18.0]] - scale_factors = None - expected_rel_codes = [[-1.317616, 0., -20.670586]] - boxes = box_list.BoxList(tf.constant(boxes)) - anchors = box_list.BoxList(tf.constant(anchors)) - coder = square_box_coder.SquareBoxCoder(scale_factors=scale_factors) - rel_codes = coder.encode(boxes, anchors) - with self.test_session() as sess: - (rel_codes_out,) = sess.run([rel_codes]) - self.assertAllClose(rel_codes_out, expected_rel_codes) - - def test_correct_boxes_with_default_scale(self): - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - rel_codes = [[-0.5, -0.416666, -0.405465], - [-0.083333, -0.222222, -0.693147]] - scale_factors = None - expected_boxes = [[14.594306, 7.884875, 20.918861, 14.209432], - [0.155051, 0.102989, 0.522474, 0.470412]] - anchors = box_list.BoxList(tf.constant(anchors)) - coder = square_box_coder.SquareBoxCoder(scale_factors=scale_factors) - boxes = coder.decode(rel_codes, anchors) - with self.test_session() as sess: - (boxes_out,) = sess.run([boxes.get()]) - self.assertAllClose(boxes_out, expected_boxes) - - def test_correct_boxes_with_non_default_scale(self): - anchors = [[15.0, 12.0, 30.0, 18.0], [0.1, 0.0, 0.7, 0.9]] - rel_codes = [[-1., -1.25, -1.62186], [-0.166667, -0.666667, -2.772588]] - scale_factors = [2, 3, 4] - expected_boxes = [[14.594306, 7.884875, 20.918861, 14.209432], - [0.155051, 0.102989, 0.522474, 0.470412]] - anchors = box_list.BoxList(tf.constant(anchors)) - coder = square_box_coder.SquareBoxCoder(scale_factors=scale_factors) - boxes = coder.decode(rel_codes, anchors) - with self.test_session() as sess: - (boxes_out,) = sess.run([boxes.get()]) - self.assertAllClose(boxes_out, expected_boxes) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/BUILD b/object_detection/builders/BUILD deleted file mode 100644 index d1bb3f03..00000000 --- a/object_detection/builders/BUILD +++ /dev/null @@ -1,305 +0,0 @@ -# Tensorflow Object Detection API: component builders. - -package( - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) - -# Apache 2.0 -py_library( - name = "model_builder", - srcs = ["model_builder.py"], - deps = [ - ":anchor_generator_builder", - ":box_coder_builder", - ":box_predictor_builder", - ":hyperparams_builder", - ":image_resizer_builder", - ":losses_builder", - ":matcher_builder", - ":post_processing_builder", - ":region_similarity_calculator_builder", - "//tensorflow_models/object_detection/core:box_predictor", - "//tensorflow_models/object_detection/meta_architectures:faster_rcnn_meta_arch", - "//tensorflow_models/object_detection/meta_architectures:rfcn_meta_arch", - "//tensorflow_models/object_detection/meta_architectures:ssd_meta_arch", - "//tensorflow_models/object_detection/models:embedded_ssd_mobilenet_v1_feature_extractor", - "//tensorflow_models/object_detection/models:faster_rcnn_inception_resnet_v2_feature_extractor", - "//tensorflow_models/object_detection/models:faster_rcnn_inception_v2_feature_extractor", - "//tensorflow_models/object_detection/models:faster_rcnn_resnet_v1_feature_extractor", - "//tensorflow_models/object_detection/models:ssd_inception_v2_feature_extractor", - "//tensorflow_models/object_detection/models:ssd_inception_v3_feature_extractor", - "//tensorflow_models/object_detection/models:ssd_mobilenet_v1_feature_extractor", - "//tensorflow_models/object_detection/protos:model_py_pb2", - ], -) - -py_test( - name = "model_builder_test", - srcs = ["model_builder_test.py"], - deps = [ - ":model_builder", - "//tensorflow", - "//tensorflow_models/object_detection/meta_architectures:faster_rcnn_meta_arch", - "//tensorflow_models/object_detection/meta_architectures:ssd_meta_arch", - "//tensorflow_models/object_detection/models:faster_rcnn_inception_resnet_v2_feature_extractor", - "//tensorflow_models/object_detection/models:faster_rcnn_inception_v2_feature_extractor", - "//tensorflow_models/object_detection/models:faster_rcnn_resnet_v1_feature_extractor", - "//tensorflow_models/object_detection/models:ssd_inception_v2_feature_extractor", - "//tensorflow_models/object_detection/models:ssd_inception_v3_feature_extractor", - "//tensorflow_models/object_detection/models:ssd_mobilenet_v1_feature_extractor", - "//tensorflow_models/object_detection/protos:model_py_pb2", - ], -) - -py_library( - name = "matcher_builder", - srcs = ["matcher_builder.py"], - deps = [ - "//tensorflow_models/object_detection/matchers:argmax_matcher", - "//tensorflow_models/object_detection/matchers:bipartite_matcher", - "//tensorflow_models/object_detection/protos:matcher_py_pb2", - ], -) - -py_test( - name = "matcher_builder_test", - srcs = ["matcher_builder_test.py"], - deps = [ - ":matcher_builder", - "//tensorflow_models/object_detection/matchers:argmax_matcher", - "//tensorflow_models/object_detection/matchers:bipartite_matcher", - "//tensorflow_models/object_detection/protos:matcher_py_pb2", - ], -) - -py_library( - name = "box_coder_builder", - srcs = ["box_coder_builder.py"], - deps = [ - "//tensorflow_models/object_detection/box_coders:faster_rcnn_box_coder", - "//tensorflow_models/object_detection/box_coders:keypoint_box_coder", - "//tensorflow_models/object_detection/box_coders:mean_stddev_box_coder", - "//tensorflow_models/object_detection/box_coders:square_box_coder", - "//tensorflow_models/object_detection/protos:box_coder_py_pb2", - ], -) - -py_test( - name = "box_coder_builder_test", - srcs = ["box_coder_builder_test.py"], - deps = [ - ":box_coder_builder", - "//tensorflow", - "//tensorflow_models/object_detection/box_coders:faster_rcnn_box_coder", - "//tensorflow_models/object_detection/box_coders:keypoint_box_coder", - "//tensorflow_models/object_detection/box_coders:mean_stddev_box_coder", - "//tensorflow_models/object_detection/box_coders:square_box_coder", - "//tensorflow_models/object_detection/protos:box_coder_py_pb2", - ], -) - -py_library( - name = "anchor_generator_builder", - srcs = ["anchor_generator_builder.py"], - deps = [ - "//tensorflow_models/object_detection/anchor_generators:grid_anchor_generator", - "//tensorflow_models/object_detection/anchor_generators:multiple_grid_anchor_generator", - "//tensorflow_models/object_detection/protos:anchor_generator_py_pb2", - ], -) - -py_test( - name = "anchor_generator_builder_test", - srcs = ["anchor_generator_builder_test.py"], - deps = [ - ":anchor_generator_builder", - "//tensorflow", - "//tensorflow_models/object_detection/anchor_generators:grid_anchor_generator", - "//tensorflow_models/object_detection/anchor_generators:multiple_grid_anchor_generator", - "//tensorflow_models/object_detection/protos:anchor_generator_py_pb2", - ], -) - -py_library( - name = "input_reader_builder", - srcs = ["input_reader_builder.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/data_decoders:tf_example_decoder", - "//tensorflow_models/object_detection/protos:input_reader_py_pb2", - ], -) - -py_test( - name = "input_reader_builder_test", - srcs = [ - "input_reader_builder_test.py", - ], - deps = [ - ":input_reader_builder", - "//tensorflow", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/protos:input_reader_py_pb2", - ], -) - -py_library( - name = "losses_builder", - srcs = ["losses_builder.py"], - deps = [ - "//tensorflow_models/object_detection/core:losses", - "//tensorflow_models/object_detection/protos:losses_py_pb2", - ], -) - -py_test( - name = "losses_builder_test", - srcs = ["losses_builder_test.py"], - deps = [ - ":losses_builder", - "//tensorflow_models/object_detection/core:losses", - "//tensorflow_models/object_detection/protos:losses_py_pb2", - ], -) - -py_library( - name = "optimizer_builder", - srcs = ["optimizer_builder.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/utils:learning_schedules", - ], -) - -py_test( - name = "optimizer_builder_test", - srcs = ["optimizer_builder_test.py"], - deps = [ - ":optimizer_builder", - "//tensorflow", - "//tensorflow_models/object_detection/protos:optimizer_py_pb2", - ], -) - -py_library( - name = "post_processing_builder", - srcs = ["post_processing_builder.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:post_processing", - "//tensorflow_models/object_detection/protos:post_processing_py_pb2", - ], -) - -py_test( - name = "post_processing_builder_test", - srcs = ["post_processing_builder_test.py"], - deps = [ - ":post_processing_builder", - "//tensorflow", - "//tensorflow_models/object_detection/protos:post_processing_py_pb2", - ], -) - -py_library( - name = "hyperparams_builder", - srcs = ["hyperparams_builder.py"], - deps = [ - "//tensorflow_models/object_detection/protos:hyperparams_py_pb2", - ], -) - -py_test( - name = "hyperparams_builder_test", - srcs = ["hyperparams_builder_test.py"], - deps = [ - ":hyperparams_builder", - "//tensorflow", - "//tensorflow_models/object_detection/protos:hyperparams_py_pb2", - ], -) - -py_library( - name = "box_predictor_builder", - srcs = ["box_predictor_builder.py"], - deps = [ - ":hyperparams_builder", - "//tensorflow_models/object_detection/core:box_predictor", - "//tensorflow_models/object_detection/protos:box_predictor_py_pb2", - ], -) - -py_test( - name = "box_predictor_builder_test", - srcs = ["box_predictor_builder_test.py"], - deps = [ - ":box_predictor_builder", - ":hyperparams_builder", - "//tensorflow", - "//tensorflow_models/object_detection/protos:box_predictor_py_pb2", - "//tensorflow_models/object_detection/protos:hyperparams_py_pb2", - ], -) - -py_library( - name = "region_similarity_calculator_builder", - srcs = ["region_similarity_calculator_builder.py"], - deps = [ - "//tensorflow_models/object_detection/core:region_similarity_calculator", - "//tensorflow_models/object_detection/protos:region_similarity_calculator_py_pb2", - ], -) - -py_test( - name = "region_similarity_calculator_builder_test", - srcs = ["region_similarity_calculator_builder_test.py"], - deps = [ - ":region_similarity_calculator_builder", - "//tensorflow", - ], -) - -py_library( - name = "preprocessor_builder", - srcs = ["preprocessor_builder.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:preprocessor", - "//tensorflow_models/object_detection/protos:preprocessor_py_pb2", - ], -) - -py_test( - name = "preprocessor_builder_test", - srcs = [ - "preprocessor_builder_test.py", - ], - deps = [ - ":preprocessor_builder", - "//tensorflow", - "//tensorflow_models/object_detection/core:preprocessor", - "//tensorflow_models/object_detection/protos:preprocessor_py_pb2", - ], -) - -py_library( - name = "image_resizer_builder", - srcs = ["image_resizer_builder.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:preprocessor", - "//tensorflow_models/object_detection/protos:image_resizer_py_pb2", - ], -) - -py_test( - name = "image_resizer_builder_test", - srcs = ["image_resizer_builder_test.py"], - deps = [ - ":image_resizer_builder", - "//tensorflow", - "//tensorflow_models/object_detection/protos:image_resizer_py_pb2", - ], -) diff --git a/object_detection/builders/__init__.py b/object_detection/builders/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/object_detection/builders/__pycache__/__init__.cpython-35.pyc b/object_detection/builders/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index 3995800164c12899950d5d0217522d15e5126f76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmWgV<>i{qWEaH%1dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnFCYDk{M=Oiq#|?u z+|-oJ(p>%G(xS4|%$%IWyyR5c4P#o`tT62t{*G#W9$>~h*g8wn%}WI1*xaj@N?yTk58 zGnXA+0Is|Myppe+;1TvjRonTQWcISQy4+n=U0q*wRk_`0*ngTA?$Z{)Kd|w_}E{&tjUEXx?d0>!Xd@LNtIKIXq|3Iz+xIt>b#DqH&VylW zq*K=X28gCn=-@G^)6_a;Q2Q`BfUv2VhY+^(++e(pHUAMJv-=e9lOo>eW53h(J9sf)Q3gp$p{zSVCEA!R zGRL+Z=TeO18GfB&%PMocJipGI%Z0g>tUDDPGqy-nR8)SHM(K#GYhzAvhBL%$r6WTo zBY_@lI@Tp8UNSWkY2nA^X0pG_^_PAmS+VJRKc2BGA-FhmUZf67rs{g@EJu6Y#RKQx zZe@Iq)=9Z?_|Q?;Q??xutcq^#-m^t1x+hzfc*^)tP|L_FGVo(2m!(9^GLAl#(kYUW zE~TFibZOvR7t!w~{8EAb-&EDsFy_AMn3>uAEVHyZQNfLxy#28^<_YT!#23AUh0!eO z$(i_-MRAN?v0mOmxaj2<`2P(zWF?}(^=xh{xwD^t0htD>EPqkf1OX??^Yjx zCu#&^d8;c_S4&ioeH5jNi7AhL#lqYHZ#^nm^BzdKT<0idc8cXU3z#?HubK1^Pt0F2 zsd9+(_SJ(W)9rki*^!J=sVJiaC9m7M)FryCfy`c&UuOR>j)L)vWevE8&oJm4I|Thx zL>)<18MA0KR+;rG3f0(cEo3bt0r0q#R2(p zNaTJBWR@PFqH7%iiQ?}#m zc#JlmcdA*{^FkhYp8N4;pXhGFmAbF#2xsjrZQWm`P7-Z=4UmRL<(loBCp?_R?1Jt< MQh8U*JpSB=q1qvSPi(Lc-3M`7Cn_zn>ngF|K3+N)q5@pMgNSCD2 z^`fV4-Xc$sN64ELy7tsp=&3_e@?UL;`eugwW;j238U+3a_eFGm4)8Y|{9MG}<0Eri zGJptI2Qn8*2PzjL7aT43jNF5$XXU<;`w;c5JTUSAqJfo%P!6H;Ao5W5AREDZY~g@!U$iiX{ty@6~44_!S6}RGb%_fc!iMV#j+NOHqQRR zkYVaHmw6%;6|qPei}6HkPM~4(mTot^VCqPFSj%LEmOT@&&cdk8f-Qa$V7gxFic69l6u7PZB9SyB zx-VArz-lW$^L;|D#Zq43n`pDGHLkibuE_OXH`@q~z17m<29*@7U`s=6_mi9pEgCX{ zZ6^zX&UZ~`+}%=D3)Xsk$?sp8c03C6Ah_G4khIjbMGtkNua^NX z58=&m5VP0Q&l|sx1(PaaDHTJ_G3uN&{{9Y)|LdwqS8w*NCO??DyT!5F9q_iX383-r zEr`Y|S}a$pmCk=JGPSaT2`&nMY=^YthyqquaW}fsL?2Cl!lAu0Gu!PmH;OLq%+Pkq zXk1dZ>^w}JC|sO0$wv@lyyU+>&sV&n^M&|!UeTbPQ=`PgSeR628wsz zq`CQ8Q6cAh=2kV^Y@30>&(MSX8W#vA&e*+l&f0&7c!(M+hwd2lzSG%5S6twk*VD7c zi{p%^aU6Yd8o+GlSDKQa)VO*2zXPVzq^YgpHwidc0`%F8zN>gvm-I!5lGG_0I$`(k F{Razet2qDw diff --git a/object_detection/builders/__pycache__/box_predictor_builder.cpython-35.pyc b/object_detection/builders/__pycache__/box_predictor_builder.cpython-35.pyc deleted file mode 100644 index c84f9f90848f54190dad276c2fb063817ce11984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2832 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 diff --git a/object_detection/builders/__pycache__/image_resizer_builder.cpython-35.pyc b/object_detection/builders/__pycache__/image_resizer_builder.cpython-35.pyc deleted file mode 100644 index 87f79381ec74435ff15d3514ef2d5da2238b3241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2646 zcmai0-EQ1O6h8L;Z@kT4ODHI4E?Eh75g>sgRJDl$M53vbq#%6b&aP*(vuk^-nb~d< zwHHucfGaL|0$$0tNJzW@7hG{>>?C%RmR)&#=FH6bKi_z(*X#c7KJb6K1Mnx5elF4v z@liewAppKY2SOJj2Ye)Q+6BL6=^8|Jh#TNHz%greh?)?$z;EHa0bvt zRpPXO*WslDF92RRFmHk!83L#Gk2N~$z$*uSwxK%i*XWmM&SRRYvU7~YOix8fCQ`(N zC5yOll<4!65iQ6GOVGcsBe5KGyM#QFr)me^Bo7V?^7A|7WLm`Ql0~T2l8+Xe5iuci z#?pYQl#O*@LwOk}BBT{Z$b_Gnh+NnrFlcQ@x$&tw$ zdu%<+MNqC-A>n%(E!e)4LhcYgAYRMMtL3*C82YON@p-{SIYWE!+;7-%=oa<-9^_;dVS8?U4;OjWK zD)@hJf~AXPsU4WP@X7`C0chK~d4b{*b^$gdPQx0^U68+;{n!zvyzx}ijxCrw1`^EK zdQse1=w?I5OkcX7yD(b;?ZK=E*!lTc?0-XG^S9uI(Na6EsBBx6e_54x;AIVrQ0&Z` zLRTT|*rhcHyOvll2{m@D6n2Fk!b^|-hP`hQMv*ba#Ec^LKLAthvTBCLBAM`0tXl(5 zS51N_gpHbKncx;pd15*urIKRBFsY2nqRVJf?*9t7-R!oCo?w#fki9oMF(3#6*gjW& z(r8J~714Cg)TMSJX)^!#v%&^#!G(NS?PPR@5{0H=tgHonLX!{y$Kn8?g{)g7eMC~B z6dy(BWXbiEBy34kipWhP67m?eSqwKJK6(ozRNc;leu)e`vBr+|6*drZ-MBfV+;)CY zWr~D}$)!woW^j>(g<}SK4d~nu9P=c&a)Ue|F+D5Ims6I!8D|UGn4g7Wp~bX^Rg-c* zNg}jCK#Tv?4S1yu4ov0cxF!ewW_5#gD!czitiRZPs|Q)HvW(NRe_1m}zijiCi^A_> zs)H%xr&H~B487!`o?dJpB+qHY!*b2zT`y8|nGX*88(EiQr73L?(?YrLm0gr82wqwD zhbbRVpO}=%HDt(jGi;c_z@GGQ$U61|LWoFZE$lo~bJAS={%V2bTHwu>oHBXWaJ_e)SBn vd6*4Lwsm98;+V2o$m4319LpgUuZ7@BQBB z>gsC!cZIvo`)>;IcaixO(EbUE>Z0<6a8O&qFNnwz{eo}`!lHgrL`Bgr38#d9N%&>) zOURamUlD$l+i0u^zsBvV@aw{Fa2tb7;jePLCj2#V(pn#XvTt`sgH96013QWB(@_}t zb`*EKC>(n{>J5Cm6M0I7-LPYZqFAXw*57>{t8QBE@bpf{ zqFMYZC}orb6!lwFi4Ye;oLl0BB`z(I6u4XDu4$LVWswKV;u5b5u`+k@mIV@%U!*&n z<6U{7UlKnr2pNh5Z(JssUts4Ni`B&ib}NY&Mc&5}7dVASF3O@?hDj>kTlf<9QakW_ zo_Z?qZ8A_Vn7nVjZrd!Ra>n^!-g>F2$cXWf?CC|(bKA3fp7ibDGp|340=pj$0*MV@ zcF?{&Q+t@VvA0sLG5Mao&)q30cogt>?1!_UwlX7M&_b z=I}zetTE!xyl52Mmok=n_F(#x|UNbe)PwWx*O z&e?!$q+d6x2fjPE)%eGx@_pk2KP4BiRWBX^e}g!&PlH7jY*vB4daI$YyNp(M$&r#k zrmv*}Sva%)dUJ8;N^TpYv)-PQOb1sUdg?(KM82*+>4lx%@gRu1x<0e3zGhTgw2&-8 zvsOhn$TF!Xv$nE^30bGAK^4jUQOHgF`PZY}Ufd6MPvwWZ{lE`L{arPZPlGUuyg?_} z^@9XnAIn|i{;uf*YrCvPAk{9N2B4(xX8WfvMs6t$`#CbuS7daB$q)?TgGC}HNidp%oGOv0f z5Xdk^+vWlv1WH1Fp2k7UQVd1-Gvi;TT?9%*K&Sy~Ky(8;kQgHW3WYon#0BUC0TBWX ziiuzc5~zz8qI!uX6-2|;@mKdK6sjcw>lMP)(nz)7^^>SYL1(EKe&aDDA0J7j`Dn~B z^hlRZ(>wG2AffX7+K zKG^|%z3+YI4uUgq>r)Emfpmwl3aO{BBDm$|!oGJFv>Ng|P(_k6IvaV5I;DHZk00u_ zgZBQ($>D>;gZ;;c$45@HeSEOrK6JPzuhaUgR8i(3uTk{|s#aB3%y-M6kq?`#AaF7? zO|?Z`!opn?^#LleR$jXK`?)GaC9_}5%P*`0`V%melW+IyX{}l#)_zD=vE4RbBjBZR35Z#gFczSC(qWUq2#f@$|&FL5@WW061KTMt*qop^i zqgGSi#OgHG=MT#u;rk>-NN}!CkkG!fAkPqZm!#~8)Cp_TzMYqK-k3-n9)Fsj{7>+Z zD>&mEOaQk*xc_DM|I>^B;OLZ#fh7?0*}dhjx!a&| z;sRWtC-gvR6eL$UvBJeu6q!|OjFrFfrfU=SS9Q9Md!8vpG-$UixNZITGg}_C_%N9x6RM9;~zE9N;P&v2mWt4v@ zB|2-I$xdIXRm!s-X_2EoNdWx=iuwrEGHlZgif&T$R8zFqfOSKDH6(_>J?(PTs_Uxj z`bdgheZ_?J*$r-|6U)G``_+ZHp^TGQaa`o987Gp=r5sUs`;6ku-ju59m5=+eKZ=68 X#P5nyiArI^+9)>PYrfmGn>YUrxKc`4 diff --git a/object_detection/builders/__pycache__/matcher_builder.cpython-35.pyc b/object_detection/builders/__pycache__/matcher_builder.cpython-35.pyc deleted file mode 100644 index c20c37d69c7e8edba4e46e8bd829a8d1e7abaad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1353 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 diff --git a/object_detection/builders/__pycache__/region_similarity_calculator_builder.cpython-35.pyc b/object_detection/builders/__pycache__/region_similarity_calculator_builder.cpython-35.pyc deleted file mode 100644 index 80a61106612aba481223cfda2865a29cb1b82be7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1523 zcma)6Uu)Dr5T7LXH&|(rwjf0o#D^0}zz2mxiduc>OA9?zj7Z2Odv|-yWv{y%r9}~} z-@;GeH}Ny%)hEA#PtI=6yJ%}@V27QV&CLFOGqc-kYwlNjH;^5GA5i&h+&{)8AD~D8 z0+bdcHl!BJYzS{Jr#u#}j)kjZ=wF1n+#k+|_hU;(!cRkRaP8repHL`( z4=62|+Hh`zyame9sLn0;Y-!gN5unS0kEj}S$2N#PP)(S&;2dC}tqsuD*T&jjTARko zjkRN}IynAif+ua{qZ56{yBSJkEgNJQNtzHOOHC+=c{XC>Tto`#^IVsZMF^fz!bjxI zKFRs6binE!d&~Np82TO+sKn$nd5);cMRtW$bvYKG%YYG+bP?}ml;-rg z5M1=hVMg-oIOFfL+5&la-?Oxiu&{(eGOl!u)ajhobA+AimHf!d2nseXWDBk{o>%5T z>rqwT%IG+hCt-rcuh`G-ytoR)gI>3AnPiz%Q5I97M=7}Z{}LANipau!HDU4OFr$1V z^c)6je>JIAD@_{QxTHyYc5wRw=E_^JV7S?4U2p6Zk`DxKK`z=f=cTm8FV>#9}TwSMS zb#dqZS+;P|f6!|c?J!Ju9EQc_zxh2ql7_ls`-0C5hBOs1p$ycD=wkSy^JvDCJf*wq OsL2+Jmc4GRJHG*v(d4TD diff --git a/object_detection/builders/anchor_generator_builder.py b/object_detection/builders/anchor_generator_builder.py deleted file mode 100644 index 40a65c5c..00000000 --- a/object_detection/builders/anchor_generator_builder.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""A function to build an object detection anchor generator from config.""" - -from object_detection.anchor_generators import grid_anchor_generator -from object_detection.anchor_generators import multiple_grid_anchor_generator -from object_detection.protos import anchor_generator_pb2 - - -def build(anchor_generator_config): - """Builds an anchor generator based on the config. - - Args: - anchor_generator_config: An anchor_generator.proto object containing the - config for the desired anchor generator. - - Returns: - Anchor generator based on the config. - - Raises: - ValueError: On empty anchor generator proto. - """ - if not isinstance(anchor_generator_config, - anchor_generator_pb2.AnchorGenerator): - raise ValueError('anchor_generator_config not of type ' - 'anchor_generator_pb2.AnchorGenerator') - if anchor_generator_config.WhichOneof( - 'anchor_generator_oneof') == 'grid_anchor_generator': - grid_anchor_generator_config = anchor_generator_config.grid_anchor_generator - return grid_anchor_generator.GridAnchorGenerator( - scales=[float(scale) for scale in grid_anchor_generator_config.scales], - aspect_ratios=[float(aspect_ratio) - for aspect_ratio - in grid_anchor_generator_config.aspect_ratios], - base_anchor_size=[grid_anchor_generator_config.height, - grid_anchor_generator_config.width], - anchor_stride=[grid_anchor_generator_config.height_stride, - grid_anchor_generator_config.width_stride], - anchor_offset=[grid_anchor_generator_config.height_offset, - grid_anchor_generator_config.width_offset]) - elif anchor_generator_config.WhichOneof( - 'anchor_generator_oneof') == 'ssd_anchor_generator': - ssd_anchor_generator_config = anchor_generator_config.ssd_anchor_generator - anchor_strides = None - if ssd_anchor_generator_config.height_stride: - anchor_strides = zip(ssd_anchor_generator_config.height_stride, - ssd_anchor_generator_config.width_stride) - anchor_offsets = None - if ssd_anchor_generator_config.height_offset: - anchor_offsets = zip(ssd_anchor_generator_config.height_offset, - ssd_anchor_generator_config.width_offset) - return multiple_grid_anchor_generator.create_ssd_anchors( - num_layers=ssd_anchor_generator_config.num_layers, - min_scale=ssd_anchor_generator_config.min_scale, - max_scale=ssd_anchor_generator_config.max_scale, - scales=[float(scale) for scale in ssd_anchor_generator_config.scales], - aspect_ratios=ssd_anchor_generator_config.aspect_ratios, - interpolated_scale_aspect_ratio=( - ssd_anchor_generator_config.interpolated_scale_aspect_ratio), - base_anchor_size=[ - ssd_anchor_generator_config.base_anchor_height, - ssd_anchor_generator_config.base_anchor_width - ], - anchor_strides=anchor_strides, - anchor_offsets=anchor_offsets, - reduce_boxes_in_lowest_layer=( - ssd_anchor_generator_config.reduce_boxes_in_lowest_layer)) - else: - raise ValueError('Empty anchor generator.') diff --git a/object_detection/builders/anchor_generator_builder_test.py b/object_detection/builders/anchor_generator_builder_test.py deleted file mode 100644 index ecc1eca1..00000000 --- a/object_detection/builders/anchor_generator_builder_test.py +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for anchor_generator_builder.""" - -import math - -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.anchor_generators import grid_anchor_generator -from object_detection.anchor_generators import multiple_grid_anchor_generator -from object_detection.builders import anchor_generator_builder -from object_detection.protos import anchor_generator_pb2 - - -class AnchorGeneratorBuilderTest(tf.test.TestCase): - - def assert_almost_list_equal(self, expected_list, actual_list, delta=None): - self.assertEqual(len(expected_list), len(actual_list)) - for expected_item, actual_item in zip(expected_list, actual_list): - self.assertAlmostEqual(expected_item, actual_item, delta=delta) - - def test_build_grid_anchor_generator_with_defaults(self): - anchor_generator_text_proto = """ - grid_anchor_generator { - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - grid_anchor_generator.GridAnchorGenerator)) - self.assertListEqual(anchor_generator_object._scales, []) - self.assertListEqual(anchor_generator_object._aspect_ratios, []) - with self.test_session() as sess: - base_anchor_size, anchor_offset, anchor_stride = sess.run( - [anchor_generator_object._base_anchor_size, - anchor_generator_object._anchor_offset, - anchor_generator_object._anchor_stride]) - self.assertAllEqual(anchor_offset, [0, 0]) - self.assertAllEqual(anchor_stride, [16, 16]) - self.assertAllEqual(base_anchor_size, [256, 256]) - - def test_build_grid_anchor_generator_with_non_default_parameters(self): - anchor_generator_text_proto = """ - grid_anchor_generator { - height: 128 - width: 512 - height_stride: 10 - width_stride: 20 - height_offset: 30 - width_offset: 40 - scales: [0.4, 2.2] - aspect_ratios: [0.3, 4.5] - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - grid_anchor_generator.GridAnchorGenerator)) - self.assert_almost_list_equal(anchor_generator_object._scales, - [0.4, 2.2]) - self.assert_almost_list_equal(anchor_generator_object._aspect_ratios, - [0.3, 4.5]) - with self.test_session() as sess: - base_anchor_size, anchor_offset, anchor_stride = sess.run( - [anchor_generator_object._base_anchor_size, - anchor_generator_object._anchor_offset, - anchor_generator_object._anchor_stride]) - self.assertAllEqual(anchor_offset, [30, 40]) - self.assertAllEqual(anchor_stride, [10, 20]) - self.assertAllEqual(base_anchor_size, [128, 512]) - - def test_build_ssd_anchor_generator_with_defaults(self): - anchor_generator_text_proto = """ - ssd_anchor_generator { - aspect_ratios: [1.0] - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - multiple_grid_anchor_generator. - MultipleGridAnchorGenerator)) - for actual_scales, expected_scales in zip( - list(anchor_generator_object._scales), - [(0.1, 0.2, 0.2), - (0.35, 0.418), - (0.499, 0.570), - (0.649, 0.721), - (0.799, 0.871), - (0.949, 0.974)]): - self.assert_almost_list_equal(expected_scales, actual_scales, delta=1e-2) - for actual_aspect_ratio, expected_aspect_ratio in zip( - list(anchor_generator_object._aspect_ratios), - [(1.0, 2.0, 0.5)] + 5 * [(1.0, 1.0)]): - self.assert_almost_list_equal(expected_aspect_ratio, actual_aspect_ratio) - - with self.test_session() as sess: - base_anchor_size = sess.run(anchor_generator_object._base_anchor_size) - self.assertAllClose(base_anchor_size, [1.0, 1.0]) - - def test_build_ssd_anchor_generator_with_custom_scales(self): - anchor_generator_text_proto = """ - ssd_anchor_generator { - aspect_ratios: [1.0] - scales: [0.1, 0.15, 0.2, 0.4, 0.6, 0.8] - reduce_boxes_in_lowest_layer: false - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - multiple_grid_anchor_generator. - MultipleGridAnchorGenerator)) - for actual_scales, expected_scales in zip( - list(anchor_generator_object._scales), - [(0.1, math.sqrt(0.1 * 0.15)), - (0.15, math.sqrt(0.15 * 0.2)), - (0.2, math.sqrt(0.2 * 0.4)), - (0.4, math.sqrt(0.4 * 0.6)), - (0.6, math.sqrt(0.6 * 0.8)), - (0.8, math.sqrt(0.8 * 1.0))]): - self.assert_almost_list_equal(expected_scales, actual_scales, delta=1e-2) - - def test_build_ssd_anchor_generator_with_custom_interpolated_scale(self): - anchor_generator_text_proto = """ - ssd_anchor_generator { - aspect_ratios: [0.5] - interpolated_scale_aspect_ratio: 0.5 - reduce_boxes_in_lowest_layer: false - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - multiple_grid_anchor_generator. - MultipleGridAnchorGenerator)) - for actual_aspect_ratio, expected_aspect_ratio in zip( - list(anchor_generator_object._aspect_ratios), - 6 * [(0.5, 0.5)]): - self.assert_almost_list_equal(expected_aspect_ratio, actual_aspect_ratio) - - def test_build_ssd_anchor_generator_without_reduced_boxes(self): - anchor_generator_text_proto = """ - ssd_anchor_generator { - aspect_ratios: [1.0] - reduce_boxes_in_lowest_layer: false - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - multiple_grid_anchor_generator. - MultipleGridAnchorGenerator)) - - for actual_scales, expected_scales in zip( - list(anchor_generator_object._scales), - [(0.2, 0.264), - (0.35, 0.418), - (0.499, 0.570), - (0.649, 0.721), - (0.799, 0.871), - (0.949, 0.974)]): - self.assert_almost_list_equal(expected_scales, actual_scales, delta=1e-2) - - for actual_aspect_ratio, expected_aspect_ratio in zip( - list(anchor_generator_object._aspect_ratios), - 6 * [(1.0, 1.0)]): - self.assert_almost_list_equal(expected_aspect_ratio, actual_aspect_ratio) - - with self.test_session() as sess: - base_anchor_size = sess.run(anchor_generator_object._base_anchor_size) - self.assertAllClose(base_anchor_size, [1.0, 1.0]) - - def test_build_ssd_anchor_generator_with_non_default_parameters(self): - anchor_generator_text_proto = """ - ssd_anchor_generator { - num_layers: 2 - min_scale: 0.3 - max_scale: 0.8 - aspect_ratios: [2.0] - height_stride: 16 - height_stride: 32 - width_stride: 20 - width_stride: 30 - height_offset: 8 - height_offset: 16 - width_offset: 0 - width_offset: 10 - } - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - anchor_generator_object = anchor_generator_builder.build( - anchor_generator_proto) - self.assertTrue(isinstance(anchor_generator_object, - multiple_grid_anchor_generator. - MultipleGridAnchorGenerator)) - - for actual_scales, expected_scales in zip( - list(anchor_generator_object._scales), - [(0.1, 0.3, 0.3), (0.8, 0.894)]): - self.assert_almost_list_equal(expected_scales, actual_scales, delta=1e-2) - - for actual_aspect_ratio, expected_aspect_ratio in zip( - list(anchor_generator_object._aspect_ratios), - [(1.0, 2.0, 0.5), (2.0, 1.0)]): - self.assert_almost_list_equal(expected_aspect_ratio, actual_aspect_ratio) - - for actual_strides, expected_strides in zip( - list(anchor_generator_object._anchor_strides), [(16, 20), (32, 30)]): - self.assert_almost_list_equal(expected_strides, actual_strides) - - for actual_offsets, expected_offsets in zip( - list(anchor_generator_object._anchor_offsets), [(8, 0), (16, 10)]): - self.assert_almost_list_equal(expected_offsets, actual_offsets) - - with self.test_session() as sess: - base_anchor_size = sess.run(anchor_generator_object._base_anchor_size) - self.assertAllClose(base_anchor_size, [1.0, 1.0]) - - def test_raise_value_error_on_empty_anchor_genertor(self): - anchor_generator_text_proto = """ - """ - anchor_generator_proto = anchor_generator_pb2.AnchorGenerator() - text_format.Merge(anchor_generator_text_proto, anchor_generator_proto) - with self.assertRaises(ValueError): - anchor_generator_builder.build(anchor_generator_proto) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/box_coder_builder.py b/object_detection/builders/box_coder_builder.py deleted file mode 100644 index edfc2fca..00000000 --- a/object_detection/builders/box_coder_builder.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""A function to build an object detection box coder from configuration.""" -from object_detection.box_coders import faster_rcnn_box_coder -from object_detection.box_coders import keypoint_box_coder -from object_detection.box_coders import mean_stddev_box_coder -from object_detection.box_coders import square_box_coder -from object_detection.protos import box_coder_pb2 - - -def build(box_coder_config): - """Builds a box coder object based on the box coder config. - - Args: - box_coder_config: A box_coder.proto object containing the config for the - desired box coder. - - Returns: - BoxCoder based on the config. - - Raises: - ValueError: On empty box coder proto. - """ - if not isinstance(box_coder_config, box_coder_pb2.BoxCoder): - raise ValueError('box_coder_config not of type box_coder_pb2.BoxCoder.') - - if box_coder_config.WhichOneof('box_coder_oneof') == 'faster_rcnn_box_coder': - return faster_rcnn_box_coder.FasterRcnnBoxCoder(scale_factors=[ - box_coder_config.faster_rcnn_box_coder.y_scale, - box_coder_config.faster_rcnn_box_coder.x_scale, - box_coder_config.faster_rcnn_box_coder.height_scale, - box_coder_config.faster_rcnn_box_coder.width_scale - ]) - if box_coder_config.WhichOneof('box_coder_oneof') == 'keypoint_box_coder': - return keypoint_box_coder.KeypointBoxCoder( - box_coder_config.keypoint_box_coder.num_keypoints, - scale_factors=[ - box_coder_config.keypoint_box_coder.y_scale, - box_coder_config.keypoint_box_coder.x_scale, - box_coder_config.keypoint_box_coder.height_scale, - box_coder_config.keypoint_box_coder.width_scale - ]) - if (box_coder_config.WhichOneof('box_coder_oneof') == - 'mean_stddev_box_coder'): - return mean_stddev_box_coder.MeanStddevBoxCoder() - if box_coder_config.WhichOneof('box_coder_oneof') == 'square_box_coder': - return square_box_coder.SquareBoxCoder(scale_factors=[ - box_coder_config.square_box_coder.y_scale, - box_coder_config.square_box_coder.x_scale, - box_coder_config.square_box_coder.length_scale - ]) - raise ValueError('Empty box coder.') diff --git a/object_detection/builders/box_coder_builder_test.py b/object_detection/builders/box_coder_builder_test.py deleted file mode 100644 index 286012e9..00000000 --- a/object_detection/builders/box_coder_builder_test.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for box_coder_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.box_coders import faster_rcnn_box_coder -from object_detection.box_coders import keypoint_box_coder -from object_detection.box_coders import mean_stddev_box_coder -from object_detection.box_coders import square_box_coder -from object_detection.builders import box_coder_builder -from object_detection.protos import box_coder_pb2 - - -class BoxCoderBuilderTest(tf.test.TestCase): - - def test_build_faster_rcnn_box_coder_with_defaults(self): - box_coder_text_proto = """ - faster_rcnn_box_coder { - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertIsInstance(box_coder_object, - faster_rcnn_box_coder.FasterRcnnBoxCoder) - self.assertEqual(box_coder_object._scale_factors, [10.0, 10.0, 5.0, 5.0]) - - def test_build_faster_rcnn_box_coder_with_non_default_parameters(self): - box_coder_text_proto = """ - faster_rcnn_box_coder { - y_scale: 6.0 - x_scale: 3.0 - height_scale: 7.0 - width_scale: 8.0 - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertIsInstance(box_coder_object, - faster_rcnn_box_coder.FasterRcnnBoxCoder) - self.assertEqual(box_coder_object._scale_factors, [6.0, 3.0, 7.0, 8.0]) - - def test_build_keypoint_box_coder_with_defaults(self): - box_coder_text_proto = """ - keypoint_box_coder { - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertIsInstance(box_coder_object, keypoint_box_coder.KeypointBoxCoder) - self.assertEqual(box_coder_object._scale_factors, [10.0, 10.0, 5.0, 5.0]) - - def test_build_keypoint_box_coder_with_non_default_parameters(self): - box_coder_text_proto = """ - keypoint_box_coder { - num_keypoints: 6 - y_scale: 6.0 - x_scale: 3.0 - height_scale: 7.0 - width_scale: 8.0 - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertIsInstance(box_coder_object, keypoint_box_coder.KeypointBoxCoder) - self.assertEqual(box_coder_object._num_keypoints, 6) - self.assertEqual(box_coder_object._scale_factors, [6.0, 3.0, 7.0, 8.0]) - - def test_build_mean_stddev_box_coder(self): - box_coder_text_proto = """ - mean_stddev_box_coder { - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertTrue( - isinstance(box_coder_object, - mean_stddev_box_coder.MeanStddevBoxCoder)) - - def test_build_square_box_coder_with_defaults(self): - box_coder_text_proto = """ - square_box_coder { - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertTrue( - isinstance(box_coder_object, square_box_coder.SquareBoxCoder)) - self.assertEqual(box_coder_object._scale_factors, [10.0, 10.0, 5.0]) - - def test_build_square_box_coder_with_non_default_parameters(self): - box_coder_text_proto = """ - square_box_coder { - y_scale: 6.0 - x_scale: 3.0 - length_scale: 7.0 - } - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - box_coder_object = box_coder_builder.build(box_coder_proto) - self.assertTrue( - isinstance(box_coder_object, square_box_coder.SquareBoxCoder)) - self.assertEqual(box_coder_object._scale_factors, [6.0, 3.0, 7.0]) - - def test_raise_error_on_empty_box_coder(self): - box_coder_text_proto = """ - """ - box_coder_proto = box_coder_pb2.BoxCoder() - text_format.Merge(box_coder_text_proto, box_coder_proto) - with self.assertRaises(ValueError): - box_coder_builder.build(box_coder_proto) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/box_predictor_builder.py b/object_detection/builders/box_predictor_builder.py deleted file mode 100644 index 3e10b394..00000000 --- a/object_detection/builders/box_predictor_builder.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Function to build box predictor from configuration.""" - -from object_detection.core import box_predictor -from object_detection.protos import box_predictor_pb2 - - -def build(argscope_fn, box_predictor_config, is_training, num_classes): - """Builds box predictor based on the configuration. - - Builds box predictor based on the configuration. See box_predictor.proto for - configurable options. Also, see box_predictor.py for more details. - - Args: - argscope_fn: A function that takes the following inputs: - * hyperparams_pb2.Hyperparams proto - * a boolean indicating if the model is in training mode. - and returns a tf slim argscope for Conv and FC hyperparameters. - box_predictor_config: box_predictor_pb2.BoxPredictor proto containing - configuration. - is_training: Whether the models is in training mode. - num_classes: Number of classes to predict. - - Returns: - box_predictor: box_predictor.BoxPredictor object. - - Raises: - ValueError: On unknown box predictor. - """ - if not isinstance(box_predictor_config, box_predictor_pb2.BoxPredictor): - raise ValueError('box_predictor_config not of type ' - 'box_predictor_pb2.BoxPredictor.') - - box_predictor_oneof = box_predictor_config.WhichOneof('box_predictor_oneof') - - if box_predictor_oneof == 'convolutional_box_predictor': - conv_box_predictor = box_predictor_config.convolutional_box_predictor - conv_hyperparams = argscope_fn(conv_box_predictor.conv_hyperparams, - is_training) - box_predictor_object = box_predictor.ConvolutionalBoxPredictor( - is_training=is_training, - num_classes=num_classes, - conv_hyperparams=conv_hyperparams, - min_depth=conv_box_predictor.min_depth, - max_depth=conv_box_predictor.max_depth, - num_layers_before_predictor=(conv_box_predictor. - num_layers_before_predictor), - use_dropout=conv_box_predictor.use_dropout, - dropout_keep_prob=conv_box_predictor.dropout_keep_probability, - kernel_size=conv_box_predictor.kernel_size, - box_code_size=conv_box_predictor.box_code_size, - apply_sigmoid_to_scores=conv_box_predictor.apply_sigmoid_to_scores, - class_prediction_bias_init=conv_box_predictor.class_prediction_bias_init - ) - return box_predictor_object - - if box_predictor_oneof == 'mask_rcnn_box_predictor': - mask_rcnn_box_predictor = box_predictor_config.mask_rcnn_box_predictor - fc_hyperparams = argscope_fn(mask_rcnn_box_predictor.fc_hyperparams, - is_training) - conv_hyperparams = None - if mask_rcnn_box_predictor.HasField('conv_hyperparams'): - conv_hyperparams = argscope_fn(mask_rcnn_box_predictor.conv_hyperparams, - is_training) - box_predictor_object = box_predictor.MaskRCNNBoxPredictor( - is_training=is_training, - num_classes=num_classes, - fc_hyperparams=fc_hyperparams, - use_dropout=mask_rcnn_box_predictor.use_dropout, - dropout_keep_prob=mask_rcnn_box_predictor.dropout_keep_probability, - box_code_size=mask_rcnn_box_predictor.box_code_size, - conv_hyperparams=conv_hyperparams, - predict_instance_masks=mask_rcnn_box_predictor.predict_instance_masks, - mask_prediction_conv_depth=(mask_rcnn_box_predictor. - mask_prediction_conv_depth), - predict_keypoints=mask_rcnn_box_predictor.predict_keypoints) - return box_predictor_object - - if box_predictor_oneof == 'rfcn_box_predictor': - rfcn_box_predictor = box_predictor_config.rfcn_box_predictor - conv_hyperparams = argscope_fn(rfcn_box_predictor.conv_hyperparams, - is_training) - box_predictor_object = box_predictor.RfcnBoxPredictor( - is_training=is_training, - num_classes=num_classes, - conv_hyperparams=conv_hyperparams, - crop_size=[rfcn_box_predictor.crop_height, - rfcn_box_predictor.crop_width], - num_spatial_bins=[rfcn_box_predictor.num_spatial_bins_height, - rfcn_box_predictor.num_spatial_bins_width], - depth=rfcn_box_predictor.depth, - box_code_size=rfcn_box_predictor.box_code_size) - return box_predictor_object - raise ValueError('Unknown box predictor: {}'.format(box_predictor_oneof)) diff --git a/object_detection/builders/box_predictor_builder_test.py b/object_detection/builders/box_predictor_builder_test.py deleted file mode 100644 index 6bafd482..00000000 --- a/object_detection/builders/box_predictor_builder_test.py +++ /dev/null @@ -1,393 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for box_predictor_builder.""" -import mock -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.builders import box_predictor_builder -from object_detection.builders import hyperparams_builder -from object_detection.protos import box_predictor_pb2 -from object_detection.protos import hyperparams_pb2 - - -class ConvolutionalBoxPredictorBuilderTest(tf.test.TestCase): - - def test_box_predictor_calls_conv_argscope_fn(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - weight: 0.0003 - } - } - initializer { - truncated_normal_initializer { - mean: 0.0 - stddev: 0.3 - } - } - activation: RELU_6 - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, hyperparams_proto) - def mock_conv_argscope_builder(conv_hyperparams_arg, is_training): - return (conv_hyperparams_arg, is_training) - - box_predictor_proto = box_predictor_pb2.BoxPredictor() - box_predictor_proto.convolutional_box_predictor.conv_hyperparams.CopyFrom( - hyperparams_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=mock_conv_argscope_builder, - box_predictor_config=box_predictor_proto, - is_training=False, - num_classes=10) - (conv_hyperparams_actual, is_training) = box_predictor._conv_hyperparams - self.assertAlmostEqual((hyperparams_proto.regularizer. - l1_regularizer.weight), - (conv_hyperparams_actual.regularizer.l1_regularizer. - weight)) - self.assertAlmostEqual((hyperparams_proto.initializer. - truncated_normal_initializer.stddev), - (conv_hyperparams_actual.initializer. - truncated_normal_initializer.stddev)) - self.assertAlmostEqual((hyperparams_proto.initializer. - truncated_normal_initializer.mean), - (conv_hyperparams_actual.initializer. - truncated_normal_initializer.mean)) - self.assertEqual(hyperparams_proto.activation, - conv_hyperparams_actual.activation) - self.assertFalse(is_training) - - def test_construct_non_default_conv_box_predictor(self): - box_predictor_text_proto = """ - convolutional_box_predictor { - min_depth: 2 - max_depth: 16 - num_layers_before_predictor: 2 - use_dropout: false - dropout_keep_probability: 0.4 - kernel_size: 3 - box_code_size: 3 - apply_sigmoid_to_scores: true - class_prediction_bias_init: 4.0 - } - """ - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, hyperparams_proto) - def mock_conv_argscope_builder(conv_hyperparams_arg, is_training): - return (conv_hyperparams_arg, is_training) - - box_predictor_proto = box_predictor_pb2.BoxPredictor() - text_format.Merge(box_predictor_text_proto, box_predictor_proto) - box_predictor_proto.convolutional_box_predictor.conv_hyperparams.CopyFrom( - hyperparams_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=mock_conv_argscope_builder, - box_predictor_config=box_predictor_proto, - is_training=False, - num_classes=10) - self.assertEqual(box_predictor._min_depth, 2) - self.assertEqual(box_predictor._max_depth, 16) - self.assertEqual(box_predictor._num_layers_before_predictor, 2) - self.assertFalse(box_predictor._use_dropout) - self.assertAlmostEqual(box_predictor._dropout_keep_prob, 0.4) - self.assertTrue(box_predictor._apply_sigmoid_to_scores) - self.assertAlmostEqual(box_predictor._class_prediction_bias_init, 4.0) - self.assertEqual(box_predictor.num_classes, 10) - self.assertFalse(box_predictor._is_training) - - def test_construct_default_conv_box_predictor(self): - box_predictor_text_proto = """ - convolutional_box_predictor { - conv_hyperparams { - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - }""" - box_predictor_proto = box_predictor_pb2.BoxPredictor() - text_format.Merge(box_predictor_text_proto, box_predictor_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=hyperparams_builder.build, - box_predictor_config=box_predictor_proto, - is_training=True, - num_classes=90) - self.assertEqual(box_predictor._min_depth, 0) - self.assertEqual(box_predictor._max_depth, 0) - self.assertEqual(box_predictor._num_layers_before_predictor, 0) - self.assertTrue(box_predictor._use_dropout) - self.assertAlmostEqual(box_predictor._dropout_keep_prob, 0.8) - self.assertFalse(box_predictor._apply_sigmoid_to_scores) - self.assertEqual(box_predictor.num_classes, 90) - self.assertTrue(box_predictor._is_training) - - -class MaskRCNNBoxPredictorBuilderTest(tf.test.TestCase): - - def test_box_predictor_builder_calls_fc_argscope_fn(self): - fc_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - weight: 0.0003 - } - } - initializer { - truncated_normal_initializer { - mean: 0.0 - stddev: 0.3 - } - } - activation: RELU_6 - op: FC - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(fc_hyperparams_text_proto, hyperparams_proto) - box_predictor_proto = box_predictor_pb2.BoxPredictor() - box_predictor_proto.mask_rcnn_box_predictor.fc_hyperparams.CopyFrom( - hyperparams_proto) - mock_argscope_fn = mock.Mock(return_value='arg_scope') - box_predictor = box_predictor_builder.build( - argscope_fn=mock_argscope_fn, - box_predictor_config=box_predictor_proto, - is_training=False, - num_classes=10) - mock_argscope_fn.assert_called_with(hyperparams_proto, False) - self.assertEqual(box_predictor._fc_hyperparams, 'arg_scope') - - def test_non_default_mask_rcnn_box_predictor(self): - fc_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - activation: RELU_6 - op: FC - """ - box_predictor_text_proto = """ - mask_rcnn_box_predictor { - use_dropout: true - dropout_keep_probability: 0.8 - box_code_size: 3 - } - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(fc_hyperparams_text_proto, hyperparams_proto) - def mock_fc_argscope_builder(fc_hyperparams_arg, is_training): - return (fc_hyperparams_arg, is_training) - - box_predictor_proto = box_predictor_pb2.BoxPredictor() - text_format.Merge(box_predictor_text_proto, box_predictor_proto) - box_predictor_proto.mask_rcnn_box_predictor.fc_hyperparams.CopyFrom( - hyperparams_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=mock_fc_argscope_builder, - box_predictor_config=box_predictor_proto, - is_training=True, - num_classes=90) - self.assertTrue(box_predictor._use_dropout) - self.assertAlmostEqual(box_predictor._dropout_keep_prob, 0.8) - self.assertEqual(box_predictor.num_classes, 90) - self.assertTrue(box_predictor._is_training) - self.assertEqual(box_predictor._box_code_size, 3) - - def test_build_default_mask_rcnn_box_predictor(self): - box_predictor_proto = box_predictor_pb2.BoxPredictor() - box_predictor_proto.mask_rcnn_box_predictor.fc_hyperparams.op = ( - hyperparams_pb2.Hyperparams.FC) - box_predictor = box_predictor_builder.build( - argscope_fn=mock.Mock(return_value='arg_scope'), - box_predictor_config=box_predictor_proto, - is_training=True, - num_classes=90) - self.assertFalse(box_predictor._use_dropout) - self.assertAlmostEqual(box_predictor._dropout_keep_prob, 0.5) - self.assertEqual(box_predictor.num_classes, 90) - self.assertTrue(box_predictor._is_training) - self.assertEqual(box_predictor._box_code_size, 4) - self.assertFalse(box_predictor._predict_instance_masks) - self.assertFalse(box_predictor._predict_keypoints) - - def test_build_box_predictor_with_mask_branch(self): - box_predictor_proto = box_predictor_pb2.BoxPredictor() - box_predictor_proto.mask_rcnn_box_predictor.fc_hyperparams.op = ( - hyperparams_pb2.Hyperparams.FC) - box_predictor_proto.mask_rcnn_box_predictor.conv_hyperparams.op = ( - hyperparams_pb2.Hyperparams.CONV) - box_predictor_proto.mask_rcnn_box_predictor.predict_instance_masks = True - box_predictor_proto.mask_rcnn_box_predictor.mask_prediction_conv_depth = 512 - mock_argscope_fn = mock.Mock(return_value='arg_scope') - box_predictor = box_predictor_builder.build( - argscope_fn=mock_argscope_fn, - box_predictor_config=box_predictor_proto, - is_training=True, - num_classes=90) - mock_argscope_fn.assert_has_calls( - [mock.call(box_predictor_proto.mask_rcnn_box_predictor.fc_hyperparams, - True), - mock.call(box_predictor_proto.mask_rcnn_box_predictor.conv_hyperparams, - True)], any_order=True) - self.assertFalse(box_predictor._use_dropout) - self.assertAlmostEqual(box_predictor._dropout_keep_prob, 0.5) - self.assertEqual(box_predictor.num_classes, 90) - self.assertTrue(box_predictor._is_training) - self.assertEqual(box_predictor._box_code_size, 4) - self.assertTrue(box_predictor._predict_instance_masks) - self.assertEqual(box_predictor._mask_prediction_conv_depth, 512) - self.assertFalse(box_predictor._predict_keypoints) - - -class RfcnBoxPredictorBuilderTest(tf.test.TestCase): - - def test_box_predictor_calls_fc_argscope_fn(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - weight: 0.0003 - } - } - initializer { - truncated_normal_initializer { - mean: 0.0 - stddev: 0.3 - } - } - activation: RELU_6 - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, hyperparams_proto) - def mock_conv_argscope_builder(conv_hyperparams_arg, is_training): - return (conv_hyperparams_arg, is_training) - - box_predictor_proto = box_predictor_pb2.BoxPredictor() - box_predictor_proto.rfcn_box_predictor.conv_hyperparams.CopyFrom( - hyperparams_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=mock_conv_argscope_builder, - box_predictor_config=box_predictor_proto, - is_training=False, - num_classes=10) - (conv_hyperparams_actual, is_training) = box_predictor._conv_hyperparams - self.assertAlmostEqual((hyperparams_proto.regularizer. - l1_regularizer.weight), - (conv_hyperparams_actual.regularizer.l1_regularizer. - weight)) - self.assertAlmostEqual((hyperparams_proto.initializer. - truncated_normal_initializer.stddev), - (conv_hyperparams_actual.initializer. - truncated_normal_initializer.stddev)) - self.assertAlmostEqual((hyperparams_proto.initializer. - truncated_normal_initializer.mean), - (conv_hyperparams_actual.initializer. - truncated_normal_initializer.mean)) - self.assertEqual(hyperparams_proto.activation, - conv_hyperparams_actual.activation) - self.assertFalse(is_training) - - def test_non_default_rfcn_box_predictor(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - activation: RELU_6 - """ - box_predictor_text_proto = """ - rfcn_box_predictor { - num_spatial_bins_height: 4 - num_spatial_bins_width: 4 - depth: 4 - box_code_size: 3 - crop_height: 16 - crop_width: 16 - } - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, hyperparams_proto) - def mock_conv_argscope_builder(conv_hyperparams_arg, is_training): - return (conv_hyperparams_arg, is_training) - - box_predictor_proto = box_predictor_pb2.BoxPredictor() - text_format.Merge(box_predictor_text_proto, box_predictor_proto) - box_predictor_proto.rfcn_box_predictor.conv_hyperparams.CopyFrom( - hyperparams_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=mock_conv_argscope_builder, - box_predictor_config=box_predictor_proto, - is_training=True, - num_classes=90) - self.assertEqual(box_predictor.num_classes, 90) - self.assertTrue(box_predictor._is_training) - self.assertEqual(box_predictor._box_code_size, 3) - self.assertEqual(box_predictor._num_spatial_bins, [4, 4]) - self.assertEqual(box_predictor._crop_size, [16, 16]) - - def test_default_rfcn_box_predictor(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - activation: RELU_6 - """ - hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, hyperparams_proto) - def mock_conv_argscope_builder(conv_hyperparams_arg, is_training): - return (conv_hyperparams_arg, is_training) - - box_predictor_proto = box_predictor_pb2.BoxPredictor() - box_predictor_proto.rfcn_box_predictor.conv_hyperparams.CopyFrom( - hyperparams_proto) - box_predictor = box_predictor_builder.build( - argscope_fn=mock_conv_argscope_builder, - box_predictor_config=box_predictor_proto, - is_training=True, - num_classes=90) - self.assertEqual(box_predictor.num_classes, 90) - self.assertTrue(box_predictor._is_training) - self.assertEqual(box_predictor._box_code_size, 4) - self.assertEqual(box_predictor._num_spatial_bins, [3, 3]) - self.assertEqual(box_predictor._crop_size, [12, 12]) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/hyperparams_builder.py b/object_detection/builders/hyperparams_builder.py deleted file mode 100644 index 094ff023..00000000 --- a/object_detection/builders/hyperparams_builder.py +++ /dev/null @@ -1,168 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Builder function to construct tf-slim arg_scope for convolution, fc ops.""" -import tensorflow as tf - -from object_detection.protos import hyperparams_pb2 - -slim = tf.contrib.slim - - -def build(hyperparams_config, is_training): - """Builds tf-slim arg_scope for convolution ops based on the config. - - Returns an arg_scope to use for convolution ops containing weights - initializer, weights regularizer, activation function, batch norm function - and batch norm parameters based on the configuration. - - Note that if the batch_norm parameteres are not specified in the config - (i.e. left to default) then batch norm is excluded from the arg_scope. - - The batch norm parameters are set for updates based on `is_training` argument - and conv_hyperparams_config.batch_norm.train parameter. During training, they - are updated only if batch_norm.train parameter is true. However, during eval, - no updates are made to the batch norm variables. In both cases, their current - values are used during forward pass. - - Args: - hyperparams_config: hyperparams.proto object containing - hyperparameters. - is_training: Whether the network is in training mode. - - Returns: - arg_scope: tf-slim arg_scope containing hyperparameters for ops. - - Raises: - ValueError: if hyperparams_config is not of type hyperparams.Hyperparams. - """ - if not isinstance(hyperparams_config, - hyperparams_pb2.Hyperparams): - raise ValueError('hyperparams_config not of type ' - 'hyperparams_pb.Hyperparams.') - - batch_norm = None - batch_norm_params = None - if hyperparams_config.HasField('batch_norm'): - batch_norm = slim.batch_norm - batch_norm_params = _build_batch_norm_params( - hyperparams_config.batch_norm, is_training) - - affected_ops = [slim.conv2d, slim.separable_conv2d, slim.conv2d_transpose] - if hyperparams_config.HasField('op') and ( - hyperparams_config.op == hyperparams_pb2.Hyperparams.FC): - affected_ops = [slim.fully_connected] - with slim.arg_scope( - affected_ops, - weights_regularizer=_build_regularizer( - hyperparams_config.regularizer), - weights_initializer=_build_initializer( - hyperparams_config.initializer), - activation_fn=_build_activation_fn(hyperparams_config.activation), - normalizer_fn=batch_norm, - normalizer_params=batch_norm_params) as sc: - return sc - - -def _build_activation_fn(activation_fn): - """Builds a callable activation from config. - - Args: - activation_fn: hyperparams_pb2.Hyperparams.activation - - Returns: - Callable activation function. - - Raises: - ValueError: On unknown activation function. - """ - if activation_fn == hyperparams_pb2.Hyperparams.NONE: - return None - if activation_fn == hyperparams_pb2.Hyperparams.RELU: - return tf.nn.relu - if activation_fn == hyperparams_pb2.Hyperparams.RELU_6: - return tf.nn.relu6 - raise ValueError('Unknown activation function: {}'.format(activation_fn)) - - -def _build_regularizer(regularizer): - """Builds a tf-slim regularizer from config. - - Args: - regularizer: hyperparams_pb2.Hyperparams.regularizer proto. - - Returns: - tf-slim regularizer. - - Raises: - ValueError: On unknown regularizer. - """ - regularizer_oneof = regularizer.WhichOneof('regularizer_oneof') - if regularizer_oneof == 'l1_regularizer': - return slim.l1_regularizer(scale=float(regularizer.l1_regularizer.weight)) - if regularizer_oneof == 'l2_regularizer': - return slim.l2_regularizer(scale=float(regularizer.l2_regularizer.weight)) - raise ValueError('Unknown regularizer function: {}'.format(regularizer_oneof)) - - -def _build_initializer(initializer): - """Build a tf initializer from config. - - Args: - initializer: hyperparams_pb2.Hyperparams.regularizer proto. - - Returns: - tf initializer. - - Raises: - ValueError: On unknown initializer. - """ - initializer_oneof = initializer.WhichOneof('initializer_oneof') - if initializer_oneof == 'truncated_normal_initializer': - return tf.truncated_normal_initializer( - mean=initializer.truncated_normal_initializer.mean, - stddev=initializer.truncated_normal_initializer.stddev) - if initializer_oneof == 'variance_scaling_initializer': - enum_descriptor = (hyperparams_pb2.VarianceScalingInitializer. - DESCRIPTOR.enum_types_by_name['Mode']) - mode = enum_descriptor.values_by_number[initializer. - variance_scaling_initializer. - mode].name - return slim.variance_scaling_initializer( - factor=initializer.variance_scaling_initializer.factor, - mode=mode, - uniform=initializer.variance_scaling_initializer.uniform) - raise ValueError('Unknown initializer function: {}'.format( - initializer_oneof)) - - -def _build_batch_norm_params(batch_norm, is_training): - """Build a dictionary of batch_norm params from config. - - Args: - batch_norm: hyperparams_pb2.ConvHyperparams.batch_norm proto. - is_training: Whether the models is in training mode. - - Returns: - A dictionary containing batch_norm parameters. - """ - batch_norm_params = { - 'decay': batch_norm.decay, - 'center': batch_norm.center, - 'scale': batch_norm.scale, - 'epsilon': batch_norm.epsilon, - 'is_training': is_training and batch_norm.train, - } - return batch_norm_params diff --git a/object_detection/builders/hyperparams_builder_test.py b/object_detection/builders/hyperparams_builder_test.py deleted file mode 100644 index a9808076..00000000 --- a/object_detection/builders/hyperparams_builder_test.py +++ /dev/null @@ -1,449 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests object_detection.core.hyperparams_builder.""" - -import numpy as np -import tensorflow as tf - -from google.protobuf import text_format - -from object_detection.builders import hyperparams_builder -from object_detection.protos import hyperparams_pb2 - -slim = tf.contrib.slim - - -class HyperparamsBuilderTest(tf.test.TestCase): - - # TODO: Make this a public api in slim arg_scope.py. - def _get_scope_key(self, op): - return getattr(op, '_key_op', str(op)) - - def test_default_arg_scope_has_conv2d_op(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - self.assertTrue(self._get_scope_key(slim.conv2d) in scope) - - def test_default_arg_scope_has_separable_conv2d_op(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - self.assertTrue(self._get_scope_key(slim.separable_conv2d) in scope) - - def test_default_arg_scope_has_conv2d_transpose_op(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - self.assertTrue(self._get_scope_key(slim.conv2d_transpose) in scope) - - def test_explicit_fc_op_arg_scope_has_fully_connected_op(self): - conv_hyperparams_text_proto = """ - op: FC - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - self.assertTrue(self._get_scope_key(slim.fully_connected) in scope) - - def test_separable_conv2d_and_conv2d_and_transpose_have_same_parameters(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - kwargs_1, kwargs_2, kwargs_3 = scope.values() - self.assertDictEqual(kwargs_1, kwargs_2) - self.assertDictEqual(kwargs_1, kwargs_3) - - def test_return_l1_regularized_weights(self): - conv_hyperparams_text_proto = """ - regularizer { - l1_regularizer { - weight: 0.5 - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - regularizer = conv_scope_arguments['weights_regularizer'] - weights = np.array([1., -1, 4., 2.]) - with self.test_session() as sess: - result = sess.run(regularizer(tf.constant(weights))) - self.assertAllClose(np.abs(weights).sum() * 0.5, result) - - def test_return_l2_regularizer_weights(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - weight: 0.42 - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - - regularizer = conv_scope_arguments['weights_regularizer'] - weights = np.array([1., -1, 4., 2.]) - with self.test_session() as sess: - result = sess.run(regularizer(tf.constant(weights))) - self.assertAllClose(np.power(weights, 2).sum() / 2.0 * 0.42, result) - - def test_return_non_default_batch_norm_params_with_train_during_train(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - batch_norm { - decay: 0.7 - center: false - scale: true - epsilon: 0.03 - train: true - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['normalizer_fn'], slim.batch_norm) - batch_norm_params = conv_scope_arguments['normalizer_params'] - self.assertAlmostEqual(batch_norm_params['decay'], 0.7) - self.assertAlmostEqual(batch_norm_params['epsilon'], 0.03) - self.assertFalse(batch_norm_params['center']) - self.assertTrue(batch_norm_params['scale']) - self.assertTrue(batch_norm_params['is_training']) - - def test_return_batch_norm_params_with_notrain_during_eval(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - batch_norm { - decay: 0.7 - center: false - scale: true - epsilon: 0.03 - train: true - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=False) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['normalizer_fn'], slim.batch_norm) - batch_norm_params = conv_scope_arguments['normalizer_params'] - self.assertAlmostEqual(batch_norm_params['decay'], 0.7) - self.assertAlmostEqual(batch_norm_params['epsilon'], 0.03) - self.assertFalse(batch_norm_params['center']) - self.assertTrue(batch_norm_params['scale']) - self.assertFalse(batch_norm_params['is_training']) - - def test_return_batch_norm_params_with_notrain_when_train_is_false(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - batch_norm { - decay: 0.7 - center: false - scale: true - epsilon: 0.03 - train: false - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['normalizer_fn'], slim.batch_norm) - batch_norm_params = conv_scope_arguments['normalizer_params'] - self.assertAlmostEqual(batch_norm_params['decay'], 0.7) - self.assertAlmostEqual(batch_norm_params['epsilon'], 0.03) - self.assertFalse(batch_norm_params['center']) - self.assertTrue(batch_norm_params['scale']) - self.assertFalse(batch_norm_params['is_training']) - - def test_do_not_use_batch_norm_if_default(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['normalizer_fn'], None) - self.assertEqual(conv_scope_arguments['normalizer_params'], None) - - def test_use_none_activation(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - activation: NONE - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['activation_fn'], None) - - def test_use_relu_activation(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - activation: RELU - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['activation_fn'], tf.nn.relu) - - def test_use_relu_6_activation(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - activation: RELU_6 - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - self.assertEqual(conv_scope_arguments['activation_fn'], tf.nn.relu6) - - def _assert_variance_in_range(self, initializer, shape, variance, - tol=1e-2): - with tf.Graph().as_default() as g: - with self.test_session(graph=g) as sess: - var = tf.get_variable( - name='test', - shape=shape, - dtype=tf.float32, - initializer=initializer) - sess.run(tf.global_variables_initializer()) - values = sess.run(var) - self.assertAllClose(np.var(values), variance, tol, tol) - - def test_variance_in_range_with_variance_scaling_initializer_fan_in(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - variance_scaling_initializer { - factor: 2.0 - mode: FAN_IN - uniform: false - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - initializer = conv_scope_arguments['weights_initializer'] - self._assert_variance_in_range(initializer, shape=[100, 40], - variance=2. / 100.) - - def test_variance_in_range_with_variance_scaling_initializer_fan_out(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - variance_scaling_initializer { - factor: 2.0 - mode: FAN_OUT - uniform: false - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - initializer = conv_scope_arguments['weights_initializer'] - self._assert_variance_in_range(initializer, shape=[100, 40], - variance=2. / 40.) - - def test_variance_in_range_with_variance_scaling_initializer_fan_avg(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - variance_scaling_initializer { - factor: 2.0 - mode: FAN_AVG - uniform: false - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - initializer = conv_scope_arguments['weights_initializer'] - self._assert_variance_in_range(initializer, shape=[100, 40], - variance=4. / (100. + 40.)) - - def test_variance_in_range_with_variance_scaling_initializer_uniform(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - variance_scaling_initializer { - factor: 2.0 - mode: FAN_IN - uniform: true - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - initializer = conv_scope_arguments['weights_initializer'] - self._assert_variance_in_range(initializer, shape=[100, 40], - variance=2. / 100.) - - def test_variance_in_range_with_truncated_normal_initializer(self): - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - mean: 0.0 - stddev: 0.8 - } - } - """ - conv_hyperparams_proto = hyperparams_pb2.Hyperparams() - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams_proto) - scope = hyperparams_builder.build(conv_hyperparams_proto, is_training=True) - conv_scope_arguments = scope.values()[0] - initializer = conv_scope_arguments['weights_initializer'] - self._assert_variance_in_range(initializer, shape=[100, 40], - variance=0.49, tol=1e-1) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/image_resizer_builder.py b/object_detection/builders/image_resizer_builder.py deleted file mode 100644 index 9d81c7d3..00000000 --- a/object_detection/builders/image_resizer_builder.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Builder function for image resizing operations.""" -import functools -import tensorflow as tf - -from object_detection.core import preprocessor -from object_detection.protos import image_resizer_pb2 - - -def _tf_resize_method(resize_method): - """Maps image resize method from enumeration type to TensorFlow. - - Args: - resize_method: The resize_method attribute of keep_aspect_ratio_resizer or - fixed_shape_resizer. - - Returns: - method: The corresponding TensorFlow ResizeMethod. - - Raises: - ValueError: if `resize_method` is of unknown type. - """ - dict_method = { - image_resizer_pb2.BILINEAR: - tf.image.ResizeMethod.BILINEAR, - image_resizer_pb2.NEAREST_NEIGHBOR: - tf.image.ResizeMethod.NEAREST_NEIGHBOR, - image_resizer_pb2.BICUBIC: - tf.image.ResizeMethod.BICUBIC, - image_resizer_pb2.AREA: - tf.image.ResizeMethod.AREA - } - if resize_method in dict_method: - return dict_method[resize_method] - else: - raise ValueError('Unknown resize_method') - - -def build(image_resizer_config): - """Builds callable for image resizing operations. - - Args: - image_resizer_config: image_resizer.proto object containing parameters for - an image resizing operation. - - Returns: - image_resizer_fn: Callable for image resizing. This callable always takes - a rank-3 image tensor (corresponding to a single image) and returns a - rank-3 image tensor, possibly with new spatial dimensions. - - Raises: - ValueError: if `image_resizer_config` is of incorrect type. - ValueError: if `image_resizer_config.image_resizer_oneof` is of expected - type. - ValueError: if min_dimension > max_dimension when keep_aspect_ratio_resizer - is used. - """ - if not isinstance(image_resizer_config, image_resizer_pb2.ImageResizer): - raise ValueError('image_resizer_config not of type ' - 'image_resizer_pb2.ImageResizer.') - - if image_resizer_config.WhichOneof( - 'image_resizer_oneof') == 'keep_aspect_ratio_resizer': - keep_aspect_ratio_config = image_resizer_config.keep_aspect_ratio_resizer - if not (keep_aspect_ratio_config.min_dimension <= - keep_aspect_ratio_config.max_dimension): - raise ValueError('min_dimension > max_dimension') - method = _tf_resize_method(keep_aspect_ratio_config.resize_method) - return functools.partial( - preprocessor.resize_to_range, - min_dimension=keep_aspect_ratio_config.min_dimension, - max_dimension=keep_aspect_ratio_config.max_dimension, - method=method) - if image_resizer_config.WhichOneof( - 'image_resizer_oneof') == 'fixed_shape_resizer': - fixed_shape_resizer_config = image_resizer_config.fixed_shape_resizer - method = _tf_resize_method(fixed_shape_resizer_config.resize_method) - return functools.partial( - preprocessor.resize_image, - new_height=fixed_shape_resizer_config.height, - new_width=fixed_shape_resizer_config.width, - method=method) - raise ValueError('Invalid image resizer option.') diff --git a/object_detection/builders/image_resizer_builder_test.py b/object_detection/builders/image_resizer_builder_test.py deleted file mode 100644 index 4ef557a5..00000000 --- a/object_detection/builders/image_resizer_builder_test.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Tests for object_detection.builders.image_resizer_builder.""" -import numpy as np -import tensorflow as tf -from google.protobuf import text_format -from object_detection.builders import image_resizer_builder -from object_detection.protos import image_resizer_pb2 - - -class ImageResizerBuilderTest(tf.test.TestCase): - - def _shape_of_resized_random_image_given_text_proto(self, input_shape, - text_proto): - image_resizer_config = image_resizer_pb2.ImageResizer() - text_format.Merge(text_proto, image_resizer_config) - image_resizer_fn = image_resizer_builder.build(image_resizer_config) - images = tf.to_float( - tf.random_uniform(input_shape, minval=0, maxval=255, dtype=tf.int32)) - resized_images = image_resizer_fn(images) - with self.test_session() as sess: - return sess.run(resized_images).shape - - def test_built_keep_aspect_ratio_resizer_returns_expected_shape(self): - image_resizer_text_proto = """ - keep_aspect_ratio_resizer { - min_dimension: 10 - max_dimension: 20 - } - """ - input_shape = (50, 25, 3) - expected_output_shape = (20, 10, 3) - output_shape = self._shape_of_resized_random_image_given_text_proto( - input_shape, image_resizer_text_proto) - self.assertEqual(output_shape, expected_output_shape) - - def test_built_fixed_shape_resizer_returns_expected_shape(self): - image_resizer_text_proto = """ - fixed_shape_resizer { - height: 10 - width: 20 - } - """ - input_shape = (50, 25, 3) - expected_output_shape = (10, 20, 3) - output_shape = self._shape_of_resized_random_image_given_text_proto( - input_shape, image_resizer_text_proto) - self.assertEqual(output_shape, expected_output_shape) - - def test_raises_error_on_invalid_input(self): - invalid_input = 'invalid_input' - with self.assertRaises(ValueError): - image_resizer_builder.build(invalid_input) - - def _resized_image_given_text_proto(self, image, text_proto): - image_resizer_config = image_resizer_pb2.ImageResizer() - text_format.Merge(text_proto, image_resizer_config) - image_resizer_fn = image_resizer_builder.build(image_resizer_config) - image_placeholder = tf.placeholder(tf.uint8, [1, None, None, 3]) - resized_image = image_resizer_fn(image_placeholder) - with self.test_session() as sess: - return sess.run(resized_image, feed_dict={image_placeholder: image}) - - def test_fixed_shape_resizer_nearest_neighbor_method(self): - image_resizer_text_proto = """ - fixed_shape_resizer { - height: 1 - width: 1 - resize_method: NEAREST_NEIGHBOR - } - """ - image = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) - image = np.expand_dims(image, axis=2) - image = np.tile(image, (1, 1, 3)) - image = np.expand_dims(image, axis=0) - resized_image = self._resized_image_given_text_proto( - image, image_resizer_text_proto) - vals = np.unique(resized_image).tolist() - self.assertEqual(len(vals), 1) - self.assertEqual(vals[0], 1) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/input_reader_builder.py b/object_detection/builders/input_reader_builder.py deleted file mode 100644 index 530e879c..00000000 --- a/object_detection/builders/input_reader_builder.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Input reader builder. - -Creates data sources for DetectionModels from an InputReader config. See -input_reader.proto for options. - -Note: If users wishes to also use their own InputReaders with the Object -Detection configuration framework, they should define their own builder function -that wraps the build function. -""" - -import tensorflow as tf - -from object_detection.data_decoders import tf_example_decoder -from object_detection.protos import input_reader_pb2 - -parallel_reader = tf.contrib.slim.parallel_reader - - -def build(input_reader_config): - """Builds a tensor dictionary based on the InputReader config. - - Args: - input_reader_config: A input_reader_pb2.InputReader object. - - Returns: - A tensor dict based on the input_reader_config. - - Raises: - ValueError: On invalid input reader proto. - ValueError: If no input paths are specified. - """ - if not isinstance(input_reader_config, input_reader_pb2.InputReader): - raise ValueError('input_reader_config not of type ' - 'input_reader_pb2.InputReader.') - - if input_reader_config.WhichOneof('input_reader') == 'tf_record_input_reader': - config = input_reader_config.tf_record_input_reader - if not config.input_path: - raise ValueError('At least one input path must be specified in ' - '`input_reader_config`.') - _, string_tensor = parallel_reader.parallel_read( - config.input_path[:], # Convert `RepeatedScalarContainer` to list. - reader_class=tf.TFRecordReader, - num_epochs=(input_reader_config.num_epochs - if input_reader_config.num_epochs else None), - num_readers=input_reader_config.num_readers, - shuffle=input_reader_config.shuffle, - dtypes=[tf.string, tf.string], - capacity=input_reader_config.queue_capacity, - min_after_dequeue=input_reader_config.min_after_dequeue) - - label_map_proto_file = None - if input_reader_config.HasField('label_map_path'): - label_map_proto_file = input_reader_config.label_map_path - decoder = tf_example_decoder.TfExampleDecoder( - load_instance_masks=input_reader_config.load_instance_masks, - label_map_proto_file=label_map_proto_file) - return decoder.decode(string_tensor) - - raise ValueError('Unsupported input_reader_config.') diff --git a/object_detection/builders/input_reader_builder_test.py b/object_detection/builders/input_reader_builder_test.py deleted file mode 100644 index f09f60e5..00000000 --- a/object_detection/builders/input_reader_builder_test.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for input_reader_builder.""" - -import os -import numpy as np -import tensorflow as tf - -from google.protobuf import text_format - -from tensorflow.core.example import example_pb2 -from tensorflow.core.example import feature_pb2 -from object_detection.builders import input_reader_builder -from object_detection.core import standard_fields as fields -from object_detection.protos import input_reader_pb2 - - -class InputReaderBuilderTest(tf.test.TestCase): - - def create_tf_record(self): - path = os.path.join(self.get_temp_dir(), 'tfrecord') - writer = tf.python_io.TFRecordWriter(path) - - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - flat_mask = (4 * 5) * [1.0] - with self.test_session(): - encoded_jpeg = tf.image.encode_jpeg(tf.constant(image_tensor)).eval() - example = example_pb2.Example(features=feature_pb2.Features(feature={ - 'image/encoded': feature_pb2.Feature( - bytes_list=feature_pb2.BytesList(value=[encoded_jpeg])), - 'image/format': feature_pb2.Feature( - bytes_list=feature_pb2.BytesList(value=['jpeg'.encode('utf-8')])), - 'image/height': feature_pb2.Feature( - int64_list=feature_pb2.Int64List(value=[4])), - 'image/width': feature_pb2.Feature( - int64_list=feature_pb2.Int64List(value=[5])), - 'image/object/bbox/xmin': feature_pb2.Feature( - float_list=feature_pb2.FloatList(value=[0.0])), - 'image/object/bbox/xmax': feature_pb2.Feature( - float_list=feature_pb2.FloatList(value=[1.0])), - 'image/object/bbox/ymin': feature_pb2.Feature( - float_list=feature_pb2.FloatList(value=[0.0])), - 'image/object/bbox/ymax': feature_pb2.Feature( - float_list=feature_pb2.FloatList(value=[1.0])), - 'image/object/class/label': feature_pb2.Feature( - int64_list=feature_pb2.Int64List(value=[2])), - 'image/object/mask': feature_pb2.Feature( - float_list=feature_pb2.FloatList(value=flat_mask)), - })) - writer.write(example.SerializeToString()) - writer.close() - - return path - - def test_build_tf_record_input_reader(self): - tf_record_path = self.create_tf_record() - - input_reader_text_proto = """ - shuffle: false - num_readers: 1 - tf_record_input_reader {{ - input_path: '{0}' - }} - """.format(tf_record_path) - input_reader_proto = input_reader_pb2.InputReader() - text_format.Merge(input_reader_text_proto, input_reader_proto) - tensor_dict = input_reader_builder.build(input_reader_proto) - - sv = tf.train.Supervisor(logdir=self.get_temp_dir()) - with sv.prepare_or_wait_for_session() as sess: - sv.start_queue_runners(sess) - output_dict = sess.run(tensor_dict) - - self.assertTrue(fields.InputDataFields.groundtruth_instance_masks - not in output_dict) - self.assertEquals( - (4, 5, 3), output_dict[fields.InputDataFields.image].shape) - self.assertEquals( - [2], output_dict[fields.InputDataFields.groundtruth_classes]) - self.assertEquals( - (1, 4), output_dict[fields.InputDataFields.groundtruth_boxes].shape) - self.assertAllEqual( - [0.0, 0.0, 1.0, 1.0], - output_dict[fields.InputDataFields.groundtruth_boxes][0]) - - def test_build_tf_record_input_reader_and_load_instance_masks(self): - tf_record_path = self.create_tf_record() - - input_reader_text_proto = """ - shuffle: false - num_readers: 1 - load_instance_masks: true - tf_record_input_reader {{ - input_path: '{0}' - }} - """.format(tf_record_path) - input_reader_proto = input_reader_pb2.InputReader() - text_format.Merge(input_reader_text_proto, input_reader_proto) - tensor_dict = input_reader_builder.build(input_reader_proto) - - sv = tf.train.Supervisor(logdir=self.get_temp_dir()) - with sv.prepare_or_wait_for_session() as sess: - sv.start_queue_runners(sess) - output_dict = sess.run(tensor_dict) - - self.assertEquals( - (4, 5, 3), output_dict[fields.InputDataFields.image].shape) - self.assertEquals( - [2], output_dict[fields.InputDataFields.groundtruth_classes]) - self.assertEquals( - (1, 4), output_dict[fields.InputDataFields.groundtruth_boxes].shape) - self.assertAllEqual( - [0.0, 0.0, 1.0, 1.0], - output_dict[fields.InputDataFields.groundtruth_boxes][0]) - self.assertAllEqual( - (1, 4, 5), - output_dict[fields.InputDataFields.groundtruth_instance_masks].shape) - - def test_raises_error_with_no_input_paths(self): - input_reader_text_proto = """ - shuffle: false - num_readers: 1 - load_instance_masks: true - """ - input_reader_proto = input_reader_pb2.InputReader() - text_format.Merge(input_reader_text_proto, input_reader_proto) - with self.assertRaises(ValueError): - input_reader_builder.build(input_reader_proto) - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/losses_builder.py b/object_detection/builders/losses_builder.py deleted file mode 100644 index c2b0a1f1..00000000 --- a/object_detection/builders/losses_builder.py +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""A function to build localization and classification losses from config.""" - -from object_detection.core import losses -from object_detection.protos import losses_pb2 - - -def build(loss_config): - """Build losses based on the config. - - Builds classification, localization losses and optionally a hard example miner - based on the config. - - Args: - loss_config: A losses_pb2.Loss object. - - Returns: - classification_loss: Classification loss object. - localization_loss: Localization loss object. - classification_weight: Classification loss weight. - localization_weight: Localization loss weight. - hard_example_miner: Hard example miner object. - - Raises: - ValueError: If hard_example_miner is used with sigmoid_focal_loss. - """ - classification_loss = _build_classification_loss( - loss_config.classification_loss) - localization_loss = _build_localization_loss( - loss_config.localization_loss) - classification_weight = loss_config.classification_weight - localization_weight = loss_config.localization_weight - hard_example_miner = None - if loss_config.HasField('hard_example_miner'): - if (loss_config.classification_loss.WhichOneof('classification_loss') == - 'weighted_sigmoid_focal'): - raise ValueError('HardExampleMiner should not be used with sigmoid focal ' - 'loss') - hard_example_miner = build_hard_example_miner( - loss_config.hard_example_miner, - classification_weight, - localization_weight) - return (classification_loss, localization_loss, - classification_weight, - localization_weight, hard_example_miner) - - -def build_hard_example_miner(config, - classification_weight, - localization_weight): - """Builds hard example miner based on the config. - - Args: - config: A losses_pb2.HardExampleMiner object. - classification_weight: Classification loss weight. - localization_weight: Localization loss weight. - - Returns: - Hard example miner. - - """ - loss_type = None - if config.loss_type == losses_pb2.HardExampleMiner.BOTH: - loss_type = 'both' - if config.loss_type == losses_pb2.HardExampleMiner.CLASSIFICATION: - loss_type = 'cls' - if config.loss_type == losses_pb2.HardExampleMiner.LOCALIZATION: - loss_type = 'loc' - - max_negatives_per_positive = None - num_hard_examples = None - if config.max_negatives_per_positive > 0: - max_negatives_per_positive = config.max_negatives_per_positive - if config.num_hard_examples > 0: - num_hard_examples = config.num_hard_examples - hard_example_miner = losses.HardExampleMiner( - num_hard_examples=num_hard_examples, - iou_threshold=config.iou_threshold, - loss_type=loss_type, - cls_loss_weight=classification_weight, - loc_loss_weight=localization_weight, - max_negatives_per_positive=max_negatives_per_positive, - min_negatives_per_image=config.min_negatives_per_image) - return hard_example_miner - - -def build_faster_rcnn_classification_loss(loss_config): - """Builds a classification loss for Faster RCNN based on the loss config. - - Args: - loss_config: A losses_pb2.ClassificationLoss object. - - Returns: - Loss based on the config. - - Raises: - ValueError: On invalid loss_config. - """ - if not isinstance(loss_config, losses_pb2.ClassificationLoss): - raise ValueError('loss_config not of type losses_pb2.ClassificationLoss.') - - loss_type = loss_config.WhichOneof('classification_loss') - - if loss_type == 'weighted_sigmoid': - config = loss_config.weighted_sigmoid - return losses.WeightedSigmoidClassificationLoss( - anchorwise_output=config.anchorwise_output) - if loss_type == 'weighted_softmax': - config = loss_config.weighted_softmax - return losses.WeightedSoftmaxClassificationLoss( - anchorwise_output=config.anchorwise_output) - - # By default, Faster RCNN second stage classifier uses Softmax loss - # with anchor-wise outputs. - return losses.WeightedSoftmaxClassificationLoss( - anchorwise_output=True) - - -def _build_localization_loss(loss_config): - """Builds a localization loss based on the loss config. - - Args: - loss_config: A losses_pb2.LocalizationLoss object. - - Returns: - Loss based on the config. - - Raises: - ValueError: On invalid loss_config. - """ - if not isinstance(loss_config, losses_pb2.LocalizationLoss): - raise ValueError('loss_config not of type losses_pb2.LocalizationLoss.') - - loss_type = loss_config.WhichOneof('localization_loss') - - if loss_type == 'weighted_l2': - config = loss_config.weighted_l2 - return losses.WeightedL2LocalizationLoss( - anchorwise_output=config.anchorwise_output) - - if loss_type == 'weighted_smooth_l1': - config = loss_config.weighted_smooth_l1 - return losses.WeightedSmoothL1LocalizationLoss( - anchorwise_output=config.anchorwise_output) - - if loss_type == 'weighted_iou': - return losses.WeightedIOULocalizationLoss() - - raise ValueError('Empty loss config.') - - -def _build_classification_loss(loss_config): - """Builds a classification loss based on the loss config. - - Args: - loss_config: A losses_pb2.ClassificationLoss object. - - Returns: - Loss based on the config. - - Raises: - ValueError: On invalid loss_config. - """ - if not isinstance(loss_config, losses_pb2.ClassificationLoss): - raise ValueError('loss_config not of type losses_pb2.ClassificationLoss.') - - loss_type = loss_config.WhichOneof('classification_loss') - - if loss_type == 'weighted_sigmoid': - config = loss_config.weighted_sigmoid - return losses.WeightedSigmoidClassificationLoss( - anchorwise_output=config.anchorwise_output) - - if loss_type == 'weighted_sigmoid_focal': - config = loss_config.weighted_sigmoid_focal - alpha = None - if config.HasField('alpha'): - alpha = config.alpha - return losses.SigmoidFocalClassificationLoss( - anchorwise_output=config.anchorwise_output, - gamma=config.gamma, - alpha=alpha) - - if loss_type == 'weighted_softmax': - config = loss_config.weighted_softmax - return losses.WeightedSoftmaxClassificationLoss( - anchorwise_output=config.anchorwise_output, - logit_scale=config.logit_scale) - - if loss_type == 'bootstrapped_sigmoid': - config = loss_config.bootstrapped_sigmoid - return losses.BootstrappedSigmoidClassificationLoss( - alpha=config.alpha, - bootstrap_type=('hard' if config.hard_bootstrap else 'soft'), - anchorwise_output=config.anchorwise_output) - - raise ValueError('Empty loss config.') diff --git a/object_detection/builders/losses_builder_test.py b/object_detection/builders/losses_builder_test.py deleted file mode 100644 index d4105203..00000000 --- a/object_detection/builders/losses_builder_test.py +++ /dev/null @@ -1,438 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for losses_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.builders import losses_builder -from object_detection.core import losses -from object_detection.protos import losses_pb2 - - -class LocalizationLossBuilderTest(tf.test.TestCase): - - def test_build_weighted_l2_localization_loss(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_softmax { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, localization_loss, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(localization_loss, - losses.WeightedL2LocalizationLoss)) - - def test_build_weighted_smooth_l1_localization_loss(self): - losses_text_proto = """ - localization_loss { - weighted_smooth_l1 { - } - } - classification_loss { - weighted_softmax { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, localization_loss, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(localization_loss, - losses.WeightedSmoothL1LocalizationLoss)) - - def test_build_weighted_iou_localization_loss(self): - losses_text_proto = """ - localization_loss { - weighted_iou { - } - } - classification_loss { - weighted_softmax { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, localization_loss, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(localization_loss, - losses.WeightedIOULocalizationLoss)) - - def test_anchorwise_output(self): - losses_text_proto = """ - localization_loss { - weighted_smooth_l1 { - anchorwise_output: true - } - } - classification_loss { - weighted_softmax { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, localization_loss, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(localization_loss, - losses.WeightedSmoothL1LocalizationLoss)) - predictions = tf.constant([[[0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 1.0, 1.0]]]) - targets = tf.constant([[[0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 1.0, 1.0]]]) - weights = tf.constant([[1.0, 1.0]]) - loss = localization_loss(predictions, targets, weights=weights) - self.assertEqual(loss.shape, [1, 2]) - - def test_raise_error_on_empty_localization_config(self): - losses_text_proto = """ - classification_loss { - weighted_softmax { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - with self.assertRaises(ValueError): - losses_builder._build_localization_loss(losses_proto) - - -class ClassificationLossBuilderTest(tf.test.TestCase): - - def test_build_weighted_sigmoid_classification_loss(self): - losses_text_proto = """ - classification_loss { - weighted_sigmoid { - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSigmoidClassificationLoss)) - - def test_build_weighted_sigmoid_focal_classification_loss(self): - losses_text_proto = """ - classification_loss { - weighted_sigmoid_focal { - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.SigmoidFocalClassificationLoss)) - self.assertAlmostEqual(classification_loss._alpha, None) - self.assertAlmostEqual(classification_loss._gamma, 2.0) - - def test_build_weighted_sigmoid_focal_loss_non_default(self): - losses_text_proto = """ - classification_loss { - weighted_sigmoid_focal { - alpha: 0.25 - gamma: 3.0 - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.SigmoidFocalClassificationLoss)) - self.assertAlmostEqual(classification_loss._alpha, 0.25) - self.assertAlmostEqual(classification_loss._gamma, 3.0) - - def test_build_weighted_softmax_classification_loss(self): - losses_text_proto = """ - classification_loss { - weighted_softmax { - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSoftmaxClassificationLoss)) - - def test_build_weighted_softmax_classification_loss_with_logit_scale(self): - losses_text_proto = """ - classification_loss { - weighted_softmax { - logit_scale: 2.0 - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSoftmaxClassificationLoss)) - - def test_build_bootstrapped_sigmoid_classification_loss(self): - losses_text_proto = """ - classification_loss { - bootstrapped_sigmoid { - alpha: 0.5 - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.BootstrappedSigmoidClassificationLoss)) - - def test_anchorwise_output(self): - losses_text_proto = """ - classification_loss { - weighted_sigmoid { - anchorwise_output: true - } - } - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss, _, _, _, _ = losses_builder.build(losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSigmoidClassificationLoss)) - predictions = tf.constant([[[0.0, 1.0, 0.0], [0.0, 0.5, 0.5]]]) - targets = tf.constant([[[0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]]) - weights = tf.constant([[1.0, 1.0]]) - loss = classification_loss(predictions, targets, weights=weights) - self.assertEqual(loss.shape, [1, 2]) - - def test_raise_error_on_empty_config(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - with self.assertRaises(ValueError): - losses_builder.build(losses_proto) - - -class HardExampleMinerBuilderTest(tf.test.TestCase): - - def test_do_not_build_hard_example_miner_by_default(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_softmax { - } - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, _, _, _, hard_example_miner = losses_builder.build(losses_proto) - self.assertEqual(hard_example_miner, None) - - def test_build_hard_example_miner_for_classification_loss(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_softmax { - } - } - hard_example_miner { - loss_type: CLASSIFICATION - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, _, _, _, hard_example_miner = losses_builder.build(losses_proto) - self.assertTrue(isinstance(hard_example_miner, losses.HardExampleMiner)) - self.assertEqual(hard_example_miner._loss_type, 'cls') - - def test_build_hard_example_miner_for_localization_loss(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_softmax { - } - } - hard_example_miner { - loss_type: LOCALIZATION - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, _, _, _, hard_example_miner = losses_builder.build(losses_proto) - self.assertTrue(isinstance(hard_example_miner, losses.HardExampleMiner)) - self.assertEqual(hard_example_miner._loss_type, 'loc') - - def test_build_hard_example_miner_with_non_default_values(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_softmax { - } - } - hard_example_miner { - num_hard_examples: 32 - iou_threshold: 0.5 - loss_type: LOCALIZATION - max_negatives_per_positive: 10 - min_negatives_per_image: 3 - } - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - _, _, _, _, hard_example_miner = losses_builder.build(losses_proto) - self.assertTrue(isinstance(hard_example_miner, losses.HardExampleMiner)) - self.assertEqual(hard_example_miner._num_hard_examples, 32) - self.assertAlmostEqual(hard_example_miner._iou_threshold, 0.5) - self.assertEqual(hard_example_miner._max_negatives_per_positive, 10) - self.assertEqual(hard_example_miner._min_negatives_per_image, 3) - - -class LossBuilderTest(tf.test.TestCase): - - def test_build_all_loss_parameters(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_softmax { - } - } - hard_example_miner { - } - classification_weight: 0.8 - localization_weight: 0.2 - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - (classification_loss, localization_loss, - classification_weight, localization_weight, - hard_example_miner) = losses_builder.build(losses_proto) - self.assertTrue(isinstance(hard_example_miner, losses.HardExampleMiner)) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSoftmaxClassificationLoss)) - self.assertTrue(isinstance(localization_loss, - losses.WeightedL2LocalizationLoss)) - self.assertAlmostEqual(classification_weight, 0.8) - self.assertAlmostEqual(localization_weight, 0.2) - - def test_raise_error_when_both_focal_loss_and_hard_example_miner(self): - losses_text_proto = """ - localization_loss { - weighted_l2 { - } - } - classification_loss { - weighted_sigmoid_focal { - } - } - hard_example_miner { - } - classification_weight: 0.8 - localization_weight: 0.2 - """ - losses_proto = losses_pb2.Loss() - text_format.Merge(losses_text_proto, losses_proto) - with self.assertRaises(ValueError): - losses_builder.build(losses_proto) - - -class FasterRcnnClassificationLossBuilderTest(tf.test.TestCase): - - def test_build_sigmoid_loss(self): - losses_text_proto = """ - weighted_sigmoid { - } - """ - losses_proto = losses_pb2.ClassificationLoss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss = losses_builder.build_faster_rcnn_classification_loss( - losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSigmoidClassificationLoss)) - - def test_build_softmax_loss(self): - losses_text_proto = """ - weighted_softmax { - } - """ - losses_proto = losses_pb2.ClassificationLoss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss = losses_builder.build_faster_rcnn_classification_loss( - losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSoftmaxClassificationLoss)) - - def test_build_softmax_loss_by_default(self): - losses_text_proto = """ - """ - losses_proto = losses_pb2.ClassificationLoss() - text_format.Merge(losses_text_proto, losses_proto) - classification_loss = losses_builder.build_faster_rcnn_classification_loss( - losses_proto) - self.assertTrue(isinstance(classification_loss, - losses.WeightedSoftmaxClassificationLoss)) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/matcher_builder.py b/object_detection/builders/matcher_builder.py deleted file mode 100644 index 6ec49da9..00000000 --- a/object_detection/builders/matcher_builder.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""A function to build an object detection matcher from configuration.""" - -from object_detection.matchers import argmax_matcher -from object_detection.matchers import bipartite_matcher -from object_detection.protos import matcher_pb2 - - -def build(matcher_config): - """Builds a matcher object based on the matcher config. - - Args: - matcher_config: A matcher.proto object containing the config for the desired - Matcher. - - Returns: - Matcher based on the config. - - Raises: - ValueError: On empty matcher proto. - """ - if not isinstance(matcher_config, matcher_pb2.Matcher): - raise ValueError('matcher_config not of type matcher_pb2.Matcher.') - if matcher_config.WhichOneof('matcher_oneof') == 'argmax_matcher': - matcher = matcher_config.argmax_matcher - matched_threshold = unmatched_threshold = None - if not matcher.ignore_thresholds: - matched_threshold = matcher.matched_threshold - unmatched_threshold = matcher.unmatched_threshold - return argmax_matcher.ArgMaxMatcher( - matched_threshold=matched_threshold, - unmatched_threshold=unmatched_threshold, - negatives_lower_than_unmatched=matcher.negatives_lower_than_unmatched, - force_match_for_each_row=matcher.force_match_for_each_row) - if matcher_config.WhichOneof('matcher_oneof') == 'bipartite_matcher': - return bipartite_matcher.GreedyBipartiteMatcher() - raise ValueError('Empty matcher.') diff --git a/object_detection/builders/matcher_builder_test.py b/object_detection/builders/matcher_builder_test.py deleted file mode 100644 index c4275aae..00000000 --- a/object_detection/builders/matcher_builder_test.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for matcher_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.builders import matcher_builder -from object_detection.matchers import argmax_matcher -from object_detection.matchers import bipartite_matcher -from object_detection.protos import matcher_pb2 - - -class MatcherBuilderTest(tf.test.TestCase): - - def test_build_arg_max_matcher_with_defaults(self): - matcher_text_proto = """ - argmax_matcher { - } - """ - matcher_proto = matcher_pb2.Matcher() - text_format.Merge(matcher_text_proto, matcher_proto) - matcher_object = matcher_builder.build(matcher_proto) - self.assertTrue(isinstance(matcher_object, argmax_matcher.ArgMaxMatcher)) - self.assertAlmostEqual(matcher_object._matched_threshold, 0.5) - self.assertAlmostEqual(matcher_object._unmatched_threshold, 0.5) - self.assertTrue(matcher_object._negatives_lower_than_unmatched) - self.assertFalse(matcher_object._force_match_for_each_row) - - def test_build_arg_max_matcher_without_thresholds(self): - matcher_text_proto = """ - argmax_matcher { - ignore_thresholds: true - } - """ - matcher_proto = matcher_pb2.Matcher() - text_format.Merge(matcher_text_proto, matcher_proto) - matcher_object = matcher_builder.build(matcher_proto) - self.assertTrue(isinstance(matcher_object, argmax_matcher.ArgMaxMatcher)) - self.assertEqual(matcher_object._matched_threshold, None) - self.assertEqual(matcher_object._unmatched_threshold, None) - self.assertTrue(matcher_object._negatives_lower_than_unmatched) - self.assertFalse(matcher_object._force_match_for_each_row) - - def test_build_arg_max_matcher_with_non_default_parameters(self): - matcher_text_proto = """ - argmax_matcher { - matched_threshold: 0.7 - unmatched_threshold: 0.3 - negatives_lower_than_unmatched: false - force_match_for_each_row: true - } - """ - matcher_proto = matcher_pb2.Matcher() - text_format.Merge(matcher_text_proto, matcher_proto) - matcher_object = matcher_builder.build(matcher_proto) - self.assertTrue(isinstance(matcher_object, argmax_matcher.ArgMaxMatcher)) - self.assertAlmostEqual(matcher_object._matched_threshold, 0.7) - self.assertAlmostEqual(matcher_object._unmatched_threshold, 0.3) - self.assertFalse(matcher_object._negatives_lower_than_unmatched) - self.assertTrue(matcher_object._force_match_for_each_row) - - def test_build_bipartite_matcher(self): - matcher_text_proto = """ - bipartite_matcher { - } - """ - matcher_proto = matcher_pb2.Matcher() - text_format.Merge(matcher_text_proto, matcher_proto) - matcher_object = matcher_builder.build(matcher_proto) - self.assertTrue( - isinstance(matcher_object, bipartite_matcher.GreedyBipartiteMatcher)) - - def test_raise_error_on_empty_matcher(self): - matcher_text_proto = """ - """ - matcher_proto = matcher_pb2.Matcher() - text_format.Merge(matcher_text_proto, matcher_proto) - with self.assertRaises(ValueError): - matcher_builder.build(matcher_proto) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/model_builder.py b/object_detection/builders/model_builder.py deleted file mode 100644 index 5467a91b..00000000 --- a/object_detection/builders/model_builder.py +++ /dev/null @@ -1,327 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""A function to build a DetectionModel from configuration.""" -from object_detection.builders import anchor_generator_builder -from object_detection.builders import box_coder_builder -from object_detection.builders import box_predictor_builder -from object_detection.builders import hyperparams_builder -from object_detection.builders import image_resizer_builder -from object_detection.builders import losses_builder -from object_detection.builders import matcher_builder -from object_detection.builders import post_processing_builder -from object_detection.builders import region_similarity_calculator_builder as sim_calc -from object_detection.core import box_predictor -from object_detection.meta_architectures import faster_rcnn_meta_arch -from object_detection.meta_architectures import rfcn_meta_arch -from object_detection.meta_architectures import ssd_meta_arch -from object_detection.models import faster_rcnn_inception_resnet_v2_feature_extractor as frcnn_inc_res -from object_detection.models import faster_rcnn_inception_v2_feature_extractor as frcnn_inc_v2 -from object_detection.models import faster_rcnn_nas_feature_extractor as frcnn_nas -from object_detection.models import faster_rcnn_resnet_v1_feature_extractor as frcnn_resnet_v1 -from object_detection.models.embedded_ssd_mobilenet_v1_feature_extractor import EmbeddedSSDMobileNetV1FeatureExtractor -from object_detection.models.ssd_inception_v2_feature_extractor import SSDInceptionV2FeatureExtractor -from object_detection.models.ssd_inception_v3_feature_extractor import SSDInceptionV3FeatureExtractor -from object_detection.models.ssd_mobilenet_v1_feature_extractor import SSDMobileNetV1FeatureExtractor -from object_detection.protos import model_pb2 - -# A map of names to SSD feature extractors. -SSD_FEATURE_EXTRACTOR_CLASS_MAP = { - 'ssd_inception_v2': SSDInceptionV2FeatureExtractor, - 'ssd_inception_v3': SSDInceptionV3FeatureExtractor, - 'ssd_mobilenet_v1': SSDMobileNetV1FeatureExtractor, - 'embedded_ssd_mobilenet_v1': EmbeddedSSDMobileNetV1FeatureExtractor, -} - -# A map of names to Faster R-CNN feature extractors. -FASTER_RCNN_FEATURE_EXTRACTOR_CLASS_MAP = { - 'faster_rcnn_nas': - frcnn_nas.FasterRCNNNASFeatureExtractor, - 'faster_rcnn_inception_resnet_v2': - frcnn_inc_res.FasterRCNNInceptionResnetV2FeatureExtractor, - 'faster_rcnn_inception_v2': - frcnn_inc_v2.FasterRCNNInceptionV2FeatureExtractor, - 'faster_rcnn_resnet50': - frcnn_resnet_v1.FasterRCNNResnet50FeatureExtractor, - 'faster_rcnn_resnet101': - frcnn_resnet_v1.FasterRCNNResnet101FeatureExtractor, - 'faster_rcnn_resnet152': - frcnn_resnet_v1.FasterRCNNResnet152FeatureExtractor, -} - - -def build(model_config, is_training): - """Builds a DetectionModel based on the model config. - - Args: - model_config: A model.proto object containing the config for the desired - DetectionModel. - is_training: True if this model is being built for training purposes. - - Returns: - DetectionModel based on the config. - - Raises: - ValueError: On invalid meta architecture or model. - """ - if not isinstance(model_config, model_pb2.DetectionModel): - raise ValueError('model_config not of type model_pb2.DetectionModel.') - meta_architecture = model_config.WhichOneof('model') - if meta_architecture == 'ssd': - return _build_ssd_model(model_config.ssd, is_training) - if meta_architecture == 'faster_rcnn': - return _build_faster_rcnn_model(model_config.faster_rcnn, is_training) - raise ValueError('Unknown meta architecture: {}'.format(meta_architecture)) - - -def _build_ssd_feature_extractor(feature_extractor_config, is_training, - reuse_weights=None): - """Builds a ssd_meta_arch.SSDFeatureExtractor based on config. - - Args: - feature_extractor_config: A SSDFeatureExtractor proto config from ssd.proto. - is_training: True if this feature extractor is being built for training. - reuse_weights: if the feature extractor should reuse weights. - - Returns: - ssd_meta_arch.SSDFeatureExtractor based on config. - - Raises: - ValueError: On invalid feature extractor type. - """ - feature_type = feature_extractor_config.type - depth_multiplier = feature_extractor_config.depth_multiplier - min_depth = feature_extractor_config.min_depth - pad_to_multiple = feature_extractor_config.pad_to_multiple - batch_norm_trainable = feature_extractor_config.batch_norm_trainable - conv_hyperparams = hyperparams_builder.build( - feature_extractor_config.conv_hyperparams, is_training) - - if feature_type not in SSD_FEATURE_EXTRACTOR_CLASS_MAP: - raise ValueError('Unknown ssd feature_extractor: {}'.format(feature_type)) - - feature_extractor_class = SSD_FEATURE_EXTRACTOR_CLASS_MAP[feature_type] - return feature_extractor_class(is_training, depth_multiplier, min_depth, - pad_to_multiple, conv_hyperparams, - batch_norm_trainable, reuse_weights) - - -def _build_ssd_model(ssd_config, is_training): - """Builds an SSD detection model based on the model config. - - Args: - ssd_config: A ssd.proto object containing the config for the desired - SSDMetaArch. - is_training: True if this model is being built for training purposes. - - Returns: - SSDMetaArch based on the config. - Raises: - ValueError: If ssd_config.type is not recognized (i.e. not registered in - model_class_map). - """ - num_classes = ssd_config.num_classes - - # Feature extractor - feature_extractor = _build_ssd_feature_extractor(ssd_config.feature_extractor, - is_training) - - box_coder = box_coder_builder.build(ssd_config.box_coder) - matcher = matcher_builder.build(ssd_config.matcher) - region_similarity_calculator = sim_calc.build( - ssd_config.similarity_calculator) - ssd_box_predictor = box_predictor_builder.build(hyperparams_builder.build, - ssd_config.box_predictor, - is_training, num_classes) - anchor_generator = anchor_generator_builder.build( - ssd_config.anchor_generator) - image_resizer_fn = image_resizer_builder.build(ssd_config.image_resizer) - non_max_suppression_fn, score_conversion_fn = post_processing_builder.build( - ssd_config.post_processing) - (classification_loss, localization_loss, classification_weight, - localization_weight, - hard_example_miner) = losses_builder.build(ssd_config.loss) - normalize_loss_by_num_matches = ssd_config.normalize_loss_by_num_matches - - return ssd_meta_arch.SSDMetaArch( - is_training, - anchor_generator, - ssd_box_predictor, - box_coder, - feature_extractor, - matcher, - region_similarity_calculator, - image_resizer_fn, - non_max_suppression_fn, - score_conversion_fn, - classification_loss, - localization_loss, - classification_weight, - localization_weight, - normalize_loss_by_num_matches, - hard_example_miner) - - -def _build_faster_rcnn_feature_extractor( - feature_extractor_config, is_training, reuse_weights=None): - """Builds a faster_rcnn_meta_arch.FasterRCNNFeatureExtractor based on config. - - Args: - feature_extractor_config: A FasterRcnnFeatureExtractor proto config from - faster_rcnn.proto. - is_training: True if this feature extractor is being built for training. - reuse_weights: if the feature extractor should reuse weights. - - Returns: - faster_rcnn_meta_arch.FasterRCNNFeatureExtractor based on config. - - Raises: - ValueError: On invalid feature extractor type. - """ - feature_type = feature_extractor_config.type - first_stage_features_stride = ( - feature_extractor_config.first_stage_features_stride) - batch_norm_trainable = feature_extractor_config.batch_norm_trainable - - if feature_type not in FASTER_RCNN_FEATURE_EXTRACTOR_CLASS_MAP: - raise ValueError('Unknown Faster R-CNN feature_extractor: {}'.format( - feature_type)) - feature_extractor_class = FASTER_RCNN_FEATURE_EXTRACTOR_CLASS_MAP[ - feature_type] - return feature_extractor_class( - is_training, first_stage_features_stride, - batch_norm_trainable, reuse_weights) - - -def _build_faster_rcnn_model(frcnn_config, is_training): - """Builds a Faster R-CNN or R-FCN detection model based on the model config. - - Builds R-FCN model if the second_stage_box_predictor in the config is of type - `rfcn_box_predictor` else builds a Faster R-CNN model. - - Args: - frcnn_config: A faster_rcnn.proto object containing the config for the - desired FasterRCNNMetaArch or RFCNMetaArch. - is_training: True if this model is being built for training purposes. - - Returns: - FasterRCNNMetaArch based on the config. - Raises: - ValueError: If frcnn_config.type is not recognized (i.e. not registered in - model_class_map). - """ - num_classes = frcnn_config.num_classes - image_resizer_fn = image_resizer_builder.build(frcnn_config.image_resizer) - - feature_extractor = _build_faster_rcnn_feature_extractor( - frcnn_config.feature_extractor, is_training) - - first_stage_only = frcnn_config.first_stage_only - first_stage_anchor_generator = anchor_generator_builder.build( - frcnn_config.first_stage_anchor_generator) - - first_stage_atrous_rate = frcnn_config.first_stage_atrous_rate - first_stage_box_predictor_arg_scope = hyperparams_builder.build( - frcnn_config.first_stage_box_predictor_conv_hyperparams, is_training) - first_stage_box_predictor_kernel_size = ( - frcnn_config.first_stage_box_predictor_kernel_size) - first_stage_box_predictor_depth = frcnn_config.first_stage_box_predictor_depth - first_stage_minibatch_size = frcnn_config.first_stage_minibatch_size - first_stage_positive_balance_fraction = ( - frcnn_config.first_stage_positive_balance_fraction) - first_stage_nms_score_threshold = frcnn_config.first_stage_nms_score_threshold - first_stage_nms_iou_threshold = frcnn_config.first_stage_nms_iou_threshold - first_stage_max_proposals = frcnn_config.first_stage_max_proposals - first_stage_loc_loss_weight = ( - frcnn_config.first_stage_localization_loss_weight) - first_stage_obj_loss_weight = frcnn_config.first_stage_objectness_loss_weight - - initial_crop_size = frcnn_config.initial_crop_size - maxpool_kernel_size = frcnn_config.maxpool_kernel_size - maxpool_stride = frcnn_config.maxpool_stride - - second_stage_box_predictor = box_predictor_builder.build( - hyperparams_builder.build, - frcnn_config.second_stage_box_predictor, - is_training=is_training, - num_classes=num_classes) - second_stage_batch_size = frcnn_config.second_stage_batch_size - second_stage_balance_fraction = frcnn_config.second_stage_balance_fraction - (second_stage_non_max_suppression_fn, second_stage_score_conversion_fn - ) = post_processing_builder.build(frcnn_config.second_stage_post_processing) - second_stage_localization_loss_weight = ( - frcnn_config.second_stage_localization_loss_weight) - second_stage_classification_loss = ( - losses_builder.build_faster_rcnn_classification_loss( - frcnn_config.second_stage_classification_loss)) - second_stage_classification_loss_weight = ( - frcnn_config.second_stage_classification_loss_weight) - second_stage_mask_prediction_loss_weight = ( - frcnn_config.second_stage_mask_prediction_loss_weight) - - hard_example_miner = None - if frcnn_config.HasField('hard_example_miner'): - hard_example_miner = losses_builder.build_hard_example_miner( - frcnn_config.hard_example_miner, - second_stage_classification_loss_weight, - second_stage_localization_loss_weight) - - common_kwargs = { - 'is_training': is_training, - 'num_classes': num_classes, - 'image_resizer_fn': image_resizer_fn, - 'feature_extractor': feature_extractor, - 'first_stage_only': first_stage_only, - 'first_stage_anchor_generator': first_stage_anchor_generator, - 'first_stage_atrous_rate': first_stage_atrous_rate, - 'first_stage_box_predictor_arg_scope': - first_stage_box_predictor_arg_scope, - 'first_stage_box_predictor_kernel_size': - first_stage_box_predictor_kernel_size, - 'first_stage_box_predictor_depth': first_stage_box_predictor_depth, - 'first_stage_minibatch_size': first_stage_minibatch_size, - 'first_stage_positive_balance_fraction': - first_stage_positive_balance_fraction, - 'first_stage_nms_score_threshold': first_stage_nms_score_threshold, - 'first_stage_nms_iou_threshold': first_stage_nms_iou_threshold, - 'first_stage_max_proposals': first_stage_max_proposals, - 'first_stage_localization_loss_weight': first_stage_loc_loss_weight, - 'first_stage_objectness_loss_weight': first_stage_obj_loss_weight, - 'second_stage_batch_size': second_stage_batch_size, - 'second_stage_balance_fraction': second_stage_balance_fraction, - 'second_stage_non_max_suppression_fn': - second_stage_non_max_suppression_fn, - 'second_stage_score_conversion_fn': second_stage_score_conversion_fn, - 'second_stage_localization_loss_weight': - second_stage_localization_loss_weight, - 'second_stage_classification_loss': - second_stage_classification_loss, - 'second_stage_classification_loss_weight': - second_stage_classification_loss_weight, - 'hard_example_miner': hard_example_miner} - - if isinstance(second_stage_box_predictor, box_predictor.RfcnBoxPredictor): - return rfcn_meta_arch.RFCNMetaArch( - second_stage_rfcn_box_predictor=second_stage_box_predictor, - **common_kwargs) - else: - return faster_rcnn_meta_arch.FasterRCNNMetaArch( - initial_crop_size=initial_crop_size, - maxpool_kernel_size=maxpool_kernel_size, - maxpool_stride=maxpool_stride, - second_stage_mask_rcnn_box_predictor=second_stage_box_predictor, - second_stage_mask_prediction_loss_weight=( - second_stage_mask_prediction_loss_weight), - **common_kwargs) diff --git a/object_detection/builders/model_builder_test.py b/object_detection/builders/model_builder_test.py deleted file mode 100644 index 5e217094..00000000 --- a/object_detection/builders/model_builder_test.py +++ /dev/null @@ -1,741 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.models.model_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.builders import model_builder -from object_detection.meta_architectures import faster_rcnn_meta_arch -from object_detection.meta_architectures import rfcn_meta_arch -from object_detection.meta_architectures import ssd_meta_arch -from object_detection.models import faster_rcnn_inception_resnet_v2_feature_extractor as frcnn_inc_res -from object_detection.models import faster_rcnn_inception_v2_feature_extractor as frcnn_inc_v2 -from object_detection.models import faster_rcnn_nas_feature_extractor as frcnn_nas -from object_detection.models import faster_rcnn_resnet_v1_feature_extractor as frcnn_resnet_v1 -from object_detection.models.ssd_inception_v2_feature_extractor import SSDInceptionV2FeatureExtractor -from object_detection.models.ssd_inception_v3_feature_extractor import SSDInceptionV3FeatureExtractor -from object_detection.models.ssd_mobilenet_v1_feature_extractor import SSDMobileNetV1FeatureExtractor -from object_detection.protos import model_pb2 - -FEATURE_EXTRACTOR_MAPS = { - 'faster_rcnn_resnet50': - frcnn_resnet_v1.FasterRCNNResnet50FeatureExtractor, - 'faster_rcnn_resnet101': - frcnn_resnet_v1.FasterRCNNResnet101FeatureExtractor, - 'faster_rcnn_resnet152': - frcnn_resnet_v1.FasterRCNNResnet152FeatureExtractor -} - - -class ModelBuilderTest(tf.test.TestCase): - - def create_model(self, model_config): - """Builds a DetectionModel based on the model config. - - Args: - model_config: A model.proto object containing the config for the desired - DetectionModel. - - Returns: - DetectionModel based on the config. - """ - return model_builder.build(model_config, is_training=True) - - def test_create_ssd_inception_v2_model_from_config(self): - model_text_proto = """ - ssd { - feature_extractor { - type: 'ssd_inception_v2' - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - box_coder { - faster_rcnn_box_coder { - } - } - matcher { - argmax_matcher { - } - } - similarity_calculator { - iou_similarity { - } - } - anchor_generator { - ssd_anchor_generator { - aspect_ratios: 1.0 - } - } - image_resizer { - fixed_shape_resizer { - height: 320 - width: 320 - } - } - box_predictor { - convolutional_box_predictor { - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - loss { - classification_loss { - weighted_softmax { - } - } - localization_loss { - weighted_smooth_l1 { - } - } - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = self.create_model(model_proto) - self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch) - self.assertIsInstance(model._feature_extractor, - SSDInceptionV2FeatureExtractor) - - def test_create_ssd_inception_v3_model_from_config(self): - model_text_proto = """ - ssd { - feature_extractor { - type: 'ssd_inception_v3' - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - box_coder { - faster_rcnn_box_coder { - } - } - matcher { - argmax_matcher { - } - } - similarity_calculator { - iou_similarity { - } - } - anchor_generator { - ssd_anchor_generator { - aspect_ratios: 1.0 - } - } - image_resizer { - fixed_shape_resizer { - height: 320 - width: 320 - } - } - box_predictor { - convolutional_box_predictor { - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - loss { - classification_loss { - weighted_softmax { - } - } - localization_loss { - weighted_smooth_l1 { - } - } - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = self.create_model(model_proto) - self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch) - self.assertIsInstance(model._feature_extractor, - SSDInceptionV3FeatureExtractor) - - def test_create_ssd_mobilenet_v1_model_from_config(self): - model_text_proto = """ - ssd { - feature_extractor { - type: 'ssd_mobilenet_v1' - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - batch_norm_trainable: true - } - box_coder { - faster_rcnn_box_coder { - } - } - matcher { - argmax_matcher { - } - } - similarity_calculator { - iou_similarity { - } - } - anchor_generator { - ssd_anchor_generator { - aspect_ratios: 1.0 - } - } - image_resizer { - fixed_shape_resizer { - height: 320 - width: 320 - } - } - box_predictor { - convolutional_box_predictor { - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - loss { - classification_loss { - weighted_softmax { - } - } - localization_loss { - weighted_smooth_l1 { - } - } - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = self.create_model(model_proto) - self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch) - self.assertIsInstance(model._feature_extractor, - SSDMobileNetV1FeatureExtractor) - self.assertTrue(model._feature_extractor._batch_norm_trainable) - - def test_create_faster_rcnn_resnet_v1_models_from_config(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_resnet101' - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - initial_crop_size: 14 - maxpool_kernel_size: 2 - maxpool_stride: 2 - second_stage_box_predictor { - mask_rcnn_box_predictor { - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.01 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - score_converter: SOFTMAX - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - for extractor_type, extractor_class in FEATURE_EXTRACTOR_MAPS.items(): - model_proto.faster_rcnn.feature_extractor.type = extractor_type - model = model_builder.build(model_proto, is_training=True) - self.assertIsInstance(model, faster_rcnn_meta_arch.FasterRCNNMetaArch) - self.assertIsInstance(model._feature_extractor, extractor_class) - - def test_create_faster_rcnn_resnet101_with_mask_prediction_enabled(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_resnet101' - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - initial_crop_size: 14 - maxpool_kernel_size: 2 - maxpool_stride: 2 - second_stage_box_predictor { - mask_rcnn_box_predictor { - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - predict_instance_masks: true - } - } - second_stage_mask_prediction_loss_weight: 3.0 - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.01 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - score_converter: SOFTMAX - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = model_builder.build(model_proto, is_training=True) - self.assertAlmostEqual(model._second_stage_mask_loss_weight, 3.0) - - def test_create_faster_rcnn_nas_model_from_config(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_nas' - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - initial_crop_size: 17 - maxpool_kernel_size: 1 - maxpool_stride: 1 - second_stage_box_predictor { - mask_rcnn_box_predictor { - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.01 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - score_converter: SOFTMAX - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = model_builder.build(model_proto, is_training=True) - self.assertIsInstance(model, faster_rcnn_meta_arch.FasterRCNNMetaArch) - self.assertIsInstance( - model._feature_extractor, - frcnn_nas.FasterRCNNNASFeatureExtractor) - - def test_create_faster_rcnn_inception_resnet_v2_model_from_config(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_inception_resnet_v2' - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - initial_crop_size: 17 - maxpool_kernel_size: 1 - maxpool_stride: 1 - second_stage_box_predictor { - mask_rcnn_box_predictor { - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.01 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - score_converter: SOFTMAX - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = model_builder.build(model_proto, is_training=True) - self.assertIsInstance(model, faster_rcnn_meta_arch.FasterRCNNMetaArch) - self.assertIsInstance( - model._feature_extractor, - frcnn_inc_res.FasterRCNNInceptionResnetV2FeatureExtractor) - - def test_create_faster_rcnn_inception_v2_model_from_config(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_inception_v2' - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - initial_crop_size: 14 - maxpool_kernel_size: 2 - maxpool_stride: 2 - second_stage_box_predictor { - mask_rcnn_box_predictor { - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.01 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - score_converter: SOFTMAX - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = model_builder.build(model_proto, is_training=True) - self.assertIsInstance(model, faster_rcnn_meta_arch.FasterRCNNMetaArch) - self.assertIsInstance(model._feature_extractor, - frcnn_inc_v2.FasterRCNNInceptionV2FeatureExtractor) - - def test_create_faster_rcnn_model_from_config_with_example_miner(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - feature_extractor { - type: 'faster_rcnn_inception_resnet_v2' - } - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - second_stage_box_predictor { - mask_rcnn_box_predictor { - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - hard_example_miner { - num_hard_examples: 10 - iou_threshold: 0.99 - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - model = model_builder.build(model_proto, is_training=True) - self.assertIsNotNone(model._hard_example_miner) - - def test_create_rfcn_resnet_v1_model_from_config(self): - model_text_proto = """ - faster_rcnn { - num_classes: 3 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_resnet101' - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 16 - width_stride: 16 - } - } - first_stage_box_predictor_conv_hyperparams { - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - initial_crop_size: 14 - maxpool_kernel_size: 2 - maxpool_stride: 2 - second_stage_box_predictor { - rfcn_box_predictor { - conv_hyperparams { - op: CONV - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - } - } - } - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.01 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - score_converter: SOFTMAX - } - }""" - model_proto = model_pb2.DetectionModel() - text_format.Merge(model_text_proto, model_proto) - for extractor_type, extractor_class in FEATURE_EXTRACTOR_MAPS.items(): - model_proto.faster_rcnn.feature_extractor.type = extractor_type - model = model_builder.build(model_proto, is_training=True) - self.assertIsInstance(model, rfcn_meta_arch.RFCNMetaArch) - self.assertIsInstance(model._feature_extractor, extractor_class) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/optimizer_builder.py b/object_detection/builders/optimizer_builder.py deleted file mode 100644 index cccaba99..00000000 --- a/object_detection/builders/optimizer_builder.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Functions to build DetectionModel training optimizers.""" - -import tensorflow as tf -from object_detection.utils import learning_schedules - - -def build(optimizer_config, global_summaries): - """Create optimizer based on config. - - Args: - optimizer_config: A Optimizer proto message. - global_summaries: A set to attach learning rate summary to. - - Returns: - An optimizer. - - Raises: - ValueError: when using an unsupported input data type. - """ - optimizer_type = optimizer_config.WhichOneof('optimizer') - optimizer = None - - if optimizer_type == 'rms_prop_optimizer': - config = optimizer_config.rms_prop_optimizer - optimizer = tf.train.RMSPropOptimizer( - _create_learning_rate(config.learning_rate, global_summaries), - decay=config.decay, - momentum=config.momentum_optimizer_value, - epsilon=config.epsilon) - - if optimizer_type == 'momentum_optimizer': - config = optimizer_config.momentum_optimizer - optimizer = tf.train.MomentumOptimizer( - _create_learning_rate(config.learning_rate, global_summaries), - momentum=config.momentum_optimizer_value) - - if optimizer_type == 'adam_optimizer': - config = optimizer_config.adam_optimizer - optimizer = tf.train.AdamOptimizer( - _create_learning_rate(config.learning_rate, global_summaries)) - - if optimizer is None: - raise ValueError('Optimizer %s not supported.' % optimizer_type) - - if optimizer_config.use_moving_average: - optimizer = tf.contrib.opt.MovingAverageOptimizer( - optimizer, average_decay=optimizer_config.moving_average_decay) - - return optimizer - - -def _create_learning_rate(learning_rate_config, global_summaries): - """Create optimizer learning rate based on config. - - Args: - learning_rate_config: A LearningRate proto message. - global_summaries: A set to attach learning rate summary to. - - Returns: - A learning rate. - - Raises: - ValueError: when using an unsupported input data type. - """ - learning_rate = None - learning_rate_type = learning_rate_config.WhichOneof('learning_rate') - if learning_rate_type == 'constant_learning_rate': - config = learning_rate_config.constant_learning_rate - learning_rate = config.learning_rate - - if learning_rate_type == 'exponential_decay_learning_rate': - config = learning_rate_config.exponential_decay_learning_rate - learning_rate = tf.train.exponential_decay( - config.initial_learning_rate, - tf.train.get_or_create_global_step(), - config.decay_steps, - config.decay_factor, - staircase=config.staircase) - - if learning_rate_type == 'manual_step_learning_rate': - config = learning_rate_config.manual_step_learning_rate - if not config.schedule: - raise ValueError('Empty learning rate schedule.') - learning_rate_step_boundaries = [x.step for x in config.schedule] - learning_rate_sequence = [config.initial_learning_rate] - learning_rate_sequence += [x.learning_rate for x in config.schedule] - learning_rate = learning_schedules.manual_stepping( - tf.train.get_or_create_global_step(), learning_rate_step_boundaries, - learning_rate_sequence) - - if learning_rate_type == 'cosine_decay_learning_rate': - config = learning_rate_config.cosine_decay_learning_rate - learning_rate = learning_schedules.cosine_decay_with_warmup( - tf.train.get_or_create_global_step(), - config.learning_rate_base, - config.total_steps, - config.warmup_learning_rate, - config.warmup_steps) - - if learning_rate is None: - raise ValueError('Learning_rate %s not supported.' % learning_rate_type) - - global_summaries.add(tf.summary.scalar('Learning_Rate', learning_rate)) - return learning_rate diff --git a/object_detection/builders/optimizer_builder_test.py b/object_detection/builders/optimizer_builder_test.py deleted file mode 100644 index e5bcbba1..00000000 --- a/object_detection/builders/optimizer_builder_test.py +++ /dev/null @@ -1,213 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for optimizer_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format - -from object_detection.builders import optimizer_builder -from object_detection.protos import optimizer_pb2 - - -class LearningRateBuilderTest(tf.test.TestCase): - - def testBuildConstantLearningRate(self): - learning_rate_text_proto = """ - constant_learning_rate { - learning_rate: 0.004 - } - """ - global_summaries = set([]) - learning_rate_proto = optimizer_pb2.LearningRate() - text_format.Merge(learning_rate_text_proto, learning_rate_proto) - learning_rate = optimizer_builder._create_learning_rate( - learning_rate_proto, global_summaries) - self.assertAlmostEqual(learning_rate, 0.004) - - def testBuildExponentialDecayLearningRate(self): - learning_rate_text_proto = """ - exponential_decay_learning_rate { - initial_learning_rate: 0.004 - decay_steps: 99999 - decay_factor: 0.85 - staircase: false - } - """ - global_summaries = set([]) - learning_rate_proto = optimizer_pb2.LearningRate() - text_format.Merge(learning_rate_text_proto, learning_rate_proto) - learning_rate = optimizer_builder._create_learning_rate( - learning_rate_proto, global_summaries) - self.assertTrue(isinstance(learning_rate, tf.Tensor)) - - def testBuildManualStepLearningRate(self): - learning_rate_text_proto = """ - manual_step_learning_rate { - schedule { - step: 0 - learning_rate: 0.006 - } - schedule { - step: 90000 - learning_rate: 0.00006 - } - } - """ - global_summaries = set([]) - learning_rate_proto = optimizer_pb2.LearningRate() - text_format.Merge(learning_rate_text_proto, learning_rate_proto) - learning_rate = optimizer_builder._create_learning_rate( - learning_rate_proto, global_summaries) - self.assertTrue(isinstance(learning_rate, tf.Tensor)) - - def testBuildCosineDecayLearningRate(self): - learning_rate_text_proto = """ - cosine_decay_learning_rate { - learning_rate_base: 0.002 - total_steps: 20000 - warmup_learning_rate: 0.0001 - warmup_steps: 1000 - } - """ - global_summaries = set([]) - learning_rate_proto = optimizer_pb2.LearningRate() - text_format.Merge(learning_rate_text_proto, learning_rate_proto) - learning_rate = optimizer_builder._create_learning_rate( - learning_rate_proto, global_summaries) - self.assertTrue(isinstance(learning_rate, tf.Tensor)) - - def testRaiseErrorOnEmptyLearningRate(self): - learning_rate_text_proto = """ - """ - global_summaries = set([]) - learning_rate_proto = optimizer_pb2.LearningRate() - text_format.Merge(learning_rate_text_proto, learning_rate_proto) - with self.assertRaises(ValueError): - optimizer_builder._create_learning_rate( - learning_rate_proto, global_summaries) - - -class OptimizerBuilderTest(tf.test.TestCase): - - def testBuildRMSPropOptimizer(self): - optimizer_text_proto = """ - rms_prop_optimizer: { - learning_rate: { - exponential_decay_learning_rate { - initial_learning_rate: 0.004 - decay_steps: 800720 - decay_factor: 0.95 - } - } - momentum_optimizer_value: 0.9 - decay: 0.9 - epsilon: 1.0 - } - use_moving_average: false - """ - global_summaries = set([]) - optimizer_proto = optimizer_pb2.Optimizer() - text_format.Merge(optimizer_text_proto, optimizer_proto) - optimizer = optimizer_builder.build(optimizer_proto, global_summaries) - self.assertTrue(isinstance(optimizer, tf.train.RMSPropOptimizer)) - - def testBuildMomentumOptimizer(self): - optimizer_text_proto = """ - momentum_optimizer: { - learning_rate: { - constant_learning_rate { - learning_rate: 0.001 - } - } - momentum_optimizer_value: 0.99 - } - use_moving_average: false - """ - global_summaries = set([]) - optimizer_proto = optimizer_pb2.Optimizer() - text_format.Merge(optimizer_text_proto, optimizer_proto) - optimizer = optimizer_builder.build(optimizer_proto, global_summaries) - self.assertTrue(isinstance(optimizer, tf.train.MomentumOptimizer)) - - def testBuildAdamOptimizer(self): - optimizer_text_proto = """ - adam_optimizer: { - learning_rate: { - constant_learning_rate { - learning_rate: 0.002 - } - } - } - use_moving_average: false - """ - global_summaries = set([]) - optimizer_proto = optimizer_pb2.Optimizer() - text_format.Merge(optimizer_text_proto, optimizer_proto) - optimizer = optimizer_builder.build(optimizer_proto, global_summaries) - self.assertTrue(isinstance(optimizer, tf.train.AdamOptimizer)) - - def testBuildMovingAverageOptimizer(self): - optimizer_text_proto = """ - adam_optimizer: { - learning_rate: { - constant_learning_rate { - learning_rate: 0.002 - } - } - } - use_moving_average: True - """ - global_summaries = set([]) - optimizer_proto = optimizer_pb2.Optimizer() - text_format.Merge(optimizer_text_proto, optimizer_proto) - optimizer = optimizer_builder.build(optimizer_proto, global_summaries) - self.assertTrue( - isinstance(optimizer, tf.contrib.opt.MovingAverageOptimizer)) - - def testBuildMovingAverageOptimizerWithNonDefaultDecay(self): - optimizer_text_proto = """ - adam_optimizer: { - learning_rate: { - constant_learning_rate { - learning_rate: 0.002 - } - } - } - use_moving_average: True - moving_average_decay: 0.2 - """ - global_summaries = set([]) - optimizer_proto = optimizer_pb2.Optimizer() - text_format.Merge(optimizer_text_proto, optimizer_proto) - optimizer = optimizer_builder.build(optimizer_proto, global_summaries) - self.assertTrue( - isinstance(optimizer, tf.contrib.opt.MovingAverageOptimizer)) - # TODO(rathodv): Find a way to not depend on the private members. - self.assertAlmostEqual(optimizer._ema._decay, 0.2) - - def testBuildEmptyOptimizer(self): - optimizer_text_proto = """ - """ - global_summaries = set([]) - optimizer_proto = optimizer_pb2.Optimizer() - text_format.Merge(optimizer_text_proto, optimizer_proto) - with self.assertRaises(ValueError): - optimizer_builder.build(optimizer_proto, global_summaries) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/post_processing_builder.py b/object_detection/builders/post_processing_builder.py deleted file mode 100644 index fa3a7728..00000000 --- a/object_detection/builders/post_processing_builder.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Builder function for post processing operations.""" -import functools - -import tensorflow as tf -from object_detection.core import post_processing -from object_detection.protos import post_processing_pb2 - - -def build(post_processing_config): - """Builds callables for post-processing operations. - - Builds callables for non-max suppression and score conversion based on the - configuration. - - Non-max suppression callable takes `boxes`, `scores`, and optionally - `clip_window`, `parallel_iterations` `masks, and `scope` as inputs. It returns - `nms_boxes`, `nms_scores`, `nms_classes` `nms_masks` and `num_detections`. See - post_processing.batch_multiclass_non_max_suppression for the type and shape - of these tensors. - - Score converter callable should be called with `input` tensor. The callable - returns the output from one of 3 tf operations based on the configuration - - tf.identity, tf.sigmoid or tf.nn.softmax. See tensorflow documentation for - argument and return value descriptions. - - Args: - post_processing_config: post_processing.proto object containing the - parameters for the post-processing operations. - - Returns: - non_max_suppressor_fn: Callable for non-max suppression. - score_converter_fn: Callable for score conversion. - - Raises: - ValueError: if the post_processing_config is of incorrect type. - """ - if not isinstance(post_processing_config, post_processing_pb2.PostProcessing): - raise ValueError('post_processing_config not of type ' - 'post_processing_pb2.Postprocessing.') - non_max_suppressor_fn = _build_non_max_suppressor( - post_processing_config.batch_non_max_suppression) - score_converter_fn = _build_score_converter( - post_processing_config.score_converter, - post_processing_config.logit_scale) - return non_max_suppressor_fn, score_converter_fn - - -def _build_non_max_suppressor(nms_config): - """Builds non-max suppresson based on the nms config. - - Args: - nms_config: post_processing_pb2.PostProcessing.BatchNonMaxSuppression proto. - - Returns: - non_max_suppressor_fn: Callable non-max suppressor. - - Raises: - ValueError: On incorrect iou_threshold or on incompatible values of - max_total_detections and max_detections_per_class. - """ - if nms_config.iou_threshold < 0 or nms_config.iou_threshold > 1.0: - raise ValueError('iou_threshold not in [0, 1.0].') - if nms_config.max_detections_per_class > nms_config.max_total_detections: - raise ValueError('max_detections_per_class should be no greater than ' - 'max_total_detections.') - - non_max_suppressor_fn = functools.partial( - post_processing.batch_multiclass_non_max_suppression, - score_thresh=nms_config.score_threshold, - iou_thresh=nms_config.iou_threshold, - max_size_per_class=nms_config.max_detections_per_class, - max_total_size=nms_config.max_total_detections) - return non_max_suppressor_fn - - -def _score_converter_fn_with_logit_scale(tf_score_converter_fn, logit_scale): - """Create a function to scale logits then apply a Tensorflow function.""" - def score_converter_fn(logits): - scaled_logits = tf.divide(logits, logit_scale, name='scale_logits') - return tf_score_converter_fn(scaled_logits, name='convert_scores') - score_converter_fn.__name__ = '%s_with_logit_scale' % ( - tf_score_converter_fn.__name__) - return score_converter_fn - - -def _build_score_converter(score_converter_config, logit_scale): - """Builds score converter based on the config. - - Builds one of [tf.identity, tf.sigmoid, tf.softmax] score converters based on - the config. - - Args: - score_converter_config: post_processing_pb2.PostProcessing.score_converter. - logit_scale: temperature to use for SOFTMAX score_converter. - - Returns: - Callable score converter op. - - Raises: - ValueError: On unknown score converter. - """ - if score_converter_config == post_processing_pb2.PostProcessing.IDENTITY: - return _score_converter_fn_with_logit_scale(tf.identity, logit_scale) - if score_converter_config == post_processing_pb2.PostProcessing.SIGMOID: - return _score_converter_fn_with_logit_scale(tf.sigmoid, logit_scale) - if score_converter_config == post_processing_pb2.PostProcessing.SOFTMAX: - return _score_converter_fn_with_logit_scale(tf.nn.softmax, logit_scale) - raise ValueError('Unknown score converter.') diff --git a/object_detection/builders/post_processing_builder_test.py b/object_detection/builders/post_processing_builder_test.py deleted file mode 100644 index c39fbfb4..00000000 --- a/object_detection/builders/post_processing_builder_test.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for post_processing_builder.""" - -import tensorflow as tf -from google.protobuf import text_format -from object_detection.builders import post_processing_builder -from object_detection.protos import post_processing_pb2 - - -class PostProcessingBuilderTest(tf.test.TestCase): - - def test_build_non_max_suppressor_with_correct_parameters(self): - post_processing_text_proto = """ - batch_non_max_suppression { - score_threshold: 0.7 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 300 - } - """ - post_processing_config = post_processing_pb2.PostProcessing() - text_format.Merge(post_processing_text_proto, post_processing_config) - non_max_suppressor, _ = post_processing_builder.build( - post_processing_config) - self.assertEqual(non_max_suppressor.keywords['max_size_per_class'], 100) - self.assertEqual(non_max_suppressor.keywords['max_total_size'], 300) - self.assertAlmostEqual(non_max_suppressor.keywords['score_thresh'], 0.7) - self.assertAlmostEqual(non_max_suppressor.keywords['iou_thresh'], 0.6) - - def test_build_identity_score_converter(self): - post_processing_text_proto = """ - score_converter: IDENTITY - """ - post_processing_config = post_processing_pb2.PostProcessing() - text_format.Merge(post_processing_text_proto, post_processing_config) - _, score_converter = post_processing_builder.build(post_processing_config) - self.assertEqual(score_converter.__name__, 'identity_with_logit_scale') - - inputs = tf.constant([1, 1], tf.float32) - outputs = score_converter(inputs) - with self.test_session() as sess: - converted_scores = sess.run(outputs) - expected_converted_scores = sess.run(inputs) - self.assertAllClose(converted_scores, expected_converted_scores) - - def test_build_identity_score_converter_with_logit_scale(self): - post_processing_text_proto = """ - score_converter: IDENTITY - logit_scale: 2.0 - """ - post_processing_config = post_processing_pb2.PostProcessing() - text_format.Merge(post_processing_text_proto, post_processing_config) - _, score_converter = post_processing_builder.build(post_processing_config) - self.assertEqual(score_converter.__name__, 'identity_with_logit_scale') - - inputs = tf.constant([1, 1], tf.float32) - outputs = score_converter(inputs) - with self.test_session() as sess: - converted_scores = sess.run(outputs) - expected_converted_scores = sess.run(tf.constant([.5, .5], tf.float32)) - self.assertAllClose(converted_scores, expected_converted_scores) - - def test_build_sigmoid_score_converter(self): - post_processing_text_proto = """ - score_converter: SIGMOID - """ - post_processing_config = post_processing_pb2.PostProcessing() - text_format.Merge(post_processing_text_proto, post_processing_config) - _, score_converter = post_processing_builder.build(post_processing_config) - self.assertEqual(score_converter.__name__, 'sigmoid_with_logit_scale') - - def test_build_softmax_score_converter(self): - post_processing_text_proto = """ - score_converter: SOFTMAX - """ - post_processing_config = post_processing_pb2.PostProcessing() - text_format.Merge(post_processing_text_proto, post_processing_config) - _, score_converter = post_processing_builder.build(post_processing_config) - self.assertEqual(score_converter.__name__, 'softmax_with_logit_scale') - - def test_build_softmax_score_converter_with_temperature(self): - post_processing_text_proto = """ - score_converter: SOFTMAX - logit_scale: 2.0 - """ - post_processing_config = post_processing_pb2.PostProcessing() - text_format.Merge(post_processing_text_proto, post_processing_config) - _, score_converter = post_processing_builder.build(post_processing_config) - self.assertEqual(score_converter.__name__, 'softmax_with_logit_scale') - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/preprocessor_builder.py b/object_detection/builders/preprocessor_builder.py deleted file mode 100644 index 9263925e..00000000 --- a/object_detection/builders/preprocessor_builder.py +++ /dev/null @@ -1,324 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Builder for preprocessing steps.""" - -import tensorflow as tf - -from object_detection.core import preprocessor -from object_detection.protos import preprocessor_pb2 - - -def _get_step_config_from_proto(preprocessor_step_config, step_name): - """Returns the value of a field named step_name from proto. - - Args: - preprocessor_step_config: A preprocessor_pb2.PreprocessingStep object. - step_name: Name of the field to get value from. - - Returns: - result_dict: a sub proto message from preprocessor_step_config which will be - later converted to a dictionary. - - Raises: - ValueError: If field does not exist in proto. - """ - for field, value in preprocessor_step_config.ListFields(): - if field.name == step_name: - return value - - raise ValueError('Could not get field %s from proto!', step_name) - - -def _get_dict_from_proto(config): - """Helper function to put all proto fields into a dictionary. - - For many preprocessing steps, there's an trivial 1-1 mapping from proto fields - to function arguments. This function automatically populates a dictionary with - the arguments from the proto. - - Protos that CANNOT be trivially populated include: - * nested messages. - * steps that check if an optional field is set (ie. where None != 0). - * protos that don't map 1-1 to arguments (ie. list should be reshaped). - * fields requiring additional validation (ie. repeated field has n elements). - - Args: - config: A protobuf object that does not violate the conditions above. - - Returns: - result_dict: |config| converted into a python dictionary. - """ - result_dict = {} - for field, value in config.ListFields(): - result_dict[field.name] = value - return result_dict - - -# A map from a PreprocessingStep proto config field name to the preprocessing -# function that should be used. The PreprocessingStep proto should be parsable -# with _get_dict_from_proto. -PREPROCESSING_FUNCTION_MAP = { - 'normalize_image': preprocessor.normalize_image, - 'random_pixel_value_scale': preprocessor.random_pixel_value_scale, - 'random_image_scale': preprocessor.random_image_scale, - 'random_rgb_to_gray': preprocessor.random_rgb_to_gray, - 'random_adjust_brightness': preprocessor.random_adjust_brightness, - 'random_adjust_contrast': preprocessor.random_adjust_contrast, - 'random_adjust_hue': preprocessor.random_adjust_hue, - 'random_adjust_saturation': preprocessor.random_adjust_saturation, - 'random_distort_color': preprocessor.random_distort_color, - 'random_jitter_boxes': preprocessor.random_jitter_boxes, - 'random_crop_to_aspect_ratio': preprocessor.random_crop_to_aspect_ratio, - 'random_black_patches': preprocessor.random_black_patches, - 'scale_boxes_to_pixel_coordinates': ( - preprocessor.scale_boxes_to_pixel_coordinates), - 'subtract_channel_mean': preprocessor.subtract_channel_mean, -} - - -# A map to convert from preprocessor_pb2.ResizeImage.Method enum to -# tf.image.ResizeMethod. -RESIZE_METHOD_MAP = { - preprocessor_pb2.ResizeImage.AREA: tf.image.ResizeMethod.AREA, - preprocessor_pb2.ResizeImage.BICUBIC: tf.image.ResizeMethod.BICUBIC, - preprocessor_pb2.ResizeImage.BILINEAR: tf.image.ResizeMethod.BILINEAR, - preprocessor_pb2.ResizeImage.NEAREST_NEIGHBOR: ( - tf.image.ResizeMethod.NEAREST_NEIGHBOR), -} - - -def build(preprocessor_step_config): - """Builds preprocessing step based on the configuration. - - Args: - preprocessor_step_config: PreprocessingStep configuration proto. - - Returns: - function, argmap: A callable function and an argument map to call function - with. - - Raises: - ValueError: On invalid configuration. - """ - step_type = preprocessor_step_config.WhichOneof('preprocessing_step') - - if step_type in PREPROCESSING_FUNCTION_MAP: - preprocessing_function = PREPROCESSING_FUNCTION_MAP[step_type] - step_config = _get_step_config_from_proto(preprocessor_step_config, - step_type) - function_args = _get_dict_from_proto(step_config) - return (preprocessing_function, function_args) - - if step_type == 'random_horizontal_flip': - config = preprocessor_step_config.random_horizontal_flip - return (preprocessor.random_horizontal_flip, - { - 'keypoint_flip_permutation': tuple( - config.keypoint_flip_permutation), - }) - - if step_type == 'random_vertical_flip': - config = preprocessor_step_config.random_vertical_flip - return (preprocessor.random_vertical_flip, - { - 'keypoint_flip_permutation': tuple( - config.keypoint_flip_permutation), - }) - - if step_type == 'random_rotation90': - return (preprocessor.random_rotation90, {}) - - if step_type == 'random_crop_image': - config = preprocessor_step_config.random_crop_image - return (preprocessor.random_crop_image, - { - 'min_object_covered': config.min_object_covered, - 'aspect_ratio_range': (config.min_aspect_ratio, - config.max_aspect_ratio), - 'area_range': (config.min_area, config.max_area), - 'overlap_thresh': config.overlap_thresh, - 'random_coef': config.random_coef, - }) - - if step_type == 'random_pad_image': - config = preprocessor_step_config.random_pad_image - min_image_size = None - if (config.HasField('min_image_height') != - config.HasField('min_image_width')): - raise ValueError('min_image_height and min_image_width should be either ' - 'both set or both unset.') - if config.HasField('min_image_height'): - min_image_size = (config.min_image_height, config.min_image_width) - - max_image_size = None - if (config.HasField('max_image_height') != - config.HasField('max_image_width')): - raise ValueError('max_image_height and max_image_width should be either ' - 'both set or both unset.') - if config.HasField('max_image_height'): - max_image_size = (config.max_image_height, config.max_image_width) - - pad_color = config.pad_color - if pad_color and len(pad_color) != 3: - raise ValueError('pad_color should have 3 elements (RGB) if set!') - if not pad_color: - pad_color = None - return (preprocessor.random_pad_image, - { - 'min_image_size': min_image_size, - 'max_image_size': max_image_size, - 'pad_color': pad_color, - }) - - if step_type == 'random_crop_pad_image': - config = preprocessor_step_config.random_crop_pad_image - min_padded_size_ratio = config.min_padded_size_ratio - if min_padded_size_ratio and len(min_padded_size_ratio) != 2: - raise ValueError('min_padded_size_ratio should have 2 elements if set!') - max_padded_size_ratio = config.max_padded_size_ratio - if max_padded_size_ratio and len(max_padded_size_ratio) != 2: - raise ValueError('max_padded_size_ratio should have 2 elements if set!') - pad_color = config.pad_color - if pad_color and len(pad_color) != 3: - raise ValueError('pad_color should have 3 elements if set!') - kwargs = { - 'min_object_covered': config.min_object_covered, - 'aspect_ratio_range': (config.min_aspect_ratio, - config.max_aspect_ratio), - 'area_range': (config.min_area, config.max_area), - 'overlap_thresh': config.overlap_thresh, - 'random_coef': config.random_coef, - } - if min_padded_size_ratio: - kwargs['min_padded_size_ratio'] = tuple(min_padded_size_ratio) - if max_padded_size_ratio: - kwargs['max_padded_size_ratio'] = tuple(max_padded_size_ratio) - if pad_color: - kwargs['pad_color'] = tuple(pad_color) - return (preprocessor.random_crop_pad_image, kwargs) - - if step_type == 'random_resize_method': - config = preprocessor_step_config.random_resize_method - return (preprocessor.random_resize_method, - { - 'target_size': [config.target_height, config.target_width], - }) - - if step_type == 'resize_image': - config = preprocessor_step_config.resize_image - method = RESIZE_METHOD_MAP[config.method] - return (preprocessor.resize_image, - { - 'new_height': config.new_height, - 'new_width': config.new_width, - 'method': method - }) - - if step_type == 'ssd_random_crop': - config = preprocessor_step_config.ssd_random_crop - if config.operations: - min_object_covered = [op.min_object_covered for op in config.operations] - aspect_ratio_range = [(op.min_aspect_ratio, op.max_aspect_ratio) - for op in config.operations] - area_range = [(op.min_area, op.max_area) for op in config.operations] - overlap_thresh = [op.overlap_thresh for op in config.operations] - random_coef = [op.random_coef for op in config.operations] - return (preprocessor.ssd_random_crop, - { - 'min_object_covered': min_object_covered, - 'aspect_ratio_range': aspect_ratio_range, - 'area_range': area_range, - 'overlap_thresh': overlap_thresh, - 'random_coef': random_coef, - }) - return (preprocessor.ssd_random_crop, {}) - - if step_type == 'ssd_random_crop_pad': - config = preprocessor_step_config.ssd_random_crop_pad - if config.operations: - min_object_covered = [op.min_object_covered for op in config.operations] - aspect_ratio_range = [(op.min_aspect_ratio, op.max_aspect_ratio) - for op in config.operations] - area_range = [(op.min_area, op.max_area) for op in config.operations] - overlap_thresh = [op.overlap_thresh for op in config.operations] - random_coef = [op.random_coef for op in config.operations] - min_padded_size_ratio = [ - (op.min_padded_size_ratio[0], op.min_padded_size_ratio[1]) - for op in config.operations] - max_padded_size_ratio = [ - (op.max_padded_size_ratio[0], op.max_padded_size_ratio[1]) - for op in config.operations] - pad_color = [(op.pad_color_r, op.pad_color_g, op.pad_color_b) - for op in config.operations] - return (preprocessor.ssd_random_crop_pad, - { - 'min_object_covered': min_object_covered, - 'aspect_ratio_range': aspect_ratio_range, - 'area_range': area_range, - 'overlap_thresh': overlap_thresh, - 'random_coef': random_coef, - 'min_padded_size_ratio': min_padded_size_ratio, - 'max_padded_size_ratio': max_padded_size_ratio, - 'pad_color': pad_color, - }) - return (preprocessor.ssd_random_crop_pad, {}) - - if step_type == 'ssd_random_crop_fixed_aspect_ratio': - config = preprocessor_step_config.ssd_random_crop_fixed_aspect_ratio - if config.operations: - min_object_covered = [op.min_object_covered for op in config.operations] - area_range = [(op.min_area, op.max_area) for op in config.operations] - overlap_thresh = [op.overlap_thresh for op in config.operations] - random_coef = [op.random_coef for op in config.operations] - return (preprocessor.ssd_random_crop_fixed_aspect_ratio, - { - 'min_object_covered': min_object_covered, - 'aspect_ratio': config.aspect_ratio, - 'area_range': area_range, - 'overlap_thresh': overlap_thresh, - 'random_coef': random_coef, - }) - return (preprocessor.ssd_random_crop_fixed_aspect_ratio, {}) - - if step_type == 'ssd_random_crop_pad_fixed_aspect_ratio': - config = preprocessor_step_config.ssd_random_crop_pad_fixed_aspect_ratio - if config.operations: - min_object_covered = [op.min_object_covered for op in config.operations] - aspect_ratio_range = [(op.min_aspect_ratio, op.max_aspect_ratio) - for op in config.operations] - area_range = [(op.min_area, op.max_area) for op in config.operations] - overlap_thresh = [op.overlap_thresh for op in config.operations] - random_coef = [op.random_coef for op in config.operations] - min_padded_size_ratio = [ - (op.min_padded_size_ratio[0], op.min_padded_size_ratio[1]) - for op in config.operations] - max_padded_size_ratio = [ - (op.max_padded_size_ratio[0], op.max_padded_size_ratio[1]) - for op in config.operations] - return (preprocessor.ssd_random_crop_pad_fixed_aspect_ratio, - { - 'min_object_covered': min_object_covered, - 'aspect_ratio': config.aspect_ratio, - 'aspect_ratio_range': aspect_ratio_range, - 'area_range': area_range, - 'overlap_thresh': overlap_thresh, - 'random_coef': random_coef, - 'min_padded_size_ratio': min_padded_size_ratio, - 'max_padded_size_ratio': max_padded_size_ratio, - }) - return (preprocessor.ssd_random_crop_pad_fixed_aspect_ratio, {}) - - raise ValueError('Unknown preprocessing step.') diff --git a/object_detection/builders/preprocessor_builder_test.py b/object_detection/builders/preprocessor_builder_test.py deleted file mode 100644 index cc2789aa..00000000 --- a/object_detection/builders/preprocessor_builder_test.py +++ /dev/null @@ -1,558 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for preprocessor_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format - -from object_detection.builders import preprocessor_builder -from object_detection.core import preprocessor -from object_detection.protos import preprocessor_pb2 - - -class PreprocessorBuilderTest(tf.test.TestCase): - - def assert_dictionary_close(self, dict1, dict2): - """Helper to check if two dicts with floatst or integers are close.""" - self.assertEqual(sorted(dict1.keys()), sorted(dict2.keys())) - for key in dict1: - value = dict1[key] - if isinstance(value, float): - self.assertAlmostEqual(value, dict2[key]) - else: - self.assertEqual(value, dict2[key]) - - def test_build_normalize_image(self): - preprocessor_text_proto = """ - normalize_image { - original_minval: 0.0 - original_maxval: 255.0 - target_minval: -1.0 - target_maxval: 1.0 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.normalize_image) - self.assertEqual(args, { - 'original_minval': 0.0, - 'original_maxval': 255.0, - 'target_minval': -1.0, - 'target_maxval': 1.0, - }) - - def test_build_random_horizontal_flip(self): - preprocessor_text_proto = """ - random_horizontal_flip { - keypoint_flip_permutation: 1 - keypoint_flip_permutation: 0 - keypoint_flip_permutation: 2 - keypoint_flip_permutation: 3 - keypoint_flip_permutation: 5 - keypoint_flip_permutation: 4 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_horizontal_flip) - self.assertEqual(args, {'keypoint_flip_permutation': (1, 0, 2, 3, 5, 4)}) - - def test_build_random_vertical_flip(self): - preprocessor_text_proto = """ - random_vertical_flip { - keypoint_flip_permutation: 1 - keypoint_flip_permutation: 0 - keypoint_flip_permutation: 2 - keypoint_flip_permutation: 3 - keypoint_flip_permutation: 5 - keypoint_flip_permutation: 4 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_vertical_flip) - self.assertEqual(args, {'keypoint_flip_permutation': (1, 0, 2, 3, 5, 4)}) - - def test_build_random_rotation90(self): - preprocessor_text_proto = """ - random_rotation90 {} - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_rotation90) - self.assertEqual(args, {}) - - def test_build_random_pixel_value_scale(self): - preprocessor_text_proto = """ - random_pixel_value_scale { - minval: 0.8 - maxval: 1.2 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_pixel_value_scale) - self.assert_dictionary_close(args, {'minval': 0.8, 'maxval': 1.2}) - - def test_build_random_image_scale(self): - preprocessor_text_proto = """ - random_image_scale { - min_scale_ratio: 0.8 - max_scale_ratio: 2.2 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_image_scale) - self.assert_dictionary_close(args, {'min_scale_ratio': 0.8, - 'max_scale_ratio': 2.2}) - - def test_build_random_rgb_to_gray(self): - preprocessor_text_proto = """ - random_rgb_to_gray { - probability: 0.8 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_rgb_to_gray) - self.assert_dictionary_close(args, {'probability': 0.8}) - - def test_build_random_adjust_brightness(self): - preprocessor_text_proto = """ - random_adjust_brightness { - max_delta: 0.2 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_adjust_brightness) - self.assert_dictionary_close(args, {'max_delta': 0.2}) - - def test_build_random_adjust_contrast(self): - preprocessor_text_proto = """ - random_adjust_contrast { - min_delta: 0.7 - max_delta: 1.1 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_adjust_contrast) - self.assert_dictionary_close(args, {'min_delta': 0.7, 'max_delta': 1.1}) - - def test_build_random_adjust_hue(self): - preprocessor_text_proto = """ - random_adjust_hue { - max_delta: 0.01 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_adjust_hue) - self.assert_dictionary_close(args, {'max_delta': 0.01}) - - def test_build_random_adjust_saturation(self): - preprocessor_text_proto = """ - random_adjust_saturation { - min_delta: 0.75 - max_delta: 1.15 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_adjust_saturation) - self.assert_dictionary_close(args, {'min_delta': 0.75, 'max_delta': 1.15}) - - def test_build_random_distort_color(self): - preprocessor_text_proto = """ - random_distort_color { - color_ordering: 1 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_distort_color) - self.assertEqual(args, {'color_ordering': 1}) - - def test_build_random_jitter_boxes(self): - preprocessor_text_proto = """ - random_jitter_boxes { - ratio: 0.1 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_jitter_boxes) - self.assert_dictionary_close(args, {'ratio': 0.1}) - - def test_build_random_crop_image(self): - preprocessor_text_proto = """ - random_crop_image { - min_object_covered: 0.75 - min_aspect_ratio: 0.75 - max_aspect_ratio: 1.5 - min_area: 0.25 - max_area: 0.875 - overlap_thresh: 0.5 - random_coef: 0.125 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_crop_image) - self.assertEqual(args, { - 'min_object_covered': 0.75, - 'aspect_ratio_range': (0.75, 1.5), - 'area_range': (0.25, 0.875), - 'overlap_thresh': 0.5, - 'random_coef': 0.125, - }) - - def test_build_random_pad_image(self): - preprocessor_text_proto = """ - random_pad_image { - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_pad_image) - self.assertEqual(args, { - 'min_image_size': None, - 'max_image_size': None, - 'pad_color': None, - }) - - def test_build_random_crop_pad_image(self): - preprocessor_text_proto = """ - random_crop_pad_image { - min_object_covered: 0.75 - min_aspect_ratio: 0.75 - max_aspect_ratio: 1.5 - min_area: 0.25 - max_area: 0.875 - overlap_thresh: 0.5 - random_coef: 0.125 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_crop_pad_image) - self.assertEqual(args, { - 'min_object_covered': 0.75, - 'aspect_ratio_range': (0.75, 1.5), - 'area_range': (0.25, 0.875), - 'overlap_thresh': 0.5, - 'random_coef': 0.125, - }) - - def test_build_random_crop_pad_image_with_optional_parameters(self): - preprocessor_text_proto = """ - random_crop_pad_image { - min_object_covered: 0.75 - min_aspect_ratio: 0.75 - max_aspect_ratio: 1.5 - min_area: 0.25 - max_area: 0.875 - overlap_thresh: 0.5 - random_coef: 0.125 - min_padded_size_ratio: 0.5 - min_padded_size_ratio: 0.75 - max_padded_size_ratio: 0.5 - max_padded_size_ratio: 0.75 - pad_color: 0.5 - pad_color: 0.5 - pad_color: 1.0 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_crop_pad_image) - self.assertEqual(args, { - 'min_object_covered': 0.75, - 'aspect_ratio_range': (0.75, 1.5), - 'area_range': (0.25, 0.875), - 'overlap_thresh': 0.5, - 'random_coef': 0.125, - 'min_padded_size_ratio': (0.5, 0.75), - 'max_padded_size_ratio': (0.5, 0.75), - 'pad_color': (0.5, 0.5, 1.0) - }) - - def test_build_random_crop_to_aspect_ratio(self): - preprocessor_text_proto = """ - random_crop_to_aspect_ratio { - aspect_ratio: 0.85 - overlap_thresh: 0.35 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_crop_to_aspect_ratio) - self.assert_dictionary_close(args, {'aspect_ratio': 0.85, - 'overlap_thresh': 0.35}) - - def test_build_random_black_patches(self): - preprocessor_text_proto = """ - random_black_patches { - max_black_patches: 20 - probability: 0.95 - size_to_image_ratio: 0.12 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_black_patches) - self.assert_dictionary_close(args, {'max_black_patches': 20, - 'probability': 0.95, - 'size_to_image_ratio': 0.12}) - - def test_build_random_resize_method(self): - preprocessor_text_proto = """ - random_resize_method { - target_height: 75 - target_width: 100 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.random_resize_method) - self.assert_dictionary_close(args, {'target_size': [75, 100]}) - - def test_build_scale_boxes_to_pixel_coordinates(self): - preprocessor_text_proto = """ - scale_boxes_to_pixel_coordinates {} - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.scale_boxes_to_pixel_coordinates) - self.assertEqual(args, {}) - - def test_build_resize_image(self): - preprocessor_text_proto = """ - resize_image { - new_height: 75 - new_width: 100 - method: BICUBIC - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.resize_image) - self.assertEqual(args, {'new_height': 75, - 'new_width': 100, - 'method': tf.image.ResizeMethod.BICUBIC}) - - def test_build_subtract_channel_mean(self): - preprocessor_text_proto = """ - subtract_channel_mean { - means: [1.0, 2.0, 3.0] - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.subtract_channel_mean) - self.assertEqual(args, {'means': [1.0, 2.0, 3.0]}) - - def test_build_ssd_random_crop(self): - preprocessor_text_proto = """ - ssd_random_crop { - operations { - min_object_covered: 0.0 - min_aspect_ratio: 0.875 - max_aspect_ratio: 1.125 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.0 - random_coef: 0.375 - } - operations { - min_object_covered: 0.25 - min_aspect_ratio: 0.75 - max_aspect_ratio: 1.5 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.25 - random_coef: 0.375 - } - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.ssd_random_crop) - self.assertEqual(args, {'min_object_covered': [0.0, 0.25], - 'aspect_ratio_range': [(0.875, 1.125), (0.75, 1.5)], - 'area_range': [(0.5, 1.0), (0.5, 1.0)], - 'overlap_thresh': [0.0, 0.25], - 'random_coef': [0.375, 0.375]}) - - def test_build_ssd_random_crop_empty_operations(self): - preprocessor_text_proto = """ - ssd_random_crop { - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.ssd_random_crop) - self.assertEqual(args, {}) - - def test_build_ssd_random_crop_pad(self): - preprocessor_text_proto = """ - ssd_random_crop_pad { - operations { - min_object_covered: 0.0 - min_aspect_ratio: 0.875 - max_aspect_ratio: 1.125 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.0 - random_coef: 0.375 - min_padded_size_ratio: [1.0, 1.0] - max_padded_size_ratio: [2.0, 2.0] - pad_color_r: 0.5 - pad_color_g: 0.5 - pad_color_b: 0.5 - } - operations { - min_object_covered: 0.25 - min_aspect_ratio: 0.75 - max_aspect_ratio: 1.5 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.25 - random_coef: 0.375 - min_padded_size_ratio: [1.0, 1.0] - max_padded_size_ratio: [2.0, 2.0] - pad_color_r: 0.5 - pad_color_g: 0.5 - pad_color_b: 0.5 - } - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.ssd_random_crop_pad) - self.assertEqual(args, {'min_object_covered': [0.0, 0.25], - 'aspect_ratio_range': [(0.875, 1.125), (0.75, 1.5)], - 'area_range': [(0.5, 1.0), (0.5, 1.0)], - 'overlap_thresh': [0.0, 0.25], - 'random_coef': [0.375, 0.375], - 'min_padded_size_ratio': [(1.0, 1.0), (1.0, 1.0)], - 'max_padded_size_ratio': [(2.0, 2.0), (2.0, 2.0)], - 'pad_color': [(0.5, 0.5, 0.5), (0.5, 0.5, 0.5)]}) - - def test_build_ssd_random_crop_fixed_aspect_ratio(self): - preprocessor_text_proto = """ - ssd_random_crop_fixed_aspect_ratio { - operations { - min_object_covered: 0.0 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.0 - random_coef: 0.375 - } - operations { - min_object_covered: 0.25 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.25 - random_coef: 0.375 - } - aspect_ratio: 0.875 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, preprocessor.ssd_random_crop_fixed_aspect_ratio) - self.assertEqual(args, {'min_object_covered': [0.0, 0.25], - 'aspect_ratio': 0.875, - 'area_range': [(0.5, 1.0), (0.5, 1.0)], - 'overlap_thresh': [0.0, 0.25], - 'random_coef': [0.375, 0.375]}) - - def test_build_ssd_random_crop_pad_fixed_aspect_ratio(self): - preprocessor_text_proto = """ - ssd_random_crop_pad_fixed_aspect_ratio { - operations { - min_object_covered: 0.0 - min_aspect_ratio: 0.875 - max_aspect_ratio: 1.125 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.0 - random_coef: 0.375 - min_padded_size_ratio: [1.0, 1.0] - max_padded_size_ratio: [2.0, 2.0] - } - operations { - min_object_covered: 0.25 - min_aspect_ratio: 0.75 - max_aspect_ratio: 1.5 - min_area: 0.5 - max_area: 1.0 - overlap_thresh: 0.25 - random_coef: 0.375 - min_padded_size_ratio: [1.0, 1.0] - max_padded_size_ratio: [2.0, 2.0] - } - aspect_ratio: 0.875 - } - """ - preprocessor_proto = preprocessor_pb2.PreprocessingStep() - text_format.Merge(preprocessor_text_proto, preprocessor_proto) - function, args = preprocessor_builder.build(preprocessor_proto) - self.assertEqual(function, - preprocessor.ssd_random_crop_pad_fixed_aspect_ratio) - self.assertEqual(args, {'min_object_covered': [0.0, 0.25], - 'aspect_ratio': 0.875, - 'aspect_ratio_range': [(0.875, 1.125), (0.75, 1.5)], - 'area_range': [(0.5, 1.0), (0.5, 1.0)], - 'overlap_thresh': [0.0, 0.25], - 'random_coef': [0.375, 0.375], - 'min_padded_size_ratio': [(1.0, 1.0), (1.0, 1.0)], - 'max_padded_size_ratio': [(2.0, 2.0), (2.0, 2.0)]}) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/builders/region_similarity_calculator_builder.py b/object_detection/builders/region_similarity_calculator_builder.py deleted file mode 100644 index fa1d6717..00000000 --- a/object_detection/builders/region_similarity_calculator_builder.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Builder for region similarity calculators.""" - -from object_detection.core import region_similarity_calculator -from object_detection.protos import region_similarity_calculator_pb2 - - -def build(region_similarity_calculator_config): - """Builds region similarity calculator based on the configuration. - - Builds one of [IouSimilarity, IoaSimilarity, NegSqDistSimilarity] objects. See - core/region_similarity_calculator.proto for details. - - Args: - region_similarity_calculator_config: RegionSimilarityCalculator - configuration proto. - - Returns: - region_similarity_calculator: RegionSimilarityCalculator object. - - Raises: - ValueError: On unknown region similarity calculator. - """ - - if not isinstance( - region_similarity_calculator_config, - region_similarity_calculator_pb2.RegionSimilarityCalculator): - raise ValueError( - 'region_similarity_calculator_config not of type ' - 'region_similarity_calculator_pb2.RegionsSimilarityCalculator') - - similarity_calculator = region_similarity_calculator_config.WhichOneof( - 'region_similarity') - if similarity_calculator == 'iou_similarity': - return region_similarity_calculator.IouSimilarity() - if similarity_calculator == 'ioa_similarity': - return region_similarity_calculator.IoaSimilarity() - if similarity_calculator == 'neg_sq_dist_similarity': - return region_similarity_calculator.NegSqDistSimilarity() - - raise ValueError('Unknown region similarity calculator.') - diff --git a/object_detection/builders/region_similarity_calculator_builder_test.py b/object_detection/builders/region_similarity_calculator_builder_test.py deleted file mode 100644 index ca3a5512..00000000 --- a/object_detection/builders/region_similarity_calculator_builder_test.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for region_similarity_calculator_builder.""" - -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.builders import region_similarity_calculator_builder -from object_detection.core import region_similarity_calculator -from object_detection.protos import region_similarity_calculator_pb2 as sim_calc_pb2 - - -class RegionSimilarityCalculatorBuilderTest(tf.test.TestCase): - - def testBuildIoaSimilarityCalculator(self): - similarity_calc_text_proto = """ - ioa_similarity { - } - """ - similarity_calc_proto = sim_calc_pb2.RegionSimilarityCalculator() - text_format.Merge(similarity_calc_text_proto, similarity_calc_proto) - similarity_calc = region_similarity_calculator_builder.build( - similarity_calc_proto) - self.assertTrue(isinstance(similarity_calc, - region_similarity_calculator.IoaSimilarity)) - - def testBuildIouSimilarityCalculator(self): - similarity_calc_text_proto = """ - iou_similarity { - } - """ - similarity_calc_proto = sim_calc_pb2.RegionSimilarityCalculator() - text_format.Merge(similarity_calc_text_proto, similarity_calc_proto) - similarity_calc = region_similarity_calculator_builder.build( - similarity_calc_proto) - self.assertTrue(isinstance(similarity_calc, - region_similarity_calculator.IouSimilarity)) - - def testBuildNegSqDistSimilarityCalculator(self): - similarity_calc_text_proto = """ - neg_sq_dist_similarity { - } - """ - similarity_calc_proto = sim_calc_pb2.RegionSimilarityCalculator() - text_format.Merge(similarity_calc_text_proto, similarity_calc_proto) - similarity_calc = region_similarity_calculator_builder.build( - similarity_calc_proto) - self.assertTrue(isinstance(similarity_calc, - region_similarity_calculator. - NegSqDistSimilarity)) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/BUILD b/object_detection/core/BUILD deleted file mode 100644 index 5d8aaad7..00000000 --- a/object_detection/core/BUILD +++ /dev/null @@ -1,368 +0,0 @@ -# Tensorflow Object Detection API: Core. - -package( - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) -# Apache 2.0 - -py_library( - name = "batcher", - srcs = ["batcher.py"], - deps = [ - ":prefetcher", - ":preprocessor", - ":standard_fields", - "//tensorflow", - ], -) - -py_test( - name = "batcher_test", - srcs = ["batcher_test.py"], - deps = [ - ":batcher", - "//tensorflow", - ], -) - -py_library( - name = "box_list", - srcs = [ - "box_list.py", - ], - deps = [ - "//tensorflow", - ], -) - -py_test( - name = "box_list_test", - srcs = ["box_list_test.py"], - deps = [ - ":box_list", - ], -) - -py_library( - name = "box_list_ops", - srcs = [ - "box_list_ops.py", - ], - deps = [ - ":box_list", - "//tensorflow", - "//tensorflow_models/object_detection/utils:shape_utils", - ], -) - -py_test( - name = "box_list_ops_test", - srcs = ["box_list_ops_test.py"], - deps = [ - ":box_list", - ":box_list_ops", - ], -) - -py_library( - name = "box_coder", - srcs = [ - "box_coder.py", - ], - deps = [ - "//tensorflow", - ], -) - -py_test( - name = "box_coder_test", - srcs = [ - "box_coder_test.py", - ], - deps = [ - ":box_coder", - ":box_list", - "//tensorflow", - ], -) - -py_library( - name = "keypoint_ops", - srcs = [ - "keypoint_ops.py", - ], - deps = [ - "//tensorflow", - ], -) - -py_test( - name = "keypoint_ops_test", - srcs = ["keypoint_ops_test.py"], - deps = [ - ":keypoint_ops", - ], -) - -py_library( - name = "losses", - srcs = ["losses.py"], - deps = [ - ":box_list", - ":box_list_ops", - "//tensorflow", - "//tensorflow_models/object_detection/utils:ops", - ], -) - -py_library( - name = "matcher", - srcs = [ - "matcher.py", - ], - deps = [ - ], -) - -py_library( - name = "model", - srcs = ["model.py"], - deps = [ - ":standard_fields", - ], -) - -py_test( - name = "matcher_test", - srcs = [ - "matcher_test.py", - ], - deps = [ - ":matcher", - "//tensorflow", - ], -) - -py_library( - name = "prefetcher", - srcs = ["prefetcher.py"], - deps = ["//tensorflow"], -) - -py_library( - name = "preprocessor", - srcs = [ - "preprocessor.py", - ], - deps = [ - ":box_list", - ":box_list_ops", - ":keypoint_ops", - ":standard_fields", - "//tensorflow", - ], -) - -py_test( - name = "preprocessor_test", - srcs = [ - "preprocessor_test.py", - ], - deps = [ - ":preprocessor", - "//tensorflow", - ], -) - -py_test( - name = "losses_test", - srcs = ["losses_test.py"], - deps = [ - ":box_list", - ":losses", - ":matcher", - "//tensorflow", - ], -) - -py_test( - name = "prefetcher_test", - srcs = ["prefetcher_test.py"], - deps = [ - ":prefetcher", - "//tensorflow", - ], -) - -py_library( - name = "standard_fields", - srcs = [ - "standard_fields.py", - ], -) - -py_library( - name = "post_processing", - srcs = ["post_processing.py"], - deps = [ - ":box_list", - ":box_list_ops", - ":standard_fields", - "//tensorflow", - ], -) - -py_test( - name = "post_processing_test", - srcs = ["post_processing_test.py"], - deps = [ - ":box_list", - ":box_list_ops", - ":post_processing", - "//tensorflow", - ], -) - -py_library( - name = "target_assigner", - srcs = [ - "target_assigner.py", - ], - deps = [ - ":box_list", - ":box_list_ops", - ":matcher", - ":region_similarity_calculator", - "//tensorflow", - "//tensorflow_models/object_detection/box_coders:faster_rcnn_box_coder", - "//tensorflow_models/object_detection/box_coders:mean_stddev_box_coder", - "//tensorflow_models/object_detection/core:box_coder", - "//tensorflow_models/object_detection/matchers:argmax_matcher", - "//tensorflow_models/object_detection/matchers:bipartite_matcher", - ], -) - -py_test( - name = "target_assigner_test", - size = "large", - timeout = "long", - srcs = ["target_assigner_test.py"], - deps = [ - ":box_list", - ":region_similarity_calculator", - ":target_assigner", - "//tensorflow", - "//tensorflow_models/object_detection/box_coders:mean_stddev_box_coder", - "//tensorflow_models/object_detection/matchers:bipartite_matcher", - ], -) - -py_library( - name = "data_decoder", - srcs = ["data_decoder.py"], -) - -py_library( - name = "data_parser", - srcs = ["data_parser.py"], -) - -py_library( - name = "box_predictor", - srcs = ["box_predictor.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/utils:ops", - "//tensorflow_models/object_detection/utils:shape_utils", - "//tensorflow_models/object_detection/utils:static_shape", - ], -) - -py_test( - name = "box_predictor_test", - srcs = ["box_predictor_test.py"], - deps = [ - ":box_predictor", - "//tensorflow", - "//tensorflow_models/object_detection/builders:hyperparams_builder", - "//tensorflow_models/object_detection/protos:hyperparams_py_pb2", - ], -) - -py_library( - name = "region_similarity_calculator", - srcs = [ - "region_similarity_calculator.py", - ], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:box_list_ops", - ], -) - -py_test( - name = "region_similarity_calculator_test", - srcs = [ - "region_similarity_calculator_test.py", - ], - deps = [ - ":region_similarity_calculator", - "//tensorflow_models/object_detection/core:box_list", - ], -) - -py_library( - name = "anchor_generator", - srcs = [ - "anchor_generator.py", - ], - deps = [ - "//tensorflow", - ], -) - -py_library( - name = "minibatch_sampler", - srcs = [ - "minibatch_sampler.py", - ], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/utils:ops", - ], -) - -py_test( - name = "minibatch_sampler_test", - srcs = [ - "minibatch_sampler_test.py", - ], - deps = [ - ":minibatch_sampler", - "//tensorflow", - ], -) - -py_library( - name = "balanced_positive_negative_sampler", - srcs = [ - "balanced_positive_negative_sampler.py", - ], - deps = [ - ":minibatch_sampler", - "//tensorflow", - ], -) - -py_test( - name = "balanced_positive_negative_sampler_test", - srcs = [ - "balanced_positive_negative_sampler_test.py", - ], - deps = [ - ":balanced_positive_negative_sampler", - "//tensorflow", - ], -) diff --git a/object_detection/core/__init__.py b/object_detection/core/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/object_detection/core/__pycache__/__init__.cpython-35.pyc b/object_detection/core/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index a42c6d3250bb6ce003bd80db888d195da2516068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmWgV<>i{qWEaH%1dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnFAx2U{M=Oiq#|?u z+|-oJ(p>%G(xS4|%$%IWyyR5c<)mX zc6Z>J1s^Et66KomEtlL=m17S11Nj+y^~rxBhg80vnFSG$w0uhfX_ve6=XCaa}T$eu^rq47S~uBu&l;*YAm4lx_z&+ow|E(u(ZK; z7TBlp0*e>fAFykY$wl@OOO{yNV2?XX;%c3-JHkjV@@S|uAIMy4Q7GMQwVn(m-&H-X z`nW$ILQZiIFNQrPx7&mF&D-Q zHPH5{(@ewG6wGNTHD;V)42m*QL_=;=CZQnTQ|XvAh?Ea>5_3|Yn1YO@_m&xoku+V- ze~uY>AhJ;^uk(G$vt%$V_`b*s66()eoz6HdWUa{g#=%CbkJF7|NG3)Yf^q!z!EHV> z3KgIAN$@BYk>t0g=8q)YNv5SL63!X9b!0!$Fmy(Q75u^38@X~Djl{v@YG(^3T_=G# zzqPipw!weIKUllHcAJ01-{07nN+T~;r;K?5NvaSjg;#Mi9*vZSE#ovjob#%YMFBsU z>ya(^ z5N~?1;hU;BoroyYpdX}#r>+&Z{a1=s!^pI+7htWu{qy1a5Ztle(;u#bQIc`CZpL~~ zCTWV3%k@|m;4G!rRc{v$p?inS^+;*C?z|IvB!M4Chh+i><9QfN+l>Jw-te# zq18BZGM@t9>3m!aM3N)NC^b+Kh7vc&K3!Ka&!(aBVEQ(Hy)omd5XOg<(UvJJ9-5PD^KLt9 zQ)D;5;Y2Z)aQ%Xu|99L#q`ScJEmj2VC?LM12MpHOOG}^6>vpzI%!JwBV?l%MF4#2- ze$7{X7SNtW5^+>xe+<}*dL{ZVcEgf=ZL%YbLr{$kthlePVrQN0F55*dn%+I2GSIeG z8EWwWEfU%pn-J8aWCCa=K8;Zg@vi!PRCB|xAvt`=IjUw_B&e++^(a2ukLj&Lh=zzU zQQ}ku^=V|ymL5!*+oxBEZX~qbK}dFNPP?&dLrEPMdaoodh8-jy+8^78AnRZd@H@5X zw|;T>o?jlm*SXHC!JF0KO$>Is-7g%2QTA5J8&5@f_*Tt9GRR>-F+@M|&>9dqh8$_N z2RGSX^yZBi9ZPP&`68VP^6=sXW>6Fda=Tpa#ax7qAwz6yW>wC1cz*oGly~WQ0jZW-F2s* z{0fu4_nQ%q3@~WRJynC2!^$44t`MPD~* zaJfopSzh)v3YC2%bJWBrk*2&FQX8v_5LI4N-FMyyRllkLWgXxto5&J0CBaWl21cdVr(yB>rAss*!wWjT)~aKwj8`2v};#_)nGYT#J|^q9|n^* zoL@bMpbl3Xr(9XbUh2&(S049fVi$u?EZu)=7x4d&XrG7`DgJjrw(Y89-E|e05f6>e zc-MIz_ZRv+#xh*4qga`|IUn9>x<(XN`ca!giE|g1`5ZS?IFzk}k67XAA}SOfPzY=6 zlP}(7pV!!n277_hhZ@#kNBH;;*qfK>Zw-Gx#NIF8Vo!@2+rY-Z2O5+4hWQDR*a?NY+-1&Z5g+q9aWyymPq{KHCvnNjsNL1ZR%p^hHQOyTwc! zH`XRfdn>5deh^GfvxC|YwO(b1gJ-2#( zwbkaU7wl}Oso%z2Sr@&?+F+HIE!RBsQ?>6xu;>tA_nfAxZ2rWZ@Z)z#AC?LhBO diff --git a/object_detection/core/__pycache__/balanced_positive_negative_sampler.cpython-35.pyc b/object_detection/core/__pycache__/balanced_positive_negative_sampler.cpython-35.pyc deleted file mode 100644 index a259a66b91eb412acf29f543c910a9dea8ea9a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3239 zcmb7GTW{P%6drrMo5V?)H04qW1fxokvJiF~%0-QOgF-7F8lk2FX{*Ybwa2@Y`VwaB zq*jDm zi_AO@#<%dQn;-!p15k?uHi;}Uu+6wdq85oAGH{4>H*iSMCeOgtCfp%=ZF15ggN~Ni z?RMCYHX*korWDOms`8;?@qWZW@9cnWq4zj9ML$%sBr?jESc)%Ps~}=wktv{NCU2fgk^IuPl*ZCvm{9~I)qMt zEcgL-4@EXM>@RoMt=-+EBBP;*BI6Z>hgm6G`$KC7dh{FZfKU`aZBFH3D15<_%negX z(_zLCZ$$UyUK&f1XSqxi4f!FLQ`N4kqZC7)hIvxP5ns}0QKYRkA7w-FD1@RU5I)ON zxk)27z76!NQsx1%>ZdBBn6`jhtqo^c<^(@%$c7@GR)0*mKFTP2SLA9W!4f$I#s|V$f(C$t6RV$?=>S zoYT7yx%d<+p#w5dJa1$c49ALQJzg*?u;7|D`8z^;zpB8hZgjyk|6Y=JO{v|c!!(UJ zT2saorR#l2)tK#b`f%qFYG#U3_(0~Iq8~_sCWoe^@m{8M(5v!z+O?($Y}TmmWHnb= z)n9Eg;Ald#&3xm!w%c&?e zxa=F~>N7^0)0?$d7M=3U#``Ad=8m9y?bcT>IHSr?Nu5HIt5bnEM*~OLw`d?@d?=(f zi#F*9I@p;nx2`6iRc8OM+=rFiw6FmW*%9ENgLb;CO?p%R{tJJ1wP-~=DHcXN^9;s{ zIi|cwpk?SXQM3bXsj#!KaJ0E%F-k|c5kwwhHJ#vYSF{A+*n!aCLW6izuIm0!xVTB> zKKF1hD;%GxtY|~v%EyIUYfNQ#QO;?r3o~L<7#E!~5`(3tOp4&iV5zCjdbSv|Cti}r zx~2|RDp2T&cWM_Jrn{JwyEQvlO?@wkYg}s1bOlrO0SH-r4`q1OD(M==%a)<775uNY zE`VOL*6cNF(tTZ_ZnW=oJG$a0Eask9xSkiMK_2PxlIQ)9v#8pc^SmJSJx}V2F5lHe zccdAj-IgtoOL&$3FiTd)UO8vhx^t3ZrEtp<6GrKwT-6J2zSydIx>ZSi9~rFPt8e+c eE#VzS4A>Lq^>T;u;-`G=8GH8UV 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 jXPW(bNIxXn9I#*+GJeF+PEi3I}SCML| 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 d=1H6hJR{dRi7)<@Cef4lS3a_O diff --git a/object_detection/core/__pycache__/data_decoder.cpython-35.pyc b/object_detection/core/__pycache__/data_decoder.cpython-35.pyc deleted file mode 100644 index 65b7de17a76a2d842655c26e8bec3d9dc5b869bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 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 MD;+D(S5AHMFUMG9+yDRo diff --git a/object_detection/core/__pycache__/minibatch_sampler.cpython-35.pyc b/object_detection/core/__pycache__/minibatch_sampler.cpython-35.pyc deleted file mode 100644 index 7fcdb236c46bc5b14850c8696fbdf8c65a37b729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 zcmb7GOK%)S5bl|MdSWLgh(rM)IucUYV0L*NkSqv!NJJ6D5;&&?H13`0^|mvQrF+IE zmU9aKf-4t(3TJL}<&?j`1-|N@ncX&SGTr;-~3zCYnzPy&DOpy z#<$VTkLY5?rszEu`z-NT>a(fOJeqgxyu+p)H}A5f%ceam+ha+er2{q{Fzmu7Tkz*nMlpkJT4PC4uVGu$&d0G&*!|r zu$2rONo9DEb5qXT0v9V8K7;a@=NUJ7DuYO?LTZ&~wc1pujL*v~DzL^QktAH1-GJk3 z)qS9{SVf}9^$xV*g`rWWa);l%xfEKYW;6~SG!i(C+dqlq?Y`V zE+vm;mKV}sNx@k8i?!C^?u^f5;4Fy8{6WFBEJ~e`!bV&Bl2<8&f?6A22m@s@Yt_Nr z{c;v1!Wdj_7I~S(T#=tsnHAQp*stB!`a@)~eOD?TOI{*KE&{=AQ;0%EsVo+G%-e&l z7skPJAcu{-YH;W7y@#?87+w@JQ)m$t?${odI{DH>B-wl&3~r;DZ_!C04=_XT6Q%$& z>F|YVhu}2rGdUn2#XXungUpagK&!zUtpqF{0%;r7_QM8Y`wn2IAK$58WI@8MclaF9 zYC^BF!xfUG8AkxC{pgq4Jv7rrhxhG|{L}aDV!hFkU{X zhG7V6i!l6V(F%|PjaqO5 zY($_t`mm-FU+wL-Sgx4?NSTFLO8&#%Pe64Jlv$cIiXAU%55{AwnXmD17lblOgX4Af z05=<{hM~J$#IYiZi-bRxPfl_jbD5z~U&=_$RkR`n5RPC1^7WNu5~ZJ)oan5r zz2kBRvWLYOf>5W9|84g|981Sxy0}qDi2)8P(^XO$@mpW6`D4fJni>u9h_CNjTlOsM zMqNEXl&g*Qja9HpZ&lwVw-rqF&`P(_pAbYWvM!#!{gP8!vB-)*wueTTx19MMgMzUm zkDXcKKK1R?XJ-W{M%s}~<6SWiL zC#qQRhg`aZixe!8b#s0|SU=dYz-rR2jS&*HI;7l>iZm+=evp-E9a3{p=V4G~spYZC zOOrgQRjqC)a;xazYmpdvU~%)J5|pY#Ed}Z!u1E2B=$?^lb*P9a=S{WhaLAP<2`<`| z*U%hQ@S|9PV8+p|@k~woS~+Fdx)9c$u{sIx0tFM+=O>^xJT;R|4&YRl+#!-dHEsC5 z=A&IazxeD^Zcx(&476qVl}ud)t*O-%Dq=b~jLs$})Kir$5r=i&)k^8H&nanY>Yo3L zZ*-yZi+R42m!tXWZ8>*>I^_CW0!`cnO=Tzh5pl=C-|E!b63gh zE8JnW(Xlr!d6&Gm{CB(?{)TtOKYjo8#9tlXgF8@=GPpAgs~`;BKRb*!!;s9VcLre? z=TR7HN*UD_)2B9hZeljEhs>ZCZt|dO3kGw+&RkHV=Xrjf4|e9w z^Foj;1cSw3XDO&Xh!%rrDfkj2mjbmMe1UFff@nGTsBuPqy%+@dI(eaGScpg!DlFnG z6@x5NNvmFe+>dk7jT41;-8fabkfNtjrQ=X^WUfS*$Q(T~Jv}&Y3Gqm0JuL^hDEhJx zQmcBT^0=3(NEDek$n>5#h>JenbYf7Tk4{V?@_sf-B9WyDy&S5P?lE7S*Li8I^05+e zTF@IJqv$Kq9i_aD951-9B@>Hwvn0t51iI&$-i*^NdzXz0OI#BpM%ZVPc=Pn-zOsXI zfmMJ@=4GUg!I*xQL~+_Hd&#^Wr^8W!sfg%NLHA&(<92e?Jh|PWRy3*YUe48v z_f?9`Ur2)Th;`V<&LCCMk9&QQsC|{x!z|6!uSO~@Ag(0K z_JkzmAeQHMpiMp{cN}{*%#Q448)EYf0XA5o>=QEuFL-nKwd@od++bwbsMp^H$s zj|M}MC}i0o8zA#BdX~q>tSvGh!YK$%Y!#cEn`B`}WXuBlA7W(OfqP&NkdX?>^r((E z7`=s`z8q3xsz}4g!Z&gSXOe|*IjnHjWIc&H9c;AfAF$OJ>jiUZQJEabBQoql^^~?2 z4q9Z|Q{u_ZrXbE+X*9rrd+CuF$RSZt&$>iByjD3H9wAo)nHKP8iR_R>;PB82qw2$M z6Id14lE)EvL8I~3_?>$FP4Y-xIZBG=2|h!6qfw{?c$%_Tfbvw$C5jM;$$d7g!_EI<}}P9@<4{6(;TIZ*H|u&%t2 zDQFnTd=Dexg!a_Y5Hcb+^bdrSpivty-+S}^`>K$*U6nQt3{=t2BDAd043X4PyBn({ z%0n9D{*{sGFKAJSObA1`&QW|q7*Y$t4&n|T=PC3c5FzwL3ju-=9=|{z#GoY#L-h7+ z5aIDG-`4|mE{N(ubk6l$;g*#kI`3M}bIWQFt+|#}Zn+Rd&$*VhAX?}D7lY{e;7bI{ z3*6^Y5M2(UE5VmFCgVBk^HJl4@#>_p95Q-qcl_0TSWclwVUcMB1%ZF}bPrCF?u4(zcj%#`G%1DEYpC^hRv;izSoQQ> zT#quC3Do5}R6I;Zk+So3WVqMUq>Km|u$+uT7LOmmeHWzfb=?PR5=VowWYB8s;gbK{k^N6dJ=ZC1oCi+-CUCi*PoD(Q~Tc^&^0=sH;SueZ1Q z*+6Y|^bfWMh=QZRRzA}EDozqo<1OP&Grg5{p28tj-gS#S@s>d>!=v$;b{pZYXt#ez zLRi2hICHjkd}UI)E!QioQ4jp1U;1O&E#n6AdKy4jwe3btFQEZHXYj++n#(zQJc|nt zVl9|EesO9gZ>tlEGVjJUaAOn&>+LNE`ny5Fih{;3=7L|d4&fCZuR?d^A3^55kQ^%G z5K;_}(+)Ju&?>g#J3dj^%!sj6R_)K#8ts0pW--0_!yYD&GA7dd1i@$C*6nl^>wL?jnGpd ziw2x1p~x&%0^t)LlY$X@Mn)E-z;OF^zK$%yzERl^Wt^*$)DK690t5B7)|tK|Vh$CC z5pc_FR9Fru%n}rd{aCsOpE@)5@r?&;Zmj%PB;sXkf7VouIZX;TUh!!_BWc@sk%cj( zbmQkd{u$ePfX+FoX|TFhTdN&U#iZ7W0Taqtdad)Api;&q(to)Og(Icb15N=B`Untk zNVrTWo^?3{_wj-uE7Sgep^1<62rkY@)nkS8lP8F7ig%!ei2AhE11O4-D|`Tn$_huX z;(l5*m%QoQkhck*zd+BNJw*NZr6~_FbHIdnO20zN$rGVm3)4 zU&f%3aIQ^|zz^hd@CjAcNnn-o)sOp>=`zT3AQV{-@=x9vlABP)`?6yLq}0Z-VMjJt z3WJ=)hVx4??(yqL)Eg|7-7aM$M7n1=7!JCOX0v!P8&U(rBBd!zDWeVQ5dJVlmEZ_@3hCJmN|KSF zkpBCb73icS9K>?y;k3$?B^?x^B`;LS~z-mTYOYu&VjO+mU! zJ}LqgRMnb6D46dk<=YdamNc4z$}>nc8nDfw)&Zj>v-ouQt$PHPG56);t5Y$z>h;V( z`&&fcN47ABVYce$aJJ}b_zOdeZL^H~z|{O0{c;`E#n=;7JFa3OAo`UYXW>*cBw70D zVMY9Zkb&j@w^ox=)xa{MO~0f9_L*uHt{6IlU9hW;1LMN0MUw5mN45w)Jn|}99v_Ge zlR9v51}CN!V%ZY$yHXogk1wCp2BN-Hg?aQP%=Ipf@i5nIU@m0tKvjhc`fwuF(-=)= z&w*Mwil+wXP<3reBV@#(0<552n*u4BsKE&At4sjBF78u-ouVy;7O&_vUFv!r)?MZJ z-XN_8K!GM`0SzHE@S3qkUY2I*=JYV~eN-?raOq}CJT#!0eLFVIg)LVK;AC)9_EHE8 zCA4b8j4V=$gqAs&)s8iFdRNL|-M%i6YT8Y*e(+W`1V@!FMCFbm_Q1(LIcg)IG{vF$ z!IM1XCwcgZbtxv7=?Et} zlsb@w2>=G$$D{-1DLuU6gVn@M}kl~gmyg!S@TRf4>y@v+(xZ=Q_@+h!XgLH z@siQV>Bx1?GqyjJ(d*iY3ZvJpj9^r1m{m3S6pi=!B#*p>Oe797DeAi5#icZWMn3d` zIhX#=OSP<$-!D@PlBNSU8n8ab1O|wEqsk>15mPOVMO-dG^)&Kfw!yEdm9u|acR=ph z6e3S4S9%!6o*LO=DUu-O6CJPQ4bBb>_Z;JVtX=9Z4>1VaxSt95qAx*6(?VaMF@G+l zy?T7{t%)B0-ELn{o?>v zQ{}cV7V%;s&_54wop`Yn+_hDwzX1(BGBw$W?Ax+ohJZX3Fy4#nmE;IrZTQyaTcYT; zCX*Nd!LG@cN^U+O6Ejt4I66X0&UuCzoHsBR)g^48@|ML38PJ9E{}kaKc*R+MX#%*} z7aw{27eIq1^1y}(+#LUrUV6}jFjttw1gXlcP;PcQATgO4LmhGVM}kof0~&@s)Px&( z=yv37)g664i^r%OZT0~@HV|<4=&tgIPN5z9h0k`9fDH~40wBZXc2OXNs=@(8VYWiA zZ=yyIK%)*V#9>as$Q&Z;o(f54?URGSiCw;WnkJQu=lpwOOEXgIiLJT#Q%+$HRM}D5 z5lG1`xX?9lM9SF2~W*3p$KJ2vlDDbud!S4o+LZ_!o2`=4<6WC-=lw~Vb7d){?t z)ohuQw&j>f34v#4z7v4WmAtWtqB{Qeih3#yQM2M4V_R;U<+mHl<~(M}ps?}zH~oXK z@gjSS@v^mp@gj?Pe74+0W0B+h&Sl>)c@VR5=LNsr&cbiT6C-$9GvY;mM7a*Xn~ony ziBFuEeMP}x1()E(i*pxiOZ<0yZ7Q(L82I>^c;Yt*KDI&xk51+cRiyJ`Q@aI%Kxqmo z9~DU?xl0tXPz>*@aF4%5m;}rxr{M1yIH&gKsm7C9SIfmIOP!3wIYnG1EvAdJfEwb7qHoucn3aHx%xaU)m0Lwo+xM@qI^v! z`W{7Q<2(yXn)5tLIxK;<7BsToZ*{V)ps(@Z72U^D;3vw6=G2?#G06bF8^D1DDt5#d z!rNvg*Rz8EW+7AR_xQ&A;rZ-GLFOAbY=^7Rj7aIs52Xjfa^PQ?gjmwqAF0DonZm2h ziHIRylt6_C$repC0~!#?Rr=DdsJnw|sy$@nLm==JY_>XtVr)eV?|@uaH5lb;IuEAr z)sVaTX9-4`8dPF}=;21ad8>&iZ>hxO%}XVKQeQYNhIh3kbSJJ!eRkh-+~eXH*HuVV zPGPNbZ%kQ9wIl;g*PE)$mda@b=jI7)Ilg)-bEiGVIm-w@is9GfDfpQ3(up*~>(*GO z?<@!lx7*`-yA5R;C3L^iZc|m?zFBU!@u^q4t!c*bdGy1lMr;OXBY!kL1E+&?hT@1n zqtI(;(--Ihw-V@ex;#&pD|C5*E`l!C=u)4&@W&Vghi~IA{|+uIwI%qvm2>M0E9)yO z>)&6$u>R8e#rfKrn6GK-x!pLczlY!PyzGQbB(FQZH2sZ9i@q_@R0z~pssEDcz?00P aV|?bWVaXet=$_L-{!;Bi?ZVuJ`F{hl?FIY* diff --git a/object_detection/core/__pycache__/post_processing.cpython-35.pyc b/object_detection/core/__pycache__/post_processing.cpython-35.pyc deleted file mode 100644 index 6192014dd39f85f2587da02baebe47851f301888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14936 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 diff --git a/object_detection/core/__pycache__/preprocessor.cpython-35.pyc b/object_detection/core/__pycache__/preprocessor.cpython-35.pyc deleted file mode 100644 index e0b16b7fda325aa01d1ce435eace1185996e90e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87800 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 diff --git a/object_detection/core/__pycache__/target_assigner.cpython-35.pyc b/object_detection/core/__pycache__/target_assigner.cpython-35.pyc deleted file mode 100644 index 039d78c48a581623a8a02d329a35f9ab8f7ffd2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17439 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 L8KZ_!*z5ld|9WG$ diff --git a/object_detection/core/anchor_generator.py b/object_detection/core/anchor_generator.py deleted file mode 100644 index ed6a2bc5..00000000 --- a/object_detection/core/anchor_generator.py +++ /dev/null @@ -1,142 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Base anchor generator. - -The job of the anchor generator is to create (or load) a collection -of bounding boxes to be used as anchors. - -Generated anchors are assumed to match some convolutional grid or list of grid -shapes. For example, we might want to generate anchors matching an 8x8 -feature map and a 4x4 feature map. If we place 3 anchors per grid location -on the first feature map and 6 anchors per grid location on the second feature -map, then 3*8*8 + 6*4*4 = 288 anchors are generated in total. - -To support fully convolutional settings, feature map shapes are passed -dynamically at generation time. The number of anchors to place at each location -is static --- implementations of AnchorGenerator must always be able return -the number of anchors that it uses per location for each feature map. -""" -from abc import ABCMeta -from abc import abstractmethod - -import tensorflow as tf - - -class AnchorGenerator(object): - """Abstract base class for anchor generators.""" - __metaclass__ = ABCMeta - - @abstractmethod - def name_scope(self): - """Name scope. - - Must be defined by implementations. - - Returns: - a string representing the name scope of the anchor generation operation. - """ - pass - - @property - def check_num_anchors(self): - """Whether to dynamically check the number of anchors generated. - - Can be overridden by implementations that would like to disable this - behavior. - - Returns: - a boolean controlling whether the Generate function should dynamically - check the number of anchors generated against the mathematically - expected number of anchors. - """ - return True - - @abstractmethod - def num_anchors_per_location(self): - """Returns the number of anchors per spatial location. - - Returns: - a list of integers, one for each expected feature map to be passed to - the `generate` function. - """ - pass - - def generate(self, feature_map_shape_list, **params): - """Generates a collection of bounding boxes to be used as anchors. - - TODO: remove **params from argument list and make stride and offsets (for - multiple_grid_anchor_generator) constructor arguments. - - Args: - feature_map_shape_list: list of (height, width) pairs in the format - [(height_0, width_0), (height_1, width_1), ...] that the generated - anchors must align with. Pairs can be provided as 1-dimensional - integer tensors of length 2 or simply as tuples of integers. - **params: parameters for anchor generation op - - Returns: - boxes: a BoxList holding a collection of N anchor boxes - Raises: - ValueError: if the number of feature map shapes does not match the length - of NumAnchorsPerLocation. - """ - if self.check_num_anchors and ( - len(feature_map_shape_list) != len(self.num_anchors_per_location())): - raise ValueError('Number of feature maps is expected to equal the length ' - 'of `num_anchors_per_location`.') - with tf.name_scope(self.name_scope()): - anchors = self._generate(feature_map_shape_list, **params) - if self.check_num_anchors: - with tf.control_dependencies([ - self._assert_correct_number_of_anchors( - anchors, feature_map_shape_list)]): - anchors.set(tf.identity(anchors.get())) - return anchors - - @abstractmethod - def _generate(self, feature_map_shape_list, **params): - """To be overridden by implementations. - - Args: - feature_map_shape_list: list of (height, width) pairs in the format - [(height_0, width_0), (height_1, width_1), ...] that the generated - anchors must align with. - **params: parameters for anchor generation op - - Returns: - boxes: a BoxList holding a collection of N anchor boxes - """ - pass - - def _assert_correct_number_of_anchors(self, anchors, feature_map_shape_list): - """Assert that correct number of anchors was generated. - - Args: - anchors: box_list.BoxList object holding anchors generated - feature_map_shape_list: list of (height, width) pairs in the format - [(height_0, width_0), (height_1, width_1), ...] that the generated - anchors must align with. - Returns: - Op that raises InvalidArgumentError if the number of anchors does not - match the number of expected anchors. - """ - expected_num_anchors = 0 - for num_anchors_per_location, feature_map_shape in zip( - self.num_anchors_per_location(), feature_map_shape_list): - expected_num_anchors += (num_anchors_per_location - * feature_map_shape[0] - * feature_map_shape[1]) - return tf.assert_equal(expected_num_anchors, anchors.num_boxes()) diff --git a/object_detection/core/balanced_positive_negative_sampler.py b/object_detection/core/balanced_positive_negative_sampler.py deleted file mode 100644 index 68844c4f..00000000 --- a/object_detection/core/balanced_positive_negative_sampler.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Class to subsample minibatches by balancing positives and negatives. - -Subsamples minibatches based on a pre-specified positive fraction in range -[0,1]. The class presumes there are many more negatives than positive examples: -if the desired batch_size cannot be achieved with the pre-specified positive -fraction, it fills the rest with negative examples. If this is not sufficient -for obtaining the desired batch_size, it returns fewer examples. - -The main function to call is Subsample(self, indicator, labels). For convenience -one can also call SubsampleWeights(self, weights, labels) which is defined in -the minibatch_sampler base class. -""" - -import tensorflow as tf - -from object_detection.core import minibatch_sampler - - -class BalancedPositiveNegativeSampler(minibatch_sampler.MinibatchSampler): - """Subsamples minibatches to a desired balance of positives and negatives.""" - - def __init__(self, positive_fraction=0.5): - """Constructs a minibatch sampler. - - Args: - positive_fraction: desired fraction of positive examples (scalar in [0,1]) - - Raises: - ValueError: if positive_fraction < 0, or positive_fraction > 1 - """ - if positive_fraction < 0 or positive_fraction > 1: - raise ValueError('positive_fraction should be in range [0,1]. ' - 'Received: %s.' % positive_fraction) - self._positive_fraction = positive_fraction - - def subsample(self, indicator, batch_size, labels): - """Returns subsampled minibatch. - - Args: - indicator: boolean tensor of shape [N] whose True entries can be sampled. - batch_size: desired batch size. - labels: boolean tensor of shape [N] denoting positive(=True) and negative - (=False) examples. - - Returns: - is_sampled: boolean tensor of shape [N], True for entries which are - sampled. - - Raises: - ValueError: if labels and indicator are not 1D boolean tensors. - """ - if len(indicator.get_shape().as_list()) != 1: - raise ValueError('indicator must be 1 dimensional, got a tensor of ' - 'shape %s' % indicator.get_shape()) - if len(labels.get_shape().as_list()) != 1: - raise ValueError('labels must be 1 dimensional, got a tensor of ' - 'shape %s' % labels.get_shape()) - if labels.dtype != tf.bool: - raise ValueError('labels should be of type bool. Received: %s' % - labels.dtype) - if indicator.dtype != tf.bool: - raise ValueError('indicator should be of type bool. Received: %s' % - indicator.dtype) - - # Only sample from indicated samples - negative_idx = tf.logical_not(labels) - positive_idx = tf.logical_and(labels, indicator) - negative_idx = tf.logical_and(negative_idx, indicator) - - # Sample positive and negative samples separately - max_num_pos = int(self._positive_fraction * batch_size) - sampled_pos_idx = self.subsample_indicator(positive_idx, max_num_pos) - max_num_neg = batch_size - tf.reduce_sum(tf.cast(sampled_pos_idx, tf.int32)) - sampled_neg_idx = self.subsample_indicator(negative_idx, max_num_neg) - - sampled_idx = tf.logical_or(sampled_pos_idx, sampled_neg_idx) - return sampled_idx diff --git a/object_detection/core/balanced_positive_negative_sampler_test.py b/object_detection/core/balanced_positive_negative_sampler_test.py deleted file mode 100644 index 23991cf5..00000000 --- a/object_detection/core/balanced_positive_negative_sampler_test.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.balanced_positive_negative_sampler.""" - -import numpy as np -import tensorflow as tf - -from object_detection.core import balanced_positive_negative_sampler - - -class BalancedPositiveNegativeSamplerTest(tf.test.TestCase): - - def test_subsample_all_examples(self): - numpy_labels = np.random.permutation(300) - indicator = tf.constant(np.ones(300) == 1) - numpy_labels = (numpy_labels - 200) > 0 - - labels = tf.constant(numpy_labels) - - sampler = (balanced_positive_negative_sampler. - BalancedPositiveNegativeSampler()) - is_sampled = sampler.subsample(indicator, 64, labels) - with self.test_session() as sess: - is_sampled = sess.run(is_sampled) - self.assertTrue(sum(is_sampled) == 64) - self.assertTrue(sum(np.logical_and(numpy_labels, is_sampled)) == 32) - self.assertTrue(sum(np.logical_and( - np.logical_not(numpy_labels), is_sampled)) == 32) - - def test_subsample_selection(self): - # Test random sampling when only some examples can be sampled: - # 100 samples, 20 positives, 10 positives cannot be sampled - numpy_labels = np.arange(100) - numpy_indicator = numpy_labels < 90 - indicator = tf.constant(numpy_indicator) - numpy_labels = (numpy_labels - 80) >= 0 - - labels = tf.constant(numpy_labels) - - sampler = (balanced_positive_negative_sampler. - BalancedPositiveNegativeSampler()) - is_sampled = sampler.subsample(indicator, 64, labels) - with self.test_session() as sess: - is_sampled = sess.run(is_sampled) - self.assertTrue(sum(is_sampled) == 64) - self.assertTrue(sum(np.logical_and(numpy_labels, is_sampled)) == 10) - self.assertTrue(sum(np.logical_and( - np.logical_not(numpy_labels), is_sampled)) == 54) - self.assertAllEqual(is_sampled, np.logical_and(is_sampled, - numpy_indicator)) - - def test_raises_error_with_incorrect_label_shape(self): - labels = tf.constant([[True, False, False]]) - indicator = tf.constant([True, False, True]) - sampler = (balanced_positive_negative_sampler. - BalancedPositiveNegativeSampler()) - with self.assertRaises(ValueError): - sampler.subsample(indicator, 64, labels) - - def test_raises_error_with_incorrect_indicator_shape(self): - labels = tf.constant([True, False, False]) - indicator = tf.constant([[True, False, True]]) - sampler = (balanced_positive_negative_sampler. - BalancedPositiveNegativeSampler()) - with self.assertRaises(ValueError): - sampler.subsample(indicator, 64, labels) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/batcher.py b/object_detection/core/batcher.py deleted file mode 100644 index c5dfb712..00000000 --- a/object_detection/core/batcher.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Provides functions to batch a dictionary of input tensors.""" -import collections - -import tensorflow as tf - -from object_detection.core import prefetcher - -rt_shape_str = '_runtime_shapes' - - -class BatchQueue(object): - """BatchQueue class. - - This class creates a batch queue to asynchronously enqueue tensors_dict. - It also adds a FIFO prefetcher so that the batches are readily available - for the consumers. Dequeue ops for a BatchQueue object can be created via - the Dequeue method which evaluates to a batch of tensor_dict. - - Example input pipeline with batching: - ------------------------------------ - key, string_tensor = slim.parallel_reader.parallel_read(...) - tensor_dict = decoder.decode(string_tensor) - tensor_dict = preprocessor.preprocess(tensor_dict, ...) - batch_queue = batcher.BatchQueue(tensor_dict, - batch_size=32, - batch_queue_capacity=2000, - num_batch_queue_threads=8, - prefetch_queue_capacity=20) - tensor_dict = batch_queue.dequeue() - outputs = Model(tensor_dict) - ... - ----------------------------------- - - Notes: - ----- - This class batches tensors of unequal sizes by zero padding and unpadding - them after generating a batch. This can be computationally expensive when - batching tensors (such as images) that are of vastly different sizes. So it is - recommended that the shapes of such tensors be fully defined in tensor_dict - while other lightweight tensors such as bounding box corners and class labels - can be of varying sizes. Use either crop or resize operations to fully define - the shape of an image in tensor_dict. - - It is also recommended to perform any preprocessing operations on tensors - before passing to BatchQueue and subsequently calling the Dequeue method. - - Another caveat is that this class does not read the last batch if it is not - full. The current implementation makes it hard to support that use case. So, - for evaluation, when it is critical to run all the examples through your - network use the input pipeline example mentioned in core/prefetcher.py. - """ - - def __init__(self, tensor_dict, batch_size, batch_queue_capacity, - num_batch_queue_threads, prefetch_queue_capacity): - """Constructs a batch queue holding tensor_dict. - - Args: - tensor_dict: dictionary of tensors to batch. - batch_size: batch size. - batch_queue_capacity: max capacity of the queue from which the tensors are - batched. - num_batch_queue_threads: number of threads to use for batching. - prefetch_queue_capacity: max capacity of the queue used to prefetch - assembled batches. - """ - # Remember static shapes to set shapes of batched tensors. - static_shapes = collections.OrderedDict( - {key: tensor.get_shape() for key, tensor in tensor_dict.items()}) - # Remember runtime shapes to unpad tensors after batching. - runtime_shapes = collections.OrderedDict( - {(key + rt_shape_str): tf.shape(tensor) - for key, tensor in tensor_dict.items()}) - - all_tensors = tensor_dict - all_tensors.update(runtime_shapes) - batched_tensors = tf.train.batch( - all_tensors, - capacity=batch_queue_capacity, - batch_size=batch_size, - dynamic_pad=True, - num_threads=num_batch_queue_threads) - - self._queue = prefetcher.prefetch(batched_tensors, - prefetch_queue_capacity) - self._static_shapes = static_shapes - self._batch_size = batch_size - - def dequeue(self): - """Dequeues a batch of tensor_dict from the BatchQueue. - - TODO: use allow_smaller_final_batch to allow running over the whole eval set - - Returns: - A list of tensor_dicts of the requested batch_size. - """ - batched_tensors = self._queue.dequeue() - # Separate input tensors from tensors containing their runtime shapes. - tensors = {} - shapes = {} - for key, batched_tensor in batched_tensors.items(): - unbatched_tensor_list = tf.unstack(batched_tensor) - for i, unbatched_tensor in enumerate(unbatched_tensor_list): - if rt_shape_str in key: - shapes[(key[:-len(rt_shape_str)], i)] = unbatched_tensor - else: - tensors[(key, i)] = unbatched_tensor - - # Undo that padding using shapes and create a list of size `batch_size` that - # contains tensor dictionaries. - tensor_dict_list = [] - batch_size = self._batch_size - for batch_id in range(batch_size): - tensor_dict = {} - for key in self._static_shapes: - tensor_dict[key] = tf.slice(tensors[(key, batch_id)], - tf.zeros_like(shapes[(key, batch_id)]), - shapes[(key, batch_id)]) - tensor_dict[key].set_shape(self._static_shapes[key]) - tensor_dict_list.append(tensor_dict) - - return tensor_dict_list diff --git a/object_detection/core/batcher_test.py b/object_detection/core/batcher_test.py deleted file mode 100644 index 61b4390b..00000000 --- a/object_detection/core/batcher_test.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.batcher.""" - -import numpy as np -import tensorflow as tf - -from object_detection.core import batcher - -slim = tf.contrib.slim - - -class BatcherTest(tf.test.TestCase): - - def test_batch_and_unpad_2d_tensors_of_different_sizes_in_1st_dimension(self): - with self.test_session() as sess: - batch_size = 3 - num_batches = 2 - examples = tf.Variable(tf.constant(2, dtype=tf.int32)) - counter = examples.count_up_to(num_batches * batch_size + 2) - boxes = tf.tile( - tf.reshape(tf.range(4), [1, 4]), tf.stack([counter, tf.constant(1)])) - batch_queue = batcher.BatchQueue( - tensor_dict={'boxes': boxes}, - batch_size=batch_size, - batch_queue_capacity=100, - num_batch_queue_threads=1, - prefetch_queue_capacity=100) - batch = batch_queue.dequeue() - - for tensor_dict in batch: - for tensor in tensor_dict.values(): - self.assertAllEqual([None, 4], tensor.get_shape().as_list()) - - tf.initialize_all_variables().run() - with slim.queues.QueueRunners(sess): - i = 2 - for _ in range(num_batches): - batch_np = sess.run(batch) - for tensor_dict in batch_np: - for tensor in tensor_dict.values(): - self.assertAllEqual(tensor, np.tile(np.arange(4), (i, 1))) - i += 1 - with self.assertRaises(tf.errors.OutOfRangeError): - sess.run(batch) - - def test_batch_and_unpad_2d_tensors_of_different_sizes_in_all_dimensions( - self): - with self.test_session() as sess: - batch_size = 3 - num_batches = 2 - examples = tf.Variable(tf.constant(2, dtype=tf.int32)) - counter = examples.count_up_to(num_batches * batch_size + 2) - image = tf.reshape( - tf.range(counter * counter), tf.stack([counter, counter])) - batch_queue = batcher.BatchQueue( - tensor_dict={'image': image}, - batch_size=batch_size, - batch_queue_capacity=100, - num_batch_queue_threads=1, - prefetch_queue_capacity=100) - batch = batch_queue.dequeue() - - for tensor_dict in batch: - for tensor in tensor_dict.values(): - self.assertAllEqual([None, None], tensor.get_shape().as_list()) - - tf.initialize_all_variables().run() - with slim.queues.QueueRunners(sess): - i = 2 - for _ in range(num_batches): - batch_np = sess.run(batch) - for tensor_dict in batch_np: - for tensor in tensor_dict.values(): - self.assertAllEqual(tensor, np.arange(i * i).reshape((i, i))) - i += 1 - with self.assertRaises(tf.errors.OutOfRangeError): - sess.run(batch) - - def test_batch_and_unpad_2d_tensors_of_same_size_in_all_dimensions(self): - with self.test_session() as sess: - batch_size = 3 - num_batches = 2 - examples = tf.Variable(tf.constant(1, dtype=tf.int32)) - counter = examples.count_up_to(num_batches * batch_size + 1) - image = tf.reshape(tf.range(1, 13), [4, 3]) * counter - batch_queue = batcher.BatchQueue( - tensor_dict={'image': image}, - batch_size=batch_size, - batch_queue_capacity=100, - num_batch_queue_threads=1, - prefetch_queue_capacity=100) - batch = batch_queue.dequeue() - - for tensor_dict in batch: - for tensor in tensor_dict.values(): - self.assertAllEqual([4, 3], tensor.get_shape().as_list()) - - tf.initialize_all_variables().run() - with slim.queues.QueueRunners(sess): - i = 1 - for _ in range(num_batches): - batch_np = sess.run(batch) - for tensor_dict in batch_np: - for tensor in tensor_dict.values(): - self.assertAllEqual(tensor, np.arange(1, 13).reshape((4, 3)) * i) - i += 1 - with self.assertRaises(tf.errors.OutOfRangeError): - sess.run(batch) - - def test_batcher_when_batch_size_is_one(self): - with self.test_session() as sess: - batch_size = 1 - num_batches = 2 - examples = tf.Variable(tf.constant(2, dtype=tf.int32)) - counter = examples.count_up_to(num_batches * batch_size + 2) - image = tf.reshape( - tf.range(counter * counter), tf.stack([counter, counter])) - batch_queue = batcher.BatchQueue( - tensor_dict={'image': image}, - batch_size=batch_size, - batch_queue_capacity=100, - num_batch_queue_threads=1, - prefetch_queue_capacity=100) - batch = batch_queue.dequeue() - - for tensor_dict in batch: - for tensor in tensor_dict.values(): - self.assertAllEqual([None, None], tensor.get_shape().as_list()) - - tf.initialize_all_variables().run() - with slim.queues.QueueRunners(sess): - i = 2 - for _ in range(num_batches): - batch_np = sess.run(batch) - for tensor_dict in batch_np: - for tensor in tensor_dict.values(): - self.assertAllEqual(tensor, np.arange(i * i).reshape((i, i))) - i += 1 - with self.assertRaises(tf.errors.OutOfRangeError): - sess.run(batch) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/box_coder.py b/object_detection/core/box_coder.py deleted file mode 100644 index f20ac956..00000000 --- a/object_detection/core/box_coder.py +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Base box coder. - -Box coders convert between coordinate frames, namely image-centric -(with (0,0) on the top left of image) and anchor-centric (with (0,0) being -defined by a specific anchor). - -Users of a BoxCoder can call two methods: - encode: which encodes a box with respect to a given anchor - (or rather, a tensor of boxes wrt a corresponding tensor of anchors) and - decode: which inverts this encoding with a decode operation. -In both cases, the arguments are assumed to be in 1-1 correspondence already; -it is not the job of a BoxCoder to perform matching. -""" -from abc import ABCMeta -from abc import abstractmethod -from abc import abstractproperty - -import tensorflow as tf - - -# Box coder types. -FASTER_RCNN = 'faster_rcnn' -KEYPOINT = 'keypoint' -MEAN_STDDEV = 'mean_stddev' -SQUARE = 'square' - - -class BoxCoder(object): - """Abstract base class for box coder.""" - __metaclass__ = ABCMeta - - @abstractproperty - def code_size(self): - """Return the size of each code. - - This number is a constant and should agree with the output of the `encode` - op (e.g. if rel_codes is the output of self.encode(...), then it should have - shape [N, code_size()]). This abstractproperty should be overridden by - implementations. - - Returns: - an integer constant - """ - pass - - def encode(self, boxes, anchors): - """Encode a box list relative to an anchor collection. - - Args: - boxes: BoxList holding N boxes to be encoded - anchors: BoxList of N anchors - - Returns: - a tensor representing N relative-encoded boxes - """ - with tf.name_scope('Encode'): - return self._encode(boxes, anchors) - - def decode(self, rel_codes, anchors): - """Decode boxes that are encoded relative to an anchor collection. - - Args: - rel_codes: a tensor representing N relative-encoded boxes - anchors: BoxList of anchors - - Returns: - boxlist: BoxList holding N boxes encoded in the ordinary way (i.e., - with corners y_min, x_min, y_max, x_max) - """ - with tf.name_scope('Decode'): - return self._decode(rel_codes, anchors) - - @abstractmethod - def _encode(self, boxes, anchors): - """Method to be overriden by implementations. - - Args: - boxes: BoxList holding N boxes to be encoded - anchors: BoxList of N anchors - - Returns: - a tensor representing N relative-encoded boxes - """ - pass - - @abstractmethod - def _decode(self, rel_codes, anchors): - """Method to be overriden by implementations. - - Args: - rel_codes: a tensor representing N relative-encoded boxes - anchors: BoxList of anchors - - Returns: - boxlist: BoxList holding N boxes encoded in the ordinary way (i.e., - with corners y_min, x_min, y_max, x_max) - """ - pass - - -def batch_decode(encoded_boxes, box_coder, anchors): - """Decode a batch of encoded boxes. - - This op takes a batch of encoded bounding boxes and transforms - them to a batch of bounding boxes specified by their corners in - the order of [y_min, x_min, y_max, x_max]. - - Args: - encoded_boxes: a float32 tensor of shape [batch_size, num_anchors, - code_size] representing the location of the objects. - box_coder: a BoxCoder object. - anchors: a BoxList of anchors used to encode `encoded_boxes`. - - Returns: - decoded_boxes: a float32 tensor of shape [batch_size, num_anchors, - coder_size] representing the corners of the objects in the order - of [y_min, x_min, y_max, x_max]. - - Raises: - ValueError: if batch sizes of the inputs are inconsistent, or if - the number of anchors inferred from encoded_boxes and anchors are - inconsistent. - """ - encoded_boxes.get_shape().assert_has_rank(3) - if encoded_boxes.get_shape()[1].value != anchors.num_boxes_static(): - raise ValueError('The number of anchors inferred from encoded_boxes' - ' and anchors are inconsistent: shape[1] of encoded_boxes' - ' %s should be equal to the number of anchors: %s.' % - (encoded_boxes.get_shape()[1].value, - anchors.num_boxes_static())) - - decoded_boxes = tf.stack([ - box_coder.decode(boxes, anchors).get() - for boxes in tf.unstack(encoded_boxes) - ]) - return decoded_boxes diff --git a/object_detection/core/box_coder_test.py b/object_detection/core/box_coder_test.py deleted file mode 100644 index c087a325..00000000 --- a/object_detection/core/box_coder_test.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.box_coder.""" - -import tensorflow as tf - -from object_detection.core import box_coder -from object_detection.core import box_list - - -class MockBoxCoder(box_coder.BoxCoder): - """Test BoxCoder that encodes/decodes using the multiply-by-two function.""" - - def code_size(self): - return 4 - - def _encode(self, boxes, anchors): - return 2.0 * boxes.get() - - def _decode(self, rel_codes, anchors): - return box_list.BoxList(rel_codes / 2.0) - - -class BoxCoderTest(tf.test.TestCase): - - def test_batch_decode(self): - mock_anchor_corners = tf.constant( - [[0, 0.1, 0.2, 0.3], [0.2, 0.4, 0.4, 0.6]], tf.float32) - mock_anchors = box_list.BoxList(mock_anchor_corners) - mock_box_coder = MockBoxCoder() - - expected_boxes = [[[0.0, 0.1, 0.5, 0.6], [0.5, 0.6, 0.7, 0.8]], - [[0.1, 0.2, 0.3, 0.4], [0.7, 0.8, 0.9, 1.0]]] - - encoded_boxes_list = [mock_box_coder.encode( - box_list.BoxList(tf.constant(boxes)), mock_anchors) - for boxes in expected_boxes] - encoded_boxes = tf.stack(encoded_boxes_list) - decoded_boxes = box_coder.batch_decode( - encoded_boxes, mock_box_coder, mock_anchors) - - with self.test_session() as sess: - decoded_boxes_result = sess.run(decoded_boxes) - self.assertAllClose(expected_boxes, decoded_boxes_result) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/box_list.py b/object_detection/core/box_list.py deleted file mode 100644 index c0196f05..00000000 --- a/object_detection/core/box_list.py +++ /dev/null @@ -1,207 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Bounding Box List definition. - -BoxList represents a list of bounding boxes as tensorflow -tensors, where each bounding box is represented as a row of 4 numbers, -[y_min, x_min, y_max, x_max]. It is assumed that all bounding boxes -within a given list correspond to a single image. See also -box_list_ops.py for common box related operations (such as area, iou, etc). - -Optionally, users can add additional related fields (such as weights). -We assume the following things to be true about fields: -* they correspond to boxes in the box_list along the 0th dimension -* they have inferrable rank at graph construction time -* all dimensions except for possibly the 0th can be inferred - (i.e., not None) at graph construction time. - -Some other notes: - * Following tensorflow conventions, we use height, width ordering, - and correspondingly, y,x (or ymin, xmin, ymax, xmax) ordering - * Tensors are always provided as (flat) [N, 4] tensors. -""" - -import tensorflow as tf - - -class BoxList(object): - """Box collection.""" - - def __init__(self, boxes): - """Constructs box collection. - - Args: - boxes: a tensor of shape [N, 4] representing box corners - - Raises: - ValueError: if invalid dimensions for bbox data or if bbox data is not in - float32 format. - """ - if len(boxes.get_shape()) != 2 or boxes.get_shape()[-1] != 4: - raise ValueError('Invalid dimensions for box data.') - if boxes.dtype != tf.float32: - raise ValueError('Invalid tensor type: should be tf.float32') - self.data = {'boxes': boxes} - - def num_boxes(self): - """Returns number of boxes held in collection. - - Returns: - a tensor representing the number of boxes held in the collection. - """ - return tf.shape(self.data['boxes'])[0] - - def num_boxes_static(self): - """Returns number of boxes held in collection. - - This number is inferred at graph construction time rather than run-time. - - Returns: - Number of boxes held in collection (integer) or None if this is not - inferrable at graph construction time. - """ - return self.data['boxes'].get_shape()[0].value - - def get_all_fields(self): - """Returns all fields.""" - return self.data.keys() - - def get_extra_fields(self): - """Returns all non-box fields (i.e., everything not named 'boxes').""" - return [k for k in self.data.keys() if k != 'boxes'] - - def add_field(self, field, field_data): - """Add field to box list. - - This method can be used to add related box data such as - weights/labels, etc. - - Args: - field: a string key to access the data via `get` - field_data: a tensor containing the data to store in the BoxList - """ - self.data[field] = field_data - - def has_field(self, field): - return field in self.data - - def get(self): - """Convenience function for accessing box coordinates. - - Returns: - a tensor with shape [N, 4] representing box coordinates. - """ - return self.get_field('boxes') - - def set(self, boxes): - """Convenience function for setting box coordinates. - - Args: - boxes: a tensor of shape [N, 4] representing box corners - - Raises: - ValueError: if invalid dimensions for bbox data - """ - if len(boxes.get_shape()) != 2 or boxes.get_shape()[-1] != 4: - raise ValueError('Invalid dimensions for box data.') - self.data['boxes'] = boxes - - def get_field(self, field): - """Accesses a box collection and associated fields. - - This function returns specified field with object; if no field is specified, - it returns the box coordinates. - - Args: - field: this optional string parameter can be used to specify - a related field to be accessed. - - Returns: - a tensor representing the box collection or an associated field. - - Raises: - ValueError: if invalid field - """ - if not self.has_field(field): - raise ValueError('field ' + str(field) + ' does not exist') - return self.data[field] - - def set_field(self, field, value): - """Sets the value of a field. - - Updates the field of a box_list with a given value. - - Args: - field: (string) name of the field to set value. - value: the value to assign to the field. - - Raises: - ValueError: if the box_list does not have specified field. - """ - if not self.has_field(field): - raise ValueError('field %s does not exist' % field) - self.data[field] = value - - def get_center_coordinates_and_sizes(self, scope=None): - """Computes the center coordinates, height and width of the boxes. - - Args: - scope: name scope of the function. - - Returns: - a list of 4 1-D tensors [ycenter, xcenter, height, width]. - """ - with tf.name_scope(scope, 'get_center_coordinates_and_sizes'): - box_corners = self.get() - ymin, xmin, ymax, xmax = tf.unstack(tf.transpose(box_corners)) - width = xmax - xmin - height = ymax - ymin - ycenter = ymin + height / 2. - xcenter = xmin + width / 2. - return [ycenter, xcenter, height, width] - - def transpose_coordinates(self, scope=None): - """Transpose the coordinate representation in a boxlist. - - Args: - scope: name scope of the function. - """ - with tf.name_scope(scope, 'transpose_coordinates'): - y_min, x_min, y_max, x_max = tf.split( - value=self.get(), num_or_size_splits=4, axis=1) - self.set(tf.concat([x_min, y_min, x_max, y_max], 1)) - - def as_tensor_dict(self, fields=None): - """Retrieves specified fields as a dictionary of tensors. - - Args: - fields: (optional) list of fields to return in the dictionary. - If None (default), all fields are returned. - - Returns: - tensor_dict: A dictionary of tensors specified by fields. - - Raises: - ValueError: if specified field is not contained in boxlist. - """ - tensor_dict = {} - if fields is None: - fields = self.get_all_fields() - for field in fields: - if not self.has_field(field): - raise ValueError('boxlist must contain all specified fields') - tensor_dict[field] = self.get_field(field) - return tensor_dict diff --git a/object_detection/core/box_list_ops.py b/object_detection/core/box_list_ops.py deleted file mode 100644 index c98048d5..00000000 --- a/object_detection/core/box_list_ops.py +++ /dev/null @@ -1,984 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Bounding Box List operations. - -Example box operations that are supported: - * areas: compute bounding box areas - * iou: pairwise intersection-over-union scores - * sq_dist: pairwise distances between bounding boxes - -Whenever box_list_ops functions output a BoxList, the fields of the incoming -BoxList are retained unless documented otherwise. -""" -import tensorflow as tf - -from object_detection.core import box_list -from object_detection.utils import shape_utils - - -class SortOrder(object): - """Enum class for sort order. - - Attributes: - ascend: ascend order. - descend: descend order. - """ - ascend = 1 - descend = 2 - - -def area(boxlist, scope=None): - """Computes area of boxes. - - Args: - boxlist: BoxList holding N boxes - scope: name scope. - - Returns: - a tensor with shape [N] representing box areas. - """ - with tf.name_scope(scope, 'Area'): - y_min, x_min, y_max, x_max = tf.split( - value=boxlist.get(), num_or_size_splits=4, axis=1) - return tf.squeeze((y_max - y_min) * (x_max - x_min), [1]) - - -def height_width(boxlist, scope=None): - """Computes height and width of boxes in boxlist. - - Args: - boxlist: BoxList holding N boxes - scope: name scope. - - Returns: - Height: A tensor with shape [N] representing box heights. - Width: A tensor with shape [N] representing box widths. - """ - with tf.name_scope(scope, 'HeightWidth'): - y_min, x_min, y_max, x_max = tf.split( - value=boxlist.get(), num_or_size_splits=4, axis=1) - return tf.squeeze(y_max - y_min, [1]), tf.squeeze(x_max - x_min, [1]) - - -def scale(boxlist, y_scale, x_scale, scope=None): - """scale box coordinates in x and y dimensions. - - Args: - boxlist: BoxList holding N boxes - y_scale: (float) scalar tensor - x_scale: (float) scalar tensor - scope: name scope. - - Returns: - boxlist: BoxList holding N boxes - """ - with tf.name_scope(scope, 'Scale'): - y_scale = tf.cast(y_scale, tf.float32) - x_scale = tf.cast(x_scale, tf.float32) - y_min, x_min, y_max, x_max = tf.split( - value=boxlist.get(), num_or_size_splits=4, axis=1) - y_min = y_scale * y_min - y_max = y_scale * y_max - x_min = x_scale * x_min - x_max = x_scale * x_max - scaled_boxlist = box_list.BoxList( - tf.concat([y_min, x_min, y_max, x_max], 1)) - return _copy_extra_fields(scaled_boxlist, boxlist) - - -def clip_to_window(boxlist, window, filter_nonoverlapping=True, scope=None): - """Clip bounding boxes to a window. - - This op clips any input bounding boxes (represented by bounding box - corners) to a window, optionally filtering out boxes that do not - overlap at all with the window. - - Args: - boxlist: BoxList holding M_in boxes - window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] - window to which the op should clip boxes. - filter_nonoverlapping: whether to filter out boxes that do not overlap at - all with the window. - scope: name scope. - - Returns: - a BoxList holding M_out boxes where M_out <= M_in - """ - with tf.name_scope(scope, 'ClipToWindow'): - y_min, x_min, y_max, x_max = tf.split( - value=boxlist.get(), num_or_size_splits=4, axis=1) - win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) - y_min_clipped = tf.maximum(tf.minimum(y_min, win_y_max), win_y_min) - y_max_clipped = tf.maximum(tf.minimum(y_max, win_y_max), win_y_min) - x_min_clipped = tf.maximum(tf.minimum(x_min, win_x_max), win_x_min) - x_max_clipped = tf.maximum(tf.minimum(x_max, win_x_max), win_x_min) - clipped = box_list.BoxList( - tf.concat([y_min_clipped, x_min_clipped, y_max_clipped, x_max_clipped], - 1)) - clipped = _copy_extra_fields(clipped, boxlist) - if filter_nonoverlapping: - areas = area(clipped) - nonzero_area_indices = tf.cast( - tf.reshape(tf.where(tf.greater(areas, 0.0)), [-1]), tf.int32) - clipped = gather(clipped, nonzero_area_indices) - return clipped - - -def prune_outside_window(boxlist, window, scope=None): - """Prunes bounding boxes that fall outside a given window. - - This function prunes bounding boxes that even partially fall outside the given - window. See also clip_to_window which only prunes bounding boxes that fall - completely outside the window, and clips any bounding boxes that partially - overflow. - - Args: - boxlist: a BoxList holding M_in boxes. - window: a float tensor of shape [4] representing [ymin, xmin, ymax, xmax] - of the window - scope: name scope. - - Returns: - pruned_corners: a tensor with shape [M_out, 4] where M_out <= M_in - valid_indices: a tensor with shape [M_out] indexing the valid bounding boxes - in the input tensor. - """ - with tf.name_scope(scope, 'PruneOutsideWindow'): - y_min, x_min, y_max, x_max = tf.split( - value=boxlist.get(), num_or_size_splits=4, axis=1) - win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) - coordinate_violations = tf.concat([ - tf.less(y_min, win_y_min), tf.less(x_min, win_x_min), - tf.greater(y_max, win_y_max), tf.greater(x_max, win_x_max) - ], 1) - valid_indices = tf.reshape( - tf.where(tf.logical_not(tf.reduce_any(coordinate_violations, 1))), [-1]) - return gather(boxlist, valid_indices), valid_indices - - -def prune_completely_outside_window(boxlist, window, scope=None): - """Prunes bounding boxes that fall completely outside of the given window. - - The function clip_to_window prunes bounding boxes that fall - completely outside the window, but also clips any bounding boxes that - partially overflow. This function does not clip partially overflowing boxes. - - Args: - boxlist: a BoxList holding M_in boxes. - window: a float tensor of shape [4] representing [ymin, xmin, ymax, xmax] - of the window - scope: name scope. - - Returns: - pruned_corners: a tensor with shape [M_out, 4] where M_out <= M_in - valid_indices: a tensor with shape [M_out] indexing the valid bounding boxes - in the input tensor. - """ - with tf.name_scope(scope, 'PruneCompleteleyOutsideWindow'): - y_min, x_min, y_max, x_max = tf.split( - value=boxlist.get(), num_or_size_splits=4, axis=1) - win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) - coordinate_violations = tf.concat([ - tf.greater_equal(y_min, win_y_max), tf.greater_equal(x_min, win_x_max), - tf.less_equal(y_max, win_y_min), tf.less_equal(x_max, win_x_min) - ], 1) - valid_indices = tf.reshape( - tf.where(tf.logical_not(tf.reduce_any(coordinate_violations, 1))), [-1]) - return gather(boxlist, valid_indices), valid_indices - - -def intersection(boxlist1, boxlist2, scope=None): - """Compute pairwise intersection areas between boxes. - - Args: - boxlist1: BoxList holding N boxes - boxlist2: BoxList holding M boxes - scope: name scope. - - Returns: - a tensor with shape [N, M] representing pairwise intersections - """ - with tf.name_scope(scope, 'Intersection'): - y_min1, x_min1, y_max1, x_max1 = tf.split( - value=boxlist1.get(), num_or_size_splits=4, axis=1) - y_min2, x_min2, y_max2, x_max2 = tf.split( - value=boxlist2.get(), num_or_size_splits=4, axis=1) - all_pairs_min_ymax = tf.minimum(y_max1, tf.transpose(y_max2)) - all_pairs_max_ymin = tf.maximum(y_min1, tf.transpose(y_min2)) - intersect_heights = tf.maximum(0.0, all_pairs_min_ymax - all_pairs_max_ymin) - all_pairs_min_xmax = tf.minimum(x_max1, tf.transpose(x_max2)) - all_pairs_max_xmin = tf.maximum(x_min1, tf.transpose(x_min2)) - intersect_widths = tf.maximum(0.0, all_pairs_min_xmax - all_pairs_max_xmin) - return intersect_heights * intersect_widths - - -def matched_intersection(boxlist1, boxlist2, scope=None): - """Compute intersection areas between corresponding boxes in two boxlists. - - Args: - boxlist1: BoxList holding N boxes - boxlist2: BoxList holding N boxes - scope: name scope. - - Returns: - a tensor with shape [N] representing pairwise intersections - """ - with tf.name_scope(scope, 'MatchedIntersection'): - y_min1, x_min1, y_max1, x_max1 = tf.split( - value=boxlist1.get(), num_or_size_splits=4, axis=1) - y_min2, x_min2, y_max2, x_max2 = tf.split( - value=boxlist2.get(), num_or_size_splits=4, axis=1) - min_ymax = tf.minimum(y_max1, y_max2) - max_ymin = tf.maximum(y_min1, y_min2) - intersect_heights = tf.maximum(0.0, min_ymax - max_ymin) - min_xmax = tf.minimum(x_max1, x_max2) - max_xmin = tf.maximum(x_min1, x_min2) - intersect_widths = tf.maximum(0.0, min_xmax - max_xmin) - return tf.reshape(intersect_heights * intersect_widths, [-1]) - - -def iou(boxlist1, boxlist2, scope=None): - """Computes pairwise intersection-over-union between box collections. - - Args: - boxlist1: BoxList holding N boxes - boxlist2: BoxList holding M boxes - scope: name scope. - - Returns: - a tensor with shape [N, M] representing pairwise iou scores. - """ - with tf.name_scope(scope, 'IOU'): - intersections = intersection(boxlist1, boxlist2) - areas1 = area(boxlist1) - areas2 = area(boxlist2) - unions = ( - tf.expand_dims(areas1, 1) + tf.expand_dims(areas2, 0) - intersections) - return tf.where( - tf.equal(intersections, 0.0), - tf.zeros_like(intersections), tf.truediv(intersections, unions)) - - -def matched_iou(boxlist1, boxlist2, scope=None): - """Compute intersection-over-union between corresponding boxes in boxlists. - - Args: - boxlist1: BoxList holding N boxes - boxlist2: BoxList holding N boxes - scope: name scope. - - Returns: - a tensor with shape [N] representing pairwise iou scores. - """ - with tf.name_scope(scope, 'MatchedIOU'): - intersections = matched_intersection(boxlist1, boxlist2) - areas1 = area(boxlist1) - areas2 = area(boxlist2) - unions = areas1 + areas2 - intersections - return tf.where( - tf.equal(intersections, 0.0), - tf.zeros_like(intersections), tf.truediv(intersections, unions)) - - -def ioa(boxlist1, boxlist2, scope=None): - """Computes pairwise intersection-over-area between box collections. - - intersection-over-area (IOA) between two boxes box1 and box2 is defined as - their intersection area over box2's area. Note that ioa is not symmetric, - that is, ioa(box1, box2) != ioa(box2, box1). - - Args: - boxlist1: BoxList holding N boxes - boxlist2: BoxList holding M boxes - scope: name scope. - - Returns: - a tensor with shape [N, M] representing pairwise ioa scores. - """ - with tf.name_scope(scope, 'IOA'): - intersections = intersection(boxlist1, boxlist2) - areas = tf.expand_dims(area(boxlist2), 0) - return tf.truediv(intersections, areas) - - -def prune_non_overlapping_boxes( - boxlist1, boxlist2, min_overlap=0.0, scope=None): - """Prunes the boxes in boxlist1 that overlap less than thresh with boxlist2. - - For each box in boxlist1, we want its IOA to be more than minoverlap with - at least one of the boxes in boxlist2. If it does not, we remove it. - - Args: - boxlist1: BoxList holding N boxes. - boxlist2: BoxList holding M boxes. - min_overlap: Minimum required overlap between boxes, to count them as - overlapping. - scope: name scope. - - Returns: - new_boxlist1: A pruned boxlist with size [N', 4]. - keep_inds: A tensor with shape [N'] indexing kept bounding boxes in the - first input BoxList `boxlist1`. - """ - with tf.name_scope(scope, 'PruneNonOverlappingBoxes'): - ioa_ = ioa(boxlist2, boxlist1) # [M, N] tensor - ioa_ = tf.reduce_max(ioa_, reduction_indices=[0]) # [N] tensor - keep_bool = tf.greater_equal(ioa_, tf.constant(min_overlap)) - keep_inds = tf.squeeze(tf.where(keep_bool), squeeze_dims=[1]) - new_boxlist1 = gather(boxlist1, keep_inds) - return new_boxlist1, keep_inds - - -def prune_small_boxes(boxlist, min_side, scope=None): - """Prunes small boxes in the boxlist which have a side smaller than min_side. - - Args: - boxlist: BoxList holding N boxes. - min_side: Minimum width AND height of box to survive pruning. - scope: name scope. - - Returns: - A pruned boxlist. - """ - with tf.name_scope(scope, 'PruneSmallBoxes'): - height, width = height_width(boxlist) - is_valid = tf.logical_and(tf.greater_equal(width, min_side), - tf.greater_equal(height, min_side)) - return gather(boxlist, tf.reshape(tf.where(is_valid), [-1])) - - -def change_coordinate_frame(boxlist, window, scope=None): - """Change coordinate frame of the boxlist to be relative to window's frame. - - Given a window of the form [ymin, xmin, ymax, xmax], - changes bounding box coordinates from boxlist to be relative to this window - (e.g., the min corner maps to (0,0) and the max corner maps to (1,1)). - - An example use case is data augmentation: where we are given groundtruth - boxes (boxlist) and would like to randomly crop the image to some - window (window). In this case we need to change the coordinate frame of - each groundtruth box to be relative to this new window. - - Args: - boxlist: A BoxList object holding N boxes. - window: A rank 1 tensor [4]. - scope: name scope. - - Returns: - Returns a BoxList object with N boxes. - """ - with tf.name_scope(scope, 'ChangeCoordinateFrame'): - win_height = window[2] - window[0] - win_width = window[3] - window[1] - boxlist_new = scale(box_list.BoxList( - boxlist.get() - [window[0], window[1], window[0], window[1]]), - 1.0 / win_height, 1.0 / win_width) - boxlist_new = _copy_extra_fields(boxlist_new, boxlist) - return boxlist_new - - -def sq_dist(boxlist1, boxlist2, scope=None): - """Computes the pairwise squared distances between box corners. - - This op treats each box as if it were a point in a 4d Euclidean space and - computes pairwise squared distances. - - Mathematically, we are given two matrices of box coordinates X and Y, - where X(i,:) is the i'th row of X, containing the 4 numbers defining the - corners of the i'th box in boxlist1. Similarly Y(j,:) corresponds to - boxlist2. We compute - Z(i,j) = ||X(i,:) - Y(j,:)||^2 - = ||X(i,:)||^2 + ||Y(j,:)||^2 - 2 X(i,:)' * Y(j,:), - - Args: - boxlist1: BoxList holding N boxes - boxlist2: BoxList holding M boxes - scope: name scope. - - Returns: - a tensor with shape [N, M] representing pairwise distances - """ - with tf.name_scope(scope, 'SqDist'): - sqnorm1 = tf.reduce_sum(tf.square(boxlist1.get()), 1, keep_dims=True) - sqnorm2 = tf.reduce_sum(tf.square(boxlist2.get()), 1, keep_dims=True) - innerprod = tf.matmul(boxlist1.get(), boxlist2.get(), - transpose_a=False, transpose_b=True) - return sqnorm1 + tf.transpose(sqnorm2) - 2.0 * innerprod - - -def boolean_mask(boxlist, indicator, fields=None, scope=None): - """Select boxes from BoxList according to indicator and return new BoxList. - - `boolean_mask` returns the subset of boxes that are marked as "True" by the - indicator tensor. By default, `boolean_mask` returns boxes corresponding to - the input index list, as well as all additional fields stored in the boxlist - (indexing into the first dimension). However one can optionally only draw - from a subset of fields. - - Args: - boxlist: BoxList holding N boxes - indicator: a rank-1 boolean tensor - fields: (optional) list of fields to also gather from. If None (default), - all fields are gathered from. Pass an empty fields list to only gather - the box coordinates. - scope: name scope. - - Returns: - subboxlist: a BoxList corresponding to the subset of the input BoxList - specified by indicator - Raises: - ValueError: if `indicator` is not a rank-1 boolean tensor. - """ - with tf.name_scope(scope, 'BooleanMask'): - if indicator.shape.ndims != 1: - raise ValueError('indicator should have rank 1') - if indicator.dtype != tf.bool: - raise ValueError('indicator should be a boolean tensor') - subboxlist = box_list.BoxList(tf.boolean_mask(boxlist.get(), indicator)) - if fields is None: - fields = boxlist.get_extra_fields() - for field in fields: - if not boxlist.has_field(field): - raise ValueError('boxlist must contain all specified fields') - subfieldlist = tf.boolean_mask(boxlist.get_field(field), indicator) - subboxlist.add_field(field, subfieldlist) - return subboxlist - - -def gather(boxlist, indices, fields=None, scope=None): - """Gather boxes from BoxList according to indices and return new BoxList. - - By default, `gather` returns boxes corresponding to the input index list, as - well as all additional fields stored in the boxlist (indexing into the - first dimension). However one can optionally only gather from a - subset of fields. - - Args: - boxlist: BoxList holding N boxes - indices: a rank-1 tensor of type int32 / int64 - fields: (optional) list of fields to also gather from. If None (default), - all fields are gathered from. Pass an empty fields list to only gather - the box coordinates. - scope: name scope. - - Returns: - subboxlist: a BoxList corresponding to the subset of the input BoxList - specified by indices - Raises: - ValueError: if specified field is not contained in boxlist or if the - indices are not of type int32 - """ - with tf.name_scope(scope, 'Gather'): - if len(indices.shape.as_list()) != 1: - raise ValueError('indices should have rank 1') - if indices.dtype != tf.int32 and indices.dtype != tf.int64: - raise ValueError('indices should be an int32 / int64 tensor') - subboxlist = box_list.BoxList(tf.gather(boxlist.get(), indices)) - if fields is None: - fields = boxlist.get_extra_fields() - for field in fields: - if not boxlist.has_field(field): - raise ValueError('boxlist must contain all specified fields') - subfieldlist = tf.gather(boxlist.get_field(field), indices) - subboxlist.add_field(field, subfieldlist) - return subboxlist - - -def concatenate(boxlists, fields=None, scope=None): - """Concatenate list of BoxLists. - - This op concatenates a list of input BoxLists into a larger BoxList. It also - handles concatenation of BoxList fields as long as the field tensor shapes - are equal except for the first dimension. - - Args: - boxlists: list of BoxList objects - fields: optional list of fields to also concatenate. By default, all - fields from the first BoxList in the list are included in the - concatenation. - scope: name scope. - - Returns: - a BoxList with number of boxes equal to - sum([boxlist.num_boxes() for boxlist in BoxList]) - Raises: - ValueError: if boxlists is invalid (i.e., is not a list, is empty, or - contains non BoxList objects), or if requested fields are not contained in - all boxlists - """ - with tf.name_scope(scope, 'Concatenate'): - if not isinstance(boxlists, list): - raise ValueError('boxlists should be a list') - if not boxlists: - raise ValueError('boxlists should have nonzero length') - for boxlist in boxlists: - if not isinstance(boxlist, box_list.BoxList): - raise ValueError('all elements of boxlists should be BoxList objects') - concatenated = box_list.BoxList( - tf.concat([boxlist.get() for boxlist in boxlists], 0)) - if fields is None: - fields = boxlists[0].get_extra_fields() - for field in fields: - first_field_shape = boxlists[0].get_field(field).get_shape().as_list() - first_field_shape[0] = -1 - if None in first_field_shape: - raise ValueError('field %s must have fully defined shape except for the' - ' 0th dimension.' % field) - for boxlist in boxlists: - if not boxlist.has_field(field): - raise ValueError('boxlist must contain all requested fields') - field_shape = boxlist.get_field(field).get_shape().as_list() - field_shape[0] = -1 - if field_shape != first_field_shape: - raise ValueError('field %s must have same shape for all boxlists ' - 'except for the 0th dimension.' % field) - concatenated_field = tf.concat( - [boxlist.get_field(field) for boxlist in boxlists], 0) - concatenated.add_field(field, concatenated_field) - return concatenated - - -def sort_by_field(boxlist, field, order=SortOrder.descend, scope=None): - """Sort boxes and associated fields according to a scalar field. - - A common use case is reordering the boxes according to descending scores. - - Args: - boxlist: BoxList holding N boxes. - field: A BoxList field for sorting and reordering the BoxList. - order: (Optional) descend or ascend. Default is descend. - scope: name scope. - - Returns: - sorted_boxlist: A sorted BoxList with the field in the specified order. - - Raises: - ValueError: if specified field does not exist - ValueError: if the order is not either descend or ascend - """ - with tf.name_scope(scope, 'SortByField'): - if order != SortOrder.descend and order != SortOrder.ascend: - raise ValueError('Invalid sort order') - - field_to_sort = boxlist.get_field(field) - if len(field_to_sort.shape.as_list()) != 1: - raise ValueError('Field should have rank 1') - - num_boxes = boxlist.num_boxes() - num_entries = tf.size(field_to_sort) - length_assert = tf.Assert( - tf.equal(num_boxes, num_entries), - ['Incorrect field size: actual vs expected.', num_entries, num_boxes]) - - with tf.control_dependencies([length_assert]): - # TODO: Remove with tf.device when top_k operation runs - # correctly on GPU. - with tf.device('/cpu:0'): - _, sorted_indices = tf.nn.top_k(field_to_sort, num_boxes, sorted=True) - - if order == SortOrder.ascend: - sorted_indices = tf.reverse_v2(sorted_indices, [0]) - - return gather(boxlist, sorted_indices) - - -def visualize_boxes_in_image(image, boxlist, normalized=False, scope=None): - """Overlay bounding box list on image. - - Currently this visualization plots a 1 pixel thick red bounding box on top - of the image. Note that tf.image.draw_bounding_boxes essentially is - 1 indexed. - - Args: - image: an image tensor with shape [height, width, 3] - boxlist: a BoxList - normalized: (boolean) specify whether corners are to be interpreted - as absolute coordinates in image space or normalized with respect to the - image size. - scope: name scope. - - Returns: - image_and_boxes: an image tensor with shape [height, width, 3] - """ - with tf.name_scope(scope, 'VisualizeBoxesInImage'): - if not normalized: - height, width, _ = tf.unstack(tf.shape(image)) - boxlist = scale(boxlist, - 1.0 / tf.cast(height, tf.float32), - 1.0 / tf.cast(width, tf.float32)) - corners = tf.expand_dims(boxlist.get(), 0) - image = tf.expand_dims(image, 0) - return tf.squeeze(tf.image.draw_bounding_boxes(image, corners), [0]) - - -def filter_field_value_equals(boxlist, field, value, scope=None): - """Filter to keep only boxes with field entries equal to the given value. - - Args: - boxlist: BoxList holding N boxes. - field: field name for filtering. - value: scalar value. - scope: name scope. - - Returns: - a BoxList holding M boxes where M <= N - - Raises: - ValueError: if boxlist not a BoxList object or if it does not have - the specified field. - """ - with tf.name_scope(scope, 'FilterFieldValueEquals'): - if not isinstance(boxlist, box_list.BoxList): - raise ValueError('boxlist must be a BoxList') - if not boxlist.has_field(field): - raise ValueError('boxlist must contain the specified field') - filter_field = boxlist.get_field(field) - gather_index = tf.reshape(tf.where(tf.equal(filter_field, value)), [-1]) - return gather(boxlist, gather_index) - - -def filter_greater_than(boxlist, thresh, scope=None): - """Filter to keep only boxes with score exceeding a given threshold. - - This op keeps the collection of boxes whose corresponding scores are - greater than the input threshold. - - TODO: Change function name to filter_scores_greater_than - - Args: - boxlist: BoxList holding N boxes. Must contain a 'scores' field - representing detection scores. - thresh: scalar threshold - scope: name scope. - - Returns: - a BoxList holding M boxes where M <= N - - Raises: - ValueError: if boxlist not a BoxList object or if it does not - have a scores field - """ - with tf.name_scope(scope, 'FilterGreaterThan'): - if not isinstance(boxlist, box_list.BoxList): - raise ValueError('boxlist must be a BoxList') - if not boxlist.has_field('scores'): - raise ValueError('input boxlist must have \'scores\' field') - scores = boxlist.get_field('scores') - if len(scores.shape.as_list()) > 2: - raise ValueError('Scores should have rank 1 or 2') - if len(scores.shape.as_list()) == 2 and scores.shape.as_list()[1] != 1: - raise ValueError('Scores should have rank 1 or have shape ' - 'consistent with [None, 1]') - high_score_indices = tf.cast(tf.reshape( - tf.where(tf.greater(scores, thresh)), - [-1]), tf.int32) - return gather(boxlist, high_score_indices) - - -def non_max_suppression(boxlist, thresh, max_output_size, scope=None): - """Non maximum suppression. - - This op greedily selects a subset of detection bounding boxes, pruning - away boxes that have high IOU (intersection over union) overlap (> thresh) - with already selected boxes. Note that this only works for a single class --- - to apply NMS to multi-class predictions, use MultiClassNonMaxSuppression. - - Args: - boxlist: BoxList holding N boxes. Must contain a 'scores' field - representing detection scores. - thresh: scalar threshold - max_output_size: maximum number of retained boxes - scope: name scope. - - Returns: - a BoxList holding M boxes where M <= max_output_size - Raises: - ValueError: if thresh is not in [0, 1] - """ - with tf.name_scope(scope, 'NonMaxSuppression'): - if not 0 <= thresh <= 1.0: - raise ValueError('thresh must be between 0 and 1') - if not isinstance(boxlist, box_list.BoxList): - raise ValueError('boxlist must be a BoxList') - if not boxlist.has_field('scores'): - raise ValueError('input boxlist must have \'scores\' field') - selected_indices = tf.image.non_max_suppression( - boxlist.get(), boxlist.get_field('scores'), - max_output_size, iou_threshold=thresh) - return gather(boxlist, selected_indices) - - -def _copy_extra_fields(boxlist_to_copy_to, boxlist_to_copy_from): - """Copies the extra fields of boxlist_to_copy_from to boxlist_to_copy_to. - - Args: - boxlist_to_copy_to: BoxList to which extra fields are copied. - boxlist_to_copy_from: BoxList from which fields are copied. - - Returns: - boxlist_to_copy_to with extra fields. - """ - for field in boxlist_to_copy_from.get_extra_fields(): - boxlist_to_copy_to.add_field(field, boxlist_to_copy_from.get_field(field)) - return boxlist_to_copy_to - - -def to_normalized_coordinates(boxlist, height, width, - check_range=True, scope=None): - """Converts absolute box coordinates to normalized coordinates in [0, 1]. - - Usually one uses the dynamic shape of the image or conv-layer tensor: - boxlist = box_list_ops.to_normalized_coordinates(boxlist, - tf.shape(images)[1], - tf.shape(images)[2]), - - This function raises an assertion failed error at graph execution time when - the maximum coordinate is smaller than 1.01 (which means that coordinates are - already normalized). The value 1.01 is to deal with small rounding errors. - - Args: - boxlist: BoxList with coordinates in terms of pixel-locations. - height: Maximum value for height of absolute box coordinates. - width: Maximum value for width of absolute box coordinates. - check_range: If True, checks if the coordinates are normalized or not. - scope: name scope. - - Returns: - boxlist with normalized coordinates in [0, 1]. - """ - with tf.name_scope(scope, 'ToNormalizedCoordinates'): - height = tf.cast(height, tf.float32) - width = tf.cast(width, tf.float32) - - if check_range: - max_val = tf.reduce_max(boxlist.get()) - max_assert = tf.Assert(tf.greater(max_val, 1.01), - ['max value is lower than 1.01: ', max_val]) - with tf.control_dependencies([max_assert]): - width = tf.identity(width) - - return scale(boxlist, 1 / height, 1 / width) - - -def to_absolute_coordinates(boxlist, - height, - width, - check_range=False, - maximum_normalized_coordinate=1.01, - scope=None): - """Converts normalized box coordinates to absolute pixel coordinates. - - This function raises an assertion failed error when the maximum box coordinate - value is larger than maximum_normalized_coordinate (in which case coordinates - are already absolute). - - Args: - boxlist: BoxList with coordinates in range [0, 1]. - height: Maximum value for height of absolute box coordinates. - width: Maximum value for width of absolute box coordinates. - check_range: If True, checks if the coordinates are normalized or not. - maximum_normalized_coordinate: Maximum coordinate value to be considered - as normalized, default to 1.01. - scope: name scope. - - Returns: - boxlist with absolute coordinates in terms of the image size. - - """ - with tf.name_scope(scope, 'ToAbsoluteCoordinates'): - height = tf.cast(height, tf.float32) - width = tf.cast(width, tf.float32) - - # Ensure range of input boxes is correct. - if check_range: - box_maximum = tf.reduce_max(boxlist.get()) - max_assert = tf.Assert( - tf.greater_equal(1.1, box_maximum), - ['maximum box coordinate value is larger ' - 'than 1.1: ', box_maximum]) - with tf.control_dependencies([max_assert]): - width = tf.identity(width) - - return scale(boxlist, height, width) - - -def refine_boxes_multi_class(pool_boxes, - num_classes, - nms_iou_thresh, - nms_max_detections, - voting_iou_thresh=0.5): - """Refines a pool of boxes using non max suppression and box voting. - - Box refinement is done independently for each class. - - Args: - pool_boxes: (BoxList) A collection of boxes to be refined. pool_boxes must - have a rank 1 'scores' field and a rank 1 'classes' field. - num_classes: (int scalar) Number of classes. - nms_iou_thresh: (float scalar) iou threshold for non max suppression (NMS). - nms_max_detections: (int scalar) maximum output size for NMS. - voting_iou_thresh: (float scalar) iou threshold for box voting. - - Returns: - BoxList of refined boxes. - - Raises: - ValueError: if - a) nms_iou_thresh or voting_iou_thresh is not in [0, 1]. - b) pool_boxes is not a BoxList. - c) pool_boxes does not have a scores and classes field. - """ - if not 0.0 <= nms_iou_thresh <= 1.0: - raise ValueError('nms_iou_thresh must be between 0 and 1') - if not 0.0 <= voting_iou_thresh <= 1.0: - raise ValueError('voting_iou_thresh must be between 0 and 1') - if not isinstance(pool_boxes, box_list.BoxList): - raise ValueError('pool_boxes must be a BoxList') - if not pool_boxes.has_field('scores'): - raise ValueError('pool_boxes must have a \'scores\' field') - if not pool_boxes.has_field('classes'): - raise ValueError('pool_boxes must have a \'classes\' field') - - refined_boxes = [] - for i in range(num_classes): - boxes_class = filter_field_value_equals(pool_boxes, 'classes', i) - refined_boxes_class = refine_boxes(boxes_class, nms_iou_thresh, - nms_max_detections, voting_iou_thresh) - refined_boxes.append(refined_boxes_class) - return sort_by_field(concatenate(refined_boxes), 'scores') - - -def refine_boxes(pool_boxes, - nms_iou_thresh, - nms_max_detections, - voting_iou_thresh=0.5): - """Refines a pool of boxes using non max suppression and box voting. - - Args: - pool_boxes: (BoxList) A collection of boxes to be refined. pool_boxes must - have a rank 1 'scores' field. - nms_iou_thresh: (float scalar) iou threshold for non max suppression (NMS). - nms_max_detections: (int scalar) maximum output size for NMS. - voting_iou_thresh: (float scalar) iou threshold for box voting. - - Returns: - BoxList of refined boxes. - - Raises: - ValueError: if - a) nms_iou_thresh or voting_iou_thresh is not in [0, 1]. - b) pool_boxes is not a BoxList. - c) pool_boxes does not have a scores field. - """ - if not 0.0 <= nms_iou_thresh <= 1.0: - raise ValueError('nms_iou_thresh must be between 0 and 1') - if not 0.0 <= voting_iou_thresh <= 1.0: - raise ValueError('voting_iou_thresh must be between 0 and 1') - if not isinstance(pool_boxes, box_list.BoxList): - raise ValueError('pool_boxes must be a BoxList') - if not pool_boxes.has_field('scores'): - raise ValueError('pool_boxes must have a \'scores\' field') - - nms_boxes = non_max_suppression( - pool_boxes, nms_iou_thresh, nms_max_detections) - return box_voting(nms_boxes, pool_boxes, voting_iou_thresh) - - -def box_voting(selected_boxes, pool_boxes, iou_thresh=0.5): - """Performs box voting as described in S. Gidaris and N. Komodakis, ICCV 2015. - - Performs box voting as described in 'Object detection via a multi-region & - semantic segmentation-aware CNN model', Gidaris and Komodakis, ICCV 2015. For - each box 'B' in selected_boxes, we find the set 'S' of boxes in pool_boxes - with iou overlap >= iou_thresh. The location of B is set to the weighted - average location of boxes in S (scores are used for weighting). And the score - of B is set to the average score of boxes in S. - - Args: - selected_boxes: BoxList containing a subset of boxes in pool_boxes. These - boxes are usually selected from pool_boxes using non max suppression. - pool_boxes: BoxList containing a set of (possibly redundant) boxes. - iou_thresh: (float scalar) iou threshold for matching boxes in - selected_boxes and pool_boxes. - - Returns: - BoxList containing averaged locations and scores for each box in - selected_boxes. - - Raises: - ValueError: if - a) selected_boxes or pool_boxes is not a BoxList. - b) if iou_thresh is not in [0, 1]. - c) pool_boxes does not have a scores field. - """ - if not 0.0 <= iou_thresh <= 1.0: - raise ValueError('iou_thresh must be between 0 and 1') - if not isinstance(selected_boxes, box_list.BoxList): - raise ValueError('selected_boxes must be a BoxList') - if not isinstance(pool_boxes, box_list.BoxList): - raise ValueError('pool_boxes must be a BoxList') - if not pool_boxes.has_field('scores'): - raise ValueError('pool_boxes must have a \'scores\' field') - - iou_ = iou(selected_boxes, pool_boxes) - match_indicator = tf.to_float(tf.greater(iou_, iou_thresh)) - num_matches = tf.reduce_sum(match_indicator, 1) - # TODO: Handle the case where some boxes in selected_boxes do not - # match to any boxes in pool_boxes. For such boxes without any matches, we - # should return the original boxes without voting. - match_assert = tf.Assert( - tf.reduce_all(tf.greater(num_matches, 0)), - ['Each box in selected_boxes must match with at least one box ' - 'in pool_boxes.']) - - scores = tf.expand_dims(pool_boxes.get_field('scores'), 1) - scores_assert = tf.Assert( - tf.reduce_all(tf.greater_equal(scores, 0)), - ['Scores must be non negative.']) - - with tf.control_dependencies([scores_assert, match_assert]): - sum_scores = tf.matmul(match_indicator, scores) - averaged_scores = tf.reshape(sum_scores, [-1]) / num_matches - - box_locations = tf.matmul(match_indicator, - pool_boxes.get() * scores) / sum_scores - averaged_boxes = box_list.BoxList(box_locations) - _copy_extra_fields(averaged_boxes, selected_boxes) - averaged_boxes.add_field('scores', averaged_scores) - return averaged_boxes - - -def pad_or_clip_box_list(boxlist, num_boxes, scope=None): - """Pads or clips all fields of a BoxList. - - Args: - boxlist: A BoxList with arbitrary of number of boxes. - num_boxes: First num_boxes in boxlist are kept. - The fields are zero-padded if num_boxes is bigger than the - actual number of boxes. - scope: name scope. - - Returns: - BoxList with all fields padded or clipped. - """ - with tf.name_scope(scope, 'PadOrClipBoxList'): - subboxlist = box_list.BoxList(shape_utils.pad_or_clip_tensor( - boxlist.get(), num_boxes)) - for field in boxlist.get_extra_fields(): - subfield = shape_utils.pad_or_clip_tensor( - boxlist.get_field(field), num_boxes) - subboxlist.add_field(field, subfield) - return subboxlist diff --git a/object_detection/core/box_list_ops_test.py b/object_detection/core/box_list_ops_test.py deleted file mode 100644 index 467bb3c6..00000000 --- a/object_detection/core/box_list_ops_test.py +++ /dev/null @@ -1,962 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.box_list_ops.""" -import numpy as np -import tensorflow as tf -from tensorflow.python.framework import errors - -from object_detection.core import box_list -from object_detection.core import box_list_ops - - -class BoxListOpsTest(tf.test.TestCase): - """Tests for common bounding box operations.""" - - def test_area(self): - corners = tf.constant([[0.0, 0.0, 10.0, 20.0], [1.0, 2.0, 3.0, 4.0]]) - exp_output = [200.0, 4.0] - boxes = box_list.BoxList(corners) - areas = box_list_ops.area(boxes) - with self.test_session() as sess: - areas_output = sess.run(areas) - self.assertAllClose(areas_output, exp_output) - - def test_height_width(self): - corners = tf.constant([[0.0, 0.0, 10.0, 20.0], [1.0, 2.0, 3.0, 4.0]]) - exp_output_heights = [10., 2.] - exp_output_widths = [20., 2.] - boxes = box_list.BoxList(corners) - heights, widths = box_list_ops.height_width(boxes) - with self.test_session() as sess: - output_heights, output_widths = sess.run([heights, widths]) - self.assertAllClose(output_heights, exp_output_heights) - self.assertAllClose(output_widths, exp_output_widths) - - def test_scale(self): - corners = tf.constant([[0, 0, 100, 200], [50, 120, 100, 140]], - dtype=tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('extra_data', tf.constant([[1], [2]])) - - y_scale = tf.constant(1.0/100) - x_scale = tf.constant(1.0/200) - scaled_boxes = box_list_ops.scale(boxes, y_scale, x_scale) - exp_output = [[0, 0, 1, 1], [0.5, 0.6, 1.0, 0.7]] - with self.test_session() as sess: - scaled_corners_out = sess.run(scaled_boxes.get()) - self.assertAllClose(scaled_corners_out, exp_output) - extra_data_out = sess.run(scaled_boxes.get_field('extra_data')) - self.assertAllEqual(extra_data_out, [[1], [2]]) - - def test_clip_to_window_filter_boxes_which_fall_outside_the_window( - self): - window = tf.constant([0, 0, 9, 14], tf.float32) - corners = tf.constant([[5.0, 5.0, 6.0, 6.0], - [-1.0, -2.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], - [0.0, 0.0, 9.0, 14.0], - [-100.0, -100.0, 300.0, 600.0], - [-10.0, -10.0, -9.0, -9.0]]) - boxes = box_list.BoxList(corners) - boxes.add_field('extra_data', tf.constant([[1], [2], [3], [4], [5], [6]])) - exp_output = [[5.0, 5.0, 6.0, 6.0], [0.0, 0.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], [0.0, 0.0, 9.0, 14.0], - [0.0, 0.0, 9.0, 14.0]] - pruned = box_list_ops.clip_to_window( - boxes, window, filter_nonoverlapping=True) - with self.test_session() as sess: - pruned_output = sess.run(pruned.get()) - self.assertAllClose(pruned_output, exp_output) - extra_data_out = sess.run(pruned.get_field('extra_data')) - self.assertAllEqual(extra_data_out, [[1], [2], [3], [4], [5]]) - - def test_clip_to_window_without_filtering_boxes_which_fall_outside_the_window( - self): - window = tf.constant([0, 0, 9, 14], tf.float32) - corners = tf.constant([[5.0, 5.0, 6.0, 6.0], - [-1.0, -2.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], - [0.0, 0.0, 9.0, 14.0], - [-100.0, -100.0, 300.0, 600.0], - [-10.0, -10.0, -9.0, -9.0]]) - boxes = box_list.BoxList(corners) - boxes.add_field('extra_data', tf.constant([[1], [2], [3], [4], [5], [6]])) - exp_output = [[5.0, 5.0, 6.0, 6.0], [0.0, 0.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], [0.0, 0.0, 9.0, 14.0], - [0.0, 0.0, 9.0, 14.0], [0.0, 0.0, 0.0, 0.0]] - pruned = box_list_ops.clip_to_window( - boxes, window, filter_nonoverlapping=False) - with self.test_session() as sess: - pruned_output = sess.run(pruned.get()) - self.assertAllClose(pruned_output, exp_output) - extra_data_out = sess.run(pruned.get_field('extra_data')) - self.assertAllEqual(extra_data_out, [[1], [2], [3], [4], [5], [6]]) - - def test_prune_outside_window_filters_boxes_which_fall_outside_the_window( - self): - window = tf.constant([0, 0, 9, 14], tf.float32) - corners = tf.constant([[5.0, 5.0, 6.0, 6.0], - [-1.0, -2.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], - [0.0, 0.0, 9.0, 14.0], - [-10.0, -10.0, -9.0, -9.0], - [-100.0, -100.0, 300.0, 600.0]]) - boxes = box_list.BoxList(corners) - boxes.add_field('extra_data', tf.constant([[1], [2], [3], [4], [5], [6]])) - exp_output = [[5.0, 5.0, 6.0, 6.0], - [2.0, 3.0, 5.0, 9.0], - [0.0, 0.0, 9.0, 14.0]] - pruned, keep_indices = box_list_ops.prune_outside_window(boxes, window) - with self.test_session() as sess: - pruned_output = sess.run(pruned.get()) - self.assertAllClose(pruned_output, exp_output) - keep_indices_out = sess.run(keep_indices) - self.assertAllEqual(keep_indices_out, [0, 2, 3]) - extra_data_out = sess.run(pruned.get_field('extra_data')) - self.assertAllEqual(extra_data_out, [[1], [3], [4]]) - - def test_prune_completely_outside_window(self): - window = tf.constant([0, 0, 9, 14], tf.float32) - corners = tf.constant([[5.0, 5.0, 6.0, 6.0], - [-1.0, -2.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], - [0.0, 0.0, 9.0, 14.0], - [-10.0, -10.0, -9.0, -9.0], - [-100.0, -100.0, 300.0, 600.0]]) - boxes = box_list.BoxList(corners) - boxes.add_field('extra_data', tf.constant([[1], [2], [3], [4], [5], [6]])) - exp_output = [[5.0, 5.0, 6.0, 6.0], - [-1.0, -2.0, 4.0, 5.0], - [2.0, 3.0, 5.0, 9.0], - [0.0, 0.0, 9.0, 14.0], - [-100.0, -100.0, 300.0, 600.0]] - pruned, keep_indices = box_list_ops.prune_completely_outside_window(boxes, - window) - with self.test_session() as sess: - pruned_output = sess.run(pruned.get()) - self.assertAllClose(pruned_output, exp_output) - keep_indices_out = sess.run(keep_indices) - self.assertAllEqual(keep_indices_out, [0, 1, 2, 3, 5]) - extra_data_out = sess.run(pruned.get_field('extra_data')) - self.assertAllEqual(extra_data_out, [[1], [2], [3], [4], [6]]) - - def test_intersection(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - exp_output = [[2.0, 0.0, 6.0], [1.0, 0.0, 5.0]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - intersect = box_list_ops.intersection(boxes1, boxes2) - with self.test_session() as sess: - intersect_output = sess.run(intersect) - self.assertAllClose(intersect_output, exp_output) - - def test_matched_intersection(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0]]) - exp_output = [2.0, 0.0] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - intersect = box_list_ops.matched_intersection(boxes1, boxes2) - with self.test_session() as sess: - intersect_output = sess.run(intersect) - self.assertAllClose(intersect_output, exp_output) - - def test_iou(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - exp_output = [[2.0 / 16.0, 0, 6.0 / 400.0], [1.0 / 16.0, 0.0, 5.0 / 400.0]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - iou = box_list_ops.iou(boxes1, boxes2) - with self.test_session() as sess: - iou_output = sess.run(iou) - self.assertAllClose(iou_output, exp_output) - - def test_matched_iou(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0]]) - exp_output = [2.0 / 16.0, 0] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - iou = box_list_ops.matched_iou(boxes1, boxes2) - with self.test_session() as sess: - iou_output = sess.run(iou) - self.assertAllClose(iou_output, exp_output) - - def test_iouworks_on_empty_inputs(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - boxes_empty = box_list.BoxList(tf.zeros((0, 4))) - iou_empty_1 = box_list_ops.iou(boxes1, boxes_empty) - iou_empty_2 = box_list_ops.iou(boxes_empty, boxes2) - iou_empty_3 = box_list_ops.iou(boxes_empty, boxes_empty) - with self.test_session() as sess: - iou_output_1, iou_output_2, iou_output_3 = sess.run( - [iou_empty_1, iou_empty_2, iou_empty_3]) - self.assertAllEqual(iou_output_1.shape, (2, 0)) - self.assertAllEqual(iou_output_2.shape, (0, 3)) - self.assertAllEqual(iou_output_3.shape, (0, 0)) - - def test_ioa(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - exp_output_1 = [[2.0 / 12.0, 0, 6.0 / 400.0], - [1.0 / 12.0, 0.0, 5.0 / 400.0]] - exp_output_2 = [[2.0 / 6.0, 1.0 / 5.0], - [0, 0], - [6.0 / 6.0, 5.0 / 5.0]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - ioa_1 = box_list_ops.ioa(boxes1, boxes2) - ioa_2 = box_list_ops.ioa(boxes2, boxes1) - with self.test_session() as sess: - ioa_output_1, ioa_output_2 = sess.run([ioa_1, ioa_2]) - self.assertAllClose(ioa_output_1, exp_output_1) - self.assertAllClose(ioa_output_2, exp_output_2) - - def test_prune_non_overlapping_boxes(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - minoverlap = 0.5 - - exp_output_1 = boxes1 - exp_output_2 = box_list.BoxList(tf.constant(0.0, shape=[0, 4])) - output_1, keep_indices_1 = box_list_ops.prune_non_overlapping_boxes( - boxes1, boxes2, min_overlap=minoverlap) - output_2, keep_indices_2 = box_list_ops.prune_non_overlapping_boxes( - boxes2, boxes1, min_overlap=minoverlap) - with self.test_session() as sess: - (output_1_, keep_indices_1_, output_2_, keep_indices_2_, exp_output_1_, - exp_output_2_) = sess.run( - [output_1.get(), keep_indices_1, - output_2.get(), keep_indices_2, - exp_output_1.get(), exp_output_2.get()]) - self.assertAllClose(output_1_, exp_output_1_) - self.assertAllClose(output_2_, exp_output_2_) - self.assertAllEqual(keep_indices_1_, [0, 1]) - self.assertAllEqual(keep_indices_2_, []) - - def test_prune_small_boxes(self): - boxes = tf.constant([[4.0, 3.0, 7.0, 5.0], - [5.0, 6.0, 10.0, 7.0], - [3.0, 4.0, 6.0, 8.0], - [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - exp_boxes = [[3.0, 4.0, 6.0, 8.0], - [0.0, 0.0, 20.0, 20.0]] - boxes = box_list.BoxList(boxes) - pruned_boxes = box_list_ops.prune_small_boxes(boxes, 3) - with self.test_session() as sess: - pruned_boxes = sess.run(pruned_boxes.get()) - self.assertAllEqual(pruned_boxes, exp_boxes) - - def test_prune_small_boxes_prunes_boxes_with_negative_side(self): - boxes = tf.constant([[4.0, 3.0, 7.0, 5.0], - [5.0, 6.0, 10.0, 7.0], - [3.0, 4.0, 6.0, 8.0], - [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0], - [2.0, 3.0, 1.5, 7.0], # negative height - [2.0, 3.0, 5.0, 1.7]]) # negative width - exp_boxes = [[3.0, 4.0, 6.0, 8.0], - [0.0, 0.0, 20.0, 20.0]] - boxes = box_list.BoxList(boxes) - pruned_boxes = box_list_ops.prune_small_boxes(boxes, 3) - with self.test_session() as sess: - pruned_boxes = sess.run(pruned_boxes.get()) - self.assertAllEqual(pruned_boxes, exp_boxes) - - def test_change_coordinate_frame(self): - corners = tf.constant([[0.25, 0.5, 0.75, 0.75], [0.5, 0.0, 1.0, 1.0]]) - window = tf.constant([0.25, 0.25, 0.75, 0.75]) - boxes = box_list.BoxList(corners) - - expected_corners = tf.constant([[0, 0.5, 1.0, 1.0], [0.5, -0.5, 1.5, 1.5]]) - expected_boxes = box_list.BoxList(expected_corners) - output = box_list_ops.change_coordinate_frame(boxes, window) - - with self.test_session() as sess: - output_, expected_boxes_ = sess.run([output.get(), expected_boxes.get()]) - self.assertAllClose(output_, expected_boxes_) - - def test_ioaworks_on_empty_inputs(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - boxes_empty = box_list.BoxList(tf.zeros((0, 4))) - ioa_empty_1 = box_list_ops.ioa(boxes1, boxes_empty) - ioa_empty_2 = box_list_ops.ioa(boxes_empty, boxes2) - ioa_empty_3 = box_list_ops.ioa(boxes_empty, boxes_empty) - with self.test_session() as sess: - ioa_output_1, ioa_output_2, ioa_output_3 = sess.run( - [ioa_empty_1, ioa_empty_2, ioa_empty_3]) - self.assertAllEqual(ioa_output_1.shape, (2, 0)) - self.assertAllEqual(ioa_output_2.shape, (0, 3)) - self.assertAllEqual(ioa_output_3.shape, (0, 0)) - - def test_pairwise_distances(self): - corners1 = tf.constant([[0.0, 0.0, 0.0, 0.0], - [1.0, 1.0, 0.0, 2.0]]) - corners2 = tf.constant([[3.0, 4.0, 1.0, 0.0], - [-4.0, 0.0, 0.0, 3.0], - [0.0, 0.0, 0.0, 0.0]]) - exp_output = [[26, 25, 0], [18, 27, 6]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - dist_matrix = box_list_ops.sq_dist(boxes1, boxes2) - with self.test_session() as sess: - dist_output = sess.run(dist_matrix) - self.assertAllClose(dist_output, exp_output) - - def test_boolean_mask(self): - corners = tf.constant( - [4 * [0.0], 4 * [1.0], 4 * [2.0], 4 * [3.0], 4 * [4.0]]) - indicator = tf.constant([True, False, True, False, True], tf.bool) - expected_subset = [4 * [0.0], 4 * [2.0], 4 * [4.0]] - boxes = box_list.BoxList(corners) - subset = box_list_ops.boolean_mask(boxes, indicator) - with self.test_session() as sess: - subset_output = sess.run(subset.get()) - self.assertAllClose(subset_output, expected_subset) - - def test_boolean_mask_with_field(self): - corners = tf.constant( - [4 * [0.0], 4 * [1.0], 4 * [2.0], 4 * [3.0], 4 * [4.0]]) - indicator = tf.constant([True, False, True, False, True], tf.bool) - weights = tf.constant([[.1], [.3], [.5], [.7], [.9]], tf.float32) - expected_subset = [4 * [0.0], 4 * [2.0], 4 * [4.0]] - expected_weights = [[.1], [.5], [.9]] - - boxes = box_list.BoxList(corners) - boxes.add_field('weights', weights) - subset = box_list_ops.boolean_mask(boxes, indicator, ['weights']) - with self.test_session() as sess: - subset_output, weights_output = sess.run( - [subset.get(), subset.get_field('weights')]) - self.assertAllClose(subset_output, expected_subset) - self.assertAllClose(weights_output, expected_weights) - - def test_gather(self): - corners = tf.constant( - [4 * [0.0], 4 * [1.0], 4 * [2.0], 4 * [3.0], 4 * [4.0]]) - indices = tf.constant([0, 2, 4], tf.int32) - expected_subset = [4 * [0.0], 4 * [2.0], 4 * [4.0]] - boxes = box_list.BoxList(corners) - subset = box_list_ops.gather(boxes, indices) - with self.test_session() as sess: - subset_output = sess.run(subset.get()) - self.assertAllClose(subset_output, expected_subset) - - def test_gather_with_field(self): - corners = tf.constant([4*[0.0], 4*[1.0], 4*[2.0], 4*[3.0], 4*[4.0]]) - indices = tf.constant([0, 2, 4], tf.int32) - weights = tf.constant([[.1], [.3], [.5], [.7], [.9]], tf.float32) - expected_subset = [4 * [0.0], 4 * [2.0], 4 * [4.0]] - expected_weights = [[.1], [.5], [.9]] - - boxes = box_list.BoxList(corners) - boxes.add_field('weights', weights) - subset = box_list_ops.gather(boxes, indices, ['weights']) - with self.test_session() as sess: - subset_output, weights_output = sess.run( - [subset.get(), subset.get_field('weights')]) - self.assertAllClose(subset_output, expected_subset) - self.assertAllClose(weights_output, expected_weights) - - def test_gather_with_invalid_field(self): - corners = tf.constant([4 * [0.0], 4 * [1.0]]) - indices = tf.constant([0, 1], tf.int32) - weights = tf.constant([[.1], [.3]], tf.float32) - - boxes = box_list.BoxList(corners) - boxes.add_field('weights', weights) - with self.assertRaises(ValueError): - box_list_ops.gather(boxes, indices, ['foo', 'bar']) - - def test_gather_with_invalid_inputs(self): - corners = tf.constant( - [4 * [0.0], 4 * [1.0], 4 * [2.0], 4 * [3.0], 4 * [4.0]]) - indices_float32 = tf.constant([0, 2, 4], tf.float32) - boxes = box_list.BoxList(corners) - with self.assertRaises(ValueError): - _ = box_list_ops.gather(boxes, indices_float32) - indices_2d = tf.constant([[0, 2, 4]], tf.int32) - boxes = box_list.BoxList(corners) - with self.assertRaises(ValueError): - _ = box_list_ops.gather(boxes, indices_2d) - - def test_gather_with_dynamic_indexing(self): - corners = tf.constant([4 * [0.0], 4 * [1.0], 4 * [2.0], 4 * [3.0], 4 * [4.0] - ]) - weights = tf.constant([.5, .3, .7, .1, .9], tf.float32) - indices = tf.reshape(tf.where(tf.greater(weights, 0.4)), [-1]) - expected_subset = [4 * [0.0], 4 * [2.0], 4 * [4.0]] - expected_weights = [.5, .7, .9] - - boxes = box_list.BoxList(corners) - boxes.add_field('weights', weights) - subset = box_list_ops.gather(boxes, indices, ['weights']) - with self.test_session() as sess: - subset_output, weights_output = sess.run([subset.get(), subset.get_field( - 'weights')]) - self.assertAllClose(subset_output, expected_subset) - self.assertAllClose(weights_output, expected_weights) - - def test_sort_by_field_ascending_order(self): - exp_corners = [[0, 0, 1, 1], [0, 0.1, 1, 1.1], [0, -0.1, 1, 0.9], - [0, 10, 1, 11], [0, 10.1, 1, 11.1], [0, 100, 1, 101]] - exp_scores = [.95, .9, .75, .6, .5, .3] - exp_weights = [.2, .45, .6, .75, .8, .92] - shuffle = [2, 4, 0, 5, 1, 3] - corners = tf.constant([exp_corners[i] for i in shuffle], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant( - [exp_scores[i] for i in shuffle], tf.float32)) - boxes.add_field('weights', tf.constant( - [exp_weights[i] for i in shuffle], tf.float32)) - sort_by_weight = box_list_ops.sort_by_field( - boxes, - 'weights', - order=box_list_ops.SortOrder.ascend) - with self.test_session() as sess: - corners_out, scores_out, weights_out = sess.run([ - sort_by_weight.get(), - sort_by_weight.get_field('scores'), - sort_by_weight.get_field('weights')]) - self.assertAllClose(corners_out, exp_corners) - self.assertAllClose(scores_out, exp_scores) - self.assertAllClose(weights_out, exp_weights) - - def test_sort_by_field_descending_order(self): - exp_corners = [[0, 0, 1, 1], [0, 0.1, 1, 1.1], [0, -0.1, 1, 0.9], - [0, 10, 1, 11], [0, 10.1, 1, 11.1], [0, 100, 1, 101]] - exp_scores = [.95, .9, .75, .6, .5, .3] - exp_weights = [.2, .45, .6, .75, .8, .92] - shuffle = [2, 4, 0, 5, 1, 3] - - corners = tf.constant([exp_corners[i] for i in shuffle], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant( - [exp_scores[i] for i in shuffle], tf.float32)) - boxes.add_field('weights', tf.constant( - [exp_weights[i] for i in shuffle], tf.float32)) - - sort_by_score = box_list_ops.sort_by_field(boxes, 'scores') - with self.test_session() as sess: - corners_out, scores_out, weights_out = sess.run([sort_by_score.get( - ), sort_by_score.get_field('scores'), sort_by_score.get_field('weights')]) - self.assertAllClose(corners_out, exp_corners) - self.assertAllClose(scores_out, exp_scores) - self.assertAllClose(weights_out, exp_weights) - - def test_sort_by_field_invalid_inputs(self): - corners = tf.constant([4 * [0.0], 4 * [0.5], 4 * [1.0], 4 * [2.0], 4 * - [3.0], 4 * [4.0]]) - misc = tf.constant([[.95, .9], [.5, .3]], tf.float32) - weights = tf.constant([.1, .2], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('misc', misc) - boxes.add_field('weights', weights) - - with self.test_session() as sess: - with self.assertRaises(ValueError): - box_list_ops.sort_by_field(boxes, 'area') - - with self.assertRaises(ValueError): - box_list_ops.sort_by_field(boxes, 'misc') - - with self.assertRaisesWithPredicateMatch(errors.InvalidArgumentError, - 'Incorrect field size'): - sess.run(box_list_ops.sort_by_field(boxes, 'weights').get()) - - def test_visualize_boxes_in_image(self): - image = tf.zeros((6, 4, 3)) - corners = tf.constant([[0, 0, 5, 3], - [0, 0, 3, 2]], tf.float32) - boxes = box_list.BoxList(corners) - image_and_boxes = box_list_ops.visualize_boxes_in_image(image, boxes) - image_and_boxes_bw = tf.to_float( - tf.greater(tf.reduce_sum(image_and_boxes, 2), 0.0)) - exp_result = [[1, 1, 1, 0], - [1, 1, 1, 0], - [1, 1, 1, 0], - [1, 0, 1, 0], - [1, 1, 1, 0], - [0, 0, 0, 0]] - with self.test_session() as sess: - output = sess.run(image_and_boxes_bw) - self.assertAllEqual(output.astype(int), exp_result) - - def test_filter_field_value_equals(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1], - [0, -0.1, 1, 0.9], - [0, 10, 1, 11], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('classes', tf.constant([1, 2, 1, 2, 2, 1])) - exp_output1 = [[0, 0, 1, 1], [0, -0.1, 1, 0.9], [0, 100, 1, 101]] - exp_output2 = [[0, 0.1, 1, 1.1], [0, 10, 1, 11], [0, 10.1, 1, 11.1]] - - filtered_boxes1 = box_list_ops.filter_field_value_equals( - boxes, 'classes', 1) - filtered_boxes2 = box_list_ops.filter_field_value_equals( - boxes, 'classes', 2) - with self.test_session() as sess: - filtered_output1, filtered_output2 = sess.run([filtered_boxes1.get(), - filtered_boxes2.get()]) - self.assertAllClose(filtered_output1, exp_output1) - self.assertAllClose(filtered_output2, exp_output2) - - def test_filter_greater_than(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1], - [0, -0.1, 1, 0.9], - [0, 10, 1, 11], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant([.1, .75, .9, .5, .5, .8])) - thresh = .6 - exp_output = [[0, 0.1, 1, 1.1], [0, -0.1, 1, 0.9], [0, 100, 1, 101]] - - filtered_boxes = box_list_ops.filter_greater_than(boxes, thresh) - with self.test_session() as sess: - filtered_output = sess.run(filtered_boxes.get()) - self.assertAllClose(filtered_output, exp_output) - - def test_clip_box_list(self): - boxlist = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5], - [0.6, 0.6, 0.8, 0.8], [0.2, 0.2, 0.3, 0.3]], tf.float32)) - boxlist.add_field('classes', tf.constant([0, 0, 1, 1])) - boxlist.add_field('scores', tf.constant([0.75, 0.65, 0.3, 0.2])) - num_boxes = 2 - clipped_boxlist = box_list_ops.pad_or_clip_box_list(boxlist, num_boxes) - - expected_boxes = [[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]] - expected_classes = [0, 0] - expected_scores = [0.75, 0.65] - with self.test_session() as sess: - boxes_out, classes_out, scores_out = sess.run( - [clipped_boxlist.get(), clipped_boxlist.get_field('classes'), - clipped_boxlist.get_field('scores')]) - - self.assertAllClose(expected_boxes, boxes_out) - self.assertAllEqual(expected_classes, classes_out) - self.assertAllClose(expected_scores, scores_out) - - def test_pad_box_list(self): - boxlist = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]], tf.float32)) - boxlist.add_field('classes', tf.constant([0, 1])) - boxlist.add_field('scores', tf.constant([0.75, 0.2])) - num_boxes = 4 - padded_boxlist = box_list_ops.pad_or_clip_box_list(boxlist, num_boxes) - - expected_boxes = [[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5], - [0, 0, 0, 0], [0, 0, 0, 0]] - expected_classes = [0, 1, 0, 0] - expected_scores = [0.75, 0.2, 0, 0] - with self.test_session() as sess: - boxes_out, classes_out, scores_out = sess.run( - [padded_boxlist.get(), padded_boxlist.get_field('classes'), - padded_boxlist.get_field('scores')]) - - self.assertAllClose(expected_boxes, boxes_out) - self.assertAllEqual(expected_classes, classes_out) - self.assertAllClose(expected_scores, scores_out) - - -class ConcatenateTest(tf.test.TestCase): - - def test_invalid_input_box_list_list(self): - with self.assertRaises(ValueError): - box_list_ops.concatenate(None) - with self.assertRaises(ValueError): - box_list_ops.concatenate([]) - with self.assertRaises(ValueError): - corners = tf.constant([[0, 0, 0, 0]], tf.float32) - boxlist = box_list.BoxList(corners) - box_list_ops.concatenate([boxlist, 2]) - - def test_concatenate_with_missing_fields(self): - corners1 = tf.constant([[0, 0, 0, 0], [1, 2, 3, 4]], tf.float32) - scores1 = tf.constant([1.0, 2.1]) - corners2 = tf.constant([[0, 3, 1, 6], [2, 4, 3, 8]], tf.float32) - boxlist1 = box_list.BoxList(corners1) - boxlist1.add_field('scores', scores1) - boxlist2 = box_list.BoxList(corners2) - with self.assertRaises(ValueError): - box_list_ops.concatenate([boxlist1, boxlist2]) - - def test_concatenate_with_incompatible_field_shapes(self): - corners1 = tf.constant([[0, 0, 0, 0], [1, 2, 3, 4]], tf.float32) - scores1 = tf.constant([1.0, 2.1]) - corners2 = tf.constant([[0, 3, 1, 6], [2, 4, 3, 8]], tf.float32) - scores2 = tf.constant([[1.0, 1.0], [2.1, 3.2]]) - boxlist1 = box_list.BoxList(corners1) - boxlist1.add_field('scores', scores1) - boxlist2 = box_list.BoxList(corners2) - boxlist2.add_field('scores', scores2) - with self.assertRaises(ValueError): - box_list_ops.concatenate([boxlist1, boxlist2]) - - def test_concatenate_is_correct(self): - corners1 = tf.constant([[0, 0, 0, 0], [1, 2, 3, 4]], tf.float32) - scores1 = tf.constant([1.0, 2.1]) - corners2 = tf.constant([[0, 3, 1, 6], [2, 4, 3, 8], [1, 0, 5, 10]], - tf.float32) - scores2 = tf.constant([1.0, 2.1, 5.6]) - - exp_corners = [[0, 0, 0, 0], - [1, 2, 3, 4], - [0, 3, 1, 6], - [2, 4, 3, 8], - [1, 0, 5, 10]] - exp_scores = [1.0, 2.1, 1.0, 2.1, 5.6] - - boxlist1 = box_list.BoxList(corners1) - boxlist1.add_field('scores', scores1) - boxlist2 = box_list.BoxList(corners2) - boxlist2.add_field('scores', scores2) - result = box_list_ops.concatenate([boxlist1, boxlist2]) - with self.test_session() as sess: - corners_output, scores_output = sess.run( - [result.get(), result.get_field('scores')]) - self.assertAllClose(corners_output, exp_corners) - self.assertAllClose(scores_output, exp_scores) - - -class NonMaxSuppressionTest(tf.test.TestCase): - - def test_with_invalid_scores_field(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1], - [0, -0.1, 1, 0.9], - [0, 10, 1, 11], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant([.9, .75, .6, .95, .5])) - iou_thresh = .5 - max_output_size = 3 - nms = box_list_ops.non_max_suppression( - boxes, iou_thresh, max_output_size) - with self.test_session() as sess: - with self.assertRaisesWithPredicateMatch( - errors.InvalidArgumentError, 'scores has incompatible shape'): - sess.run(nms.get()) - - def test_select_from_three_clusters(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1], - [0, -0.1, 1, 0.9], - [0, 10, 1, 11], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant([.9, .75, .6, .95, .5, .3])) - iou_thresh = .5 - max_output_size = 3 - - exp_nms = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 100, 1, 101]] - nms = box_list_ops.non_max_suppression( - boxes, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_output = sess.run(nms.get()) - self.assertAllClose(nms_output, exp_nms) - - def test_select_at_most_two_boxes_from_three_clusters(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1], - [0, -0.1, 1, 0.9], - [0, 10, 1, 11], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant([.9, .75, .6, .95, .5, .3])) - iou_thresh = .5 - max_output_size = 2 - - exp_nms = [[0, 10, 1, 11], - [0, 0, 1, 1]] - nms = box_list_ops.non_max_suppression( - boxes, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_output = sess.run(nms.get()) - self.assertAllClose(nms_output, exp_nms) - - def test_select_at_most_thirty_boxes_from_three_clusters(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1], - [0, -0.1, 1, 0.9], - [0, 10, 1, 11], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant([.9, .75, .6, .95, .5, .3])) - iou_thresh = .5 - max_output_size = 30 - - exp_nms = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 100, 1, 101]] - nms = box_list_ops.non_max_suppression( - boxes, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_output = sess.run(nms.get()) - self.assertAllClose(nms_output, exp_nms) - - def test_select_single_box(self): - corners = tf.constant([[0, 0, 1, 1]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant([.9])) - iou_thresh = .5 - max_output_size = 3 - - exp_nms = [[0, 0, 1, 1]] - nms = box_list_ops.non_max_suppression( - boxes, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_output = sess.run(nms.get()) - self.assertAllClose(nms_output, exp_nms) - - def test_select_from_ten_identical_boxes(self): - corners = tf.constant(10 * [[0, 0, 1, 1]], tf.float32) - boxes = box_list.BoxList(corners) - boxes.add_field('scores', tf.constant(10 * [.9])) - iou_thresh = .5 - max_output_size = 3 - - exp_nms = [[0, 0, 1, 1]] - nms = box_list_ops.non_max_suppression( - boxes, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_output = sess.run(nms.get()) - self.assertAllClose(nms_output, exp_nms) - - def test_copy_extra_fields(self): - corners = tf.constant([[0, 0, 1, 1], - [0, 0.1, 1, 1.1]], tf.float32) - boxes = box_list.BoxList(corners) - tensor1 = np.array([[1], [4]]) - tensor2 = np.array([[1, 1], [2, 2]]) - boxes.add_field('tensor1', tf.constant(tensor1)) - boxes.add_field('tensor2', tf.constant(tensor2)) - new_boxes = box_list.BoxList(tf.constant([[0, 0, 10, 10], - [1, 3, 5, 5]], tf.float32)) - new_boxes = box_list_ops._copy_extra_fields(new_boxes, boxes) - with self.test_session() as sess: - self.assertAllClose(tensor1, sess.run(new_boxes.get_field('tensor1'))) - self.assertAllClose(tensor2, sess.run(new_boxes.get_field('tensor2'))) - - -class CoordinatesConversionTest(tf.test.TestCase): - - def test_to_normalized_coordinates(self): - coordinates = tf.constant([[0, 0, 100, 100], - [25, 25, 75, 75]], tf.float32) - img = tf.ones((128, 100, 100, 3)) - boxlist = box_list.BoxList(coordinates) - normalized_boxlist = box_list_ops.to_normalized_coordinates( - boxlist, tf.shape(img)[1], tf.shape(img)[2]) - expected_boxes = [[0, 0, 1, 1], - [0.25, 0.25, 0.75, 0.75]] - - with self.test_session() as sess: - normalized_boxes = sess.run(normalized_boxlist.get()) - self.assertAllClose(normalized_boxes, expected_boxes) - - def test_to_normalized_coordinates_already_normalized(self): - coordinates = tf.constant([[0, 0, 1, 1], - [0.25, 0.25, 0.75, 0.75]], tf.float32) - img = tf.ones((128, 100, 100, 3)) - boxlist = box_list.BoxList(coordinates) - normalized_boxlist = box_list_ops.to_normalized_coordinates( - boxlist, tf.shape(img)[1], tf.shape(img)[2]) - - with self.test_session() as sess: - with self.assertRaisesOpError('assertion failed'): - sess.run(normalized_boxlist.get()) - - def test_to_absolute_coordinates(self): - coordinates = tf.constant([[0, 0, 1, 1], - [0.25, 0.25, 0.75, 0.75]], tf.float32) - img = tf.ones((128, 100, 100, 3)) - boxlist = box_list.BoxList(coordinates) - absolute_boxlist = box_list_ops.to_absolute_coordinates(boxlist, - tf.shape(img)[1], - tf.shape(img)[2]) - expected_boxes = [[0, 0, 100, 100], - [25, 25, 75, 75]] - - with self.test_session() as sess: - absolute_boxes = sess.run(absolute_boxlist.get()) - self.assertAllClose(absolute_boxes, expected_boxes) - - def test_to_absolute_coordinates_already_abolute(self): - coordinates = tf.constant([[0, 0, 100, 100], - [25, 25, 75, 75]], tf.float32) - img = tf.ones((128, 100, 100, 3)) - boxlist = box_list.BoxList(coordinates) - absolute_boxlist = box_list_ops.to_absolute_coordinates(boxlist, - tf.shape(img)[1], - tf.shape(img)[2]) - - with self.test_session() as sess: - with self.assertRaisesOpError('assertion failed'): - sess.run(absolute_boxlist.get()) - - def test_convert_to_normalized_and_back(self): - coordinates = np.random.uniform(size=(100, 4)) - coordinates = np.round(np.sort(coordinates) * 200) - coordinates[:, 2:4] += 1 - coordinates[99, :] = [0, 0, 201, 201] - img = tf.ones((128, 202, 202, 3)) - - boxlist = box_list.BoxList(tf.constant(coordinates, tf.float32)) - boxlist = box_list_ops.to_normalized_coordinates(boxlist, - tf.shape(img)[1], - tf.shape(img)[2]) - boxlist = box_list_ops.to_absolute_coordinates(boxlist, - tf.shape(img)[1], - tf.shape(img)[2]) - - with self.test_session() as sess: - out = sess.run(boxlist.get()) - self.assertAllClose(out, coordinates) - - def test_convert_to_absolute_and_back(self): - coordinates = np.random.uniform(size=(100, 4)) - coordinates = np.sort(coordinates) - coordinates[99, :] = [0, 0, 1, 1] - img = tf.ones((128, 202, 202, 3)) - - boxlist = box_list.BoxList(tf.constant(coordinates, tf.float32)) - boxlist = box_list_ops.to_absolute_coordinates(boxlist, - tf.shape(img)[1], - tf.shape(img)[2]) - boxlist = box_list_ops.to_normalized_coordinates(boxlist, - tf.shape(img)[1], - tf.shape(img)[2]) - - with self.test_session() as sess: - out = sess.run(boxlist.get()) - self.assertAllClose(out, coordinates) - - -class BoxRefinementTest(tf.test.TestCase): - - def test_box_voting(self): - candidates = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.6, 0.6, 0.8, 0.8]], tf.float32)) - candidates.add_field('ExtraField', tf.constant([1, 2])) - pool = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5], - [0.6, 0.6, 0.8, 0.8]], tf.float32)) - pool.add_field('scores', tf.constant([0.75, 0.25, 0.3])) - averaged_boxes = box_list_ops.box_voting(candidates, pool) - expected_boxes = [[0.1, 0.1, 0.425, 0.425], [0.6, 0.6, 0.8, 0.8]] - expected_scores = [0.5, 0.3] - with self.test_session() as sess: - boxes_out, scores_out, extra_field_out = sess.run( - [averaged_boxes.get(), averaged_boxes.get_field('scores'), - averaged_boxes.get_field('ExtraField')]) - - self.assertAllClose(expected_boxes, boxes_out) - self.assertAllClose(expected_scores, scores_out) - self.assertAllEqual(extra_field_out, [1, 2]) - - def test_box_voting_fails_with_negative_scores(self): - candidates = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4]], tf.float32)) - pool = box_list.BoxList(tf.constant([[0.1, 0.1, 0.4, 0.4]], tf.float32)) - pool.add_field('scores', tf.constant([-0.2])) - averaged_boxes = box_list_ops.box_voting(candidates, pool) - - with self.test_session() as sess: - with self.assertRaisesOpError('Scores must be non negative'): - sess.run([averaged_boxes.get()]) - - def test_box_voting_fails_when_unmatched(self): - candidates = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4]], tf.float32)) - pool = box_list.BoxList(tf.constant([[0.6, 0.6, 0.8, 0.8]], tf.float32)) - pool.add_field('scores', tf.constant([0.2])) - averaged_boxes = box_list_ops.box_voting(candidates, pool) - - with self.test_session() as sess: - with self.assertRaisesOpError('Each box in selected_boxes must match ' - 'with at least one box in pool_boxes.'): - sess.run([averaged_boxes.get()]) - - def test_refine_boxes(self): - pool = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5], - [0.6, 0.6, 0.8, 0.8]], tf.float32)) - pool.add_field('ExtraField', tf.constant([1, 2, 3])) - pool.add_field('scores', tf.constant([0.75, 0.25, 0.3])) - refined_boxes = box_list_ops.refine_boxes(pool, 0.5, 10) - - expected_boxes = [[0.1, 0.1, 0.425, 0.425], [0.6, 0.6, 0.8, 0.8]] - expected_scores = [0.5, 0.3] - with self.test_session() as sess: - boxes_out, scores_out, extra_field_out = sess.run( - [refined_boxes.get(), refined_boxes.get_field('scores'), - refined_boxes.get_field('ExtraField')]) - - self.assertAllClose(expected_boxes, boxes_out) - self.assertAllClose(expected_scores, scores_out) - self.assertAllEqual(extra_field_out, [1, 3]) - - def test_refine_boxes_multi_class(self): - pool = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5], - [0.6, 0.6, 0.8, 0.8], [0.2, 0.2, 0.3, 0.3]], tf.float32)) - pool.add_field('classes', tf.constant([0, 0, 1, 1])) - pool.add_field('scores', tf.constant([0.75, 0.25, 0.3, 0.2])) - refined_boxes = box_list_ops.refine_boxes_multi_class(pool, 3, 0.5, 10) - - expected_boxes = [[0.1, 0.1, 0.425, 0.425], [0.6, 0.6, 0.8, 0.8], - [0.2, 0.2, 0.3, 0.3]] - expected_scores = [0.5, 0.3, 0.2] - with self.test_session() as sess: - boxes_out, scores_out, extra_field_out = sess.run( - [refined_boxes.get(), refined_boxes.get_field('scores'), - refined_boxes.get_field('classes')]) - - self.assertAllClose(expected_boxes, boxes_out) - self.assertAllClose(expected_scores, scores_out) - self.assertAllEqual(extra_field_out, [0, 1, 1]) - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/box_list_test.py b/object_detection/core/box_list_test.py deleted file mode 100644 index edc00ebb..00000000 --- a/object_detection/core/box_list_test.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.box_list.""" - -import tensorflow as tf - -from object_detection.core import box_list - - -class BoxListTest(tf.test.TestCase): - """Tests for BoxList class.""" - - def test_num_boxes(self): - data = tf.constant([[0, 0, 1, 1], [1, 1, 2, 3], [3, 4, 5, 5]], tf.float32) - expected_num_boxes = 3 - - boxes = box_list.BoxList(data) - with self.test_session() as sess: - num_boxes_output = sess.run(boxes.num_boxes()) - self.assertEquals(num_boxes_output, expected_num_boxes) - - def test_get_correct_center_coordinates_and_sizes(self): - boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - boxes = box_list.BoxList(tf.constant(boxes)) - centers_sizes = boxes.get_center_coordinates_and_sizes() - expected_centers_sizes = [[15, 0.35], [12.5, 0.25], [10, 0.3], [5, 0.3]] - with self.test_session() as sess: - centers_sizes_out = sess.run(centers_sizes) - self.assertAllClose(centers_sizes_out, expected_centers_sizes) - - def test_create_box_list_with_dynamic_shape(self): - data = tf.constant([[0, 0, 1, 1], [1, 1, 2, 3], [3, 4, 5, 5]], tf.float32) - indices = tf.reshape(tf.where(tf.greater([1, 0, 1], 0)), [-1]) - data = tf.gather(data, indices) - assert data.get_shape().as_list() == [None, 4] - expected_num_boxes = 2 - - boxes = box_list.BoxList(data) - with self.test_session() as sess: - num_boxes_output = sess.run(boxes.num_boxes()) - self.assertEquals(num_boxes_output, expected_num_boxes) - - def test_transpose_coordinates(self): - boxes = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - boxes = box_list.BoxList(tf.constant(boxes)) - boxes.transpose_coordinates() - expected_corners = [[10.0, 10.0, 15.0, 20.0], [0.1, 0.2, 0.4, 0.5]] - with self.test_session() as sess: - corners_out = sess.run(boxes.get()) - self.assertAllClose(corners_out, expected_corners) - - def test_box_list_invalid_inputs(self): - data0 = tf.constant([[[0, 0, 1, 1], [3, 4, 5, 5]]], tf.float32) - data1 = tf.constant([[0, 0, 1], [1, 1, 2], [3, 4, 5]], tf.float32) - data2 = tf.constant([[0, 0, 1], [1, 1, 2], [3, 4, 5]], tf.int32) - - with self.assertRaises(ValueError): - _ = box_list.BoxList(data0) - with self.assertRaises(ValueError): - _ = box_list.BoxList(data1) - with self.assertRaises(ValueError): - _ = box_list.BoxList(data2) - - def test_num_boxes_static(self): - box_corners = [[10.0, 10.0, 20.0, 15.0], [0.2, 0.1, 0.5, 0.4]] - boxes = box_list.BoxList(tf.constant(box_corners)) - self.assertEquals(boxes.num_boxes_static(), 2) - self.assertEquals(type(boxes.num_boxes_static()), int) - - def test_num_boxes_static_for_uninferrable_shape(self): - placeholder = tf.placeholder(tf.float32, shape=[None, 4]) - boxes = box_list.BoxList(placeholder) - self.assertEquals(boxes.num_boxes_static(), None) - - def test_as_tensor_dict(self): - boxlist = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]], tf.float32)) - boxlist.add_field('classes', tf.constant([0, 1])) - boxlist.add_field('scores', tf.constant([0.75, 0.2])) - tensor_dict = boxlist.as_tensor_dict() - - expected_boxes = [[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]] - expected_classes = [0, 1] - expected_scores = [0.75, 0.2] - - with self.test_session() as sess: - tensor_dict_out = sess.run(tensor_dict) - self.assertAllEqual(3, len(tensor_dict_out)) - self.assertAllClose(expected_boxes, tensor_dict_out['boxes']) - self.assertAllEqual(expected_classes, tensor_dict_out['classes']) - self.assertAllClose(expected_scores, tensor_dict_out['scores']) - - def test_as_tensor_dict_with_features(self): - boxlist = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]], tf.float32)) - boxlist.add_field('classes', tf.constant([0, 1])) - boxlist.add_field('scores', tf.constant([0.75, 0.2])) - tensor_dict = boxlist.as_tensor_dict(['boxes', 'classes', 'scores']) - - expected_boxes = [[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]] - expected_classes = [0, 1] - expected_scores = [0.75, 0.2] - - with self.test_session() as sess: - tensor_dict_out = sess.run(tensor_dict) - self.assertAllEqual(3, len(tensor_dict_out)) - self.assertAllClose(expected_boxes, tensor_dict_out['boxes']) - self.assertAllEqual(expected_classes, tensor_dict_out['classes']) - self.assertAllClose(expected_scores, tensor_dict_out['scores']) - - def test_as_tensor_dict_missing_field(self): - boxlist = box_list.BoxList( - tf.constant([[0.1, 0.1, 0.4, 0.4], [0.1, 0.1, 0.5, 0.5]], tf.float32)) - boxlist.add_field('classes', tf.constant([0, 1])) - boxlist.add_field('scores', tf.constant([0.75, 0.2])) - with self.assertRaises(ValueError): - boxlist.as_tensor_dict(['foo', 'bar']) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/box_predictor.py b/object_detection/core/box_predictor.py deleted file mode 100644 index 8378a8ea..00000000 --- a/object_detection/core/box_predictor.py +++ /dev/null @@ -1,566 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Box predictor for object detectors. - -Box predictors are classes that take a high level -image feature map as input and produce two predictions, -(1) a tensor encoding box locations, and -(2) a tensor encoding classes for each box. - -These components are passed directly to loss functions -in our detection models. - -These modules are separated from the main model since the same -few box predictor architectures are shared across many models. -""" -from abc import abstractmethod -import tensorflow as tf -from object_detection.utils import ops -from object_detection.utils import shape_utils -from object_detection.utils import static_shape - -slim = tf.contrib.slim - -BOX_ENCODINGS = 'box_encodings' -CLASS_PREDICTIONS_WITH_BACKGROUND = 'class_predictions_with_background' -MASK_PREDICTIONS = 'mask_predictions' - - -class BoxPredictor(object): - """BoxPredictor.""" - - def __init__(self, is_training, num_classes): - """Constructor. - - Args: - is_training: Indicates whether the BoxPredictor is in training mode. - num_classes: number of classes. Note that num_classes *does not* - include the background category, so if groundtruth labels take values - in {0, 1, .., K-1}, num_classes=K (and not K+1, even though the - assigned classification targets can range from {0,... K}). - """ - self._is_training = is_training - self._num_classes = num_classes - - @property - def num_classes(self): - return self._num_classes - - def predict(self, image_features, num_predictions_per_location, scope, - **params): - """Computes encoded object locations and corresponding confidences. - - Takes a high level image feature map as input and produce two predictions, - (1) a tensor encoding box locations, and - (2) a tensor encoding class scores for each corresponding box. - In this interface, we only assume that two tensors are returned as output - and do not assume anything about their shapes. - - Args: - image_features: A float tensor of shape [batch_size, height, width, - channels] containing features for a batch of images. - num_predictions_per_location: an integer representing the number of box - predictions to be made per spatial location in the feature map. - scope: Variable and Op scope name. - **params: Additional keyword arguments for specific implementations of - BoxPredictor. - - Returns: - A dictionary containing at least the following tensors. - box_encodings: A float tensor of shape - [batch_size, num_anchors, q, code_size] representing the location of - the objects, where q is 1 or the number of classes. - class_predictions_with_background: A float tensor of shape - [batch_size, num_anchors, num_classes + 1] representing the class - predictions for the proposals. - """ - with tf.variable_scope(scope): - return self._predict(image_features, num_predictions_per_location, - **params) - - # TODO: num_predictions_per_location could be moved to constructor. - # This is currently only used by ConvolutionalBoxPredictor. - @abstractmethod - def _predict(self, image_features, num_predictions_per_location, **params): - """Implementations must override this method. - - Args: - image_features: A float tensor of shape [batch_size, height, width, - channels] containing features for a batch of images. - num_predictions_per_location: an integer representing the number of box - predictions to be made per spatial location in the feature map. - **params: Additional keyword arguments for specific implementations of - BoxPredictor. - - Returns: - A dictionary containing at least the following tensors. - box_encodings: A float tensor of shape - [batch_size, num_anchors, q, code_size] representing the location of - the objects, where q is 1 or the number of classes. - class_predictions_with_background: A float tensor of shape - [batch_size, num_anchors, num_classes + 1] representing the class - predictions for the proposals. - """ - pass - - -class RfcnBoxPredictor(BoxPredictor): - """RFCN Box Predictor. - - Applies a position sensitve ROI pooling on position sensitive feature maps to - predict classes and refined locations. See https://arxiv.org/abs/1605.06409 - for details. - - This is used for the second stage of the RFCN meta architecture. Notice that - locations are *not* shared across classes, thus for each anchor, a separate - prediction is made for each class. - """ - - def __init__(self, - is_training, - num_classes, - conv_hyperparams, - num_spatial_bins, - depth, - crop_size, - box_code_size): - """Constructor. - - Args: - is_training: Indicates whether the BoxPredictor is in training mode. - num_classes: number of classes. Note that num_classes *does not* - include the background category, so if groundtruth labels take values - in {0, 1, .., K-1}, num_classes=K (and not K+1, even though the - assigned classification targets can range from {0,... K}). - conv_hyperparams: Slim arg_scope with hyperparameters for conolutional - layers. - num_spatial_bins: A list of two integers `[spatial_bins_y, - spatial_bins_x]`. - depth: Target depth to reduce the input feature maps to. - crop_size: A list of two integers `[crop_height, crop_width]`. - box_code_size: Size of encoding for each box. - """ - super(RfcnBoxPredictor, self).__init__(is_training, num_classes) - self._conv_hyperparams = conv_hyperparams - self._num_spatial_bins = num_spatial_bins - self._depth = depth - self._crop_size = crop_size - self._box_code_size = box_code_size - - @property - def num_classes(self): - return self._num_classes - - def _predict(self, image_features, num_predictions_per_location, - proposal_boxes): - """Computes encoded object locations and corresponding confidences. - - Args: - image_features: A float tensor of shape [batch_size, height, width, - channels] containing features for a batch of images. - num_predictions_per_location: an integer representing the number of box - predictions to be made per spatial location in the feature map. - Currently, this must be set to 1, or an error will be raised. - proposal_boxes: A float tensor of shape [batch_size, num_proposals, - box_code_size]. - - Returns: - box_encodings: A float tensor of shape - [batch_size, 1, num_classes, code_size] representing the - location of the objects. - class_predictions_with_background: A float tensor of shape - [batch_size, 1, num_classes + 1] representing the class - predictions for the proposals. - Raises: - ValueError: if num_predictions_per_location is not 1. - """ - if num_predictions_per_location != 1: - raise ValueError('Currently RfcnBoxPredictor only supports ' - 'predicting a single box per class per location.') - - batch_size = tf.shape(proposal_boxes)[0] - num_boxes = tf.shape(proposal_boxes)[1] - def get_box_indices(proposals): - proposals_shape = proposals.get_shape().as_list() - if any(dim is None for dim in proposals_shape): - proposals_shape = tf.shape(proposals) - ones_mat = tf.ones(proposals_shape[:2], dtype=tf.int32) - multiplier = tf.expand_dims( - tf.range(start=0, limit=proposals_shape[0]), 1) - return tf.reshape(ones_mat * multiplier, [-1]) - - net = image_features - with slim.arg_scope(self._conv_hyperparams): - net = slim.conv2d(net, self._depth, [1, 1], scope='reduce_depth') - # Location predictions. - location_feature_map_depth = (self._num_spatial_bins[0] * - self._num_spatial_bins[1] * - self.num_classes * - self._box_code_size) - location_feature_map = slim.conv2d(net, location_feature_map_depth, - [1, 1], activation_fn=None, - scope='refined_locations') - box_encodings = ops.position_sensitive_crop_regions( - location_feature_map, - boxes=tf.reshape(proposal_boxes, [-1, self._box_code_size]), - box_ind=get_box_indices(proposal_boxes), - crop_size=self._crop_size, - num_spatial_bins=self._num_spatial_bins, - global_pool=True) - box_encodings = tf.squeeze(box_encodings, squeeze_dims=[1, 2]) - box_encodings = tf.reshape(box_encodings, - [batch_size * num_boxes, 1, self.num_classes, - self._box_code_size]) - - # Class predictions. - total_classes = self.num_classes + 1 # Account for background class. - class_feature_map_depth = (self._num_spatial_bins[0] * - self._num_spatial_bins[1] * - total_classes) - class_feature_map = slim.conv2d(net, class_feature_map_depth, [1, 1], - activation_fn=None, - scope='class_predictions') - class_predictions_with_background = ops.position_sensitive_crop_regions( - class_feature_map, - boxes=tf.reshape(proposal_boxes, [-1, self._box_code_size]), - box_ind=get_box_indices(proposal_boxes), - crop_size=self._crop_size, - num_spatial_bins=self._num_spatial_bins, - global_pool=True) - class_predictions_with_background = tf.squeeze( - class_predictions_with_background, squeeze_dims=[1, 2]) - class_predictions_with_background = tf.reshape( - class_predictions_with_background, - [batch_size * num_boxes, 1, total_classes]) - - return {BOX_ENCODINGS: box_encodings, - CLASS_PREDICTIONS_WITH_BACKGROUND: - class_predictions_with_background} - - -class MaskRCNNBoxPredictor(BoxPredictor): - """Mask R-CNN Box Predictor. - - See Mask R-CNN: He, K., Gkioxari, G., Dollar, P., & Girshick, R. (2017). - Mask R-CNN. arXiv preprint arXiv:1703.06870. - - This is used for the second stage of the Mask R-CNN detector where proposals - cropped from an image are arranged along the batch dimension of the input - image_features tensor. Notice that locations are *not* shared across classes, - thus for each anchor, a separate prediction is made for each class. - - In addition to predicting boxes and classes, optionally this class allows - predicting masks and/or keypoints inside detection boxes. - - Currently this box predictor makes per-class predictions; that is, each - anchor makes a separate box prediction for each class. - """ - - def __init__(self, - is_training, - num_classes, - fc_hyperparams, - use_dropout, - dropout_keep_prob, - box_code_size, - conv_hyperparams=None, - predict_instance_masks=False, - mask_height=14, - mask_width=14, - mask_prediction_conv_depth=256, - predict_keypoints=False): - """Constructor. - - Args: - is_training: Indicates whether the BoxPredictor is in training mode. - num_classes: number of classes. Note that num_classes *does not* - include the background category, so if groundtruth labels take values - in {0, 1, .., K-1}, num_classes=K (and not K+1, even though the - assigned classification targets can range from {0,... K}). - fc_hyperparams: Slim arg_scope with hyperparameters for fully - connected ops. - use_dropout: Option to use dropout or not. Note that a single dropout - op is applied here prior to both box and class predictions, which stands - in contrast to the ConvolutionalBoxPredictor below. - dropout_keep_prob: Keep probability for dropout. - This is only used if use_dropout is True. - box_code_size: Size of encoding for each box. - conv_hyperparams: Slim arg_scope with hyperparameters for convolution - ops. - predict_instance_masks: Whether to predict object masks inside detection - boxes. - mask_height: Desired output mask height. The default value is 14. - mask_width: Desired output mask width. The default value is 14. - mask_prediction_conv_depth: The depth for the first conv2d_transpose op - applied to the image_features in the mask prediciton branch. - predict_keypoints: Whether to predict keypoints insde detection boxes. - - - Raises: - ValueError: If predict_instance_masks or predict_keypoints is true. - """ - super(MaskRCNNBoxPredictor, self).__init__(is_training, num_classes) - self._fc_hyperparams = fc_hyperparams - self._use_dropout = use_dropout - self._box_code_size = box_code_size - self._dropout_keep_prob = dropout_keep_prob - self._conv_hyperparams = conv_hyperparams - self._predict_instance_masks = predict_instance_masks - self._mask_height = mask_height - self._mask_width = mask_width - self._mask_prediction_conv_depth = mask_prediction_conv_depth - self._predict_keypoints = predict_keypoints - if self._predict_keypoints: - raise ValueError('Keypoint prediction is unimplemented.') - if ((self._predict_instance_masks or self._predict_keypoints) and - self._conv_hyperparams is None): - raise ValueError('`conv_hyperparams` must be provided when predicting ' - 'masks.') - - @property - def num_classes(self): - return self._num_classes - - def _predict(self, image_features, num_predictions_per_location): - """Computes encoded object locations and corresponding confidences. - - Flattens image_features and applies fully connected ops (with no - non-linearity) to predict box encodings and class predictions. In this - setting, anchors are not spatially arranged in any way and are assumed to - have been folded into the batch dimension. Thus we output 1 for the - anchors dimension. - - Also optionally predicts instance masks. - The mask prediction head is based on the Mask RCNN paper with the following - modifications: We replace the deconvolution layer with a bilinear resize - and a convolution. - - Args: - image_features: A float tensor of shape [batch_size, height, width, - channels] containing features for a batch of images. - num_predictions_per_location: an integer representing the number of box - predictions to be made per spatial location in the feature map. - Currently, this must be set to 1, or an error will be raised. - - Returns: - A dictionary containing the following tensors. - box_encodings: A float tensor of shape - [batch_size, 1, num_classes, code_size] representing the - location of the objects. - class_predictions_with_background: A float tensor of shape - [batch_size, 1, num_classes + 1] representing the class - predictions for the proposals. - If predict_masks is True the dictionary also contains: - instance_masks: A float tensor of shape - [batch_size, 1, num_classes, image_height, image_width] - If predict_keypoints is True the dictionary also contains: - keypoints: [batch_size, 1, num_keypoints, 2] - - Raises: - ValueError: if num_predictions_per_location is not 1. - """ - if num_predictions_per_location != 1: - raise ValueError('Currently FullyConnectedBoxPredictor only supports ' - 'predicting a single box per class per location.') - spatial_averaged_image_features = tf.reduce_mean(image_features, [1, 2], - keep_dims=True, - name='AvgPool') - flattened_image_features = slim.flatten(spatial_averaged_image_features) - if self._use_dropout: - flattened_image_features = slim.dropout(flattened_image_features, - keep_prob=self._dropout_keep_prob, - is_training=self._is_training) - with slim.arg_scope(self._fc_hyperparams): - box_encodings = slim.fully_connected( - flattened_image_features, - self._num_classes * self._box_code_size, - activation_fn=None, - scope='BoxEncodingPredictor') - class_predictions_with_background = slim.fully_connected( - flattened_image_features, - self._num_classes + 1, - activation_fn=None, - scope='ClassPredictor') - box_encodings = tf.reshape( - box_encodings, [-1, 1, self._num_classes, self._box_code_size]) - class_predictions_with_background = tf.reshape( - class_predictions_with_background, [-1, 1, self._num_classes + 1]) - - predictions_dict = { - BOX_ENCODINGS: box_encodings, - CLASS_PREDICTIONS_WITH_BACKGROUND: class_predictions_with_background - } - - if self._predict_instance_masks: - with slim.arg_scope(self._conv_hyperparams): - upsampled_features = tf.image.resize_bilinear( - image_features, - [self._mask_height, self._mask_width], - align_corners=True) - upsampled_features = slim.conv2d( - upsampled_features, - num_outputs=self._mask_prediction_conv_depth, - kernel_size=[2, 2]) - mask_predictions = slim.conv2d(upsampled_features, - num_outputs=self.num_classes, - activation_fn=None, - kernel_size=[3, 3]) - instance_masks = tf.expand_dims(tf.transpose(mask_predictions, - perm=[0, 3, 1, 2]), - axis=1, - name='MaskPredictor') - predictions_dict[MASK_PREDICTIONS] = instance_masks - return predictions_dict - - -class ConvolutionalBoxPredictor(BoxPredictor): - """Convolutional Box Predictor. - - Optionally add an intermediate 1x1 convolutional layer after features and - predict in parallel branches box_encodings and - class_predictions_with_background. - - Currently this box predictor assumes that predictions are "shared" across - classes --- that is each anchor makes box predictions which do not depend - on class. - """ - - def __init__(self, - is_training, - num_classes, - conv_hyperparams, - min_depth, - max_depth, - num_layers_before_predictor, - use_dropout, - dropout_keep_prob, - kernel_size, - box_code_size, - apply_sigmoid_to_scores=False, - class_prediction_bias_init=0.0): - """Constructor. - - Args: - is_training: Indicates whether the BoxPredictor is in training mode. - num_classes: number of classes. Note that num_classes *does not* - include the background category, so if groundtruth labels take values - in {0, 1, .., K-1}, num_classes=K (and not K+1, even though the - assigned classification targets can range from {0,... K}). - conv_hyperparams: Slim arg_scope with hyperparameters for convolution ops. - min_depth: Minumum feature depth prior to predicting box encodings - and class predictions. - max_depth: Maximum feature depth prior to predicting box encodings - and class predictions. If max_depth is set to 0, no additional - feature map will be inserted before location and class predictions. - num_layers_before_predictor: Number of the additional conv layers before - the predictor. - use_dropout: Option to use dropout for class prediction or not. - dropout_keep_prob: Keep probability for dropout. - This is only used if use_dropout is True. - kernel_size: Size of final convolution kernel. If the - spatial resolution of the feature map is smaller than the kernel size, - then the kernel size is automatically set to be - min(feature_width, feature_height). - box_code_size: Size of encoding for each box. - apply_sigmoid_to_scores: if True, apply the sigmoid on the output - class_predictions. - class_prediction_bias_init: constant value to initialize bias of the last - conv2d layer before class prediction. - - Raises: - ValueError: if min_depth > max_depth. - """ - super(ConvolutionalBoxPredictor, self).__init__(is_training, num_classes) - if min_depth > max_depth: - raise ValueError('min_depth should be less than or equal to max_depth') - self._conv_hyperparams = conv_hyperparams - self._min_depth = min_depth - self._max_depth = max_depth - self._num_layers_before_predictor = num_layers_before_predictor - self._use_dropout = use_dropout - self._kernel_size = kernel_size - self._box_code_size = box_code_size - self._dropout_keep_prob = dropout_keep_prob - self._apply_sigmoid_to_scores = apply_sigmoid_to_scores - self._class_prediction_bias_init = class_prediction_bias_init - - def _predict(self, image_features, num_predictions_per_location): - """Computes encoded object locations and corresponding confidences. - - Args: - image_features: A float tensor of shape [batch_size, height, width, - channels] containing features for a batch of images. - num_predictions_per_location: an integer representing the number of box - predictions to be made per spatial location in the feature map. - - Returns: - A dictionary containing the following tensors. - box_encodings: A float tensor of shape [batch_size, num_anchors, 1, - code_size] representing the location of the objects, where - num_anchors = feat_height * feat_width * num_predictions_per_location - class_predictions_with_background: A float tensor of shape - [batch_size, num_anchors, num_classes + 1] representing the class - predictions for the proposals. - """ - # Add a slot for the background class. - num_class_slots = self.num_classes + 1 - net = image_features - with slim.arg_scope(self._conv_hyperparams), \ - slim.arg_scope([slim.dropout], is_training=self._is_training): - # Add additional conv layers before the class predictor. - features_depth = static_shape.get_depth(image_features.get_shape()) - depth = max(min(features_depth, self._max_depth), self._min_depth) - tf.logging.info('depth of additional conv before box predictor: {}'. - format(depth)) - if depth > 0 and self._num_layers_before_predictor > 0: - for i in range(self._num_layers_before_predictor): - net = slim.conv2d( - net, depth, [1, 1], scope='Conv2d_%d_1x1_%d' % (i, depth)) - with slim.arg_scope([slim.conv2d], activation_fn=None, - normalizer_fn=None, normalizer_params=None): - box_encodings = slim.conv2d( - net, num_predictions_per_location * self._box_code_size, - [self._kernel_size, self._kernel_size], - scope='BoxEncodingPredictor') - if self._use_dropout: - net = slim.dropout(net, keep_prob=self._dropout_keep_prob) - class_predictions_with_background = slim.conv2d( - net, num_predictions_per_location * num_class_slots, - [self._kernel_size, self._kernel_size], scope='ClassPredictor', - biases_initializer=tf.constant_initializer( - self._class_prediction_bias_init)) - if self._apply_sigmoid_to_scores: - class_predictions_with_background = tf.sigmoid( - class_predictions_with_background) - - combined_feature_map_shape = shape_utils.combined_static_and_dynamic_shape( - image_features) - box_encodings = tf.reshape( - box_encodings, tf.stack([combined_feature_map_shape[0], - combined_feature_map_shape[1] * - combined_feature_map_shape[2] * - num_predictions_per_location, - 1, self._box_code_size])) - class_predictions_with_background = tf.reshape( - class_predictions_with_background, - tf.stack([combined_feature_map_shape[0], - combined_feature_map_shape[1] * - combined_feature_map_shape[2] * - num_predictions_per_location, - num_class_slots])) - return {BOX_ENCODINGS: box_encodings, - CLASS_PREDICTIONS_WITH_BACKGROUND: - class_predictions_with_background} diff --git a/object_detection/core/box_predictor_test.py b/object_detection/core/box_predictor_test.py deleted file mode 100644 index e5e5a3c9..00000000 --- a/object_detection/core/box_predictor_test.py +++ /dev/null @@ -1,323 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.box_predictor.""" - -import numpy as np -import tensorflow as tf - -from google.protobuf import text_format -from object_detection.builders import hyperparams_builder -from object_detection.core import box_predictor -from object_detection.protos import hyperparams_pb2 - - -class MaskRCNNBoxPredictorTest(tf.test.TestCase): - - def _build_arg_scope_with_hyperparams(self, - op_type=hyperparams_pb2.Hyperparams.FC): - hyperparams = hyperparams_pb2.Hyperparams() - hyperparams_text_proto = """ - activation: NONE - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - text_format.Merge(hyperparams_text_proto, hyperparams) - hyperparams.op = op_type - return hyperparams_builder.build(hyperparams, is_training=True) - - def test_get_boxes_with_five_classes(self): - image_features = tf.random_uniform([2, 7, 7, 3], dtype=tf.float32) - mask_box_predictor = box_predictor.MaskRCNNBoxPredictor( - is_training=False, - num_classes=5, - fc_hyperparams=self._build_arg_scope_with_hyperparams(), - use_dropout=False, - dropout_keep_prob=0.5, - box_code_size=4, - ) - box_predictions = mask_box_predictor.predict( - image_features, num_predictions_per_location=1, scope='BoxPredictor') - box_encodings = box_predictions[box_predictor.BOX_ENCODINGS] - class_predictions_with_background = box_predictions[ - box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND] - init_op = tf.global_variables_initializer() - with self.test_session() as sess: - sess.run(init_op) - (box_encodings_shape, - class_predictions_with_background_shape) = sess.run( - [tf.shape(box_encodings), - tf.shape(class_predictions_with_background)]) - self.assertAllEqual(box_encodings_shape, [2, 1, 5, 4]) - self.assertAllEqual(class_predictions_with_background_shape, [2, 1, 6]) - - def test_value_error_on_predict_instance_masks_with_no_conv_hyperparms(self): - with self.assertRaises(ValueError): - box_predictor.MaskRCNNBoxPredictor( - is_training=False, - num_classes=5, - fc_hyperparams=self._build_arg_scope_with_hyperparams(), - use_dropout=False, - dropout_keep_prob=0.5, - box_code_size=4, - predict_instance_masks=True) - - def test_get_instance_masks(self): - image_features = tf.random_uniform([2, 7, 7, 3], dtype=tf.float32) - mask_box_predictor = box_predictor.MaskRCNNBoxPredictor( - is_training=False, - num_classes=5, - fc_hyperparams=self._build_arg_scope_with_hyperparams(), - use_dropout=False, - dropout_keep_prob=0.5, - box_code_size=4, - conv_hyperparams=self._build_arg_scope_with_hyperparams( - op_type=hyperparams_pb2.Hyperparams.CONV), - predict_instance_masks=True) - box_predictions = mask_box_predictor.predict( - image_features, num_predictions_per_location=1, scope='BoxPredictor') - mask_predictions = box_predictions[box_predictor.MASK_PREDICTIONS] - self.assertListEqual([2, 1, 5, 14, 14], - mask_predictions.get_shape().as_list()) - - def test_do_not_return_instance_masks_and_keypoints_without_request(self): - image_features = tf.random_uniform([2, 7, 7, 3], dtype=tf.float32) - mask_box_predictor = box_predictor.MaskRCNNBoxPredictor( - is_training=False, - num_classes=5, - fc_hyperparams=self._build_arg_scope_with_hyperparams(), - use_dropout=False, - dropout_keep_prob=0.5, - box_code_size=4) - box_predictions = mask_box_predictor.predict( - image_features, num_predictions_per_location=1, scope='BoxPredictor') - self.assertEqual(len(box_predictions), 2) - self.assertTrue(box_predictor.BOX_ENCODINGS in box_predictions) - self.assertTrue(box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND - in box_predictions) - - def test_value_error_on_predict_keypoints(self): - with self.assertRaises(ValueError): - box_predictor.MaskRCNNBoxPredictor( - is_training=False, - num_classes=5, - fc_hyperparams=self._build_arg_scope_with_hyperparams(), - use_dropout=False, - dropout_keep_prob=0.5, - box_code_size=4, - predict_keypoints=True) - - -class RfcnBoxPredictorTest(tf.test.TestCase): - - def _build_arg_scope_with_conv_hyperparams(self): - conv_hyperparams = hyperparams_pb2.Hyperparams() - conv_hyperparams_text_proto = """ - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams) - return hyperparams_builder.build(conv_hyperparams, is_training=True) - - def test_get_correct_box_encoding_and_class_prediction_shapes(self): - image_features = tf.random_uniform([4, 8, 8, 64], dtype=tf.float32) - proposal_boxes = tf.random_normal([4, 2, 4], dtype=tf.float32) - rfcn_box_predictor = box_predictor.RfcnBoxPredictor( - is_training=False, - num_classes=2, - conv_hyperparams=self._build_arg_scope_with_conv_hyperparams(), - num_spatial_bins=[3, 3], - depth=4, - crop_size=[12, 12], - box_code_size=4 - ) - box_predictions = rfcn_box_predictor.predict( - image_features, num_predictions_per_location=1, scope='BoxPredictor', - proposal_boxes=proposal_boxes) - box_encodings = box_predictions[box_predictor.BOX_ENCODINGS] - class_predictions_with_background = box_predictions[ - box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND] - - init_op = tf.global_variables_initializer() - with self.test_session() as sess: - sess.run(init_op) - (box_encodings_shape, - class_predictions_shape) = sess.run( - [tf.shape(box_encodings), - tf.shape(class_predictions_with_background)]) - self.assertAllEqual(box_encodings_shape, [8, 1, 2, 4]) - self.assertAllEqual(class_predictions_shape, [8, 1, 3]) - - -class ConvolutionalBoxPredictorTest(tf.test.TestCase): - - def _build_arg_scope_with_conv_hyperparams(self): - conv_hyperparams = hyperparams_pb2.Hyperparams() - conv_hyperparams_text_proto = """ - activation: RELU_6 - regularizer { - l2_regularizer { - } - } - initializer { - truncated_normal_initializer { - } - } - """ - text_format.Merge(conv_hyperparams_text_proto, conv_hyperparams) - return hyperparams_builder.build(conv_hyperparams, is_training=True) - - def test_get_boxes_for_five_aspect_ratios_per_location(self): - image_features = tf.random_uniform([4, 8, 8, 64], dtype=tf.float32) - conv_box_predictor = box_predictor.ConvolutionalBoxPredictor( - is_training=False, - num_classes=0, - conv_hyperparams=self._build_arg_scope_with_conv_hyperparams(), - min_depth=0, - max_depth=32, - num_layers_before_predictor=1, - use_dropout=True, - dropout_keep_prob=0.8, - kernel_size=1, - box_code_size=4 - ) - box_predictions = conv_box_predictor.predict( - image_features, num_predictions_per_location=5, scope='BoxPredictor') - box_encodings = box_predictions[box_predictor.BOX_ENCODINGS] - objectness_predictions = box_predictions[ - box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND] - - init_op = tf.global_variables_initializer() - with self.test_session() as sess: - sess.run(init_op) - (box_encodings_shape, - objectness_predictions_shape) = sess.run( - [tf.shape(box_encodings), tf.shape(objectness_predictions)]) - self.assertAllEqual(box_encodings_shape, [4, 320, 1, 4]) - self.assertAllEqual(objectness_predictions_shape, [4, 320, 1]) - - def test_get_boxes_for_one_aspect_ratio_per_location(self): - image_features = tf.random_uniform([4, 8, 8, 64], dtype=tf.float32) - conv_box_predictor = box_predictor.ConvolutionalBoxPredictor( - is_training=False, - num_classes=0, - conv_hyperparams=self._build_arg_scope_with_conv_hyperparams(), - min_depth=0, - max_depth=32, - num_layers_before_predictor=1, - use_dropout=True, - dropout_keep_prob=0.8, - kernel_size=1, - box_code_size=4 - ) - box_predictions = conv_box_predictor.predict( - image_features, num_predictions_per_location=1, scope='BoxPredictor') - box_encodings = box_predictions[box_predictor.BOX_ENCODINGS] - objectness_predictions = box_predictions[ - box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND] - - init_op = tf.global_variables_initializer() - with self.test_session() as sess: - sess.run(init_op) - (box_encodings_shape, - objectness_predictions_shape) = sess.run( - [tf.shape(box_encodings), tf.shape(objectness_predictions)]) - self.assertAllEqual(box_encodings_shape, [4, 64, 1, 4]) - self.assertAllEqual(objectness_predictions_shape, [4, 64, 1]) - - def test_get_multi_class_predictions_for_five_aspect_ratios_per_location( - self): - num_classes_without_background = 6 - image_features = tf.random_uniform([4, 8, 8, 64], dtype=tf.float32) - conv_box_predictor = box_predictor.ConvolutionalBoxPredictor( - is_training=False, - num_classes=num_classes_without_background, - conv_hyperparams=self._build_arg_scope_with_conv_hyperparams(), - min_depth=0, - max_depth=32, - num_layers_before_predictor=1, - use_dropout=True, - dropout_keep_prob=0.8, - kernel_size=1, - box_code_size=4 - ) - box_predictions = conv_box_predictor.predict( - image_features, - num_predictions_per_location=5, - scope='BoxPredictor') - box_encodings = box_predictions[box_predictor.BOX_ENCODINGS] - class_predictions_with_background = box_predictions[ - box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND] - - init_op = tf.global_variables_initializer() - with self.test_session() as sess: - sess.run(init_op) - (box_encodings_shape, class_predictions_with_background_shape - ) = sess.run([ - tf.shape(box_encodings), tf.shape(class_predictions_with_background)]) - self.assertAllEqual(box_encodings_shape, [4, 320, 1, 4]) - self.assertAllEqual(class_predictions_with_background_shape, - [4, 320, num_classes_without_background+1]) - - def test_get_boxes_for_five_aspect_ratios_per_location_fully_convolutional( - self): - image_features = tf.placeholder(dtype=tf.float32, shape=[4, None, None, 64]) - conv_box_predictor = box_predictor.ConvolutionalBoxPredictor( - is_training=False, - num_classes=0, - conv_hyperparams=self._build_arg_scope_with_conv_hyperparams(), - min_depth=0, - max_depth=32, - num_layers_before_predictor=1, - use_dropout=True, - dropout_keep_prob=0.8, - kernel_size=1, - box_code_size=4 - ) - box_predictions = conv_box_predictor.predict( - image_features, num_predictions_per_location=5, scope='BoxPredictor') - box_encodings = box_predictions[box_predictor.BOX_ENCODINGS] - objectness_predictions = box_predictions[ - box_predictor.CLASS_PREDICTIONS_WITH_BACKGROUND] - init_op = tf.global_variables_initializer() - - resolution = 32 - expected_num_anchors = resolution*resolution*5 - with self.test_session() as sess: - sess.run(init_op) - (box_encodings_shape, - objectness_predictions_shape) = sess.run( - [tf.shape(box_encodings), tf.shape(objectness_predictions)], - feed_dict={image_features: - np.random.rand(4, resolution, resolution, 64)}) - self.assertAllEqual(box_encodings_shape, [4, expected_num_anchors, 1, 4]) - self.assertAllEqual(objectness_predictions_shape, - [4, expected_num_anchors, 1]) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/data_decoder.py b/object_detection/core/data_decoder.py deleted file mode 100644 index 9ae18c1f..00000000 --- a/object_detection/core/data_decoder.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Interface for data decoders. - -Data decoders decode the input data and return a dictionary of tensors keyed by -the entries in core.reader.Fields. -""" -from abc import ABCMeta -from abc import abstractmethod - - -class DataDecoder(object): - """Interface for data decoders.""" - __metaclass__ = ABCMeta - - @abstractmethod - def decode(self, data): - """Return a single image and associated labels. - - Args: - data: a string tensor holding a serialized protocol buffer corresponding - to data for a single image. - - Returns: - tensor_dict: a dictionary containing tensors. Possible keys are defined in - reader.Fields. - """ - pass diff --git a/object_detection/core/data_parser.py b/object_detection/core/data_parser.py deleted file mode 100644 index 3dac4de2..00000000 --- a/object_detection/core/data_parser.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Interface for data parsers. - -Data parser parses input data and returns a dictionary of numpy arrays -keyed by the entries in standard_fields.py. Since the parser parses records -to numpy arrays (materialized tensors) directly, it is used to read data for -evaluation/visualization; to parse the data during training, DataDecoder should -be used. -""" -from abc import ABCMeta -from abc import abstractmethod - - -class DataToNumpyParser(object): - __metaclass__ = ABCMeta - - @abstractmethod - def parse(self, input_data): - """Parses input and returns a numpy array or a dictionary of numpy arrays. - - Args: - input_data: an input data - - Returns: - A numpy array or a dictionary of numpy arrays or None, if input - cannot be parsed. - """ - pass diff --git a/object_detection/core/keypoint_ops.py b/object_detection/core/keypoint_ops.py deleted file mode 100644 index e520845f..00000000 --- a/object_detection/core/keypoint_ops.py +++ /dev/null @@ -1,282 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Keypoint operations. - -Keypoints are represented as tensors of shape [num_instances, num_keypoints, 2], -where the last dimension holds rank 2 tensors of the form [y, x] representing -the coordinates of the keypoint. -""" -import numpy as np -import tensorflow as tf - - -def scale(keypoints, y_scale, x_scale, scope=None): - """Scales keypoint coordinates in x and y dimensions. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - y_scale: (float) scalar tensor - x_scale: (float) scalar tensor - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'Scale'): - y_scale = tf.cast(y_scale, tf.float32) - x_scale = tf.cast(x_scale, tf.float32) - new_keypoints = keypoints * [[[y_scale, x_scale]]] - return new_keypoints - - -def clip_to_window(keypoints, window, scope=None): - """Clips keypoints to a window. - - This op clips any input keypoints to a window. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] - window to which the op should clip the keypoints. - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'ClipToWindow'): - y, x = tf.split(value=keypoints, num_or_size_splits=2, axis=2) - win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) - y = tf.maximum(tf.minimum(y, win_y_max), win_y_min) - x = tf.maximum(tf.minimum(x, win_x_max), win_x_min) - new_keypoints = tf.concat([y, x], 2) - return new_keypoints - - -def prune_outside_window(keypoints, window, scope=None): - """Prunes keypoints that fall outside a given window. - - This function replaces keypoints that fall outside the given window with nan. - See also clip_to_window which clips any keypoints that fall outside the given - window. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] - window outside of which the op should prune the keypoints. - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'PruneOutsideWindow'): - y, x = tf.split(value=keypoints, num_or_size_splits=2, axis=2) - win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) - - valid_indices = tf.logical_and( - tf.logical_and(y >= win_y_min, y <= win_y_max), - tf.logical_and(x >= win_x_min, x <= win_x_max)) - - new_y = tf.where(valid_indices, y, np.nan * tf.ones_like(y)) - new_x = tf.where(valid_indices, x, np.nan * tf.ones_like(x)) - new_keypoints = tf.concat([new_y, new_x], 2) - - return new_keypoints - - -def change_coordinate_frame(keypoints, window, scope=None): - """Changes coordinate frame of the keypoints to be relative to window's frame. - - Given a window of the form [y_min, x_min, y_max, x_max], changes keypoint - coordinates from keypoints of shape [num_instances, num_keypoints, 2] - to be relative to this window. - - An example use case is data augmentation: where we are given groundtruth - keypoints and would like to randomly crop the image to some window. In this - case we need to change the coordinate frame of each groundtruth keypoint to be - relative to this new window. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] - window we should change the coordinate frame to. - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'ChangeCoordinateFrame'): - win_height = window[2] - window[0] - win_width = window[3] - window[1] - new_keypoints = scale(keypoints - [window[0], window[1]], 1.0 / win_height, - 1.0 / win_width) - return new_keypoints - - -def to_normalized_coordinates(keypoints, height, width, - check_range=True, scope=None): - """Converts absolute keypoint coordinates to normalized coordinates in [0, 1]. - - Usually one uses the dynamic shape of the image or conv-layer tensor: - keypoints = keypoint_ops.to_normalized_coordinates(keypoints, - tf.shape(images)[1], - tf.shape(images)[2]), - - This function raises an assertion failed error at graph execution time when - the maximum coordinate is smaller than 1.01 (which means that coordinates are - already normalized). The value 1.01 is to deal with small rounding errors. - - Args: - keypoints: A tensor of shape [num_instances, num_keypoints, 2]. - height: Maximum value for y coordinate of absolute keypoint coordinates. - width: Maximum value for x coordinate of absolute keypoint coordinates. - check_range: If True, checks if the coordinates are normalized. - scope: name scope. - - Returns: - tensor of shape [num_instances, num_keypoints, 2] with normalized - coordinates in [0, 1]. - """ - with tf.name_scope(scope, 'ToNormalizedCoordinates'): - height = tf.cast(height, tf.float32) - width = tf.cast(width, tf.float32) - - if check_range: - max_val = tf.reduce_max(keypoints) - max_assert = tf.Assert(tf.greater(max_val, 1.01), - ['max value is lower than 1.01: ', max_val]) - with tf.control_dependencies([max_assert]): - width = tf.identity(width) - - return scale(keypoints, 1.0 / height, 1.0 / width) - - -def to_absolute_coordinates(keypoints, height, width, - check_range=True, scope=None): - """Converts normalized keypoint coordinates to absolute pixel coordinates. - - This function raises an assertion failed error when the maximum keypoint - coordinate value is larger than 1.01 (in which case coordinates are already - absolute). - - Args: - keypoints: A tensor of shape [num_instances, num_keypoints, 2] - height: Maximum value for y coordinate of absolute keypoint coordinates. - width: Maximum value for x coordinate of absolute keypoint coordinates. - check_range: If True, checks if the coordinates are normalized or not. - scope: name scope. - - Returns: - tensor of shape [num_instances, num_keypoints, 2] with absolute coordinates - in terms of the image size. - - """ - with tf.name_scope(scope, 'ToAbsoluteCoordinates'): - height = tf.cast(height, tf.float32) - width = tf.cast(width, tf.float32) - - # Ensure range of input keypoints is correct. - if check_range: - max_val = tf.reduce_max(keypoints) - max_assert = tf.Assert(tf.greater_equal(1.01, max_val), - ['maximum keypoint coordinate value is larger ' - 'than 1.01: ', max_val]) - with tf.control_dependencies([max_assert]): - width = tf.identity(width) - - return scale(keypoints, height, width) - - -def flip_horizontal(keypoints, flip_point, flip_permutation, scope=None): - """Flips the keypoints horizontally around the flip_point. - - This operation flips the x coordinate for each keypoint around the flip_point - and also permutes the keypoints in a manner specified by flip_permutation. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - flip_point: (float) scalar tensor representing the x coordinate to flip the - keypoints around. - flip_permutation: rank 1 int32 tensor containing the keypoint flip - permutation. This specifies the mapping from original keypoint indices - to the flipped keypoint indices. This is used primarily for keypoints - that are not reflection invariant. E.g. Suppose there are 3 keypoints - representing ['head', 'right_eye', 'left_eye'], then a logical choice for - flip_permutation might be [0, 2, 1] since we want to swap the 'left_eye' - and 'right_eye' after a horizontal flip. - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'FlipHorizontal'): - keypoints = tf.transpose(keypoints, [1, 0, 2]) - keypoints = tf.gather(keypoints, flip_permutation) - v, u = tf.split(value=keypoints, num_or_size_splits=2, axis=2) - u = flip_point * 2.0 - u - new_keypoints = tf.concat([v, u], 2) - new_keypoints = tf.transpose(new_keypoints, [1, 0, 2]) - return new_keypoints - - -def flip_vertical(keypoints, flip_point, flip_permutation, scope=None): - """Flips the keypoints vertically around the flip_point. - - This operation flips the y coordinate for each keypoint around the flip_point - and also permutes the keypoints in a manner specified by flip_permutation. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - flip_point: (float) scalar tensor representing the y coordinate to flip the - keypoints around. - flip_permutation: rank 1 int32 tensor containing the keypoint flip - permutation. This specifies the mapping from original keypoint indices - to the flipped keypoint indices. This is used primarily for keypoints - that are not reflection invariant. E.g. Suppose there are 3 keypoints - representing ['head', 'right_eye', 'left_eye'], then a logical choice for - flip_permutation might be [0, 2, 1] since we want to swap the 'left_eye' - and 'right_eye' after a horizontal flip. - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'FlipVertical'): - keypoints = tf.transpose(keypoints, [1, 0, 2]) - keypoints = tf.gather(keypoints, flip_permutation) - v, u = tf.split(value=keypoints, num_or_size_splits=2, axis=2) - v = flip_point * 2.0 - v - new_keypoints = tf.concat([v, u], 2) - new_keypoints = tf.transpose(new_keypoints, [1, 0, 2]) - return new_keypoints - - -def rot90(keypoints, scope=None): - """Rotates the keypoints counter-clockwise by 90 degrees. - - Args: - keypoints: a tensor of shape [num_instances, num_keypoints, 2] - scope: name scope. - - Returns: - new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] - """ - with tf.name_scope(scope, 'Rot90'): - keypoints = tf.transpose(keypoints, [1, 0, 2]) - v, u = tf.split(value=keypoints[:, :, ::-1], num_or_size_splits=2, axis=2) - v = 1.0 - v - new_keypoints = tf.concat([v, u], 2) - new_keypoints = tf.transpose(new_keypoints, [1, 0, 2]) - return new_keypoints diff --git a/object_detection/core/keypoint_ops_test.py b/object_detection/core/keypoint_ops_test.py deleted file mode 100644 index 1c09c55a..00000000 --- a/object_detection/core/keypoint_ops_test.py +++ /dev/null @@ -1,200 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.keypoint_ops.""" -import numpy as np -import tensorflow as tf - -from object_detection.core import keypoint_ops - - -class KeypointOpsTest(tf.test.TestCase): - """Tests for common keypoint operations.""" - - def test_scale(self): - keypoints = tf.constant([ - [[0.0, 0.0], [100.0, 200.0]], - [[50.0, 120.0], [100.0, 140.0]] - ]) - y_scale = tf.constant(1.0 / 100) - x_scale = tf.constant(1.0 / 200) - - expected_keypoints = tf.constant([ - [[0., 0.], [1.0, 1.0]], - [[0.5, 0.6], [1.0, 0.7]] - ]) - output = keypoint_ops.scale(keypoints, y_scale, x_scale) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_clip_to_window(self): - keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.0], [1.0, 1.0]] - ]) - window = tf.constant([0.25, 0.25, 0.75, 0.75]) - - expected_keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.25], [0.75, 0.75]] - ]) - output = keypoint_ops.clip_to_window(keypoints, window) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_prune_outside_window(self): - keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.0], [1.0, 1.0]] - ]) - window = tf.constant([0.25, 0.25, 0.75, 0.75]) - - expected_keypoints = tf.constant([[[0.25, 0.5], [0.75, 0.75]], - [[np.nan, np.nan], [np.nan, np.nan]]]) - output = keypoint_ops.prune_outside_window(keypoints, window) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_change_coordinate_frame(self): - keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.0], [1.0, 1.0]] - ]) - window = tf.constant([0.25, 0.25, 0.75, 0.75]) - - expected_keypoints = tf.constant([ - [[0, 0.5], [1.0, 1.0]], - [[0.5, -0.5], [1.5, 1.5]] - ]) - output = keypoint_ops.change_coordinate_frame(keypoints, window) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_to_normalized_coordinates(self): - keypoints = tf.constant([ - [[10., 30.], [30., 45.]], - [[20., 0.], [40., 60.]] - ]) - output = keypoint_ops.to_normalized_coordinates( - keypoints, 40, 60) - expected_keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.0], [1.0, 1.0]] - ]) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_to_normalized_coordinates_already_normalized(self): - keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.0], [1.0, 1.0]] - ]) - output = keypoint_ops.to_normalized_coordinates( - keypoints, 40, 60) - - with self.test_session() as sess: - with self.assertRaisesOpError('assertion failed'): - sess.run(output) - - def test_to_absolute_coordinates(self): - keypoints = tf.constant([ - [[0.25, 0.5], [0.75, 0.75]], - [[0.5, 0.0], [1.0, 1.0]] - ]) - output = keypoint_ops.to_absolute_coordinates( - keypoints, 40, 60) - expected_keypoints = tf.constant([ - [[10., 30.], [30., 45.]], - [[20., 0.], [40., 60.]] - ]) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_to_absolute_coordinates_already_absolute(self): - keypoints = tf.constant([ - [[10., 30.], [30., 45.]], - [[20., 0.], [40., 60.]] - ]) - output = keypoint_ops.to_absolute_coordinates( - keypoints, 40, 60) - - with self.test_session() as sess: - with self.assertRaisesOpError('assertion failed'): - sess.run(output) - - def test_flip_horizontal(self): - keypoints = tf.constant([ - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], - [[0.4, 0.4], [0.5, 0.5], [0.6, 0.6]] - ]) - flip_permutation = [0, 2, 1] - - expected_keypoints = tf.constant([ - [[0.1, 0.9], [0.3, 0.7], [0.2, 0.8]], - [[0.4, 0.6], [0.6, 0.4], [0.5, 0.5]], - ]) - output = keypoint_ops.flip_horizontal(keypoints, 0.5, flip_permutation) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_flip_vertical(self): - keypoints = tf.constant([ - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], - [[0.4, 0.4], [0.5, 0.5], [0.6, 0.6]] - ]) - flip_permutation = [0, 2, 1] - - expected_keypoints = tf.constant([ - [[0.9, 0.1], [0.7, 0.3], [0.8, 0.2]], - [[0.6, 0.4], [0.4, 0.6], [0.5, 0.5]], - ]) - output = keypoint_ops.flip_vertical(keypoints, 0.5, flip_permutation) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - def test_rot90(self): - keypoints = tf.constant([ - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], - [[0.4, 0.6], [0.5, 0.6], [0.6, 0.7]] - ]) - expected_keypoints = tf.constant([ - [[0.9, 0.1], [0.8, 0.2], [0.7, 0.3]], - [[0.4, 0.4], [0.4, 0.5], [0.3, 0.6]], - ]) - output = keypoint_ops.rot90(keypoints) - - with self.test_session() as sess: - output_, expected_keypoints_ = sess.run([output, expected_keypoints]) - self.assertAllClose(output_, expected_keypoints_) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/losses.py b/object_detection/core/losses.py deleted file mode 100644 index b8478c15..00000000 --- a/object_detection/core/losses.py +++ /dev/null @@ -1,621 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Classification and regression loss functions for object detection. - -Localization losses: - * WeightedL2LocalizationLoss - * WeightedSmoothL1LocalizationLoss - * WeightedIOULocalizationLoss - -Classification losses: - * WeightedSigmoidClassificationLoss - * WeightedSoftmaxClassificationLoss - * BootstrappedSigmoidClassificationLoss -""" -from abc import ABCMeta -from abc import abstractmethod - -import tensorflow as tf - -from object_detection.core import box_list -from object_detection.core import box_list_ops -from object_detection.utils import ops - -slim = tf.contrib.slim - - -class Loss(object): - """Abstract base class for loss functions.""" - __metaclass__ = ABCMeta - - def __call__(self, - prediction_tensor, - target_tensor, - ignore_nan_targets=False, - scope=None, - **params): - """Call the loss function. - - Args: - prediction_tensor: a tensor representing predicted quantities. - target_tensor: a tensor representing regression or classification targets. - ignore_nan_targets: whether to ignore nan targets in the loss computation. - E.g. can be used if the target tensor is missing groundtruth data that - shouldn't be factored into the loss. - scope: Op scope name. Defaults to 'Loss' if None. - **params: Additional keyword arguments for specific implementations of - the Loss. - - Returns: - loss: a tensor representing the value of the loss function. - """ - with tf.name_scope(scope, 'Loss', - [prediction_tensor, target_tensor, params]) as scope: - if ignore_nan_targets: - target_tensor = tf.where(tf.is_nan(target_tensor), - prediction_tensor, - target_tensor) - return self._compute_loss(prediction_tensor, target_tensor, **params) - - @abstractmethod - def _compute_loss(self, prediction_tensor, target_tensor, **params): - """Method to be overridden by implementations. - - Args: - prediction_tensor: a tensor representing predicted quantities - target_tensor: a tensor representing regression or classification targets - **params: Additional keyword arguments for specific implementations of - the Loss. - - Returns: - loss: a tensor representing the value of the loss function - """ - pass - - -class WeightedL2LocalizationLoss(Loss): - """L2 localization loss function with anchorwise output support. - - Loss[b,a] = .5 * ||weights[b,a] * (prediction[b,a,:] - target[b,a,:])||^2 - """ - - def __init__(self, anchorwise_output=False): - """Constructor. - - Args: - anchorwise_output: Outputs loss per anchor. (default False) - - """ - self._anchorwise_output = anchorwise_output - - def _compute_loss(self, prediction_tensor, target_tensor, weights): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, - code_size] representing the (encoded) predicted locations of objects. - target_tensor: A float tensor of shape [batch_size, num_anchors, - code_size] representing the regression targets - weights: a float tensor of shape [batch_size, num_anchors] - - Returns: - loss: a (scalar) tensor representing the value of the loss function - or a float tensor of shape [batch_size, num_anchors] - """ - weighted_diff = (prediction_tensor - target_tensor) * tf.expand_dims( - weights, 2) - square_diff = 0.5 * tf.square(weighted_diff) - if self._anchorwise_output: - return tf.reduce_sum(square_diff, 2) - return tf.reduce_sum(square_diff) - - -class WeightedSmoothL1LocalizationLoss(Loss): - """Smooth L1 localization loss function. - - The smooth L1_loss is defined elementwise as .5 x^2 if |x|<1 and |x|-.5 - otherwise, where x is the difference between predictions and target. - - See also Equation (3) in the Fast R-CNN paper by Ross Girshick (ICCV 2015) - """ - - def __init__(self, anchorwise_output=False): - """Constructor. - - Args: - anchorwise_output: Outputs loss per anchor. (default False) - - """ - self._anchorwise_output = anchorwise_output - - def _compute_loss(self, prediction_tensor, target_tensor, weights): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, - code_size] representing the (encoded) predicted locations of objects. - target_tensor: A float tensor of shape [batch_size, num_anchors, - code_size] representing the regression targets - weights: a float tensor of shape [batch_size, num_anchors] - - Returns: - loss: a (scalar) tensor representing the value of the loss function - """ - diff = prediction_tensor - target_tensor - abs_diff = tf.abs(diff) - abs_diff_lt_1 = tf.less(abs_diff, 1) - anchorwise_smooth_l1norm = tf.reduce_sum( - tf.where(abs_diff_lt_1, 0.5 * tf.square(abs_diff), abs_diff - 0.5), - 2) * weights - if self._anchorwise_output: - return anchorwise_smooth_l1norm - return tf.reduce_sum(anchorwise_smooth_l1norm) - - -class WeightedIOULocalizationLoss(Loss): - """IOU localization loss function. - - Sums the IOU for corresponding pairs of predicted/groundtruth boxes - and for each pair assign a loss of 1 - IOU. We then compute a weighted - sum over all pairs which is returned as the total loss. - """ - - def _compute_loss(self, prediction_tensor, target_tensor, weights): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, 4] - representing the decoded predicted boxes - target_tensor: A float tensor of shape [batch_size, num_anchors, 4] - representing the decoded target boxes - weights: a float tensor of shape [batch_size, num_anchors] - - Returns: - loss: a (scalar) tensor representing the value of the loss function - """ - predicted_boxes = box_list.BoxList(tf.reshape(prediction_tensor, [-1, 4])) - target_boxes = box_list.BoxList(tf.reshape(target_tensor, [-1, 4])) - per_anchor_iou_loss = 1.0 - box_list_ops.matched_iou(predicted_boxes, - target_boxes) - return tf.reduce_sum(tf.reshape(weights, [-1]) * per_anchor_iou_loss) - - -class WeightedSigmoidClassificationLoss(Loss): - """Sigmoid cross entropy classification loss function.""" - - def __init__(self, anchorwise_output=False): - """Constructor. - - Args: - anchorwise_output: Outputs loss per anchor. (default False) - - """ - self._anchorwise_output = anchorwise_output - - def _compute_loss(self, - prediction_tensor, - target_tensor, - weights, - class_indices=None): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing the predicted logits for each class - target_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing one-hot encoded classification targets - weights: a float tensor of shape [batch_size, num_anchors] - class_indices: (Optional) A 1-D integer tensor of class indices. - If provided, computes loss only for the specified class indices. - - Returns: - loss: a (scalar) tensor representing the value of the loss function - or a float tensor of shape [batch_size, num_anchors] - """ - weights = tf.expand_dims(weights, 2) - if class_indices is not None: - weights *= tf.reshape( - ops.indices_to_dense_vector(class_indices, - tf.shape(prediction_tensor)[2]), - [1, 1, -1]) - per_entry_cross_ent = (tf.nn.sigmoid_cross_entropy_with_logits( - labels=target_tensor, logits=prediction_tensor)) - if self._anchorwise_output: - return tf.reduce_sum(per_entry_cross_ent * weights, 2) - return tf.reduce_sum(per_entry_cross_ent * weights) - - -class SigmoidFocalClassificationLoss(Loss): - """Sigmoid focal cross entropy loss. - - Focal loss down-weights well classified examples and focusses on the hard - examples. See https://arxiv.org/pdf/1708.02002.pdf for the loss definition. - """ - - def __init__(self, anchorwise_output=False, gamma=2.0, alpha=0.25): - """Constructor. - - Args: - anchorwise_output: Outputs loss per anchor. (default False) - gamma: exponent of the modulating factor (1 - p_t) ^ gamma. - alpha: optional alpha weighting factor to balance positives vs negatives. - """ - self._anchorwise_output = anchorwise_output - self._alpha = alpha - self._gamma = gamma - - def _compute_loss(self, - prediction_tensor, - target_tensor, - weights, - class_indices=None): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing the predicted logits for each class - target_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing one-hot encoded classification targets - weights: a float tensor of shape [batch_size, num_anchors] - class_indices: (Optional) A 1-D integer tensor of class indices. - If provided, computes loss only for the specified class indices. - - Returns: - loss: a (scalar) tensor representing the value of the loss function - or a float tensor of shape [batch_size, num_anchors] - """ - weights = tf.expand_dims(weights, 2) - if class_indices is not None: - weights *= tf.reshape( - ops.indices_to_dense_vector(class_indices, - tf.shape(prediction_tensor)[2]), - [1, 1, -1]) - per_entry_cross_ent = (tf.nn.sigmoid_cross_entropy_with_logits( - labels=target_tensor, logits=prediction_tensor)) - prediction_probabilities = tf.sigmoid(prediction_tensor) - p_t = ((target_tensor * prediction_probabilities) + - ((1 - target_tensor) * (1 - prediction_probabilities))) - modulating_factor = 1.0 - if self._gamma: - modulating_factor = tf.pow(1.0 - p_t, self._gamma) - alpha_weight_factor = 1.0 - if self._alpha is not None: - alpha_weight_factor = (target_tensor * self._alpha + - (1 - target_tensor) * (1 - self._alpha)) - focal_cross_entropy_loss = (modulating_factor * alpha_weight_factor * - per_entry_cross_ent) - if self._anchorwise_output: - return tf.reduce_sum(focal_cross_entropy_loss * weights, 2) - return tf.reduce_sum(focal_cross_entropy_loss * weights) - - -class WeightedSoftmaxClassificationLoss(Loss): - """Softmax loss function.""" - - def __init__(self, anchorwise_output=False, logit_scale=1.0): - """Constructor. - - Args: - anchorwise_output: Whether to output loss per anchor (default False) - logit_scale: When this value is high, the prediction is "diffused" and - when this value is low, the prediction is made peakier. - (default 1.0) - - """ - self._anchorwise_output = anchorwise_output - self._logit_scale = logit_scale - - def _compute_loss(self, prediction_tensor, target_tensor, weights): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing the predicted logits for each class - target_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing one-hot encoded classification targets - weights: a float tensor of shape [batch_size, num_anchors] - - Returns: - loss: a (scalar) tensor representing the value of the loss function - """ - num_classes = prediction_tensor.get_shape().as_list()[-1] - prediction_tensor = tf.divide( - prediction_tensor, self._logit_scale, name='scale_logit') - per_row_cross_ent = (tf.nn.softmax_cross_entropy_with_logits( - labels=tf.reshape(target_tensor, [-1, num_classes]), - logits=tf.reshape(prediction_tensor, [-1, num_classes]))) - if self._anchorwise_output: - return tf.reshape(per_row_cross_ent, tf.shape(weights)) * weights - return tf.reduce_sum(per_row_cross_ent * tf.reshape(weights, [-1])) - - -class BootstrappedSigmoidClassificationLoss(Loss): - """Bootstrapped sigmoid cross entropy classification loss function. - - This loss uses a convex combination of training labels and the current model's - predictions as training targets in the classification loss. The idea is that - as the model improves over time, its predictions can be trusted more and we - can use these predictions to mitigate the damage of noisy/incorrect labels, - because incorrect labels are likely to be eventually highly inconsistent with - other stimuli predicted to have the same label by the model. - - In "soft" bootstrapping, we use all predicted class probabilities, whereas in - "hard" bootstrapping, we use the single class favored by the model. - - See also Training Deep Neural Networks On Noisy Labels with Bootstrapping by - Reed et al. (ICLR 2015). - """ - - def __init__(self, alpha, bootstrap_type='soft', anchorwise_output=False): - """Constructor. - - Args: - alpha: a float32 scalar tensor between 0 and 1 representing interpolation - weight - bootstrap_type: set to either 'hard' or 'soft' (default) - anchorwise_output: Outputs loss per anchor. (default False) - - Raises: - ValueError: if bootstrap_type is not either 'hard' or 'soft' - """ - if bootstrap_type != 'hard' and bootstrap_type != 'soft': - raise ValueError('Unrecognized bootstrap_type: must be one of ' - '\'hard\' or \'soft.\'') - self._alpha = alpha - self._bootstrap_type = bootstrap_type - self._anchorwise_output = anchorwise_output - - def _compute_loss(self, prediction_tensor, target_tensor, weights): - """Compute loss function. - - Args: - prediction_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing the predicted logits for each class - target_tensor: A float tensor of shape [batch_size, num_anchors, - num_classes] representing one-hot encoded classification targets - weights: a float tensor of shape [batch_size, num_anchors] - - Returns: - loss: a (scalar) tensor representing the value of the loss function - or a float tensor of shape [batch_size, num_anchors] - """ - if self._bootstrap_type == 'soft': - bootstrap_target_tensor = self._alpha * target_tensor + ( - 1.0 - self._alpha) * tf.sigmoid(prediction_tensor) - else: - bootstrap_target_tensor = self._alpha * target_tensor + ( - 1.0 - self._alpha) * tf.cast( - tf.sigmoid(prediction_tensor) > 0.5, tf.float32) - per_entry_cross_ent = (tf.nn.sigmoid_cross_entropy_with_logits( - labels=bootstrap_target_tensor, logits=prediction_tensor)) - if self._anchorwise_output: - return tf.reduce_sum(per_entry_cross_ent * tf.expand_dims(weights, 2), 2) - return tf.reduce_sum(per_entry_cross_ent * tf.expand_dims(weights, 2)) - - -class HardExampleMiner(object): - """Hard example mining for regions in a list of images. - - Implements hard example mining to select a subset of regions to be - back-propagated. For each image, selects the regions with highest losses, - subject to the condition that a newly selected region cannot have - an IOU > iou_threshold with any of the previously selected regions. - This can be achieved by re-using a greedy non-maximum suppression algorithm. - A constraint on the number of negatives mined per positive region can also be - enforced. - - Reference papers: "Training Region-based Object Detectors with Online - Hard Example Mining" (CVPR 2016) by Srivastava et al., and - "SSD: Single Shot MultiBox Detector" (ECCV 2016) by Liu et al. - """ - - def __init__(self, - num_hard_examples=64, - iou_threshold=0.7, - loss_type='both', - cls_loss_weight=0.05, - loc_loss_weight=0.06, - max_negatives_per_positive=None, - min_negatives_per_image=0): - """Constructor. - - The hard example mining implemented by this class can replicate the behavior - in the two aforementioned papers (Srivastava et al., and Liu et al). - To replicate the A2 paper (Srivastava et al), num_hard_examples is set - to a fixed parameter (64 by default) and iou_threshold is set to .7 for - running non-max-suppression the predicted boxes prior to hard mining. - In order to replicate the SSD paper (Liu et al), num_hard_examples should - be set to None, max_negatives_per_positive should be 3 and iou_threshold - should be 1.0 (in order to effectively turn off NMS). - - Args: - num_hard_examples: maximum number of hard examples to be - selected per image (prior to enforcing max negative to positive ratio - constraint). If set to None, all examples obtained after NMS are - considered. - iou_threshold: minimum intersection over union for an example - to be discarded during NMS. - loss_type: use only classification losses ('cls', default), - localization losses ('loc') or both losses ('both'). - In the last case, cls_loss_weight and loc_loss_weight are used to - compute weighted sum of the two losses. - cls_loss_weight: weight for classification loss. - loc_loss_weight: weight for location loss. - max_negatives_per_positive: maximum number of negatives to retain for - each positive anchor. By default, num_negatives_per_positive is None, - which means that we do not enforce a prespecified negative:positive - ratio. Note also that num_negatives_per_positives can be a float - (and will be converted to be a float even if it is passed in otherwise). - min_negatives_per_image: minimum number of negative anchors to sample for - a given image. Setting this to a positive number allows sampling - negatives in an image without any positive anchors and thus not biased - towards at least one detection per image. - """ - self._num_hard_examples = num_hard_examples - self._iou_threshold = iou_threshold - self._loss_type = loss_type - self._cls_loss_weight = cls_loss_weight - self._loc_loss_weight = loc_loss_weight - self._max_negatives_per_positive = max_negatives_per_positive - self._min_negatives_per_image = min_negatives_per_image - if self._max_negatives_per_positive is not None: - self._max_negatives_per_positive = float(self._max_negatives_per_positive) - self._num_positives_list = None - self._num_negatives_list = None - - def __call__(self, - location_losses, - cls_losses, - decoded_boxlist_list, - match_list=None): - """Computes localization and classification losses after hard mining. - - Args: - location_losses: a float tensor of shape [num_images, num_anchors] - representing anchorwise localization losses. - cls_losses: a float tensor of shape [num_images, num_anchors] - representing anchorwise classification losses. - decoded_boxlist_list: a list of decoded BoxList representing location - predictions for each image. - match_list: an optional list of matcher.Match objects encoding the match - between anchors and groundtruth boxes for each image of the batch, - with rows of the Match objects corresponding to groundtruth boxes - and columns corresponding to anchors. Match objects in match_list are - used to reference which anchors are positive, negative or ignored. If - self._max_negatives_per_positive exists, these are then used to enforce - a prespecified negative to positive ratio. - - Returns: - mined_location_loss: a float scalar with sum of localization losses from - selected hard examples. - mined_cls_loss: a float scalar with sum of classification losses from - selected hard examples. - Raises: - ValueError: if location_losses, cls_losses and decoded_boxlist_list do - not have compatible shapes (i.e., they must correspond to the same - number of images). - ValueError: if match_list is specified but its length does not match - len(decoded_boxlist_list). - """ - mined_location_losses = [] - mined_cls_losses = [] - location_losses = tf.unstack(location_losses) - cls_losses = tf.unstack(cls_losses) - num_images = len(decoded_boxlist_list) - if not match_list: - match_list = num_images * [None] - if not len(location_losses) == len(decoded_boxlist_list) == len(cls_losses): - raise ValueError('location_losses, cls_losses and decoded_boxlist_list ' - 'do not have compatible shapes.') - if not isinstance(match_list, list): - raise ValueError('match_list must be a list.') - if len(match_list) != len(decoded_boxlist_list): - raise ValueError('match_list must either be None or have ' - 'length=len(decoded_boxlist_list).') - num_positives_list = [] - num_negatives_list = [] - for ind, detection_boxlist in enumerate(decoded_boxlist_list): - box_locations = detection_boxlist.get() - match = match_list[ind] - image_losses = cls_losses[ind] - if self._loss_type == 'loc': - image_losses = location_losses[ind] - elif self._loss_type == 'both': - image_losses *= self._cls_loss_weight - image_losses += location_losses[ind] * self._loc_loss_weight - if self._num_hard_examples is not None: - num_hard_examples = self._num_hard_examples - else: - num_hard_examples = detection_boxlist.num_boxes() - selected_indices = tf.image.non_max_suppression( - box_locations, image_losses, num_hard_examples, self._iou_threshold) - if self._max_negatives_per_positive is not None and match: - (selected_indices, num_positives, - num_negatives) = self._subsample_selection_to_desired_neg_pos_ratio( - selected_indices, match, self._max_negatives_per_positive, - self._min_negatives_per_image) - num_positives_list.append(num_positives) - num_negatives_list.append(num_negatives) - mined_location_losses.append( - tf.reduce_sum(tf.gather(location_losses[ind], selected_indices))) - mined_cls_losses.append( - tf.reduce_sum(tf.gather(cls_losses[ind], selected_indices))) - location_loss = tf.reduce_sum(tf.stack(mined_location_losses)) - cls_loss = tf.reduce_sum(tf.stack(mined_cls_losses)) - if match and self._max_negatives_per_positive: - self._num_positives_list = num_positives_list - self._num_negatives_list = num_negatives_list - return (location_loss, cls_loss) - - def summarize(self): - """Summarize the number of positives and negatives after mining.""" - if self._num_positives_list and self._num_negatives_list: - avg_num_positives = tf.reduce_mean(tf.to_float(self._num_positives_list)) - avg_num_negatives = tf.reduce_mean(tf.to_float(self._num_negatives_list)) - tf.summary.scalar('HardExampleMiner/NumPositives', avg_num_positives) - tf.summary.scalar('HardExampleMiner/NumNegatives', avg_num_negatives) - - def _subsample_selection_to_desired_neg_pos_ratio(self, - indices, - match, - max_negatives_per_positive, - min_negatives_per_image=0): - """Subsample a collection of selected indices to a desired neg:pos ratio. - - This function takes a subset of M indices (indexing into a large anchor - collection of N anchors where M=0, - meaning that column i is matched with row match_results[i]. - (2) match_results[i]=-1, meaning that column i is not matched. - (3) match_results[i]=-2, meaning that column i is ignored. - - Raises: - ValueError: if match_results does not have rank 1 or is not an - integer int32 scalar tensor - """ - if match_results.shape.ndims != 1: - raise ValueError('match_results should have rank 1') - if match_results.dtype != tf.int32: - raise ValueError('match_results should be an int32 or int64 scalar ' - 'tensor') - self._match_results = match_results - - @property - def match_results(self): - """The accessor for match results. - - Returns: - the tensor which encodes the match results. - """ - return self._match_results - - def matched_column_indices(self): - """Returns column indices that match to some row. - - The indices returned by this op are always sorted in increasing order. - - Returns: - column_indices: int32 tensor of shape [K] with column indices. - """ - return self._reshape_and_cast(tf.where(tf.greater(self._match_results, -1))) - - def matched_column_indicator(self): - """Returns column indices that are matched. - - Returns: - column_indices: int32 tensor of shape [K] with column indices. - """ - return tf.greater_equal(self._match_results, 0) - - def num_matched_columns(self): - """Returns number (int32 scalar tensor) of matched columns.""" - return tf.size(self.matched_column_indices()) - - def unmatched_column_indices(self): - """Returns column indices that do not match any row. - - The indices returned by this op are always sorted in increasing order. - - Returns: - column_indices: int32 tensor of shape [K] with column indices. - """ - return self._reshape_and_cast(tf.where(tf.equal(self._match_results, -1))) - - def unmatched_column_indicator(self): - """Returns column indices that are unmatched. - - Returns: - column_indices: int32 tensor of shape [K] with column indices. - """ - return tf.equal(self._match_results, -1) - - def num_unmatched_columns(self): - """Returns number (int32 scalar tensor) of unmatched columns.""" - return tf.size(self.unmatched_column_indices()) - - def ignored_column_indices(self): - """Returns column indices that are ignored (neither Matched nor Unmatched). - - The indices returned by this op are always sorted in increasing order. - - Returns: - column_indices: int32 tensor of shape [K] with column indices. - """ - return self._reshape_and_cast(tf.where(self.ignored_column_indicator())) - - def ignored_column_indicator(self): - """Returns boolean column indicator where True means the colum is ignored. - - Returns: - column_indicator: boolean vector which is True for all ignored column - indices. - """ - return tf.equal(self._match_results, -2) - - def num_ignored_columns(self): - """Returns number (int32 scalar tensor) of matched columns.""" - return tf.size(self.ignored_column_indices()) - - def unmatched_or_ignored_column_indices(self): - """Returns column indices that are unmatched or ignored. - - The indices returned by this op are always sorted in increasing order. - - Returns: - column_indices: int32 tensor of shape [K] with column indices. - """ - return self._reshape_and_cast(tf.where(tf.greater(0, self._match_results))) - - def matched_row_indices(self): - """Returns row indices that match some column. - - The indices returned by this op are ordered so as to be in correspondence - with the output of matched_column_indicator(). For example if - self.matched_column_indicator() is [0,2], and self.matched_row_indices() is - [7, 3], then we know that column 0 was matched to row 7 and column 2 was - matched to row 3. - - Returns: - row_indices: int32 tensor of shape [K] with row indices. - """ - return self._reshape_and_cast( - tf.gather(self._match_results, self.matched_column_indices())) - - def _reshape_and_cast(self, t): - return tf.cast(tf.reshape(t, [-1]), tf.int32) - - -class Matcher(object): - """Abstract base class for matcher. - """ - __metaclass__ = ABCMeta - - def match(self, similarity_matrix, scope=None, **params): - """Computes matches among row and column indices and returns the result. - - Computes matches among the row and column indices based on the similarity - matrix and optional arguments. - - Args: - similarity_matrix: Float tensor of shape [N, M] with pairwise similarity - where higher value means more similar. - scope: Op scope name. Defaults to 'Match' if None. - **params: Additional keyword arguments for specific implementations of - the Matcher. - - Returns: - A Match object with the results of matching. - """ - with tf.name_scope(scope, 'Match', [similarity_matrix, params]) as scope: - return Match(self._match(similarity_matrix, **params)) - - @abstractmethod - def _match(self, similarity_matrix, **params): - """Method to be overriden by implementations. - - Args: - similarity_matrix: Float tensor of shape [N, M] with pairwise similarity - where higher value means more similar. - **params: Additional keyword arguments for specific implementations of - the Matcher. - - Returns: - match_results: Integer tensor of shape [M]: match_results[i]>=0 means - that column i is matched to row match_results[i], match_results[i]=-1 - means that the column is not matched. match_results[i]=-2 means that - the column is ignored (usually this happens when there is a very weak - match which one neither wants as positive nor negative example). - """ - pass diff --git a/object_detection/core/matcher_test.py b/object_detection/core/matcher_test.py deleted file mode 100644 index 7054015f..00000000 --- a/object_detection/core/matcher_test.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.matcher.""" -import numpy as np -import tensorflow as tf - -from object_detection.core import matcher - - -class AnchorMatcherTest(tf.test.TestCase): - - def test_get_correct_matched_columnIndices(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indices = [0, 1, 3, 5] - matched_column_indices = match.matched_column_indices() - self.assertEquals(matched_column_indices.dtype, tf.int32) - with self.test_session() as sess: - matched_column_indices = sess.run(matched_column_indices) - self.assertAllEqual(matched_column_indices, expected_column_indices) - - def test_get_correct_counts(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - exp_num_matched_columns = 4 - exp_num_unmatched_columns = 2 - exp_num_ignored_columns = 1 - num_matched_columns = match.num_matched_columns() - num_unmatched_columns = match.num_unmatched_columns() - num_ignored_columns = match.num_ignored_columns() - self.assertEquals(num_matched_columns.dtype, tf.int32) - self.assertEquals(num_unmatched_columns.dtype, tf.int32) - self.assertEquals(num_ignored_columns.dtype, tf.int32) - with self.test_session() as sess: - (num_matched_columns_out, num_unmatched_columns_out, - num_ignored_columns_out) = sess.run( - [num_matched_columns, num_unmatched_columns, num_ignored_columns]) - self.assertAllEqual(num_matched_columns_out, exp_num_matched_columns) - self.assertAllEqual(num_unmatched_columns_out, exp_num_unmatched_columns) - self.assertAllEqual(num_ignored_columns_out, exp_num_ignored_columns) - - def testGetCorrectUnmatchedColumnIndices(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indices = [2, 4] - unmatched_column_indices = match.unmatched_column_indices() - self.assertEquals(unmatched_column_indices.dtype, tf.int32) - with self.test_session() as sess: - unmatched_column_indices = sess.run(unmatched_column_indices) - self.assertAllEqual(unmatched_column_indices, expected_column_indices) - - def testGetCorrectMatchedRowIndices(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_row_indices = [3, 1, 0, 5] - matched_row_indices = match.matched_row_indices() - self.assertEquals(matched_row_indices.dtype, tf.int32) - with self.test_session() as sess: - matched_row_inds = sess.run(matched_row_indices) - self.assertAllEqual(matched_row_inds, expected_row_indices) - - def test_get_correct_ignored_column_indices(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indices = [6] - ignored_column_indices = match.ignored_column_indices() - self.assertEquals(ignored_column_indices.dtype, tf.int32) - with self.test_session() as sess: - ignored_column_indices = sess.run(ignored_column_indices) - self.assertAllEqual(ignored_column_indices, expected_column_indices) - - def test_get_correct_matched_column_indicator(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indicator = [True, True, False, True, False, True, False] - matched_column_indicator = match.matched_column_indicator() - self.assertEquals(matched_column_indicator.dtype, tf.bool) - with self.test_session() as sess: - matched_column_indicator = sess.run(matched_column_indicator) - self.assertAllEqual(matched_column_indicator, expected_column_indicator) - - def test_get_correct_unmatched_column_indicator(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indicator = [False, False, True, False, True, False, False] - unmatched_column_indicator = match.unmatched_column_indicator() - self.assertEquals(unmatched_column_indicator.dtype, tf.bool) - with self.test_session() as sess: - unmatched_column_indicator = sess.run(unmatched_column_indicator) - self.assertAllEqual(unmatched_column_indicator, expected_column_indicator) - - def test_get_correct_ignored_column_indicator(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indicator = [False, False, False, False, False, False, True] - ignored_column_indicator = match.ignored_column_indicator() - self.assertEquals(ignored_column_indicator.dtype, tf.bool) - with self.test_session() as sess: - ignored_column_indicator = sess.run(ignored_column_indicator) - self.assertAllEqual(ignored_column_indicator, expected_column_indicator) - - def test_get_correct_unmatched_ignored_column_indices(self): - match_results = tf.constant([3, 1, -1, 0, -1, 5, -2]) - match = matcher.Match(match_results) - expected_column_indices = [2, 4, 6] - unmatched_ignored_column_indices = (match. - unmatched_or_ignored_column_indices()) - self.assertEquals(unmatched_ignored_column_indices.dtype, tf.int32) - with self.test_session() as sess: - unmatched_ignored_column_indices = sess.run( - unmatched_ignored_column_indices) - self.assertAllEqual(unmatched_ignored_column_indices, - expected_column_indices) - - def test_all_columns_accounted_for(self): - # Note: deliberately setting to small number so not always - # all possibilities appear (matched, unmatched, ignored) - num_matches = 10 - match_results = tf.random_uniform( - [num_matches], minval=-2, maxval=5, dtype=tf.int32) - match = matcher.Match(match_results) - matched_column_indices = match.matched_column_indices() - unmatched_column_indices = match.unmatched_column_indices() - ignored_column_indices = match.ignored_column_indices() - with self.test_session() as sess: - matched, unmatched, ignored = sess.run([ - matched_column_indices, unmatched_column_indices, - ignored_column_indices - ]) - all_indices = np.hstack((matched, unmatched, ignored)) - all_indices_sorted = np.sort(all_indices) - self.assertAllEqual(all_indices_sorted, - np.arange(num_matches, dtype=np.int32)) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/minibatch_sampler.py b/object_detection/core/minibatch_sampler.py deleted file mode 100644 index dc622221..00000000 --- a/object_detection/core/minibatch_sampler.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Base minibatch sampler module. - -The job of the minibatch_sampler is to subsample a minibatch based on some -criterion. - -The main function call is: - subsample(indicator, batch_size, **params). -Indicator is a 1d boolean tensor where True denotes which examples can be -sampled. It returns a boolean indicator where True denotes an example has been -sampled.. - -Subclasses should implement the Subsample function and can make use of the -@staticmethod SubsampleIndicator. -""" - -from abc import ABCMeta -from abc import abstractmethod - -import tensorflow as tf - -from object_detection.utils import ops - - -class MinibatchSampler(object): - """Abstract base class for subsampling minibatches.""" - __metaclass__ = ABCMeta - - def __init__(self): - """Constructs a minibatch sampler.""" - pass - - @abstractmethod - def subsample(self, indicator, batch_size, **params): - """Returns subsample of entries in indicator. - - Args: - indicator: boolean tensor of shape [N] whose True entries can be sampled. - batch_size: desired batch size. - **params: additional keyword arguments for specific implementations of - the MinibatchSampler. - - Returns: - sample_indicator: boolean tensor of shape [N] whose True entries have been - sampled. If sum(indicator) >= batch_size, sum(is_sampled) = batch_size - """ - pass - - @staticmethod - def subsample_indicator(indicator, num_samples): - """Subsample indicator vector. - - Given a boolean indicator vector with M elements set to `True`, the function - assigns all but `num_samples` of these previously `True` elements to - `False`. If `num_samples` is greater than M, the original indicator vector - is returned. - - Args: - indicator: a 1-dimensional boolean tensor indicating which elements - are allowed to be sampled and which are not. - num_samples: int32 scalar tensor - - Returns: - a boolean tensor with the same shape as input (indicator) tensor - """ - indices = tf.where(indicator) - indices = tf.random_shuffle(indices) - indices = tf.reshape(indices, [-1]) - - num_samples = tf.minimum(tf.size(indices), num_samples) - selected_indices = tf.slice(indices, [0], tf.reshape(num_samples, [1])) - - selected_indicator = ops.indices_to_dense_vector(selected_indices, - tf.shape(indicator)[0]) - - return tf.equal(selected_indicator, 1) diff --git a/object_detection/core/minibatch_sampler_test.py b/object_detection/core/minibatch_sampler_test.py deleted file mode 100644 index 7420ae5d..00000000 --- a/object_detection/core/minibatch_sampler_test.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for google3.research.vale.object_detection.minibatch_sampler.""" - -import numpy as np -import tensorflow as tf - -from object_detection.core import minibatch_sampler - - -class MinibatchSamplerTest(tf.test.TestCase): - - def test_subsample_indicator_when_more_true_elements_than_num_samples(self): - np_indicator = [True, False, True, False, True, True, False] - indicator = tf.constant(np_indicator) - samples = minibatch_sampler.MinibatchSampler.subsample_indicator( - indicator, 3) - with self.test_session() as sess: - samples_out = sess.run(samples) - self.assertTrue(np.sum(samples_out), 3) - self.assertAllEqual(samples_out, - np.logical_and(samples_out, np_indicator)) - - def test_subsample_when_more_true_elements_than_num_samples_no_shape(self): - np_indicator = [True, False, True, False, True, True, False] - indicator = tf.placeholder(tf.bool) - feed_dict = {indicator: np_indicator} - - samples = minibatch_sampler.MinibatchSampler.subsample_indicator( - indicator, 3) - with self.test_session() as sess: - samples_out = sess.run(samples, feed_dict=feed_dict) - self.assertTrue(np.sum(samples_out), 3) - self.assertAllEqual(samples_out, - np.logical_and(samples_out, np_indicator)) - - def test_subsample_indicator_when_less_true_elements_than_num_samples(self): - np_indicator = [True, False, True, False, True, True, False] - indicator = tf.constant(np_indicator) - samples = minibatch_sampler.MinibatchSampler.subsample_indicator( - indicator, 5) - with self.test_session() as sess: - samples_out = sess.run(samples) - self.assertTrue(np.sum(samples_out), 4) - self.assertAllEqual(samples_out, - np.logical_and(samples_out, np_indicator)) - - def test_subsample_indicator_when_num_samples_is_zero(self): - np_indicator = [True, False, True, False, True, True, False] - indicator = tf.constant(np_indicator) - samples_none = minibatch_sampler.MinibatchSampler.subsample_indicator( - indicator, 0) - with self.test_session() as sess: - samples_none_out = sess.run(samples_none) - self.assertAllEqual( - np.zeros_like(samples_none_out, dtype=bool), - samples_none_out) - - def test_subsample_indicator_when_indicator_all_false(self): - indicator_empty = tf.zeros([0], dtype=tf.bool) - samples_empty = minibatch_sampler.MinibatchSampler.subsample_indicator( - indicator_empty, 4) - with self.test_session() as sess: - samples_empty_out = sess.run(samples_empty) - self.assertEqual(0, samples_empty_out.size) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/model.py b/object_detection/core/model.py deleted file mode 100644 index 08843944..00000000 --- a/object_detection/core/model.py +++ /dev/null @@ -1,265 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Abstract detection model. - -This file defines a generic base class for detection models. Programs that are -designed to work with arbitrary detection models should only depend on this -class. We intend for the functions in this class to follow tensor-in/tensor-out -design, thus all functions have tensors or lists/dictionaries holding tensors as -inputs and outputs. - -Abstractly, detection models predict output tensors given input images -which can be passed to a loss function at training time or passed to a -postprocessing function at eval time. The computation graphs at a high level -consequently look as follows: - -Training time: -inputs (images tensor) -> preprocess -> predict -> loss -> outputs (loss tensor) - -Evaluation time: -inputs (images tensor) -> preprocess -> predict -> postprocess - -> outputs (boxes tensor, scores tensor, classes tensor, num_detections tensor) - -DetectionModels must thus implement four functions (1) preprocess, (2) predict, -(3) postprocess and (4) loss. DetectionModels should make no assumptions about -the input size or aspect ratio --- they are responsible for doing any -resize/reshaping necessary (see docstring for the preprocess function). -Output classes are always integers in the range [0, num_classes). Any mapping -of these integers to semantic labels is to be handled outside of this class. - -By default, DetectionModels produce bounding box detections; However, we support -a handful of auxiliary annotations associated with each bounding box, namely, -instance masks and keypoints. -""" -from abc import ABCMeta -from abc import abstractmethod - -from object_detection.core import standard_fields as fields - - -class DetectionModel(object): - """Abstract base class for detection models.""" - __metaclass__ = ABCMeta - - def __init__(self, num_classes): - """Constructor. - - Args: - num_classes: number of classes. Note that num_classes *does not* include - background categories that might be implicitly be predicted in various - implementations. - """ - self._num_classes = num_classes - self._groundtruth_lists = {} - - @property - def num_classes(self): - return self._num_classes - - def groundtruth_lists(self, field): - """Access list of groundtruth tensors. - - Args: - field: a string key, options are - fields.BoxListFields.{boxes,classes,masks,keypoints} - - Returns: - a list of tensors holding groundtruth information (see also - provide_groundtruth function below), with one entry for each image in the - batch. - Raises: - RuntimeError: if the field has not been provided via provide_groundtruth. - """ - if field not in self._groundtruth_lists: - raise RuntimeError('Groundtruth tensor %s has not been provided', field) - return self._groundtruth_lists[field] - - def groundtruth_has_field(self, field): - """Determines whether the groundtruth includes the given field. - - Args: - field: a string key, options are - fields.BoxListFields.{boxes,classes,masks,keypoints} - - Returns: - True if the groundtruth includes the given field, False otherwise. - """ - return field in self._groundtruth_lists - - @abstractmethod - def preprocess(self, inputs): - """Input preprocessing. - - To be overridden by implementations. - - This function is responsible for any scaling/shifting of input values that - is necessary prior to running the detector on an input image. - It is also responsible for any resizing that might be necessary as images - are assumed to arrive in arbitrary sizes. While this function could - conceivably be part of the predict method (below), it is often convenient - to keep these separate --- for example, we may want to preprocess on one - device, place onto a queue, and let another device (e.g., the GPU) handle - prediction. - - A few important notes about the preprocess function: - + We assume that this operation does not have any trainable variables nor - does it affect the groundtruth annotations in any way (thus data - augmentation operations such as random cropping should be performed - externally). - + There is no assumption that the batchsize in this function is the same as - the batch size in the predict function. In fact, we recommend calling the - preprocess function prior to calling any batching operations (which should - happen outside of the model) and thus assuming that batch sizes are equal - to 1 in the preprocess function. - + There is also no explicit assumption that the output resolutions - must be fixed across inputs --- this is to support "fully convolutional" - settings in which input images can have different shapes/resolutions. - - Args: - inputs: a [batch, height_in, width_in, channels] float32 tensor - representing a batch of images with values between 0 and 255.0. - - Returns: - preprocessed_inputs: a [batch, height_out, width_out, channels] float32 - tensor representing a batch of images. - """ - pass - - @abstractmethod - def predict(self, preprocessed_inputs): - """Predict prediction tensors from inputs tensor. - - Outputs of this function can be passed to loss or postprocess functions. - - Args: - preprocessed_inputs: a [batch, height, width, channels] float32 tensor - representing a batch of images. - - Returns: - prediction_dict: a dictionary holding prediction tensors to be - passed to the Loss or Postprocess functions. - """ - pass - - @abstractmethod - def postprocess(self, prediction_dict, **params): - """Convert predicted output tensors to final detections. - - Outputs adhere to the following conventions: - * Classes are integers in [0, num_classes); background classes are removed - and the first non-background class is mapped to 0. If the model produces - class-agnostic detections, then no output is produced for classes. - * Boxes are to be interpreted as being in [y_min, x_min, y_max, x_max] - format and normalized relative to the image window. - * `num_detections` is provided for settings where detections are padded to a - fixed number of boxes. - * We do not specifically assume any kind of probabilistic interpretation - of the scores --- the only important thing is their relative ordering. - Thus implementations of the postprocess function are free to output - logits, probabilities, calibrated probabilities, or anything else. - - Args: - prediction_dict: a dictionary holding prediction tensors. - **params: Additional keyword arguments for specific implementations of - DetectionModel. - - Returns: - detections: a dictionary containing the following fields - detection_boxes: [batch, max_detections, 4] - detection_scores: [batch, max_detections] - detection_classes: [batch, max_detections] - (If a model is producing class-agnostic detections, this field may be - missing) - instance_masks: [batch, max_detections, image_height, image_width] - (optional) - keypoints: [batch, max_detections, num_keypoints, 2] (optional) - num_detections: [batch] - """ - pass - - @abstractmethod - def loss(self, prediction_dict): - """Compute scalar loss tensors with respect to provided groundtruth. - - Calling this function requires that groundtruth tensors have been - provided via the provide_groundtruth function. - - Args: - prediction_dict: a dictionary holding predicted tensors - - Returns: - a dictionary mapping strings (loss names) to scalar tensors representing - loss values. - """ - pass - - def provide_groundtruth(self, - groundtruth_boxes_list, - groundtruth_classes_list, - groundtruth_masks_list=None, - groundtruth_keypoints_list=None): - """Provide groundtruth tensors. - - Args: - groundtruth_boxes_list: a list of 2-D tf.float32 tensors of shape - [num_boxes, 4] containing coordinates of the groundtruth boxes. - Groundtruth boxes are provided in [y_min, x_min, y_max, x_max] - format and assumed to be normalized and clipped - relative to the image window with y_min <= y_max and x_min <= x_max. - groundtruth_classes_list: a list of 2-D tf.float32 one-hot (or k-hot) - tensors of shape [num_boxes, num_classes] containing the class targets - with the 0th index assumed to map to the first non-background class. - groundtruth_masks_list: a list of 3-D tf.float32 tensors of - shape [num_boxes, height_in, width_in] containing instance - masks with values in {0, 1}. If None, no masks are provided. - Mask resolution `height_in`x`width_in` must agree with the resolution - of the input image tensor provided to the `preprocess` function. - groundtruth_keypoints_list: a list of 3-D tf.float32 tensors of - shape [num_boxes, num_keypoints, 2] containing keypoints. - Keypoints are assumed to be provided in normalized coordinates and - missing keypoints should be encoded as NaN. - """ - self._groundtruth_lists[fields.BoxListFields.boxes] = groundtruth_boxes_list - self._groundtruth_lists[ - fields.BoxListFields.classes] = groundtruth_classes_list - if groundtruth_masks_list: - self._groundtruth_lists[ - fields.BoxListFields.masks] = groundtruth_masks_list - if groundtruth_keypoints_list: - self._groundtruth_lists[ - fields.BoxListFields.keypoints] = groundtruth_keypoints_list - - @abstractmethod - def restore_map(self, from_detection_checkpoint=True): - """Returns a map of variables to load from a foreign checkpoint. - - Returns a map of variable names to load from a checkpoint to variables in - the model graph. This enables the model to initialize based on weights from - another task. For example, the feature extractor variables from a - classification model can be used to bootstrap training of an object - detector. When loading from an object detection model, the checkpoint model - should have the same parameters as this detection model with exception of - the num_classes parameter. - - Args: - from_detection_checkpoint: whether to restore from a full detection - checkpoint (with compatible variable names) or to restore from a - classification checkpoint for initialization prior to training. - - Returns: - A dict mapping variable names (to load from a checkpoint) to variables in - the model graph. - """ - pass diff --git a/object_detection/core/post_processing.py b/object_detection/core/post_processing.py deleted file mode 100644 index d34f0683..00000000 --- a/object_detection/core/post_processing.py +++ /dev/null @@ -1,395 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Post-processing operations on detected boxes.""" - -import tensorflow as tf - -from object_detection.core import box_list -from object_detection.core import box_list_ops -from object_detection.core import standard_fields as fields - - -def multiclass_non_max_suppression(boxes, - scores, - score_thresh, - iou_thresh, - max_size_per_class, - max_total_size=0, - clip_window=None, - change_coordinate_frame=False, - masks=None, - additional_fields=None, - scope=None): - """Multi-class version of non maximum suppression. - - This op greedily selects a subset of detection bounding boxes, pruning - away boxes that have high IOU (intersection over union) overlap (> thresh) - with already selected boxes. It operates independently for each class for - which scores are provided (via the scores field of the input box_list), - pruning boxes with score less than a provided threshold prior to - applying NMS. - - Please note that this operation is performed on *all* classes, therefore any - background classes should be removed prior to calling this function. - - Args: - boxes: A [k, q, 4] float32 tensor containing k detections. `q` can be either - number of classes or 1 depending on whether a separate box is predicted - per class. - scores: A [k, num_classes] float32 tensor containing the scores for each of - the k detections. - score_thresh: scalar threshold for score (low scoring boxes are removed). - iou_thresh: scalar threshold for IOU (new boxes that have high IOU overlap - with previously selected boxes are removed). - max_size_per_class: maximum number of retained boxes per class. - max_total_size: maximum number of boxes retained over all classes. By - default returns all boxes retained after capping boxes per class. - clip_window: A float32 tensor of the form [y_min, x_min, y_max, x_max] - representing the window to clip and normalize boxes to before performing - non-max suppression. - change_coordinate_frame: Whether to normalize coordinates after clipping - relative to clip_window (this can only be set to True if a clip_window - is provided) - masks: (optional) a [k, q, mask_height, mask_width] float32 tensor - containing box masks. `q` can be either number of classes or 1 depending - on whether a separate mask is predicted per class. - additional_fields: (optional) If not None, a dictionary that maps keys to - tensors whose first dimensions are all of size `k`. After non-maximum - suppression, all tensors corresponding to the selected boxes will be - added to resulting BoxList. - scope: name scope. - - Returns: - a BoxList holding M boxes with a rank-1 scores field representing - corresponding scores for each box with scores sorted in decreasing order - and a rank-1 classes field representing a class label for each box. - - Raises: - ValueError: if iou_thresh is not in [0, 1] or if input boxlist does not have - a valid scores field. - """ - if not 0 <= iou_thresh <= 1.0: - raise ValueError('iou_thresh must be between 0 and 1') - if scores.shape.ndims != 2: - raise ValueError('scores field must be of rank 2') - if scores.shape[1].value is None: - raise ValueError('scores must have statically defined second ' - 'dimension') - if boxes.shape.ndims != 3: - raise ValueError('boxes must be of rank 3.') - if not (boxes.shape[1].value == scores.shape[1].value or - boxes.shape[1].value == 1): - raise ValueError('second dimension of boxes must be either 1 or equal ' - 'to the second dimension of scores') - if boxes.shape[2].value != 4: - raise ValueError('last dimension of boxes must be of size 4.') - if change_coordinate_frame and clip_window is None: - raise ValueError('if change_coordinate_frame is True, then a clip_window' - 'must be specified.') - - with tf.name_scope(scope, 'MultiClassNonMaxSuppression'): - num_boxes = tf.shape(boxes)[0] - num_scores = tf.shape(scores)[0] - num_classes = scores.get_shape()[1] - - length_assert = tf.Assert( - tf.equal(num_boxes, num_scores), - ['Incorrect scores field length: actual vs expected.', - num_scores, num_boxes]) - - selected_boxes_list = [] - per_class_boxes_list = tf.unstack(boxes, axis=1) - if masks is not None: - per_class_masks_list = tf.unstack(masks, axis=1) - boxes_ids = (range(num_classes) if len(per_class_boxes_list) > 1 - else [0] * num_classes) - for class_idx, boxes_idx in zip(range(num_classes), boxes_ids): - per_class_boxes = per_class_boxes_list[boxes_idx] - boxlist_and_class_scores = box_list.BoxList(per_class_boxes) - with tf.control_dependencies([length_assert]): - class_scores = tf.reshape( - tf.slice(scores, [0, class_idx], tf.stack([num_scores, 1])), [-1]) - boxlist_and_class_scores.add_field(fields.BoxListFields.scores, - class_scores) - if masks is not None: - per_class_masks = per_class_masks_list[boxes_idx] - boxlist_and_class_scores.add_field(fields.BoxListFields.masks, - per_class_masks) - if additional_fields is not None: - for key, tensor in additional_fields.items(): - boxlist_and_class_scores.add_field(key, tensor) - boxlist_filtered = box_list_ops.filter_greater_than( - boxlist_and_class_scores, score_thresh) - if clip_window is not None: - boxlist_filtered = box_list_ops.clip_to_window( - boxlist_filtered, clip_window) - if change_coordinate_frame: - boxlist_filtered = box_list_ops.change_coordinate_frame( - boxlist_filtered, clip_window) - max_selection_size = tf.minimum(max_size_per_class, - boxlist_filtered.num_boxes()) - selected_indices = tf.image.non_max_suppression( - boxlist_filtered.get(), - boxlist_filtered.get_field(fields.BoxListFields.scores), - max_selection_size, - iou_threshold=iou_thresh) - nms_result = box_list_ops.gather(boxlist_filtered, selected_indices) - nms_result.add_field( - fields.BoxListFields.classes, (tf.zeros_like( - nms_result.get_field(fields.BoxListFields.scores)) + class_idx)) - selected_boxes_list.append(nms_result) - selected_boxes = box_list_ops.concatenate(selected_boxes_list) - sorted_boxes = box_list_ops.sort_by_field(selected_boxes, - fields.BoxListFields.scores) - if max_total_size: - max_total_size = tf.minimum(max_total_size, - sorted_boxes.num_boxes()) - sorted_boxes = box_list_ops.gather(sorted_boxes, - tf.range(max_total_size)) - return sorted_boxes - - -def batch_multiclass_non_max_suppression(boxes, - scores, - score_thresh, - iou_thresh, - max_size_per_class, - max_total_size=0, - clip_window=None, - change_coordinate_frame=False, - num_valid_boxes=None, - masks=None, - additional_fields=None, - scope=None, - parallel_iterations=32): - """Multi-class version of non maximum suppression that operates on a batch. - - This op is similar to `multiclass_non_max_suppression` but operates on a batch - of boxes and scores. See documentation for `multiclass_non_max_suppression` - for details. - - Args: - boxes: A [batch_size, num_anchors, q, 4] float32 tensor containing - detections. If `q` is 1 then same boxes are used for all classes - otherwise, if `q` is equal to number of classes, class-specific boxes - are used. - scores: A [batch_size, num_anchors, num_classes] float32 tensor containing - the scores for each of the `num_anchors` detections. - score_thresh: scalar threshold for score (low scoring boxes are removed). - iou_thresh: scalar threshold for IOU (new boxes that have high IOU overlap - with previously selected boxes are removed). - max_size_per_class: maximum number of retained boxes per class. - max_total_size: maximum number of boxes retained over all classes. By - default returns all boxes retained after capping boxes per class. - clip_window: A float32 tensor of the form [y_min, x_min, y_max, x_max] - representing the window to clip boxes to before performing non-max - suppression. - change_coordinate_frame: Whether to normalize coordinates after clipping - relative to clip_window (this can only be set to True if a clip_window - is provided) - num_valid_boxes: (optional) a Tensor of type `int32`. A 1-D tensor of shape - [batch_size] representing the number of valid boxes to be considered - for each image in the batch. This parameter allows for ignoring zero - paddings. - masks: (optional) a [batch_size, num_anchors, q, mask_height, mask_width] - float32 tensor containing box masks. `q` can be either number of classes - or 1 depending on whether a separate mask is predicted per class. - additional_fields: (optional) If not None, a dictionary that maps keys to - tensors whose dimensions are [batch_size, num_anchors, ...]. - scope: tf scope name. - parallel_iterations: (optional) number of batch items to process in - parallel. - - Returns: - 'nmsed_boxes': A [batch_size, max_detections, 4] float32 tensor - containing the non-max suppressed boxes. - 'nmsed_scores': A [batch_size, max_detections] float32 tensor containing - the scores for the boxes. - 'nmsed_classes': A [batch_size, max_detections] float32 tensor - containing the class for boxes. - 'nmsed_masks': (optional) a - [batch_size, max_detections, mask_height, mask_width] float32 tensor - containing masks for each selected box. This is set to None if input - `masks` is None. - 'nmsed_additional_fields': (optional) a dictionary of - [batch_size, max_detections, ...] float32 tensors corresponding to the - tensors specified in the input `additional_fields`. This is not returned - if input `additional_fields` is None. - 'num_detections': A [batch_size] int32 tensor indicating the number of - valid detections per batch item. Only the top num_detections[i] entries in - nms_boxes[i], nms_scores[i] and nms_class[i] are valid. The rest of the - entries are zero paddings. - - Raises: - ValueError: if `q` in boxes.shape is not 1 or not equal to number of - classes as inferred from scores.shape. - """ - q = boxes.shape[2].value - num_classes = scores.shape[2].value - if q != 1 and q != num_classes: - raise ValueError('third dimension of boxes must be either 1 or equal ' - 'to the third dimension of scores') - - original_masks = masks - original_additional_fields = additional_fields - with tf.name_scope(scope, 'BatchMultiClassNonMaxSuppression'): - boxes_shape = boxes.shape - batch_size = boxes_shape[0].value - num_anchors = boxes_shape[1].value - - if batch_size is None: - batch_size = tf.shape(boxes)[0] - if num_anchors is None: - num_anchors = tf.shape(boxes)[1] - - # If num valid boxes aren't provided, create one and mark all boxes as - # valid. - if num_valid_boxes is None: - num_valid_boxes = tf.ones([batch_size], dtype=tf.int32) * num_anchors - - # If masks aren't provided, create dummy masks so we can only have one copy - # of _single_image_nms_fn and discard the dummy masks after map_fn. - if masks is None: - masks_shape = tf.stack([batch_size, num_anchors, 1, 0, 0]) - masks = tf.zeros(masks_shape) - - if additional_fields is None: - additional_fields = {} - - def _single_image_nms_fn(args): - """Runs NMS on a single image and returns padded output. - - Args: - args: A list of tensors consisting of the following: - per_image_boxes - A [num_anchors, q, 4] float32 tensor containing - detections. If `q` is 1 then same boxes are used for all classes - otherwise, if `q` is equal to number of classes, class-specific - boxes are used. - per_image_scores - A [num_anchors, num_classes] float32 tensor - containing the scores for each of the `num_anchors` detections. - per_image_masks - A [num_anchors, q, mask_height, mask_width] float32 - tensor containing box masks. `q` can be either number of classes - or 1 depending on whether a separate mask is predicted per class. - per_image_additional_fields - (optional) A variable number of float32 - tensors each with size [num_anchors, ...]. - per_image_num_valid_boxes - A tensor of type `int32`. A 1-D tensor of - shape [batch_size] representing the number of valid boxes to be - considered for each image in the batch. This parameter allows for - ignoring zero paddings. - - Returns: - 'nmsed_boxes': A [max_detections, 4] float32 tensor containing the - non-max suppressed boxes. - 'nmsed_scores': A [max_detections] float32 tensor containing the scores - for the boxes. - 'nmsed_classes': A [max_detections] float32 tensor containing the class - for boxes. - 'nmsed_masks': (optional) a [max_detections, mask_height, mask_width] - float32 tensor containing masks for each selected box. This is set to - None if input `masks` is None. - 'nmsed_additional_fields': (optional) A variable number of float32 - tensors each with size [max_detections, ...] corresponding to the - input `per_image_additional_fields`. - 'num_detections': A [batch_size] int32 tensor indicating the number of - valid detections per batch item. Only the top num_detections[i] - entries in nms_boxes[i], nms_scores[i] and nms_class[i] are valid. The - rest of the entries are zero paddings. - """ - per_image_boxes = args[0] - per_image_scores = args[1] - per_image_masks = args[2] - per_image_additional_fields = { - key: value - for key, value in zip(additional_fields, args[3:-1]) - } - per_image_num_valid_boxes = args[-1] - per_image_boxes = tf.reshape( - tf.slice(per_image_boxes, 3 * [0], - tf.stack([per_image_num_valid_boxes, -1, -1])), [-1, q, 4]) - per_image_scores = tf.reshape( - tf.slice(per_image_scores, [0, 0], - tf.stack([per_image_num_valid_boxes, -1])), - [-1, num_classes]) - per_image_masks = tf.reshape( - tf.slice(per_image_masks, 4 * [0], - tf.stack([per_image_num_valid_boxes, -1, -1, -1])), - [-1, q, per_image_masks.shape[2].value, - per_image_masks.shape[3].value]) - if per_image_additional_fields is not None: - for key, tensor in per_image_additional_fields.items(): - additional_field_shape = tensor.get_shape() - additional_field_dim = len(additional_field_shape) - per_image_additional_fields[key] = tf.reshape( - tf.slice(per_image_additional_fields[key], - additional_field_dim * [0], - tf.stack([per_image_num_valid_boxes] + - (additional_field_dim - 1) * [-1])), - [-1] + [dim.value for dim in additional_field_shape[1:]]) - nmsed_boxlist = multiclass_non_max_suppression( - per_image_boxes, - per_image_scores, - score_thresh, - iou_thresh, - max_size_per_class, - max_total_size, - clip_window=clip_window, - change_coordinate_frame=change_coordinate_frame, - masks=per_image_masks, - additional_fields=per_image_additional_fields) - padded_boxlist = box_list_ops.pad_or_clip_box_list(nmsed_boxlist, - max_total_size) - num_detections = nmsed_boxlist.num_boxes() - nmsed_boxes = padded_boxlist.get() - nmsed_scores = padded_boxlist.get_field(fields.BoxListFields.scores) - nmsed_classes = padded_boxlist.get_field(fields.BoxListFields.classes) - nmsed_masks = padded_boxlist.get_field(fields.BoxListFields.masks) - nmsed_additional_fields = [ - padded_boxlist.get_field(key) for key in per_image_additional_fields - ] - return ([nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks] + - nmsed_additional_fields + [num_detections]) - - num_additional_fields = 0 - if additional_fields is not None: - num_additional_fields = len(additional_fields) - num_nmsed_outputs = 4 + num_additional_fields - - batch_outputs = tf.map_fn( - _single_image_nms_fn, - elems=([boxes, scores, masks] + list(additional_fields.values()) + - [num_valid_boxes]), - dtype=(num_nmsed_outputs * [tf.float32] + [tf.int32]), - parallel_iterations=parallel_iterations) - - batch_nmsed_boxes = batch_outputs[0] - batch_nmsed_scores = batch_outputs[1] - batch_nmsed_classes = batch_outputs[2] - batch_nmsed_masks = batch_outputs[3] - batch_nmsed_additional_fields = { - key: value - for key, value in zip(additional_fields, batch_outputs[4:-1]) - } - batch_num_detections = batch_outputs[-1] - - if original_masks is None: - batch_nmsed_masks = None - - if original_additional_fields is None: - batch_nmsed_additional_fields = None - - return (batch_nmsed_boxes, batch_nmsed_scores, batch_nmsed_classes, - batch_nmsed_masks, batch_nmsed_additional_fields, - batch_num_detections) diff --git a/object_detection/core/post_processing_test.py b/object_detection/core/post_processing_test.py deleted file mode 100644 index 542f8e18..00000000 --- a/object_detection/core/post_processing_test.py +++ /dev/null @@ -1,959 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for tensorflow_models.object_detection.core.post_processing.""" -import numpy as np -import tensorflow as tf -from object_detection.core import post_processing -from object_detection.core import standard_fields as fields - - -class MulticlassNonMaxSuppressionTest(tf.test.TestCase): - - def test_with_invalid_scores_size(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]]], tf.float32) - scores = tf.constant([[.9], [.75], [.6], [.95], [.5]]) - iou_thresh = .5 - score_thresh = 0.6 - max_output_size = 3 - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size) - with self.test_session() as sess: - with self.assertRaisesWithPredicateMatch( - tf.errors.InvalidArgumentError, 'Incorrect scores field length'): - sess.run(nms.get()) - - def test_multiclass_nms_select_with_shared_boxes(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 1000, 1, 1002], - [0, 100, 1, 101]] - exp_nms_scores = [.95, .9, .85, .3] - exp_nms_classes = [0, 0, 1, 0] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_corners_output, nms_scores_output, nms_classes_output = sess.run( - [nms.get(), nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes)]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - - def test_multiclass_nms_select_with_shared_boxes_given_keypoints(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - num_keypoints = 6 - keypoints = tf.tile( - tf.reshape(tf.range(8), [8, 1, 1]), - [1, num_keypoints, 2]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 1000, 1, 1002], - [0, 100, 1, 101]] - exp_nms_scores = [.95, .9, .85, .3] - exp_nms_classes = [0, 0, 1, 0] - exp_nms_keypoints_tensor = tf.tile( - tf.reshape(tf.constant([3, 0, 6, 5], dtype=tf.float32), [4, 1, 1]), - [1, num_keypoints, 2]) - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size, - additional_fields={ - fields.BoxListFields.keypoints: keypoints}) - - with self.test_session() as sess: - (nms_corners_output, - nms_scores_output, - nms_classes_output, - nms_keypoints, - exp_nms_keypoints) = sess.run([ - nms.get(), - nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes), - nms.get_field(fields.BoxListFields.keypoints), - exp_nms_keypoints_tensor - ]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - self.assertAllEqual(nms_keypoints, exp_nms_keypoints) - - def test_multiclass_nms_with_shared_boxes_given_keypoint_heatmaps(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - - num_boxes = tf.shape(boxes)[0] - heatmap_height = 5 - heatmap_width = 5 - num_keypoints = 17 - keypoint_heatmaps = tf.ones( - [num_boxes, heatmap_height, heatmap_width, num_keypoints], - dtype=tf.float32) - - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 1000, 1, 1002], - [0, 100, 1, 101]] - - exp_nms_scores = [.95, .9, .85, .3] - exp_nms_classes = [0, 0, 1, 0] - exp_nms_keypoint_heatmaps = np.ones( - (4, heatmap_height, heatmap_width, num_keypoints), dtype=np.float32) - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size, - additional_fields={ - fields.BoxListFields.keypoint_heatmaps: keypoint_heatmaps}) - - with self.test_session() as sess: - (nms_corners_output, - nms_scores_output, - nms_classes_output, - nms_keypoint_heatmaps) = sess.run( - [nms.get(), - nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes), - nms.get_field(fields.BoxListFields.keypoint_heatmaps)]) - - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - self.assertAllEqual(nms_keypoint_heatmaps, exp_nms_keypoint_heatmaps) - - def test_multiclass_nms_with_additional_fields(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - - coarse_boxes_key = 'coarse_boxes' - coarse_boxes = tf.constant([[0.1, 0.1, 1.1, 1.1], - [0.1, 0.2, 1.1, 1.2], - [0.1, -0.2, 1.1, 1.0], - [0.1, 10.1, 1.1, 11.1], - [0.1, 10.2, 1.1, 11.2], - [0.1, 100.1, 1.1, 101.1], - [0.1, 1000.1, 1.1, 1002.1], - [0.1, 1000.1, 1.1, 1002.2]], tf.float32) - - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = np.array([[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 1000, 1, 1002], - [0, 100, 1, 101]], dtype=np.float32) - - exp_nms_coarse_corners = np.array([[0.1, 10.1, 1.1, 11.1], - [0.1, 0.1, 1.1, 1.1], - [0.1, 1000.1, 1.1, 1002.1], - [0.1, 100.1, 1.1, 101.1]], - dtype=np.float32) - - exp_nms_scores = [.95, .9, .85, .3] - exp_nms_classes = [0, 0, 1, 0] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size, - additional_fields={coarse_boxes_key: coarse_boxes}) - - with self.test_session() as sess: - (nms_corners_output, - nms_scores_output, - nms_classes_output, - nms_coarse_corners) = sess.run( - [nms.get(), - nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes), - nms.get_field(coarse_boxes_key)]) - - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - self.assertAllEqual(nms_coarse_corners, exp_nms_coarse_corners) - - def test_multiclass_nms_select_with_shared_boxes_given_masks(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - num_classes = 2 - mask_height = 3 - mask_width = 3 - masks = tf.tile( - tf.reshape(tf.range(8), [8, 1, 1, 1]), - [1, num_classes, mask_height, mask_width]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 1000, 1, 1002], - [0, 100, 1, 101]] - exp_nms_scores = [.95, .9, .85, .3] - exp_nms_classes = [0, 0, 1, 0] - exp_nms_masks_tensor = tf.tile( - tf.reshape(tf.constant([3, 0, 6, 5], dtype=tf.float32), [4, 1, 1]), - [1, mask_height, mask_width]) - - nms = post_processing.multiclass_non_max_suppression(boxes, scores, - score_thresh, - iou_thresh, - max_output_size, - masks=masks) - with self.test_session() as sess: - (nms_corners_output, - nms_scores_output, - nms_classes_output, - nms_masks, - exp_nms_masks) = sess.run([nms.get(), - nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes), - nms.get_field(fields.BoxListFields.masks), - exp_nms_masks_tensor]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - self.assertAllEqual(nms_masks, exp_nms_masks) - - def test_multiclass_nms_select_with_clip_window(self): - boxes = tf.constant([[[0, 0, 10, 10]], - [[1, 1, 11, 11]]], tf.float32) - scores = tf.constant([[.9], [.75]]) - clip_window = tf.constant([5, 4, 8, 7], tf.float32) - score_thresh = 0.0 - iou_thresh = 0.5 - max_output_size = 100 - - exp_nms_corners = [[5, 4, 8, 7]] - exp_nms_scores = [.9] - exp_nms_classes = [0] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size, - clip_window=clip_window) - with self.test_session() as sess: - nms_corners_output, nms_scores_output, nms_classes_output = sess.run( - [nms.get(), nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes)]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - - def test_multiclass_nms_select_with_clip_window_change_coordinate_frame(self): - boxes = tf.constant([[[0, 0, 10, 10]], - [[1, 1, 11, 11]]], tf.float32) - scores = tf.constant([[.9], [.75]]) - clip_window = tf.constant([5, 4, 8, 7], tf.float32) - score_thresh = 0.0 - iou_thresh = 0.5 - max_output_size = 100 - - exp_nms_corners = [[0, 0, 1, 1]] - exp_nms_scores = [.9] - exp_nms_classes = [0] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size, - clip_window=clip_window, change_coordinate_frame=True) - with self.test_session() as sess: - nms_corners_output, nms_scores_output, nms_classes_output = sess.run( - [nms.get(), nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes)]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - - def test_multiclass_nms_select_with_per_class_cap(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - score_thresh = 0.1 - iou_thresh = .5 - max_size_per_class = 2 - - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 1000, 1, 1002]] - exp_nms_scores = [.95, .9, .85] - exp_nms_classes = [0, 0, 1] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_size_per_class) - with self.test_session() as sess: - nms_corners_output, nms_scores_output, nms_classes_output = sess.run( - [nms.get(), nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes)]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - - def test_multiclass_nms_select_with_total_cap(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - score_thresh = 0.1 - iou_thresh = .5 - max_size_per_class = 4 - max_total_size = 2 - - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1]] - exp_nms_scores = [.95, .9] - exp_nms_classes = [0, 0] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_size_per_class, - max_total_size) - with self.test_session() as sess: - nms_corners_output, nms_scores_output, nms_classes_output = sess.run( - [nms.get(), nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes)]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - - def test_multiclass_nms_threshold_then_select_with_shared_boxes(self): - boxes = tf.constant([[[0, 0, 1, 1]], - [[0, 0.1, 1, 1.1]], - [[0, -0.1, 1, 0.9]], - [[0, 10, 1, 11]], - [[0, 10.1, 1, 11.1]], - [[0, 100, 1, 101]], - [[0, 1000, 1, 1002]], - [[0, 1000, 1, 1002.1]]], tf.float32) - scores = tf.constant([[.9], [.75], [.6], [.95], [.5], [.3], [.01], [.01]]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 3 - - exp_nms = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 100, 1, 101]] - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_output = sess.run(nms.get()) - self.assertAllClose(nms_output, exp_nms) - - def test_multiclass_nms_select_with_separate_boxes(self): - boxes = tf.constant([[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]], - [[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]], - tf.float32) - scores = tf.constant([[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 999, 2, 1004], - [0, 100, 1, 101]] - exp_nms_scores = [.95, .9, .85, .3] - exp_nms_classes = [0, 0, 1, 0] - - nms = post_processing.multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, max_output_size) - with self.test_session() as sess: - nms_corners_output, nms_scores_output, nms_classes_output = sess.run( - [nms.get(), nms.get_field(fields.BoxListFields.scores), - nms.get_field(fields.BoxListFields.classes)]) - self.assertAllClose(nms_corners_output, exp_nms_corners) - self.assertAllClose(nms_scores_output, exp_nms_scores) - self.assertAllClose(nms_classes_output, exp_nms_classes) - - def test_batch_multiclass_nms_with_batch_size_1(self): - boxes = tf.constant([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]], - [[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]], - tf.float32) - scores = tf.constant([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0], - [.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 999, 2, 1004], - [0, 100, 1, 101]]] - exp_nms_scores = [[.95, .9, .85, .3]] - exp_nms_classes = [[0, 0, 1, 0]] - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size) - - self.assertIsNone(nmsed_masks) - self.assertIsNone(nmsed_additional_fields) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - num_detections]) - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - self.assertEqual(num_detections, [4]) - - def test_batch_multiclass_nms_with_batch_size_2(self): - boxes = tf.constant([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]]], - [[[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]], - tf.float32) - scores = tf.constant([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0]], - [[.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = np.array([[[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 999, 2, 1004], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101], - [0, 0, 0, 0]]]) - exp_nms_scores = np.array([[.95, .9, 0, 0], - [.85, .5, .3, 0]]) - exp_nms_classes = np.array([[0, 0, 0, 0], - [1, 0, 0, 0]]) - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size) - - self.assertIsNone(nmsed_masks) - self.assertIsNone(nmsed_additional_fields) - # Check static shapes - self.assertAllEqual(nmsed_boxes.shape.as_list(), - exp_nms_corners.shape) - self.assertAllEqual(nmsed_scores.shape.as_list(), - exp_nms_scores.shape) - self.assertAllEqual(nmsed_classes.shape.as_list(), - exp_nms_classes.shape) - self.assertEqual(num_detections.shape.as_list(), [2]) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - num_detections]) - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - self.assertAllClose(num_detections, [2, 3]) - - def test_batch_multiclass_nms_with_masks(self): - boxes = tf.constant([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]]], - [[[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]], - tf.float32) - scores = tf.constant([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0]], - [[.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - masks = tf.constant([[[[[0, 1], [2, 3]], [[1, 2], [3, 4]]], - [[[2, 3], [4, 5]], [[3, 4], [5, 6]]], - [[[4, 5], [6, 7]], [[5, 6], [7, 8]]], - [[[6, 7], [8, 9]], [[7, 8], [9, 10]]]], - [[[[8, 9], [10, 11]], [[9, 10], [11, 12]]], - [[[10, 11], [12, 13]], [[11, 12], [13, 14]]], - [[[12, 13], [14, 15]], [[13, 14], [15, 16]]], - [[[14, 15], [16, 17]], [[15, 16], [17, 18]]]]], - tf.float32) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = np.array([[[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 999, 2, 1004], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101], - [0, 0, 0, 0]]]) - exp_nms_scores = np.array([[.95, .9, 0, 0], - [.85, .5, .3, 0]]) - exp_nms_classes = np.array([[0, 0, 0, 0], - [1, 0, 0, 0]]) - exp_nms_masks = np.array([[[[6, 7], [8, 9]], - [[0, 1], [2, 3]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[13, 14], [15, 16]], - [[8, 9], [10, 11]], - [[10, 11], [12, 13]], - [[0, 0], [0, 0]]]]) - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size, - masks=masks) - - self.assertIsNone(nmsed_additional_fields) - # Check static shapes - self.assertAllEqual(nmsed_boxes.shape.as_list(), exp_nms_corners.shape) - self.assertAllEqual(nmsed_scores.shape.as_list(), exp_nms_scores.shape) - self.assertAllEqual(nmsed_classes.shape.as_list(), exp_nms_classes.shape) - self.assertAllEqual(nmsed_masks.shape.as_list(), exp_nms_masks.shape) - self.assertEqual(num_detections.shape.as_list(), [2]) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - nmsed_masks, num_detections]) - - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - self.assertAllClose(num_detections, [2, 3]) - self.assertAllClose(nmsed_masks, exp_nms_masks) - - def test_batch_multiclass_nms_with_additional_fields(self): - boxes = tf.constant([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]]], - [[[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]], - tf.float32) - scores = tf.constant([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0]], - [[.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - additional_fields = { - 'keypoints': tf.constant( - [[[[6, 7], [8, 9]], - [[0, 1], [2, 3]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[13, 14], [15, 16]], - [[8, 9], [10, 11]], - [[10, 11], [12, 13]], - [[0, 0], [0, 0]]]], - tf.float32) - } - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = np.array([[[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 999, 2, 1004], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101], - [0, 0, 0, 0]]]) - exp_nms_scores = np.array([[.95, .9, 0, 0], - [.85, .5, .3, 0]]) - exp_nms_classes = np.array([[0, 0, 0, 0], - [1, 0, 0, 0]]) - exp_nms_additional_fields = { - 'keypoints': np.array([[[[0, 0], [0, 0]], - [[6, 7], [8, 9]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[10, 11], [12, 13]], - [[13, 14], [15, 16]], - [[8, 9], [10, 11]], - [[0, 0], [0, 0]]]]) - } - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size, - additional_fields=additional_fields) - - self.assertIsNone(nmsed_masks) - # Check static shapes - self.assertAllEqual(nmsed_boxes.shape.as_list(), exp_nms_corners.shape) - self.assertAllEqual(nmsed_scores.shape.as_list(), exp_nms_scores.shape) - self.assertAllEqual(nmsed_classes.shape.as_list(), exp_nms_classes.shape) - self.assertEqual(len(nmsed_additional_fields), - len(exp_nms_additional_fields)) - for key in exp_nms_additional_fields: - self.assertAllEqual(nmsed_additional_fields[key].shape.as_list(), - exp_nms_additional_fields[key].shape) - self.assertEqual(num_detections.shape.as_list(), [2]) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_additional_fields, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - nmsed_additional_fields, num_detections]) - - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - for key in exp_nms_additional_fields: - self.assertAllClose(nmsed_additional_fields[key], - exp_nms_additional_fields[key]) - self.assertAllClose(num_detections, [2, 3]) - - def test_batch_multiclass_nms_with_dynamic_batch_size(self): - boxes_placeholder = tf.placeholder(tf.float32, shape=(None, None, 2, 4)) - scores_placeholder = tf.placeholder(tf.float32, shape=(None, None, 2)) - masks_placeholder = tf.placeholder(tf.float32, shape=(None, None, 2, 2, 2)) - - boxes = np.array([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]]], - [[[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]]) - scores = np.array([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0]], - [[.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - masks = np.array([[[[[0, 1], [2, 3]], [[1, 2], [3, 4]]], - [[[2, 3], [4, 5]], [[3, 4], [5, 6]]], - [[[4, 5], [6, 7]], [[5, 6], [7, 8]]], - [[[6, 7], [8, 9]], [[7, 8], [9, 10]]]], - [[[[8, 9], [10, 11]], [[9, 10], [11, 12]]], - [[[10, 11], [12, 13]], [[11, 12], [13, 14]]], - [[[12, 13], [14, 15]], [[13, 14], [15, 16]]], - [[[14, 15], [16, 17]], [[15, 16], [17, 18]]]]]) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = np.array([[[0, 10, 1, 11], - [0, 0, 1, 1], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 999, 2, 1004], - [0, 10.1, 1, 11.1], - [0, 100, 1, 101], - [0, 0, 0, 0]]]) - exp_nms_scores = np.array([[.95, .9, 0, 0], - [.85, .5, .3, 0]]) - exp_nms_classes = np.array([[0, 0, 0, 0], - [1, 0, 0, 0]]) - exp_nms_masks = np.array([[[[6, 7], [8, 9]], - [[0, 1], [2, 3]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[13, 14], [15, 16]], - [[8, 9], [10, 11]], - [[10, 11], [12, 13]], - [[0, 0], [0, 0]]]]) - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes_placeholder, scores_placeholder, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size, - masks=masks_placeholder) - - self.assertIsNone(nmsed_additional_fields) - # Check static shapes - self.assertAllEqual(nmsed_boxes.shape.as_list(), [None, 4, 4]) - self.assertAllEqual(nmsed_scores.shape.as_list(), [None, 4]) - self.assertAllEqual(nmsed_classes.shape.as_list(), [None, 4]) - self.assertAllEqual(nmsed_masks.shape.as_list(), [None, 4, 2, 2]) - self.assertEqual(num_detections.shape.as_list(), [None]) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - nmsed_masks, num_detections], - feed_dict={boxes_placeholder: boxes, - scores_placeholder: scores, - masks_placeholder: masks}) - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - self.assertAllClose(num_detections, [2, 3]) - self.assertAllClose(nmsed_masks, exp_nms_masks) - - def test_batch_multiclass_nms_with_masks_and_num_valid_boxes(self): - boxes = tf.constant([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]]], - [[[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]], - tf.float32) - scores = tf.constant([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0]], - [[.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - masks = tf.constant([[[[[0, 1], [2, 3]], [[1, 2], [3, 4]]], - [[[2, 3], [4, 5]], [[3, 4], [5, 6]]], - [[[4, 5], [6, 7]], [[5, 6], [7, 8]]], - [[[6, 7], [8, 9]], [[7, 8], [9, 10]]]], - [[[[8, 9], [10, 11]], [[9, 10], [11, 12]]], - [[[10, 11], [12, 13]], [[11, 12], [13, 14]]], - [[[12, 13], [14, 15]], [[13, 14], [15, 16]]], - [[[14, 15], [16, 17]], [[15, 16], [17, 18]]]]], - tf.float32) - num_valid_boxes = tf.constant([1, 1], tf.int32) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[[0, 0, 1, 1], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 10.1, 1, 11.1], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]]] - exp_nms_scores = [[.9, 0, 0, 0], - [.5, 0, 0, 0]] - exp_nms_classes = [[0, 0, 0, 0], - [0, 0, 0, 0]] - exp_nms_masks = [[[[0, 1], [2, 3]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[8, 9], [10, 11]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]]] - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size, - num_valid_boxes=num_valid_boxes, masks=masks) - - self.assertIsNone(nmsed_additional_fields) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - nmsed_masks, num_detections]) - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - self.assertAllClose(num_detections, [1, 1]) - self.assertAllClose(nmsed_masks, exp_nms_masks) - - def test_batch_multiclass_nms_with_additional_fields_and_num_valid_boxes( - self): - boxes = tf.constant([[[[0, 0, 1, 1], [0, 0, 4, 5]], - [[0, 0.1, 1, 1.1], [0, 0.1, 2, 1.1]], - [[0, -0.1, 1, 0.9], [0, -0.1, 1, 0.9]], - [[0, 10, 1, 11], [0, 10, 1, 11]]], - [[[0, 10.1, 1, 11.1], [0, 10.1, 1, 11.1]], - [[0, 100, 1, 101], [0, 100, 1, 101]], - [[0, 1000, 1, 1002], [0, 999, 2, 1004]], - [[0, 1000, 1, 1002.1], [0, 999, 2, 1002.7]]]], - tf.float32) - scores = tf.constant([[[.9, 0.01], [.75, 0.05], - [.6, 0.01], [.95, 0]], - [[.5, 0.01], [.3, 0.01], - [.01, .85], [.01, .5]]]) - additional_fields = { - 'keypoints': tf.constant( - [[[[6, 7], [8, 9]], - [[0, 1], [2, 3]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[13, 14], [15, 16]], - [[8, 9], [10, 11]], - [[10, 11], [12, 13]], - [[0, 0], [0, 0]]]], - tf.float32) - } - num_valid_boxes = tf.constant([1, 1], tf.int32) - score_thresh = 0.1 - iou_thresh = .5 - max_output_size = 4 - - exp_nms_corners = [[[0, 0, 1, 1], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 10.1, 1, 11.1], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]]] - exp_nms_scores = [[.9, 0, 0, 0], - [.5, 0, 0, 0]] - exp_nms_classes = [[0, 0, 0, 0], - [0, 0, 0, 0]] - exp_nms_additional_fields = { - 'keypoints': np.array([[[[6, 7], [8, 9]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]], - [[[13, 14], [15, 16]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]], - [[0, 0], [0, 0]]]]) - } - - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_masks, - nmsed_additional_fields, num_detections - ) = post_processing.batch_multiclass_non_max_suppression( - boxes, scores, score_thresh, iou_thresh, - max_size_per_class=max_output_size, max_total_size=max_output_size, - num_valid_boxes=num_valid_boxes, - additional_fields=additional_fields) - - self.assertIsNone(nmsed_masks) - - with self.test_session() as sess: - (nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_additional_fields, - num_detections) = sess.run([nmsed_boxes, nmsed_scores, nmsed_classes, - nmsed_additional_fields, num_detections]) - - self.assertAllClose(nmsed_boxes, exp_nms_corners) - self.assertAllClose(nmsed_scores, exp_nms_scores) - self.assertAllClose(nmsed_classes, exp_nms_classes) - for key in exp_nms_additional_fields: - self.assertAllClose(nmsed_additional_fields[key], - exp_nms_additional_fields[key]) - self.assertAllClose(num_detections, [1, 1]) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/prefetcher.py b/object_detection/core/prefetcher.py deleted file mode 100644 index e690c599..00000000 --- a/object_detection/core/prefetcher.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Provides functions to prefetch tensors to feed into models.""" -import tensorflow as tf - - -def prefetch(tensor_dict, capacity): - """Creates a prefetch queue for tensors. - - Creates a FIFO queue to asynchronously enqueue tensor_dicts and returns a - dequeue op that evaluates to a tensor_dict. This function is useful in - prefetching preprocessed tensors so that the data is readily available for - consumers. - - Example input pipeline when you don't need batching: - ---------------------------------------------------- - key, string_tensor = slim.parallel_reader.parallel_read(...) - tensor_dict = decoder.decode(string_tensor) - tensor_dict = preprocessor.preprocess(tensor_dict, ...) - prefetch_queue = prefetcher.prefetch(tensor_dict, capacity=20) - tensor_dict = prefetch_queue.dequeue() - outputs = Model(tensor_dict) - ... - ---------------------------------------------------- - - For input pipelines with batching, refer to core/batcher.py - - Args: - tensor_dict: a dictionary of tensors to prefetch. - capacity: the size of the prefetch queue. - - Returns: - a FIFO prefetcher queue - """ - names = list(tensor_dict.keys()) - dtypes = [t.dtype for t in tensor_dict.values()] - shapes = [t.get_shape() for t in tensor_dict.values()] - prefetch_queue = tf.PaddingFIFOQueue(capacity, dtypes=dtypes, - shapes=shapes, - names=names, - name='prefetch_queue') - enqueue_op = prefetch_queue.enqueue(tensor_dict) - tf.train.queue_runner.add_queue_runner(tf.train.queue_runner.QueueRunner( - prefetch_queue, [enqueue_op])) - tf.summary.scalar('queue/%s/fraction_of_%d_full' % (prefetch_queue.name, - capacity), - tf.to_float(prefetch_queue.size()) * (1. / capacity)) - return prefetch_queue diff --git a/object_detection/core/prefetcher_test.py b/object_detection/core/prefetcher_test.py deleted file mode 100644 index 63f557e3..00000000 --- a/object_detection/core/prefetcher_test.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.prefetcher.""" -import tensorflow as tf - -from object_detection.core import prefetcher - -slim = tf.contrib.slim - - -class PrefetcherTest(tf.test.TestCase): - - def test_prefetch_tensors_with_fully_defined_shapes(self): - with self.test_session() as sess: - batch_size = 10 - image_size = 32 - num_batches = 5 - examples = tf.Variable(tf.constant(0, dtype=tf.int64)) - counter = examples.count_up_to(num_batches) - image = tf.random_normal([batch_size, image_size, - image_size, 3], - dtype=tf.float32, - name='images') - label = tf.random_uniform([batch_size, 1], 0, 10, - dtype=tf.int32, name='labels') - - prefetch_queue = prefetcher.prefetch(tensor_dict={'counter': counter, - 'image': image, - 'label': label}, - capacity=100) - tensor_dict = prefetch_queue.dequeue() - - self.assertAllEqual(tensor_dict['image'].get_shape().as_list(), - [batch_size, image_size, image_size, 3]) - self.assertAllEqual(tensor_dict['label'].get_shape().as_list(), - [batch_size, 1]) - - tf.initialize_all_variables().run() - with slim.queues.QueueRunners(sess): - for _ in range(num_batches): - results = sess.run(tensor_dict) - self.assertEquals(results['image'].shape, - (batch_size, image_size, image_size, 3)) - self.assertEquals(results['label'].shape, (batch_size, 1)) - with self.assertRaises(tf.errors.OutOfRangeError): - sess.run(tensor_dict) - - def test_prefetch_tensors_with_partially_defined_shapes(self): - with self.test_session() as sess: - batch_size = 10 - image_size = 32 - num_batches = 5 - examples = tf.Variable(tf.constant(0, dtype=tf.int64)) - counter = examples.count_up_to(num_batches) - image = tf.random_normal([batch_size, - tf.Variable(image_size), - tf.Variable(image_size), 3], - dtype=tf.float32, - name='image') - image.set_shape([batch_size, None, None, 3]) - label = tf.random_uniform([batch_size, tf.Variable(1)], 0, - 10, dtype=tf.int32, name='label') - label.set_shape([batch_size, None]) - - prefetch_queue = prefetcher.prefetch(tensor_dict={'counter': counter, - 'image': image, - 'label': label}, - capacity=100) - tensor_dict = prefetch_queue.dequeue() - - self.assertAllEqual(tensor_dict['image'].get_shape().as_list(), - [batch_size, None, None, 3]) - self.assertAllEqual(tensor_dict['label'].get_shape().as_list(), - [batch_size, None]) - - tf.initialize_all_variables().run() - with slim.queues.QueueRunners(sess): - for _ in range(num_batches): - results = sess.run(tensor_dict) - self.assertEquals(results['image'].shape, - (batch_size, image_size, image_size, 3)) - self.assertEquals(results['label'].shape, (batch_size, 1)) - with self.assertRaises(tf.errors.OutOfRangeError): - sess.run(tensor_dict) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/preprocessor.py b/object_detection/core/preprocessor.py deleted file mode 100644 index 33435f7b..00000000 --- a/object_detection/core/preprocessor.py +++ /dev/null @@ -1,2562 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Preprocess images and bounding boxes for detection. - -We perform two sets of operations in preprocessing stage: -(a) operations that are applied to both training and testing data, -(b) operations that are applied only to training data for the purpose of - data augmentation. - -A preprocessing function receives a set of inputs, -e.g. an image and bounding boxes, -performs an operation on them, and returns them. -Some examples are: randomly cropping the image, randomly mirroring the image, - randomly changing the brightness, contrast, hue and - randomly jittering the bounding boxes. - -The preprocess function receives a tensor_dict which is a dictionary that maps -different field names to their tensors. For example, -tensor_dict[fields.InputDataFields.image] holds the image tensor. -The image is a rank 4 tensor: [1, height, width, channels] with -dtype=tf.float32. The groundtruth_boxes is a rank 2 tensor: [N, 4] where -in each row there is a box with [ymin xmin ymax xmax]. -Boxes are in normalized coordinates meaning -their coordinate values range in [0, 1] - -Important Note: In tensor_dict, images is a rank 4 tensor, but preprocessing -functions receive a rank 3 tensor for processing the image. Thus, inside the -preprocess function we squeeze the image to become a rank 3 tensor and then -we pass it to the functions. At the end of the preprocess we expand the image -back to rank 4. -""" - -import sys -import tensorflow as tf - -from tensorflow.python.ops import control_flow_ops - -from object_detection.core import box_list -from object_detection.core import box_list_ops -from object_detection.core import keypoint_ops -from object_detection.core import standard_fields as fields - - -def _apply_with_random_selector(x, func, num_cases): - """Computes func(x, sel), with sel sampled from [0...num_cases-1]. - - Args: - x: input Tensor. - func: Python function to apply. - num_cases: Python int32, number of cases to sample sel from. - - Returns: - The result of func(x, sel), where func receives the value of the - selector as a python integer, but sel is sampled dynamically. - """ - rand_sel = tf.random_uniform([], maxval=num_cases, dtype=tf.int32) - # Pass the real x only to one of the func calls. - return control_flow_ops.merge([func( - control_flow_ops.switch(x, tf.equal(rand_sel, case))[1], case) - for case in range(num_cases)])[0] - - -def _apply_with_random_selector_tuples(x, func, num_cases): - """Computes func(x, sel), with sel sampled from [0...num_cases-1]. - - Args: - x: A tuple of input tensors. - func: Python function to apply. - num_cases: Python int32, number of cases to sample sel from. - - Returns: - The result of func(x, sel), where func receives the value of the - selector as a python integer, but sel is sampled dynamically. - """ - num_inputs = len(x) - rand_sel = tf.random_uniform([], maxval=num_cases, dtype=tf.int32) - # Pass the real x only to one of the func calls. - - tuples = [list() for t in x] - for case in range(num_cases): - new_x = [control_flow_ops.switch(t, tf.equal(rand_sel, case))[1] for t in x] - output = func(tuple(new_x), case) - for j in range(num_inputs): - tuples[j].append(output[j]) - - for i in range(num_inputs): - tuples[i] = control_flow_ops.merge(tuples[i])[0] - return tuple(tuples) - - -def _random_integer(minval, maxval, seed): - """Returns a random 0-D tensor between minval and maxval. - - Args: - minval: minimum value of the random tensor. - maxval: maximum value of the random tensor. - seed: random seed. - - Returns: - A random 0-D tensor between minval and maxval. - """ - return tf.random_uniform( - [], minval=minval, maxval=maxval, dtype=tf.int32, seed=seed) - - -def normalize_image(image, original_minval, original_maxval, target_minval, - target_maxval): - """Normalizes pixel values in the image. - - Moves the pixel values from the current [original_minval, original_maxval] - range to a the [target_minval, target_maxval] range. - - Args: - image: rank 3 float32 tensor containing 1 - image -> [height, width, channels]. - original_minval: current image minimum value. - original_maxval: current image maximum value. - target_minval: target image minimum value. - target_maxval: target image maximum value. - - Returns: - image: image which is the same shape as input image. - """ - with tf.name_scope('NormalizeImage', values=[image]): - original_minval = float(original_minval) - original_maxval = float(original_maxval) - target_minval = float(target_minval) - target_maxval = float(target_maxval) - image = tf.to_float(image) - image = tf.subtract(image, original_minval) - image = tf.multiply(image, (target_maxval - target_minval) / - (original_maxval - original_minval)) - image = tf.add(image, target_minval) - return image - - -def retain_boxes_above_threshold(boxes, - labels, - label_scores, - masks=None, - keypoints=None, - threshold=0.0): - """Retains boxes whose label score is above a given threshold. - - If the label score for a box is missing (represented by NaN), the box is - retained. The boxes that don't pass the threshold will not appear in the - returned tensor. - - Args: - boxes: float32 tensor of shape [num_instance, 4] representing boxes - location in normalized coordinates. - labels: rank 1 int32 tensor of shape [num_instance] containing the object - classes. - label_scores: float32 tensor of shape [num_instance] representing the - score for each box. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks are of - the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x normalized - coordinates. - threshold: scalar python float. - - Returns: - retained_boxes: [num_retained_instance, 4] - retianed_labels: [num_retained_instance] - retained_label_scores: [num_retained_instance] - - If masks, or keypoints are not None, the function also returns: - - retained_masks: [num_retained_instance, height, width] - retained_keypoints: [num_retained_instance, num_keypoints, 2] - """ - with tf.name_scope('RetainBoxesAboveThreshold', - values=[boxes, labels, label_scores]): - indices = tf.where( - tf.logical_or(label_scores > threshold, tf.is_nan(label_scores))) - indices = tf.squeeze(indices, axis=1) - retained_boxes = tf.gather(boxes, indices) - retained_labels = tf.gather(labels, indices) - retained_label_scores = tf.gather(label_scores, indices) - result = [retained_boxes, retained_labels, retained_label_scores] - - if masks is not None: - retained_masks = tf.gather(masks, indices) - result.append(retained_masks) - - if keypoints is not None: - retained_keypoints = tf.gather(keypoints, indices) - result.append(retained_keypoints) - - return result - - -def _flip_boxes_left_right(boxes): - """Left-right flip the boxes. - - Args: - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - - Returns: - Flipped boxes. - """ - ymin, xmin, ymax, xmax = tf.split(value=boxes, num_or_size_splits=4, axis=1) - flipped_xmin = tf.subtract(1.0, xmax) - flipped_xmax = tf.subtract(1.0, xmin) - flipped_boxes = tf.concat([ymin, flipped_xmin, ymax, flipped_xmax], 1) - return flipped_boxes - - -def _flip_boxes_up_down(boxes): - """Up-down flip the boxes. - - Args: - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - - Returns: - Flipped boxes. - """ - ymin, xmin, ymax, xmax = tf.split(value=boxes, num_or_size_splits=4, axis=1) - flipped_ymin = tf.subtract(1.0, ymax) - flipped_ymax = tf.subtract(1.0, ymin) - flipped_boxes = tf.concat([flipped_ymin, xmin, flipped_ymax, xmax], 1) - return flipped_boxes - - -def _rot90_boxes(boxes): - """Rotate boxes counter-clockwise by 90 degrees. - - Args: - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - - Returns: - Rotated boxes. - """ - ymin, xmin, ymax, xmax = tf.split(value=boxes, num_or_size_splits=4, axis=1) - rotated_ymin = tf.subtract(1.0, xmax) - rotated_ymax = tf.subtract(1.0, xmin) - rotated_xmin = ymin - rotated_xmax = ymax - rotated_boxes = tf.concat( - [rotated_ymin, rotated_xmin, rotated_ymax, rotated_xmax], 1) - return rotated_boxes - - -def _flip_masks_left_right(masks): - """Left-right flip masks. - - Args: - masks: rank 3 float32 tensor with shape - [num_instances, height, width] representing instance masks. - - Returns: - flipped masks: rank 3 float32 tensor with shape - [num_instances, height, width] representing instance masks. - """ - return masks[:, :, ::-1] - - -def _flip_masks_up_down(masks): - """Up-down flip masks. - - Args: - masks: rank 3 float32 tensor with shape - [num_instances, height, width] representing instance masks. - - Returns: - flipped masks: rank 3 float32 tensor with shape - [num_instances, height, width] representing instance masks. - """ - return masks[:, ::-1, :] - - -def _rot90_masks(masks): - """Rotate masks counter-clockwise by 90 degrees. - - Args: - masks: rank 3 float32 tensor with shape - [num_instances, height, width] representing instance masks. - - Returns: - rotated masks: rank 3 float32 tensor with shape - [num_instances, height, width] representing instance masks. - """ - masks = tf.transpose(masks, [0, 2, 1]) - return masks[:, ::-1, :] - - -def random_horizontal_flip(image, - boxes=None, - masks=None, - keypoints=None, - keypoint_flip_permutation=None, - seed=None): - """Randomly flips the image and detections horizontally. - - The probability of flipping the image is 50%. - - Args: - image: rank 3 float32 tensor with shape [height, width, channels]. - boxes: (optional) rank 2 float32 tensor with shape [N, 4] - containing the bounding boxes. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - keypoint_flip_permutation: rank 1 int32 tensor containing the keypoint flip - permutation. - seed: random seed - - Returns: - image: image which is the same shape as input image. - - If boxes, masks, keypoints, and keypoint_flip_permutation are not None, - the function also returns the following tensors. - - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - - Raises: - ValueError: if keypoints are provided but keypoint_flip_permutation is not. - """ - - def _flip_image(image): - # flip image - image_flipped = tf.image.flip_left_right(image) - return image_flipped - - if keypoints is not None and keypoint_flip_permutation is None: - raise ValueError( - 'keypoints are provided but keypoints_flip_permutation is not provided') - - with tf.name_scope('RandomHorizontalFlip', values=[image, boxes]): - result = [] - # random variable defining whether to do flip or not - do_a_flip_random = tf.greater(tf.random_uniform([], seed=seed), 0.5) - - # flip image - image = tf.cond(do_a_flip_random, lambda: _flip_image(image), lambda: image) - result.append(image) - - # flip boxes - if boxes is not None: - boxes = tf.cond(do_a_flip_random, lambda: _flip_boxes_left_right(boxes), - lambda: boxes) - result.append(boxes) - - # flip masks - if masks is not None: - masks = tf.cond(do_a_flip_random, lambda: _flip_masks_left_right(masks), - lambda: masks) - result.append(masks) - - # flip keypoints - if keypoints is not None and keypoint_flip_permutation is not None: - permutation = keypoint_flip_permutation - keypoints = tf.cond( - do_a_flip_random, - lambda: keypoint_ops.flip_horizontal(keypoints, 0.5, permutation), - lambda: keypoints) - result.append(keypoints) - - return tuple(result) - - -def random_vertical_flip(image, - boxes=None, - masks=None, - keypoints=None, - keypoint_flip_permutation=None, - seed=None): - """Randomly flips the image and detections vertically. - - The probability of flipping the image is 50%. - - Args: - image: rank 3 float32 tensor with shape [height, width, channels]. - boxes: (optional) rank 2 float32 tensor with shape [N, 4] - containing the bounding boxes. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - keypoint_flip_permutation: rank 1 int32 tensor containing the keypoint flip - permutation. - seed: random seed - - Returns: - image: image which is the same shape as input image. - - If boxes, masks, keypoints, and keypoint_flip_permutation are not None, - the function also returns the following tensors. - - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - - Raises: - ValueError: if keypoints are provided but keypoint_flip_permutation is not. - """ - - def _flip_image(image): - # flip image - image_flipped = tf.image.flip_up_down(image) - return image_flipped - - if keypoints is not None and keypoint_flip_permutation is None: - raise ValueError( - 'keypoints are provided but keypoints_flip_permutation is not provided') - - with tf.name_scope('RandomVerticalFlip', values=[image, boxes]): - result = [] - # random variable defining whether to do flip or not - do_a_flip_random = tf.greater(tf.random_uniform([], seed=seed), 0.5) - - # flip image - image = tf.cond(do_a_flip_random, lambda: _flip_image(image), lambda: image) - result.append(image) - - # flip boxes - if boxes is not None: - boxes = tf.cond(do_a_flip_random, lambda: _flip_boxes_up_down(boxes), - lambda: boxes) - result.append(boxes) - - # flip masks - if masks is not None: - masks = tf.cond(do_a_flip_random, lambda: _flip_masks_up_down(masks), - lambda: masks) - result.append(masks) - - # flip keypoints - if keypoints is not None and keypoint_flip_permutation is not None: - permutation = keypoint_flip_permutation - keypoints = tf.cond( - do_a_flip_random, - lambda: keypoint_ops.flip_vertical(keypoints, 0.5, permutation), - lambda: keypoints) - result.append(keypoints) - - return tuple(result) - - -def random_rotation90(image, - boxes=None, - masks=None, - keypoints=None, - seed=None): - """Randomly rotates the image and detections 90 degrees counter-clockwise. - - The probability of rotating the image is 50%. This can be combined with - random_horizontal_flip and random_vertical_flip to produce an output with a - uniform distribution of the eight possible 90 degree rotation / reflection - combinations. - - Args: - image: rank 3 float32 tensor with shape [height, width, channels]. - boxes: (optional) rank 2 float32 tensor with shape [N, 4] - containing the bounding boxes. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - seed: random seed - - Returns: - image: image which is the same shape as input image. - - If boxes, masks, and keypoints, are not None, - the function also returns the following tensors. - - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - """ - - def _rot90_image(image): - # flip image - image_rotated = tf.image.rot90(image) - return image_rotated - - with tf.name_scope('RandomRotation90', values=[image, boxes]): - result = [] - - # random variable defining whether to rotate by 90 degrees or not - do_a_rot90_random = tf.greater(tf.random_uniform([], seed=seed), 0.5) - - # flip image - image = tf.cond(do_a_rot90_random, lambda: _rot90_image(image), - lambda: image) - result.append(image) - - # flip boxes - if boxes is not None: - boxes = tf.cond(do_a_rot90_random, lambda: _rot90_boxes(boxes), - lambda: boxes) - result.append(boxes) - - # flip masks - if masks is not None: - masks = tf.cond(do_a_rot90_random, lambda: _rot90_masks(masks), - lambda: masks) - result.append(masks) - - # flip keypoints - if keypoints is not None: - keypoints = tf.cond( - do_a_rot90_random, - lambda: keypoint_ops.rot90(keypoints), - lambda: keypoints) - result.append(keypoints) - - return tuple(result) - - -def random_pixel_value_scale(image, minval=0.9, maxval=1.1, seed=None): - """Scales each value in the pixels of the image. - - This function scales each pixel independent of the other ones. - For each value in image tensor, draws a random number between - minval and maxval and multiples the values with them. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - minval: lower ratio of scaling pixel values. - maxval: upper ratio of scaling pixel values. - seed: random seed. - - Returns: - image: image which is the same shape as input image. - """ - with tf.name_scope('RandomPixelValueScale', values=[image]): - color_coef = tf.random_uniform( - tf.shape(image), - minval=minval, - maxval=maxval, - dtype=tf.float32, - seed=seed) - image = tf.multiply(image, color_coef) - image = tf.clip_by_value(image, 0.0, 1.0) - - return image - - -def random_image_scale(image, - masks=None, - min_scale_ratio=0.5, - max_scale_ratio=2.0, - seed=None): - """Scales the image size. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels]. - masks: (optional) rank 3 float32 tensor containing masks with - size [height, width, num_masks]. The value is set to None if there are no - masks. - min_scale_ratio: minimum scaling ratio. - max_scale_ratio: maximum scaling ratio. - seed: random seed. - - Returns: - image: image which is the same rank as input image. - masks: If masks is not none, resized masks which are the same rank as input - masks will be returned. - """ - with tf.name_scope('RandomImageScale', values=[image]): - result = [] - image_shape = tf.shape(image) - image_height = image_shape[0] - image_width = image_shape[1] - size_coef = tf.random_uniform([], - minval=min_scale_ratio, - maxval=max_scale_ratio, - dtype=tf.float32, seed=seed) - image_newysize = tf.to_int32( - tf.multiply(tf.to_float(image_height), size_coef)) - image_newxsize = tf.to_int32( - tf.multiply(tf.to_float(image_width), size_coef)) - image = tf.image.resize_images( - image, [image_newysize, image_newxsize], align_corners=True) - result.append(image) - if masks: - masks = tf.image.resize_nearest_neighbor( - masks, [image_newysize, image_newxsize], align_corners=True) - result.append(masks) - return tuple(result) - - -def random_rgb_to_gray(image, probability=0.1, seed=None): - """Changes the image from RGB to Grayscale with the given probability. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - probability: the probability of returning a grayscale image. - The probability should be a number between [0, 1]. - seed: random seed. - - Returns: - image: image which is the same shape as input image. - """ - def _image_to_gray(image): - image_gray1 = tf.image.rgb_to_grayscale(image) - image_gray3 = tf.image.grayscale_to_rgb(image_gray1) - return image_gray3 - - with tf.name_scope('RandomRGBtoGray', values=[image]): - # random variable defining whether to do flip or not - do_gray_random = tf.random_uniform([], seed=seed) - - image = tf.cond( - tf.greater(do_gray_random, probability), lambda: image, - lambda: _image_to_gray(image)) - - return image - - -def random_adjust_brightness(image, max_delta=0.2): - """Randomly adjusts brightness. - - Makes sure the output image is still between 0 and 1. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - max_delta: how much to change the brightness. A value between [0, 1). - - Returns: - image: image which is the same shape as input image. - boxes: boxes which is the same shape as input boxes. - """ - with tf.name_scope('RandomAdjustBrightness', values=[image]): - image = tf.image.random_brightness(image, max_delta) - image = tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0) - return image - - -def random_adjust_contrast(image, min_delta=0.8, max_delta=1.25): - """Randomly adjusts contrast. - - Makes sure the output image is still between 0 and 1. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - min_delta: see max_delta. - max_delta: how much to change the contrast. Contrast will change with a - value between min_delta and max_delta. This value will be - multiplied to the current contrast of the image. - - Returns: - image: image which is the same shape as input image. - """ - with tf.name_scope('RandomAdjustContrast', values=[image]): - image = tf.image.random_contrast(image, min_delta, max_delta) - image = tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0) - return image - - -def random_adjust_hue(image, max_delta=0.02): - """Randomly adjusts hue. - - Makes sure the output image is still between 0 and 1. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - max_delta: change hue randomly with a value between 0 and max_delta. - - Returns: - image: image which is the same shape as input image. - """ - with tf.name_scope('RandomAdjustHue', values=[image]): - image = tf.image.random_hue(image, max_delta) - image = tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0) - return image - - -def random_adjust_saturation(image, min_delta=0.8, max_delta=1.25): - """Randomly adjusts saturation. - - Makes sure the output image is still between 0 and 1. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - min_delta: see max_delta. - max_delta: how much to change the saturation. Saturation will change with a - value between min_delta and max_delta. This value will be - multiplied to the current saturation of the image. - - Returns: - image: image which is the same shape as input image. - """ - with tf.name_scope('RandomAdjustSaturation', values=[image]): - image = tf.image.random_saturation(image, min_delta, max_delta) - image = tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0) - return image - - -def random_distort_color(image, color_ordering=0): - """Randomly distorts color. - - Randomly distorts color using a combination of brightness, hue, contrast - and saturation changes. Makes sure the output image is still between 0 and 1. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - color_ordering: Python int, a type of distortion (valid values: 0, 1). - - Returns: - image: image which is the same shape as input image. - - Raises: - ValueError: if color_ordering is not in {0, 1}. - """ - with tf.name_scope('RandomDistortColor', values=[image]): - if color_ordering == 0: - image = tf.image.random_brightness(image, max_delta=32. / 255.) - image = tf.image.random_saturation(image, lower=0.5, upper=1.5) - image = tf.image.random_hue(image, max_delta=0.2) - image = tf.image.random_contrast(image, lower=0.5, upper=1.5) - elif color_ordering == 1: - image = tf.image.random_brightness(image, max_delta=32. / 255.) - image = tf.image.random_contrast(image, lower=0.5, upper=1.5) - image = tf.image.random_saturation(image, lower=0.5, upper=1.5) - image = tf.image.random_hue(image, max_delta=0.2) - else: - raise ValueError('color_ordering must be in {0, 1}') - - # The random_* ops do not necessarily clamp. - image = tf.clip_by_value(image, 0.0, 1.0) - return image - - -def random_jitter_boxes(boxes, ratio=0.05, seed=None): - """Randomly jitter boxes in image. - - Args: - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - ratio: The ratio of the box width and height that the corners can jitter. - For example if the width is 100 pixels and ratio is 0.05, - the corners can jitter up to 5 pixels in the x direction. - seed: random seed. - - Returns: - boxes: boxes which is the same shape as input boxes. - """ - def random_jitter_box(box, ratio, seed): - """Randomly jitter box. - - Args: - box: bounding box [1, 1, 4]. - ratio: max ratio between jittered box and original box, - a number between [0, 0.5]. - seed: random seed. - - Returns: - jittered_box: jittered box. - """ - rand_numbers = tf.random_uniform( - [1, 1, 4], minval=-ratio, maxval=ratio, dtype=tf.float32, seed=seed) - box_width = tf.subtract(box[0, 0, 3], box[0, 0, 1]) - box_height = tf.subtract(box[0, 0, 2], box[0, 0, 0]) - hw_coefs = tf.stack([box_height, box_width, box_height, box_width]) - hw_rand_coefs = tf.multiply(hw_coefs, rand_numbers) - jittered_box = tf.add(box, hw_rand_coefs) - jittered_box = tf.clip_by_value(jittered_box, 0.0, 1.0) - return jittered_box - - with tf.name_scope('RandomJitterBoxes', values=[boxes]): - # boxes are [N, 4]. Lets first make them [N, 1, 1, 4] - boxes_shape = tf.shape(boxes) - boxes = tf.expand_dims(boxes, 1) - boxes = tf.expand_dims(boxes, 2) - - distorted_boxes = tf.map_fn( - lambda x: random_jitter_box(x, ratio, seed), boxes, dtype=tf.float32) - - distorted_boxes = tf.reshape(distorted_boxes, boxes_shape) - - return distorted_boxes - - -def _strict_random_crop_image(image, - boxes, - labels, - label_scores=None, - masks=None, - keypoints=None, - min_object_covered=1.0, - aspect_ratio_range=(0.75, 1.33), - area_range=(0.1, 1.0), - overlap_thresh=0.3): - """Performs random crop. - - Note: boxes will be clipped to the crop. Keypoint coordinates that are - outside the crop will be set to NaN, which is consistent with the original - keypoint encoding for non-existing keypoints. This function always crops - the image and is supposed to be used by `random_crop_image` function which - sometimes returns image unchanged. - - Args: - image: rank 3 float32 tensor containing 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes with shape - [num_instances, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: (optional) float32 tensor of shape [num_instances] - representing the score for each box. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio_range: allowed range for aspect ratio of cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - - Returns: - image: image which is the same rank as input image. - boxes: boxes which is the same rank as input boxes. - Boxes are in normalized form. - labels: new labels. - - If label_scores, masks, or keypoints is not None, the function also returns: - label_scores: rank 1 float32 tensor with shape [num_instances]. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - """ - with tf.name_scope('RandomCropImage', values=[image, boxes]): - image_shape = tf.shape(image) - - # boxes are [N, 4]. Lets first make them [N, 1, 4]. - boxes_expanded = tf.expand_dims( - tf.clip_by_value( - boxes, clip_value_min=0.0, clip_value_max=1.0), 1) - - sample_distorted_bounding_box = tf.image.sample_distorted_bounding_box( - image_shape, - bounding_boxes=boxes_expanded, - min_object_covered=min_object_covered, - aspect_ratio_range=aspect_ratio_range, - area_range=area_range, - max_attempts=100, - use_image_if_no_bounding_boxes=True) - - im_box_begin, im_box_size, im_box = sample_distorted_bounding_box - - new_image = tf.slice(image, im_box_begin, im_box_size) - new_image.set_shape([None, None, image.get_shape()[2]]) - - # [1, 4] - im_box_rank2 = tf.squeeze(im_box, squeeze_dims=[0]) - # [4] - im_box_rank1 = tf.squeeze(im_box) - - boxlist = box_list.BoxList(boxes) - boxlist.add_field('labels', labels) - - if label_scores is not None: - boxlist.add_field('label_scores', label_scores) - - im_boxlist = box_list.BoxList(im_box_rank2) - - # remove boxes that are outside cropped image - boxlist, inside_window_ids = box_list_ops.prune_completely_outside_window( - boxlist, im_box_rank1) - - # remove boxes that are outside image - overlapping_boxlist, keep_ids = box_list_ops.prune_non_overlapping_boxes( - boxlist, im_boxlist, overlap_thresh) - - # change the coordinate of the remaining boxes - new_labels = overlapping_boxlist.get_field('labels') - new_boxlist = box_list_ops.change_coordinate_frame(overlapping_boxlist, - im_box_rank1) - new_boxes = new_boxlist.get() - new_boxes = tf.clip_by_value( - new_boxes, clip_value_min=0.0, clip_value_max=1.0) - - result = [new_image, new_boxes, new_labels] - - if label_scores is not None: - new_label_scores = overlapping_boxlist.get_field('label_scores') - result.append(new_label_scores) - - if masks is not None: - masks_of_boxes_inside_window = tf.gather(masks, inside_window_ids) - masks_of_boxes_completely_inside_window = tf.gather( - masks_of_boxes_inside_window, keep_ids) - masks_box_begin = [0, im_box_begin[0], im_box_begin[1]] - masks_box_size = [-1, im_box_size[0], im_box_size[1]] - new_masks = tf.slice( - masks_of_boxes_completely_inside_window, - masks_box_begin, masks_box_size) - result.append(new_masks) - - if keypoints is not None: - keypoints_of_boxes_inside_window = tf.gather(keypoints, inside_window_ids) - keypoints_of_boxes_completely_inside_window = tf.gather( - keypoints_of_boxes_inside_window, keep_ids) - new_keypoints = keypoint_ops.change_coordinate_frame( - keypoints_of_boxes_completely_inside_window, im_box_rank1) - new_keypoints = keypoint_ops.prune_outside_window(new_keypoints, - [0.0, 0.0, 1.0, 1.0]) - result.append(new_keypoints) - - return tuple(result) - - -def random_crop_image(image, - boxes, - labels, - label_scores=None, - masks=None, - keypoints=None, - min_object_covered=1.0, - aspect_ratio_range=(0.75, 1.33), - area_range=(0.1, 1.0), - overlap_thresh=0.3, - random_coef=0.0, - seed=None): - """Randomly crops the image. - - Given the input image and its bounding boxes, this op randomly - crops a subimage. Given a user-provided set of input constraints, - the crop window is resampled until it satisfies these constraints. - If within 100 trials it is unable to find a valid crop, the original - image is returned. See the Args section for a description of the input - constraints. Both input boxes and returned Boxes are in normalized - form (e.g., lie in the unit square [0, 1]). - This function will return the original image with probability random_coef. - - Note: boxes will be clipped to the crop. Keypoint coordinates that are - outside the crop will be set to NaN, which is consistent with the original - keypoint encoding for non-existing keypoints. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes with shape - [num_instances, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: (optional) float32 tensor of shape [num_instances]. - representing the score for each box. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio_range: allowed range for aspect ratio of cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - random_coef: a random coefficient that defines the chance of getting the - original image. If random_coef is 0, we will always get the - cropped image, and if it is 1.0, we will always get the - original image. - seed: random seed. - - Returns: - image: Image shape will be [new_height, new_width, channels]. - boxes: boxes which is the same rank as input boxes. Boxes are in normalized - form. - labels: new labels. - - If label_scores, masks, or keypoints are not None, the function also - returns: - label_scores: new scores. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - """ - - def strict_random_crop_image_fn(): - return _strict_random_crop_image( - image, - boxes, - labels, - label_scores=label_scores, - masks=masks, - keypoints=keypoints, - min_object_covered=min_object_covered, - aspect_ratio_range=aspect_ratio_range, - area_range=area_range, - overlap_thresh=overlap_thresh) - - # avoids tf.cond to make faster RCNN training on borg. See b/140057645. - if random_coef < sys.float_info.min: - result = strict_random_crop_image_fn() - else: - do_a_crop_random = tf.random_uniform([], seed=seed) - do_a_crop_random = tf.greater(do_a_crop_random, random_coef) - - outputs = [image, boxes, labels] - - if label_scores is not None: - outputs.append(label_scores) - if masks is not None: - outputs.append(masks) - if keypoints is not None: - outputs.append(keypoints) - - result = tf.cond(do_a_crop_random, strict_random_crop_image_fn, - lambda: tuple(outputs)) - return result - - -def random_pad_image(image, - boxes, - min_image_size=None, - max_image_size=None, - pad_color=None, - seed=None): - """Randomly pads the image. - - This function randomly pads the image with zeros. The final size of the - padded image will be between min_image_size and max_image_size. - if min_image_size is smaller than the input image size, min_image_size will - be set to the input image size. The same for max_image_size. The input image - will be located at a uniformly random location inside the padded image. - The relative location of the boxes to the original image will remain the same. - - Args: - image: rank 3 float32 tensor containing 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - min_image_size: a tensor of size [min_height, min_width], type tf.int32. - If passed as None, will be set to image size - [height, width]. - max_image_size: a tensor of size [max_height, max_width], type tf.int32. - If passed as None, will be set to twice the - image [height * 2, width * 2]. - pad_color: padding color. A rank 1 tensor of [3] with dtype=tf.float32. - if set as None, it will be set to average color of the input - image. - - seed: random seed. - - Returns: - image: Image shape will be [new_height, new_width, channels]. - boxes: boxes which is the same rank as input boxes. Boxes are in normalized - form. - """ - if pad_color is None: - pad_color = tf.reduce_mean(image, axis=[0, 1]) - - image_shape = tf.shape(image) - image_height = image_shape[0] - image_width = image_shape[1] - - if max_image_size is None: - max_image_size = tf.stack([image_height * 2, image_width * 2]) - max_image_size = tf.maximum(max_image_size, - tf.stack([image_height, image_width])) - - if min_image_size is None: - min_image_size = tf.stack([image_height, image_width]) - min_image_size = tf.maximum(min_image_size, - tf.stack([image_height, image_width])) - - target_height = tf.cond( - max_image_size[0] > min_image_size[0], - lambda: _random_integer(min_image_size[0], max_image_size[0], seed), - lambda: max_image_size[0]) - - target_width = tf.cond( - max_image_size[1] > min_image_size[1], - lambda: _random_integer(min_image_size[1], max_image_size[1], seed), - lambda: max_image_size[1]) - - offset_height = tf.cond( - target_height > image_height, - lambda: _random_integer(0, target_height - image_height, seed), - lambda: tf.constant(0, dtype=tf.int32)) - - offset_width = tf.cond( - target_width > image_width, - lambda: _random_integer(0, target_width - image_width, seed), - lambda: tf.constant(0, dtype=tf.int32)) - - new_image = tf.image.pad_to_bounding_box( - image, - offset_height=offset_height, - offset_width=offset_width, - target_height=target_height, - target_width=target_width) - - # Setting color of the padded pixels - image_ones = tf.ones_like(image) - image_ones_padded = tf.image.pad_to_bounding_box( - image_ones, - offset_height=offset_height, - offset_width=offset_width, - target_height=target_height, - target_width=target_width) - image_color_padded = (1.0 - image_ones_padded) * pad_color - new_image += image_color_padded - - # setting boxes - new_window = tf.to_float( - tf.stack([ - -offset_height, -offset_width, target_height - offset_height, - target_width - offset_width - ])) - new_window /= tf.to_float( - tf.stack([image_height, image_width, image_height, image_width])) - boxlist = box_list.BoxList(boxes) - new_boxlist = box_list_ops.change_coordinate_frame(boxlist, new_window) - new_boxes = new_boxlist.get() - - return new_image, new_boxes - - -def random_crop_pad_image(image, - boxes, - labels, - label_scores=None, - min_object_covered=1.0, - aspect_ratio_range=(0.75, 1.33), - area_range=(0.1, 1.0), - overlap_thresh=0.3, - random_coef=0.0, - min_padded_size_ratio=(1.0, 1.0), - max_padded_size_ratio=(2.0, 2.0), - pad_color=None, - seed=None): - """Randomly crops and pads the image. - - Given an input image and its bounding boxes, this op first randomly crops - the image and then randomly pads the image with background values. Parameters - min_padded_size_ratio and max_padded_size_ratio, determine the range of the - final output image size. Specifically, the final image size will have a size - in the range of min_padded_size_ratio * tf.shape(image) and - max_padded_size_ratio * tf.shape(image). Note that these ratios are with - respect to the size of the original image, so we can't capture the same - effect easily by independently applying RandomCropImage - followed by RandomPadImage. - - Args: - image: rank 3 float32 tensor containing 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: rank 1 float32 containing the label scores. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio_range: allowed range for aspect ratio of cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - random_coef: a random coefficient that defines the chance of getting the - original image. If random_coef is 0, we will always get the - cropped image, and if it is 1.0, we will always get the - original image. - min_padded_size_ratio: min ratio of padded image height and width to the - input image's height and width. - max_padded_size_ratio: max ratio of padded image height and width to the - input image's height and width. - pad_color: padding color. A rank 1 tensor of [3] with dtype=tf.float32. - if set as None, it will be set to average color of the randomly - cropped image. - seed: random seed. - - Returns: - padded_image: padded image. - padded_boxes: boxes which is the same rank as input boxes. Boxes are in - normalized form. - cropped_labels: cropped labels. - if label_scores is not None also returns: - cropped_label_scores: cropped label scores. - """ - image_size = tf.shape(image) - image_height = image_size[0] - image_width = image_size[1] - result = random_crop_image( - image=image, - boxes=boxes, - labels=labels, - label_scores=label_scores, - min_object_covered=min_object_covered, - aspect_ratio_range=aspect_ratio_range, - area_range=area_range, - overlap_thresh=overlap_thresh, - random_coef=random_coef, - seed=seed) - - cropped_image, cropped_boxes, cropped_labels = result[:3] - - min_image_size = tf.to_int32( - tf.to_float(tf.stack([image_height, image_width])) * - min_padded_size_ratio) - max_image_size = tf.to_int32( - tf.to_float(tf.stack([image_height, image_width])) * - max_padded_size_ratio) - - padded_image, padded_boxes = random_pad_image( - cropped_image, - cropped_boxes, - min_image_size=min_image_size, - max_image_size=max_image_size, - pad_color=pad_color, - seed=seed) - - cropped_padded_output = (padded_image, padded_boxes, cropped_labels) - - if label_scores is not None: - cropped_label_scores = result[3] - cropped_padded_output += (cropped_label_scores,) - - return cropped_padded_output - - -def random_crop_to_aspect_ratio(image, - boxes, - labels, - label_scores=None, - masks=None, - keypoints=None, - aspect_ratio=1.0, - overlap_thresh=0.3, - seed=None): - """Randomly crops an image to the specified aspect ratio. - - Randomly crops the a portion of the image such that the crop is of the - specified aspect ratio, and the crop is as large as possible. If the specified - aspect ratio is larger than the aspect ratio of the image, this op will - randomly remove rows from the top and bottom of the image. If the specified - aspect ratio is less than the aspect ratio of the image, this op will randomly - remove cols from the left and right of the image. If the specified aspect - ratio is the same as the aspect ratio of the image, this op will return the - image. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: (optional) float32 tensor of shape [num_instances] - representing the score for each box. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - aspect_ratio: the aspect ratio of cropped image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - seed: random seed. - - Returns: - image: image which is the same rank as input image. - boxes: boxes which is the same rank as input boxes. - Boxes are in normalized form. - labels: new labels. - - If label_scores, masks, or keypoints is not None, the function also returns: - label_scores: new label scores. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - - Raises: - ValueError: If image is not a 3D tensor. - """ - if len(image.get_shape()) != 3: - raise ValueError('Image should be 3D tensor') - - with tf.name_scope('RandomCropToAspectRatio', values=[image]): - image_shape = tf.shape(image) - orig_height = image_shape[0] - orig_width = image_shape[1] - orig_aspect_ratio = tf.to_float(orig_width) / tf.to_float(orig_height) - new_aspect_ratio = tf.constant(aspect_ratio, dtype=tf.float32) - def target_height_fn(): - return tf.to_int32(tf.round(tf.to_float(orig_width) / new_aspect_ratio)) - - target_height = tf.cond(orig_aspect_ratio >= new_aspect_ratio, - lambda: orig_height, target_height_fn) - - def target_width_fn(): - return tf.to_int32(tf.round(tf.to_float(orig_height) * new_aspect_ratio)) - - target_width = tf.cond(orig_aspect_ratio <= new_aspect_ratio, - lambda: orig_width, target_width_fn) - - # either offset_height = 0 and offset_width is randomly chosen from - # [0, offset_width - target_width), or else offset_width = 0 and - # offset_height is randomly chosen from [0, offset_height - target_height) - offset_height = _random_integer(0, orig_height - target_height + 1, seed) - offset_width = _random_integer(0, orig_width - target_width + 1, seed) - new_image = tf.image.crop_to_bounding_box( - image, offset_height, offset_width, target_height, target_width) - - im_box = tf.stack([ - tf.to_float(offset_height) / tf.to_float(orig_height), - tf.to_float(offset_width) / tf.to_float(orig_width), - tf.to_float(offset_height + target_height) / tf.to_float(orig_height), - tf.to_float(offset_width + target_width) / tf.to_float(orig_width) - ]) - - boxlist = box_list.BoxList(boxes) - boxlist.add_field('labels', labels) - - if label_scores is not None: - boxlist.add_field('label_scores', label_scores) - - im_boxlist = box_list.BoxList(tf.expand_dims(im_box, 0)) - - # remove boxes whose overlap with the image is less than overlap_thresh - overlapping_boxlist, keep_ids = box_list_ops.prune_non_overlapping_boxes( - boxlist, im_boxlist, overlap_thresh) - - # change the coordinate of the remaining boxes - new_labels = overlapping_boxlist.get_field('labels') - new_boxlist = box_list_ops.change_coordinate_frame(overlapping_boxlist, - im_box) - new_boxlist = box_list_ops.clip_to_window(new_boxlist, - tf.constant([0.0, 0.0, 1.0, 1.0], - tf.float32)) - new_boxes = new_boxlist.get() - - result = [new_image, new_boxes, new_labels] - - if label_scores is not None: - new_label_scores = overlapping_boxlist.get_field('label_scores') - result.append(new_label_scores) - - if masks is not None: - masks_inside_window = tf.gather(masks, keep_ids) - masks_box_begin = tf.stack([0, offset_height, offset_width]) - masks_box_size = tf.stack([-1, target_height, target_width]) - new_masks = tf.slice(masks_inside_window, masks_box_begin, masks_box_size) - result.append(new_masks) - - if keypoints is not None: - keypoints_inside_window = tf.gather(keypoints, keep_ids) - new_keypoints = keypoint_ops.change_coordinate_frame( - keypoints_inside_window, im_box) - new_keypoints = keypoint_ops.prune_outside_window(new_keypoints, - [0.0, 0.0, 1.0, 1.0]) - result.append(new_keypoints) - - return tuple(result) - - -def random_pad_to_aspect_ratio(image, - boxes, - masks=None, - keypoints=None, - aspect_ratio=1.0, - min_padded_size_ratio=(1.0, 1.0), - max_padded_size_ratio=(2.0, 2.0), - seed=None): - """Randomly zero pads an image to the specified aspect ratio. - - Pads the image so that the resulting image will have the specified aspect - ratio without scaling less than the min_padded_size_ratio or more than the - max_padded_size_ratio. If the min_padded_size_ratio or max_padded_size_ratio - is lower than what is possible to maintain the aspect ratio, then this method - will use the least padding to achieve the specified aspect ratio. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - aspect_ratio: aspect ratio of the final image. - min_padded_size_ratio: min ratio of padded image height and width to the - input image's height and width. - max_padded_size_ratio: max ratio of padded image height and width to the - input image's height and width. - seed: random seed. - - Returns: - image: image which is the same rank as input image. - boxes: boxes which is the same rank as input boxes. - Boxes are in normalized form. - labels: new labels. - - If label_scores, masks, or keypoints is not None, the function also returns: - label_scores: new label scores. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - - Raises: - ValueError: If image is not a 3D tensor. - """ - if len(image.get_shape()) != 3: - raise ValueError('Image should be 3D tensor') - - with tf.name_scope('RandomPadToAspectRatio', values=[image]): - image_shape = tf.shape(image) - image_height = tf.to_float(image_shape[0]) - image_width = tf.to_float(image_shape[1]) - image_aspect_ratio = image_width / image_height - new_aspect_ratio = tf.constant(aspect_ratio, dtype=tf.float32) - target_height = tf.cond( - image_aspect_ratio <= new_aspect_ratio, - lambda: image_height, - lambda: image_width / new_aspect_ratio) - target_width = tf.cond( - image_aspect_ratio >= new_aspect_ratio, - lambda: image_width, - lambda: image_height * new_aspect_ratio) - - min_height = tf.maximum( - min_padded_size_ratio[0] * image_height, target_height) - min_width = tf.maximum( - min_padded_size_ratio[1] * image_width, target_width) - max_height = tf.maximum( - max_padded_size_ratio[0] * image_height, target_height) - max_width = tf.maximum( - max_padded_size_ratio[1] * image_width, target_width) - - min_scale = tf.maximum(min_height / target_height, min_width / target_width) - max_scale = tf.minimum(max_height / target_height, max_width / target_width) - scale = tf.random_uniform([], min_scale, max_scale, seed=seed) - - target_height = scale * target_height - target_width = scale * target_width - - new_image = tf.image.pad_to_bounding_box( - image, 0, 0, tf.to_int32(target_height), tf.to_int32(target_width)) - - im_box = tf.stack([ - 0.0, - 0.0, - target_height / image_height, - target_width / image_width - ]) - boxlist = box_list.BoxList(boxes) - new_boxlist = box_list_ops.change_coordinate_frame(boxlist, im_box) - new_boxes = new_boxlist.get() - - result = [new_image, new_boxes] - - if masks is not None: - new_masks = tf.expand_dims(masks, -1) - new_masks = tf.image.pad_to_bounding_box(new_masks, 0, 0, - tf.to_int32(target_height), - tf.to_int32(target_width)) - new_masks = tf.squeeze(new_masks, [-1]) - result.append(new_masks) - - if keypoints is not None: - new_keypoints = keypoint_ops.change_coordinate_frame(keypoints, im_box) - result.append(new_keypoints) - - return tuple(result) - - -def random_black_patches(image, - max_black_patches=10, - probability=0.5, - size_to_image_ratio=0.1, - random_seed=None): - """Randomly adds some black patches to the image. - - This op adds up to max_black_patches square black patches of a fixed size - to the image where size is specified via the size_to_image_ratio parameter. - - Args: - image: rank 3 float32 tensor containing 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - max_black_patches: number of times that the function tries to add a - black box to the image. - probability: at each try, what is the chance of adding a box. - size_to_image_ratio: Determines the ratio of the size of the black patches - to the size of the image. - box_size = size_to_image_ratio * - min(image_width, image_height) - random_seed: random seed. - - Returns: - image - """ - def add_black_patch_to_image(image): - """Function for adding one patch to the image. - - Args: - image: image - - Returns: - image with a randomly added black box - """ - image_shape = tf.shape(image) - image_height = image_shape[0] - image_width = image_shape[1] - box_size = tf.to_int32( - tf.multiply( - tf.minimum(tf.to_float(image_height), tf.to_float(image_width)), - size_to_image_ratio)) - normalized_y_min = tf.random_uniform( - [], minval=0.0, maxval=(1.0 - size_to_image_ratio), seed=random_seed) - normalized_x_min = tf.random_uniform( - [], minval=0.0, maxval=(1.0 - size_to_image_ratio), seed=random_seed) - y_min = tf.to_int32(normalized_y_min * tf.to_float(image_height)) - x_min = tf.to_int32(normalized_x_min * tf.to_float(image_width)) - black_box = tf.ones([box_size, box_size, 3], dtype=tf.float32) - mask = 1.0 - tf.image.pad_to_bounding_box(black_box, y_min, x_min, - image_height, image_width) - image = tf.multiply(image, mask) - return image - - with tf.name_scope('RandomBlackPatchInImage', values=[image]): - for _ in range(max_black_patches): - random_prob = tf.random_uniform( - [], minval=0.0, maxval=1.0, dtype=tf.float32, seed=random_seed) - image = tf.cond( - tf.greater(random_prob, probability), lambda: image, - lambda: add_black_patch_to_image(image)) - - return image - - -def image_to_float(image): - """Used in Faster R-CNN. Casts image pixel values to float. - - Args: - image: input image which might be in tf.uint8 or sth else format - - Returns: - image: image in tf.float32 format. - """ - with tf.name_scope('ImageToFloat', values=[image]): - image = tf.to_float(image) - return image - - -def random_resize_method(image, target_size): - """Uses a random resize method to resize the image to target size. - - Args: - image: a rank 3 tensor. - target_size: a list of [target_height, target_width] - - Returns: - resized image. - """ - - resized_image = _apply_with_random_selector( - image, - lambda x, method: tf.image.resize_images(x, target_size, method), - num_cases=4) - - return resized_image - - -def _compute_new_static_size(image, min_dimension, max_dimension): - """Compute new static shape for resize_to_range method.""" - image_shape = image.get_shape().as_list() - orig_height = image_shape[0] - orig_width = image_shape[1] - orig_min_dim = min(orig_height, orig_width) - # Calculates the larger of the possible sizes - large_scale_factor = min_dimension / float(orig_min_dim) - # Scaling orig_(height|width) by large_scale_factor will make the smaller - # dimension equal to min_dimension, save for floating point rounding errors. - # For reasonably-sized images, taking the nearest integer will reliably - # eliminate this error. - large_height = int(round(orig_height * large_scale_factor)) - large_width = int(round(orig_width * large_scale_factor)) - large_size = [large_height, large_width] - if max_dimension: - # Calculates the smaller of the possible sizes, use that if the larger - # is too big. - orig_max_dim = max(orig_height, orig_width) - small_scale_factor = max_dimension / float(orig_max_dim) - # Scaling orig_(height|width) by small_scale_factor will make the larger - # dimension equal to max_dimension, save for floating point rounding - # errors. For reasonably-sized images, taking the nearest integer will - # reliably eliminate this error. - small_height = int(round(orig_height * small_scale_factor)) - small_width = int(round(orig_width * small_scale_factor)) - small_size = [small_height, small_width] - new_size = large_size - if max(large_size) > max_dimension: - new_size = small_size - else: - new_size = large_size - return tf.constant(new_size) - - -def _compute_new_dynamic_size(image, min_dimension, max_dimension): - """Compute new dynamic shape for resize_to_range method.""" - image_shape = tf.shape(image) - orig_height = tf.to_float(image_shape[0]) - orig_width = tf.to_float(image_shape[1]) - orig_min_dim = tf.minimum(orig_height, orig_width) - # Calculates the larger of the possible sizes - min_dimension = tf.constant(min_dimension, dtype=tf.float32) - large_scale_factor = min_dimension / orig_min_dim - # Scaling orig_(height|width) by large_scale_factor will make the smaller - # dimension equal to min_dimension, save for floating point rounding errors. - # For reasonably-sized images, taking the nearest integer will reliably - # eliminate this error. - large_height = tf.to_int32(tf.round(orig_height * large_scale_factor)) - large_width = tf.to_int32(tf.round(orig_width * large_scale_factor)) - large_size = tf.stack([large_height, large_width]) - if max_dimension: - # Calculates the smaller of the possible sizes, use that if the larger - # is too big. - orig_max_dim = tf.maximum(orig_height, orig_width) - max_dimension = tf.constant(max_dimension, dtype=tf.float32) - small_scale_factor = max_dimension / orig_max_dim - # Scaling orig_(height|width) by small_scale_factor will make the larger - # dimension equal to max_dimension, save for floating point rounding - # errors. For reasonably-sized images, taking the nearest integer will - # reliably eliminate this error. - small_height = tf.to_int32(tf.round(orig_height * small_scale_factor)) - small_width = tf.to_int32(tf.round(orig_width * small_scale_factor)) - small_size = tf.stack([small_height, small_width]) - new_size = tf.cond( - tf.to_float(tf.reduce_max(large_size)) > max_dimension, - lambda: small_size, lambda: large_size) - else: - new_size = large_size - return new_size - - -def resize_to_range(image, - masks=None, - min_dimension=None, - max_dimension=None, - method=tf.image.ResizeMethod.BILINEAR, - align_corners=False): - """Resizes an image so its dimensions are within the provided value. - - The output size can be described by two cases: - 1. If the image can be rescaled so its minimum dimension is equal to the - provided value without the other dimension exceeding max_dimension, - then do so. - 2. Otherwise, resize so the largest dimension is equal to max_dimension. - - Args: - image: A 3D tensor of shape [height, width, channels] - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. - min_dimension: (optional) (scalar) desired size of the smaller image - dimension. - max_dimension: (optional) (scalar) maximum allowed size - of the larger image dimension. - method: (optional) interpolation method used in resizing. Defaults to - BILINEAR. - align_corners: bool. If true, exactly align all 4 corners of the input - and output. Defaults to False. - - Returns: - A 3D tensor of shape [new_height, new_width, channels], - where the image has been resized (with bilinear interpolation) so that - min(new_height, new_width) == min_dimension or - max(new_height, new_width) == max_dimension. - - If masks is not None, also outputs masks: - A 3D tensor of shape [num_instances, new_height, new_width] - - Raises: - ValueError: if the image is not a 3D tensor. - """ - if len(image.get_shape()) != 3: - raise ValueError('Image should be 3D tensor') - - with tf.name_scope('ResizeToRange', values=[image, min_dimension]): - if image.get_shape().is_fully_defined(): - new_size = _compute_new_static_size(image, min_dimension, max_dimension) - else: - new_size = _compute_new_dynamic_size(image, min_dimension, max_dimension) - new_image = tf.image.resize_images( - image, new_size, method=method, align_corners=align_corners) - - result = new_image - if masks is not None: - new_masks = tf.expand_dims(masks, 3) - new_masks = tf.image.resize_nearest_neighbor( - new_masks, new_size, align_corners=align_corners) - new_masks = tf.squeeze(new_masks, 3) - result = [new_image, new_masks] - - return result - - -# TODO: Make sure the static shapes are preserved. -def resize_to_min_dimension(image, masks=None, min_dimension=600): - """Resizes image and masks given the min size maintaining the aspect ratio. - - If one of the image dimensions is smaller that min_dimension, it will scale - the image such that its smallest dimension is equal to min_dimension. - Otherwise, will keep the image size as is. - - Args: - image: a tensor of size [height, width, channels]. - masks: (optional) a tensors of size [num_instances, height, width]. - min_dimension: minimum image dimension. - - Returns: - a tuple containing the following: - Resized image. A tensor of size [new_height, new_width, channels]. - (optional) Resized masks. A tensor of - size [num_instances, new_height, new_width]. - - Raises: - ValueError: if the image is not a 3D tensor. - """ - if len(image.get_shape()) != 3: - raise ValueError('Image should be 3D tensor') - - with tf.name_scope('ResizeGivenMinDimension', values=[image, min_dimension]): - image_height = tf.shape(image)[0] - image_width = tf.shape(image)[1] - min_image_dimension = tf.minimum(image_height, image_width) - min_target_dimension = tf.maximum(min_image_dimension, min_dimension) - target_ratio = tf.to_float(min_target_dimension) / tf.to_float( - min_image_dimension) - target_height = tf.to_int32(tf.to_float(image_height) * target_ratio) - target_width = tf.to_int32(tf.to_float(image_width) * target_ratio) - image = tf.image.resize_bilinear( - tf.expand_dims(image, axis=0), - size=[target_height, target_width], - align_corners=True) - result = tf.squeeze(image, axis=0) - if masks is not None: - masks = tf.image.resize_nearest_neighbor( - tf.expand_dims(masks, axis=3), - size=[target_height, target_width], - align_corners=True) - result = (result, tf.squeeze(masks, axis=3)) - return result - - -def scale_boxes_to_pixel_coordinates(image, boxes, keypoints=None): - """Scales boxes from normalized to pixel coordinates. - - Args: - image: A 3D float32 tensor of shape [height, width, channels]. - boxes: A 2D float32 tensor of shape [num_boxes, 4] containing the bounding - boxes in normalized coordinates. Each row is of the form - [ymin, xmin, ymax, xmax]. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x normalized - coordinates. - - Returns: - image: unchanged input image. - scaled_boxes: a 2D float32 tensor of shape [num_boxes, 4] containing the - bounding boxes in pixel coordinates. - scaled_keypoints: a 3D float32 tensor with shape - [num_instances, num_keypoints, 2] containing the keypoints in pixel - coordinates. - """ - boxlist = box_list.BoxList(boxes) - image_height = tf.shape(image)[0] - image_width = tf.shape(image)[1] - scaled_boxes = box_list_ops.scale(boxlist, image_height, image_width).get() - result = [image, scaled_boxes] - if keypoints is not None: - scaled_keypoints = keypoint_ops.scale(keypoints, image_height, image_width) - result.append(scaled_keypoints) - return tuple(result) - - -# pylint: disable=g-doc-return-or-yield -def resize_image(image, - masks=None, - new_height=600, - new_width=1024, - method=tf.image.ResizeMethod.BILINEAR, - align_corners=False): - """See `tf.image.resize_images` for detailed doc.""" - with tf.name_scope( - 'ResizeImage', - values=[image, new_height, new_width, method, align_corners]): - new_image = tf.image.resize_images( - image, [new_height, new_width], - method=method, - align_corners=align_corners) - result = new_image - if masks is not None: - num_instances = tf.shape(masks)[0] - new_size = tf.constant([new_height, new_width], dtype=tf.int32) - def resize_masks_branch(): - new_masks = tf.expand_dims(masks, 3) - new_masks = tf.image.resize_nearest_neighbor( - new_masks, new_size, align_corners=align_corners) - new_masks = tf.squeeze(new_masks, axis=3) - return new_masks - - def reshape_masks_branch(): - new_masks = tf.reshape(masks, [0, new_size[0], new_size[1]]) - return new_masks - - masks = tf.cond(num_instances > 0, resize_masks_branch, - reshape_masks_branch) - result = [new_image, masks] - - return result - - -def subtract_channel_mean(image, means=None): - """Normalizes an image by subtracting a mean from each channel. - - Args: - image: A 3D tensor of shape [height, width, channels] - means: float list containing a mean for each channel - Returns: - normalized_images: a tensor of shape [height, width, channels] - Raises: - ValueError: if images is not a 4D tensor or if the number of means is not - equal to the number of channels. - """ - with tf.name_scope('SubtractChannelMean', values=[image, means]): - if len(image.get_shape()) != 3: - raise ValueError('Input must be of size [height, width, channels]') - if len(means) != image.get_shape()[-1]: - raise ValueError('len(means) must match the number of channels') - return image - [[means]] - - -def one_hot_encoding(labels, num_classes=None): - """One-hot encodes the multiclass labels. - - Example usage: - labels = tf.constant([1, 4], dtype=tf.int32) - one_hot = OneHotEncoding(labels, num_classes=5) - one_hot.eval() # evaluates to [0, 1, 0, 0, 1] - - Args: - labels: A tensor of shape [None] corresponding to the labels. - num_classes: Number of classes in the dataset. - Returns: - onehot_labels: a tensor of shape [num_classes] corresponding to the one hot - encoding of the labels. - Raises: - ValueError: if num_classes is not specified. - """ - with tf.name_scope('OneHotEncoding', values=[labels]): - if num_classes is None: - raise ValueError('num_classes must be specified') - - labels = tf.one_hot(labels, num_classes, 1, 0) - return tf.reduce_max(labels, 0) - - -def rgb_to_gray(image): - """Converts a 3 channel RGB image to a 1 channel grayscale image. - - Args: - image: Rank 3 float32 tensor containing 1 image -> [height, width, 3] - with pixel values varying between [0, 1]. - - Returns: - image: A single channel grayscale image -> [image, height, 1]. - """ - return tf.image.rgb_to_grayscale(image) - - -def ssd_random_crop(image, - boxes, - labels, - label_scores=None, - masks=None, - keypoints=None, - min_object_covered=(0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - aspect_ratio_range=((0.5, 2.0),) * 7, - area_range=((0.1, 1.0),) * 7, - overlap_thresh=(0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - random_coef=(0.15,) * 7, - seed=None): - """Random crop preprocessing with default parameters as in SSD paper. - - Liu et al., SSD: Single shot multibox detector. - For further information on random crop preprocessing refer to RandomCrop - function above. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: rank 1 float32 tensor containing the scores. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio_range: allowed range for aspect ratio of cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - random_coef: a random coefficient that defines the chance of getting the - original image. If random_coef is 0, we will always get the - cropped image, and if it is 1.0, we will always get the - original image. - seed: random seed. - - Returns: - image: image which is the same rank as input image. - boxes: boxes which is the same rank as input boxes. - Boxes are in normalized form. - labels: new labels. - - If label_scores, masks, or keypoints is not None, the function also returns: - label_scores: new label scores. - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - """ - - def random_crop_selector(selected_result, index): - """Applies random_crop_image to selected result. - - Args: - selected_result: A tuple containing image, boxes, labels, keypoints (if - not None), and masks (if not None). - index: The index that was randomly selected. - - Returns: A tuple containing image, boxes, labels, keypoints (if not None), - and masks (if not None). - """ - i = 3 - image, boxes, labels = selected_result[:i] - selected_label_scores = None - selected_masks = None - selected_keypoints = None - if label_scores is not None: - selected_label_scores = selected_result[i] - i += 1 - if masks is not None: - selected_masks = selected_result[i] - i += 1 - if keypoints is not None: - selected_keypoints = selected_result[i] - - return random_crop_image( - image=image, - boxes=boxes, - labels=labels, - label_scores=selected_label_scores, - masks=selected_masks, - keypoints=selected_keypoints, - min_object_covered=min_object_covered[index], - aspect_ratio_range=aspect_ratio_range[index], - area_range=area_range[index], - overlap_thresh=overlap_thresh[index], - random_coef=random_coef[index], - seed=seed) - - result = _apply_with_random_selector_tuples( - tuple( - t for t in (image, boxes, labels, label_scores, masks, keypoints) - if t is not None), - random_crop_selector, - num_cases=len(min_object_covered)) - return result - - -def ssd_random_crop_pad(image, - boxes, - labels, - label_scores=None, - min_object_covered=(0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - aspect_ratio_range=((0.5, 2.0),) * 6, - area_range=((0.1, 1.0),) * 6, - overlap_thresh=(0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - random_coef=(0.15,) * 6, - min_padded_size_ratio=((1.0, 1.0),) * 6, - max_padded_size_ratio=((2.0, 2.0),) * 6, - pad_color=(None,) * 6, - seed=None): - """Random crop preprocessing with default parameters as in SSD paper. - - Liu et al., SSD: Single shot multibox detector. - For further information on random crop preprocessing refer to RandomCrop - function above. - - Args: - image: rank 3 float32 tensor containing 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: float32 tensor of shape [num_instances] representing the - score for each box. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio_range: allowed range for aspect ratio of cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - random_coef: a random coefficient that defines the chance of getting the - original image. If random_coef is 0, we will always get the - cropped image, and if it is 1.0, we will always get the - original image. - min_padded_size_ratio: min ratio of padded image height and width to the - input image's height and width. - max_padded_size_ratio: max ratio of padded image height and width to the - input image's height and width. - pad_color: padding color. A rank 1 tensor of [3] with dtype=tf.float32. - if set as None, it will be set to average color of the randomly - cropped image. - seed: random seed. - - Returns: - image: Image shape will be [new_height, new_width, channels]. - boxes: boxes which is the same rank as input boxes. Boxes are in normalized - form. - new_labels: new labels. - new_label_scores: new label scores. - """ - - def random_crop_pad_selector(image_boxes_labels, index): - i = 3 - image, boxes, labels = image_boxes_labels[:i] - selected_label_scores = None - if label_scores is not None: - selected_label_scores = image_boxes_labels[i] - - return random_crop_pad_image( - image, - boxes, - labels, - selected_label_scores, - min_object_covered=min_object_covered[index], - aspect_ratio_range=aspect_ratio_range[index], - area_range=area_range[index], - overlap_thresh=overlap_thresh[index], - random_coef=random_coef[index], - min_padded_size_ratio=min_padded_size_ratio[index], - max_padded_size_ratio=max_padded_size_ratio[index], - pad_color=pad_color[index], - seed=seed) - - return _apply_with_random_selector_tuples( - tuple(t for t in (image, boxes, labels, label_scores) if t is not None), - random_crop_pad_selector, - num_cases=len(min_object_covered)) - - -def ssd_random_crop_fixed_aspect_ratio( - image, - boxes, - labels, - label_scores=None, - masks=None, - keypoints=None, - min_object_covered=(0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - aspect_ratio=1.0, - area_range=((0.1, 1.0),) * 7, - overlap_thresh=(0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - random_coef=(0.15,) * 7, - seed=None): - """Random crop preprocessing with default parameters as in SSD paper. - - Liu et al., SSD: Single shot multibox detector. - For further information on random crop preprocessing refer to RandomCrop - function above. - - The only difference is that the aspect ratio of the crops are fixed. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: (optional) float32 tensor of shape [num_instances] - representing the score for each box. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio: aspect ratio of the cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - random_coef: a random coefficient that defines the chance of getting the - original image. If random_coef is 0, we will always get the - cropped image, and if it is 1.0, we will always get the - original image. - seed: random seed. - - Returns: - image: image which is the same rank as input image. - boxes: boxes which is the same rank as input boxes. - Boxes are in normalized form. - labels: new labels. - - If masks or keypoints is not None, the function also returns: - - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - """ - aspect_ratio_range = ((aspect_ratio, aspect_ratio),) * len(area_range) - - crop_result = ssd_random_crop( - image, boxes, labels, label_scores, masks, keypoints, min_object_covered, - aspect_ratio_range, area_range, overlap_thresh, random_coef, seed) - i = 3 - new_image, new_boxes, new_labels = crop_result[:i] - new_label_scores = None - new_masks = None - new_keypoints = None - if label_scores is not None: - new_label_scores = crop_result[i] - i += 1 - if masks is not None: - new_masks = crop_result[i] - i += 1 - if keypoints is not None: - new_keypoints = crop_result[i] - result = random_crop_to_aspect_ratio( - new_image, - new_boxes, - new_labels, - new_label_scores, - new_masks, - new_keypoints, - aspect_ratio=aspect_ratio, - seed=seed) - - return result - - -def ssd_random_crop_pad_fixed_aspect_ratio( - image, - boxes, - labels, - label_scores=None, - masks=None, - keypoints=None, - min_object_covered=(0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - aspect_ratio=1.0, - aspect_ratio_range=((0.5, 2.0),) * 7, - area_range=((0.1, 1.0),) * 7, - overlap_thresh=(0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0), - random_coef=(0.15,) * 7, - min_padded_size_ratio=(1.0, 1.0), - max_padded_size_ratio=(2.0, 2.0), - seed=None): - """Random crop and pad preprocessing with default parameters as in SSD paper. - - Liu et al., SSD: Single shot multibox detector. - For further information on random crop preprocessing refer to RandomCrop - function above. - - The only difference is that after the initial crop, images are zero-padded - to a fixed aspect ratio instead of being resized to that aspect ratio. - - Args: - image: rank 3 float32 tensor contains 1 image -> [height, width, channels] - with pixel values varying between [0, 1]. - boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning their coordinates vary - between [0, 1]. - Each row is in the form of [ymin, xmin, ymax, xmax]. - labels: rank 1 int32 tensor containing the object classes. - label_scores: (optional) float32 tensor of shape [num_instances] - representing the score for each box. - masks: (optional) rank 3 float32 tensor with shape - [num_instances, height, width] containing instance masks. The masks - are of the same height, width as the input `image`. - keypoints: (optional) rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2]. The keypoints are in y-x - normalized coordinates. - min_object_covered: the cropped image must cover at least this fraction of - at least one of the input bounding boxes. - aspect_ratio: the final aspect ratio to pad to. - aspect_ratio_range: allowed range for aspect ratio of cropped image. - area_range: allowed range for area ratio between cropped image and the - original image. - overlap_thresh: minimum overlap thresh with new cropped - image to keep the box. - random_coef: a random coefficient that defines the chance of getting the - original image. If random_coef is 0, we will always get the - cropped image, and if it is 1.0, we will always get the - original image. - min_padded_size_ratio: min ratio of padded image height and width to the - input image's height and width. - max_padded_size_ratio: max ratio of padded image height and width to the - input image's height and width. - seed: random seed. - - Returns: - image: image which is the same rank as input image. - boxes: boxes which is the same rank as input boxes. - Boxes are in normalized form. - labels: new labels. - - If masks or keypoints is not None, the function also returns: - - masks: rank 3 float32 tensor with shape [num_instances, height, width] - containing instance masks. - keypoints: rank 3 float32 tensor with shape - [num_instances, num_keypoints, 2] - """ - crop_result = ssd_random_crop( - image, boxes, labels, label_scores, masks, keypoints, min_object_covered, - aspect_ratio_range, area_range, overlap_thresh, random_coef, seed) - i = 3 - new_image, new_boxes, new_labels = crop_result[:i] - new_label_scores = None - new_masks = None - new_keypoints = None - if label_scores is not None: - new_label_scores = crop_result[i] - i += 1 - if masks is not None: - new_masks = crop_result[i] - i += 1 - if keypoints is not None: - new_keypoints = crop_result[i] - result = random_pad_to_aspect_ratio( - new_image, - new_boxes, - new_masks, - new_keypoints, - aspect_ratio=aspect_ratio, - min_padded_size_ratio=min_padded_size_ratio, - max_padded_size_ratio=max_padded_size_ratio, - seed=seed) - - result = list(result) - if new_label_scores is not None: - result.insert(2, new_label_scores) - result.insert(2, new_labels) - result = tuple(result) - - return result - - -def get_default_func_arg_map(include_label_scores=False, - include_instance_masks=False, - include_keypoints=False): - """Returns the default mapping from a preprocessor function to its args. - - Args: - include_label_scores: If True, preprocessing functions will modify the - label scores, too. - include_instance_masks: If True, preprocessing functions will modify the - instance masks, too. - include_keypoints: If True, preprocessing functions will modify the - keypoints, too. - - Returns: - A map from preprocessing functions to the arguments they receive. - """ - groundtruth_label_scores = None - if include_label_scores: - groundtruth_label_scores = (fields.InputDataFields.groundtruth_label_scores) - - groundtruth_instance_masks = None - if include_instance_masks: - groundtruth_instance_masks = ( - fields.InputDataFields.groundtruth_instance_masks) - - groundtruth_keypoints = None - if include_keypoints: - groundtruth_keypoints = fields.InputDataFields.groundtruth_keypoints - - prep_func_arg_map = { - normalize_image: (fields.InputDataFields.image,), - random_horizontal_flip: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - groundtruth_instance_masks, - groundtruth_keypoints,), - random_vertical_flip: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - groundtruth_instance_masks, - groundtruth_keypoints,), - random_rotation90: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - groundtruth_instance_masks, - groundtruth_keypoints,), - random_pixel_value_scale: (fields.InputDataFields.image,), - random_image_scale: ( - fields.InputDataFields.image, - groundtruth_instance_masks,), - random_rgb_to_gray: (fields.InputDataFields.image,), - random_adjust_brightness: (fields.InputDataFields.image,), - random_adjust_contrast: (fields.InputDataFields.image,), - random_adjust_hue: (fields.InputDataFields.image,), - random_adjust_saturation: (fields.InputDataFields.image,), - random_distort_color: (fields.InputDataFields.image,), - random_jitter_boxes: (fields.InputDataFields.groundtruth_boxes,), - random_crop_image: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores, - groundtruth_instance_masks, - groundtruth_keypoints,), - random_pad_image: (fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes), - random_crop_pad_image: (fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores), - random_crop_to_aspect_ratio: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores, - groundtruth_instance_masks, - groundtruth_keypoints,), - random_pad_to_aspect_ratio: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - groundtruth_instance_masks, - groundtruth_keypoints,), - random_black_patches: (fields.InputDataFields.image,), - retain_boxes_above_threshold: ( - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores, - groundtruth_instance_masks, - groundtruth_keypoints,), - image_to_float: (fields.InputDataFields.image,), - random_resize_method: (fields.InputDataFields.image,), - resize_to_range: ( - fields.InputDataFields.image, - groundtruth_instance_masks,), - resize_to_min_dimension: ( - fields.InputDataFields.image, - groundtruth_instance_masks,), - scale_boxes_to_pixel_coordinates: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - groundtruth_keypoints,), - resize_image: ( - fields.InputDataFields.image, - groundtruth_instance_masks,), - subtract_channel_mean: (fields.InputDataFields.image,), - one_hot_encoding: (fields.InputDataFields.groundtruth_image_classes,), - rgb_to_gray: (fields.InputDataFields.image,), - ssd_random_crop: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores, - groundtruth_instance_masks, - groundtruth_keypoints,), - ssd_random_crop_pad: (fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores), - ssd_random_crop_fixed_aspect_ratio: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores, - groundtruth_instance_masks, - groundtruth_keypoints,), - ssd_random_crop_pad_fixed_aspect_ratio: ( - fields.InputDataFields.image, - fields.InputDataFields.groundtruth_boxes, - fields.InputDataFields.groundtruth_classes, - groundtruth_label_scores, - groundtruth_instance_masks, - groundtruth_keypoints,), - } - - return prep_func_arg_map - - -def preprocess(tensor_dict, preprocess_options, func_arg_map=None): - """Preprocess images and bounding boxes. - - Various types of preprocessing (to be implemented) based on the - preprocess_options dictionary e.g. "crop image" (affects image and possibly - boxes), "white balance image" (affects only image), etc. If self._options - is None, no preprocessing is done. - - Args: - tensor_dict: dictionary that contains images, boxes, and can contain other - things as well. - images-> rank 4 float32 tensor contains - 1 image -> [1, height, width, 3]. - with pixel values varying between [0, 1] - boxes-> rank 2 float32 tensor containing - the bounding boxes -> [N, 4]. - Boxes are in normalized form meaning - their coordinates vary between [0, 1]. - Each row is in the form - of [ymin, xmin, ymax, xmax]. - preprocess_options: It is a list of tuples, where each tuple contains a - function and a dictionary that contains arguments and - their values. - func_arg_map: mapping from preprocessing functions to arguments that they - expect to receive and return. - - Returns: - tensor_dict: which contains the preprocessed images, bounding boxes, etc. - - Raises: - ValueError: (a) If the functions passed to Preprocess - are not in func_arg_map. - (b) If the arguments that a function needs - do not exist in tensor_dict. - (c) If image in tensor_dict is not rank 4 - """ - if func_arg_map is None: - func_arg_map = get_default_func_arg_map() - - # changes the images to image (rank 4 to rank 3) since the functions - # receive rank 3 tensor for image - if fields.InputDataFields.image in tensor_dict: - images = tensor_dict[fields.InputDataFields.image] - if len(images.get_shape()) != 4: - raise ValueError('images in tensor_dict should be rank 4') - image = tf.squeeze(images, squeeze_dims=[0]) - tensor_dict[fields.InputDataFields.image] = image - - # Preprocess inputs based on preprocess_options - for option in preprocess_options: - func, params = option - if func not in func_arg_map: - raise ValueError('The function %s does not exist in func_arg_map' % - (func.__name__)) - arg_names = func_arg_map[func] - for a in arg_names: - if a is not None and a not in tensor_dict: - raise ValueError('The function %s requires argument %s' % - (func.__name__, a)) - - def get_arg(key): - return tensor_dict[key] if key is not None else None - - args = [get_arg(a) for a in arg_names] - results = func(*args, **params) - if not isinstance(results, (list, tuple)): - results = (results,) - # Removes None args since the return values will not contain those. - arg_names = [arg_name for arg_name in arg_names if arg_name is not None] - for res, arg_name in zip(results, arg_names): - tensor_dict[arg_name] = res - - # changes the image to images (rank 3 to rank 4) to be compatible to what - # we received in the first place - if fields.InputDataFields.image in tensor_dict: - image = tensor_dict[fields.InputDataFields.image] - images = tf.expand_dims(image, 0) - tensor_dict[fields.InputDataFields.image] = images - - return tensor_dict diff --git a/object_detection/core/preprocessor_test.py b/object_detection/core/preprocessor_test.py deleted file mode 100644 index a163bea0..00000000 --- a/object_detection/core/preprocessor_test.py +++ /dev/null @@ -1,2288 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.preprocessor.""" - -import numpy as np -import six - -import tensorflow as tf - -from object_detection.core import preprocessor -from object_detection.core import standard_fields as fields - -if six.PY2: - import mock # pylint: disable=g-import-not-at-top -else: - from unittest import mock # pylint: disable=g-import-not-at-top - - -class PreprocessorTest(tf.test.TestCase): - - def createColorfulTestImage(self): - ch255 = tf.fill([1, 100, 200, 1], tf.constant(255, dtype=tf.uint8)) - ch128 = tf.fill([1, 100, 200, 1], tf.constant(128, dtype=tf.uint8)) - ch0 = tf.fill([1, 100, 200, 1], tf.constant(0, dtype=tf.uint8)) - imr = tf.concat([ch255, ch0, ch0], 3) - img = tf.concat([ch255, ch255, ch0], 3) - imb = tf.concat([ch255, ch0, ch255], 3) - imw = tf.concat([ch128, ch128, ch128], 3) - imu = tf.concat([imr, img], 2) - imd = tf.concat([imb, imw], 2) - im = tf.concat([imu, imd], 1) - return im - - def createTestImages(self): - images_r = tf.constant([[[128, 128, 128, 128], [0, 0, 128, 128], - [0, 128, 128, 128], [192, 192, 128, 128]]], - dtype=tf.uint8) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[0, 0, 128, 128], [0, 0, 128, 128], - [0, 128, 192, 192], [192, 192, 128, 192]]], - dtype=tf.uint8) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[128, 128, 192, 0], [0, 0, 128, 192], - [0, 128, 128, 0], [192, 192, 192, 128]]], - dtype=tf.uint8) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def createEmptyTestBoxes(self): - boxes = tf.constant([[]], dtype=tf.float32) - return boxes - - def createTestBoxes(self): - boxes = tf.constant( - [[0.0, 0.25, 0.75, 1.0], [0.25, 0.5, 0.75, 1.0]], dtype=tf.float32) - return boxes - - def createTestLabelScores(self): - return tf.constant([1.0, 0.5], dtype=tf.float32) - - def createTestLabelScoresWithMissingScore(self): - return tf.constant([0.5, np.nan], dtype=tf.float32) - - def createTestMasks(self): - mask = np.array([ - [[255.0, 0.0, 0.0], - [255.0, 0.0, 0.0], - [255.0, 0.0, 0.0]], - [[255.0, 255.0, 0.0], - [255.0, 255.0, 0.0], - [255.0, 255.0, 0.0]]]) - return tf.constant(mask, dtype=tf.float32) - - def createTestKeypoints(self): - keypoints = np.array([ - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], - [[0.4, 0.4], [0.5, 0.5], [0.6, 0.6]], - ]) - return tf.constant(keypoints, dtype=tf.float32) - - def createTestKeypointsInsideCrop(self): - keypoints = np.array([ - [[0.4, 0.4], [0.5, 0.5], [0.6, 0.6]], - [[0.4, 0.4], [0.5, 0.5], [0.6, 0.6]], - ]) - return tf.constant(keypoints, dtype=tf.float32) - - def createTestKeypointsOutsideCrop(self): - keypoints = np.array([ - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], - ]) - return tf.constant(keypoints, dtype=tf.float32) - - def createKeypointFlipPermutation(self): - return np.array([0, 2, 1], dtype=np.int32) - - def createTestLabels(self): - labels = tf.constant([1, 2], dtype=tf.int32) - return labels - - def createTestBoxesOutOfImage(self): - boxes = tf.constant( - [[-0.1, 0.25, 0.75, 1], [0.25, 0.5, 0.75, 1.1]], dtype=tf.float32) - return boxes - - def expectedImagesAfterNormalization(self): - images_r = tf.constant([[[0, 0, 0, 0], [-1, -1, 0, 0], - [-1, 0, 0, 0], [0.5, 0.5, 0, 0]]], - dtype=tf.float32) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[-1, -1, 0, 0], [-1, -1, 0, 0], - [-1, 0, 0.5, 0.5], [0.5, 0.5, 0, 0.5]]], - dtype=tf.float32) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[0, 0, 0.5, -1], [-1, -1, 0, 0.5], - [-1, 0, 0, -1], [0.5, 0.5, 0.5, 0]]], - dtype=tf.float32) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def expectedMaxImageAfterColorScale(self): - images_r = tf.constant([[[0.1, 0.1, 0.1, 0.1], [-0.9, -0.9, 0.1, 0.1], - [-0.9, 0.1, 0.1, 0.1], [0.6, 0.6, 0.1, 0.1]]], - dtype=tf.float32) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[-0.9, -0.9, 0.1, 0.1], [-0.9, -0.9, 0.1, 0.1], - [-0.9, 0.1, 0.6, 0.6], [0.6, 0.6, 0.1, 0.6]]], - dtype=tf.float32) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[0.1, 0.1, 0.6, -0.9], [-0.9, -0.9, 0.1, 0.6], - [-0.9, 0.1, 0.1, -0.9], [0.6, 0.6, 0.6, 0.1]]], - dtype=tf.float32) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def expectedMinImageAfterColorScale(self): - images_r = tf.constant([[[-0.1, -0.1, -0.1, -0.1], [-1, -1, -0.1, -0.1], - [-1, -0.1, -0.1, -0.1], [0.4, 0.4, -0.1, -0.1]]], - dtype=tf.float32) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[-1, -1, -0.1, -0.1], [-1, -1, -0.1, -0.1], - [-1, -0.1, 0.4, 0.4], [0.4, 0.4, -0.1, 0.4]]], - dtype=tf.float32) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[-0.1, -0.1, 0.4, -1], [-1, -1, -0.1, 0.4], - [-1, -0.1, -0.1, -1], [0.4, 0.4, 0.4, -0.1]]], - dtype=tf.float32) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def expectedImagesAfterLeftRightFlip(self): - images_r = tf.constant([[[0, 0, 0, 0], [0, 0, -1, -1], - [0, 0, 0, -1], [0, 0, 0.5, 0.5]]], - dtype=tf.float32) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[0, 0, -1, -1], [0, 0, -1, -1], - [0.5, 0.5, 0, -1], [0.5, 0, 0.5, 0.5]]], - dtype=tf.float32) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[-1, 0.5, 0, 0], [0.5, 0, -1, -1], - [-1, 0, 0, -1], [0, 0.5, 0.5, 0.5]]], - dtype=tf.float32) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def expectedImagesAfterUpDownFlip(self): - images_r = tf.constant([[[0.5, 0.5, 0, 0], [-1, 0, 0, 0], - [-1, -1, 0, 0], [0, 0, 0, 0]]], - dtype=tf.float32) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[0.5, 0.5, 0, 0.5], [-1, 0, 0.5, 0.5], - [-1, -1, 0, 0], [-1, -1, 0, 0]]], - dtype=tf.float32) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[0.5, 0.5, 0.5, 0], [-1, 0, 0, -1], - [-1, -1, 0, 0.5], [0, 0, 0.5, -1]]], - dtype=tf.float32) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def expectedImagesAfterRot90(self): - images_r = tf.constant([[[0, 0, 0, 0], [0, 0, 0, 0], - [0, -1, 0, 0.5], [0, -1, -1, 0.5]]], - dtype=tf.float32) - images_r = tf.expand_dims(images_r, 3) - images_g = tf.constant([[[0, 0, 0.5, 0.5], [0, 0, 0.5, 0], - [-1, -1, 0, 0.5], [-1, -1, -1, 0.5]]], - dtype=tf.float32) - images_g = tf.expand_dims(images_g, 3) - images_b = tf.constant([[[-1, 0.5, -1, 0], [0.5, 0, 0, 0.5], - [0, -1, 0, 0.5], [0, -1, -1, 0.5]]], - dtype=tf.float32) - images_b = tf.expand_dims(images_b, 3) - images = tf.concat([images_r, images_g, images_b], 3) - return images - - def expectedBoxesAfterLeftRightFlip(self): - boxes = tf.constant([[0.0, 0.0, 0.75, 0.75], [0.25, 0.0, 0.75, 0.5]], - dtype=tf.float32) - return boxes - - def expectedBoxesAfterUpDownFlip(self): - boxes = tf.constant([[0.25, 0.25, 1.0, 1.0], [0.25, 0.5, 0.75, 1.0]], - dtype=tf.float32) - return boxes - - def expectedBoxesAfterRot90(self): - boxes = tf.constant( - [[0.0, 0.0, 0.75, 0.75], [0.0, 0.25, 0.5, 0.75]], dtype=tf.float32) - return boxes - - def expectedMasksAfterLeftRightFlip(self): - mask = np.array([ - [[0.0, 0.0, 255.0], - [0.0, 0.0, 255.0], - [0.0, 0.0, 255.0]], - [[0.0, 255.0, 255.0], - [0.0, 255.0, 255.0], - [0.0, 255.0, 255.0]]]) - return tf.constant(mask, dtype=tf.float32) - - def expectedMasksAfterUpDownFlip(self): - mask = np.array([ - [[255.0, 0.0, 0.0], - [255.0, 0.0, 0.0], - [255.0, 0.0, 0.0]], - [[255.0, 255.0, 0.0], - [255.0, 255.0, 0.0], - [255.0, 255.0, 0.0]]]) - return tf.constant(mask, dtype=tf.float32) - - def expectedMasksAfterRot90(self): - mask = np.array([ - [[0.0, 0.0, 0.0], - [0.0, 0.0, 0.0], - [255.0, 255.0, 255.0]], - [[0.0, 0.0, 0.0], - [255.0, 255.0, 255.0], - [255.0, 255.0, 255.0]]]) - return tf.constant(mask, dtype=tf.float32) - - def expectedLabelScoresAfterThresholding(self): - return tf.constant([1.0], dtype=tf.float32) - - def expectedBoxesAfterThresholding(self): - return tf.constant([[0.0, 0.25, 0.75, 1.0]], dtype=tf.float32) - - def expectedLabelsAfterThresholding(self): - return tf.constant([1], dtype=tf.float32) - - def expectedMasksAfterThresholding(self): - mask = np.array([ - [[255.0, 0.0, 0.0], - [255.0, 0.0, 0.0], - [255.0, 0.0, 0.0]]]) - return tf.constant(mask, dtype=tf.float32) - - def expectedKeypointsAfterThresholding(self): - keypoints = np.array([ - [[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]] - ]) - return tf.constant(keypoints, dtype=tf.float32) - - def expectedLabelScoresAfterThresholdingWithMissingScore(self): - return tf.constant([np.nan], dtype=tf.float32) - - def expectedBoxesAfterThresholdingWithMissingScore(self): - return tf.constant([[0.25, 0.5, 0.75, 1]], dtype=tf.float32) - - def expectedLabelsAfterThresholdingWithMissingScore(self): - return tf.constant([2], dtype=tf.float32) - - def testNormalizeImage(self): - preprocess_options = [(preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 256, - 'target_minval': -1, - 'target_maxval': 1 - })] - images = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - images_expected = self.expectedImagesAfterNormalization() - - with self.test_session() as sess: - (images_, images_expected_) = sess.run( - [images, images_expected]) - images_shape_ = images_.shape - images_expected_shape_ = images_expected_.shape - expected_shape = [1, 4, 4, 3] - self.assertAllEqual(images_expected_shape_, images_shape_) - self.assertAllEqual(images_shape_, expected_shape) - self.assertAllClose(images_, images_expected_) - - def testRetainBoxesAboveThreshold(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - (retained_boxes, retained_labels, - retained_label_scores) = preprocessor.retain_boxes_above_threshold( - boxes, labels, label_scores, threshold=0.6) - with self.test_session() as sess: - (retained_boxes_, retained_labels_, retained_label_scores_, - expected_retained_boxes_, expected_retained_labels_, - expected_retained_label_scores_) = sess.run([ - retained_boxes, retained_labels, retained_label_scores, - self.expectedBoxesAfterThresholding(), - self.expectedLabelsAfterThresholding(), - self.expectedLabelScoresAfterThresholding()]) - self.assertAllClose( - retained_boxes_, expected_retained_boxes_) - self.assertAllClose( - retained_labels_, expected_retained_labels_) - self.assertAllClose( - retained_label_scores_, expected_retained_label_scores_) - - def testRetainBoxesAboveThresholdWithMasks(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - masks = self.createTestMasks() - _, _, _, retained_masks = preprocessor.retain_boxes_above_threshold( - boxes, labels, label_scores, masks, threshold=0.6) - with self.test_session() as sess: - retained_masks_, expected_retained_masks_ = sess.run([ - retained_masks, self.expectedMasksAfterThresholding()]) - - self.assertAllClose( - retained_masks_, expected_retained_masks_) - - def testRetainBoxesAboveThresholdWithKeypoints(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - keypoints = self.createTestKeypoints() - (_, _, _, retained_keypoints) = preprocessor.retain_boxes_above_threshold( - boxes, labels, label_scores, keypoints=keypoints, threshold=0.6) - with self.test_session() as sess: - (retained_keypoints_, - expected_retained_keypoints_) = sess.run([ - retained_keypoints, - self.expectedKeypointsAfterThresholding()]) - - self.assertAllClose( - retained_keypoints_, expected_retained_keypoints_) - - def testRetainBoxesAboveThresholdWithMissingScore(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScoresWithMissingScore() - (retained_boxes, retained_labels, - retained_label_scores) = preprocessor.retain_boxes_above_threshold( - boxes, labels, label_scores, threshold=0.6) - with self.test_session() as sess: - (retained_boxes_, retained_labels_, retained_label_scores_, - expected_retained_boxes_, expected_retained_labels_, - expected_retained_label_scores_) = sess.run([ - retained_boxes, retained_labels, retained_label_scores, - self.expectedBoxesAfterThresholdingWithMissingScore(), - self.expectedLabelsAfterThresholdingWithMissingScore(), - self.expectedLabelScoresAfterThresholdingWithMissingScore()]) - self.assertAllClose( - retained_boxes_, expected_retained_boxes_) - self.assertAllClose( - retained_labels_, expected_retained_labels_) - self.assertAllClose( - retained_label_scores_, expected_retained_label_scores_) - - def testFlipBoxesLeftRight(self): - boxes = self.createTestBoxes() - flipped_boxes = preprocessor._flip_boxes_left_right(boxes) - expected_boxes = self.expectedBoxesAfterLeftRightFlip() - with self.test_session() as sess: - flipped_boxes, expected_boxes = sess.run([flipped_boxes, expected_boxes]) - self.assertAllEqual(flipped_boxes.flatten(), expected_boxes.flatten()) - - def testFlipBoxesUpDown(self): - boxes = self.createTestBoxes() - flipped_boxes = preprocessor._flip_boxes_up_down(boxes) - expected_boxes = self.expectedBoxesAfterUpDownFlip() - with self.test_session() as sess: - flipped_boxes, expected_boxes = sess.run([flipped_boxes, expected_boxes]) - self.assertAllEqual(flipped_boxes.flatten(), expected_boxes.flatten()) - - def testRot90Boxes(self): - boxes = self.createTestBoxes() - rotated_boxes = preprocessor._rot90_boxes(boxes) - expected_boxes = self.expectedBoxesAfterRot90() - with self.test_session() as sess: - rotated_boxes, expected_boxes = sess.run([rotated_boxes, expected_boxes]) - self.assertAllEqual(rotated_boxes.flatten(), expected_boxes.flatten()) - - def testFlipMasksLeftRight(self): - test_mask = self.createTestMasks() - flipped_mask = preprocessor._flip_masks_left_right(test_mask) - expected_mask = self.expectedMasksAfterLeftRightFlip() - with self.test_session() as sess: - flipped_mask, expected_mask = sess.run([flipped_mask, expected_mask]) - self.assertAllEqual(flipped_mask.flatten(), expected_mask.flatten()) - - def testFlipMasksUpDown(self): - test_mask = self.createTestMasks() - flipped_mask = preprocessor._flip_masks_up_down(test_mask) - expected_mask = self.expectedMasksAfterUpDownFlip() - with self.test_session() as sess: - flipped_mask, expected_mask = sess.run([flipped_mask, expected_mask]) - self.assertAllEqual(flipped_mask.flatten(), expected_mask.flatten()) - - def testRot90Masks(self): - test_mask = self.createTestMasks() - rotated_mask = preprocessor._rot90_masks(test_mask) - expected_mask = self.expectedMasksAfterRot90() - with self.test_session() as sess: - rotated_mask, expected_mask = sess.run([rotated_mask, expected_mask]) - self.assertAllEqual(rotated_mask.flatten(), expected_mask.flatten()) - - def testRandomHorizontalFlip(self): - preprocess_options = [(preprocessor.random_horizontal_flip, {})] - images = self.expectedImagesAfterNormalization() - boxes = self.createTestBoxes() - tensor_dict = {fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes} - images_expected1 = self.expectedImagesAfterLeftRightFlip() - boxes_expected1 = self.expectedBoxesAfterLeftRightFlip() - images_expected2 = images - boxes_expected2 = boxes - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - - boxes_diff1 = tf.squared_difference(boxes, boxes_expected1) - boxes_diff2 = tf.squared_difference(boxes, boxes_expected2) - boxes_diff = tf.multiply(boxes_diff1, boxes_diff2) - boxes_diff_expected = tf.zeros_like(boxes_diff) - - images_diff1 = tf.squared_difference(images, images_expected1) - images_diff2 = tf.squared_difference(images, images_expected2) - images_diff = tf.multiply(images_diff1, images_diff2) - images_diff_expected = tf.zeros_like(images_diff) - - with self.test_session() as sess: - (images_diff_, images_diff_expected_, boxes_diff_, - boxes_diff_expected_) = sess.run([images_diff, images_diff_expected, - boxes_diff, boxes_diff_expected]) - self.assertAllClose(boxes_diff_, boxes_diff_expected_) - self.assertAllClose(images_diff_, images_diff_expected_) - - def testRandomHorizontalFlipWithEmptyBoxes(self): - preprocess_options = [(preprocessor.random_horizontal_flip, {})] - images = self.expectedImagesAfterNormalization() - boxes = self.createEmptyTestBoxes() - tensor_dict = {fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes} - images_expected1 = self.expectedImagesAfterLeftRightFlip() - boxes_expected = self.createEmptyTestBoxes() - images_expected2 = images - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - - images_diff1 = tf.squared_difference(images, images_expected1) - images_diff2 = tf.squared_difference(images, images_expected2) - images_diff = tf.multiply(images_diff1, images_diff2) - images_diff_expected = tf.zeros_like(images_diff) - - with self.test_session() as sess: - (images_diff_, images_diff_expected_, boxes_, - boxes_expected_) = sess.run([images_diff, images_diff_expected, boxes, - boxes_expected]) - self.assertAllClose(boxes_, boxes_expected_) - self.assertAllClose(images_diff_, images_diff_expected_) - - def testRunRandomHorizontalFlipWithMaskAndKeypoints(self): - preprocess_options = [(preprocessor.random_horizontal_flip, {})] - image_height = 3 - image_width = 3 - images = tf.random_uniform([1, image_height, image_width, 3]) - boxes = self.createTestBoxes() - masks = self.createTestMasks() - keypoints = self.createTestKeypoints() - keypoint_flip_permutation = self.createKeypointFlipPermutation() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_instance_masks: masks, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - preprocess_options = [ - (preprocessor.random_horizontal_flip, - {'keypoint_flip_permutation': keypoint_flip_permutation})] - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_instance_masks=True, include_keypoints=True) - tensor_dict = preprocessor.preprocess( - tensor_dict, preprocess_options, func_arg_map=preprocessor_arg_map) - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - masks = tensor_dict[fields.InputDataFields.groundtruth_instance_masks] - keypoints = tensor_dict[fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - boxes, masks, keypoints = sess.run([boxes, masks, keypoints]) - self.assertTrue(boxes is not None) - self.assertTrue(masks is not None) - self.assertTrue(keypoints is not None) - - def testRandomVerticalFlip(self): - preprocess_options = [(preprocessor.random_vertical_flip, {})] - images = self.expectedImagesAfterNormalization() - boxes = self.createTestBoxes() - tensor_dict = {fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes} - images_expected1 = self.expectedImagesAfterUpDownFlip() - boxes_expected1 = self.expectedBoxesAfterUpDownFlip() - images_expected2 = images - boxes_expected2 = boxes - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - - boxes_diff1 = tf.squared_difference(boxes, boxes_expected1) - boxes_diff2 = tf.squared_difference(boxes, boxes_expected2) - boxes_diff = tf.multiply(boxes_diff1, boxes_diff2) - boxes_diff_expected = tf.zeros_like(boxes_diff) - - images_diff1 = tf.squared_difference(images, images_expected1) - images_diff2 = tf.squared_difference(images, images_expected2) - images_diff = tf.multiply(images_diff1, images_diff2) - images_diff_expected = tf.zeros_like(images_diff) - - with self.test_session() as sess: - (images_diff_, images_diff_expected_, boxes_diff_, - boxes_diff_expected_) = sess.run([images_diff, images_diff_expected, - boxes_diff, boxes_diff_expected]) - self.assertAllClose(boxes_diff_, boxes_diff_expected_) - self.assertAllClose(images_diff_, images_diff_expected_) - - def testRandomVerticalFlipWithEmptyBoxes(self): - preprocess_options = [(preprocessor.random_vertical_flip, {})] - images = self.expectedImagesAfterNormalization() - boxes = self.createEmptyTestBoxes() - tensor_dict = {fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes} - images_expected1 = self.expectedImagesAfterUpDownFlip() - boxes_expected = self.createEmptyTestBoxes() - images_expected2 = images - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - - images_diff1 = tf.squared_difference(images, images_expected1) - images_diff2 = tf.squared_difference(images, images_expected2) - images_diff = tf.multiply(images_diff1, images_diff2) - images_diff_expected = tf.zeros_like(images_diff) - - with self.test_session() as sess: - (images_diff_, images_diff_expected_, boxes_, - boxes_expected_) = sess.run([images_diff, images_diff_expected, boxes, - boxes_expected]) - self.assertAllClose(boxes_, boxes_expected_) - self.assertAllClose(images_diff_, images_diff_expected_) - - def testRunRandomVerticalFlipWithMaskAndKeypoints(self): - preprocess_options = [(preprocessor.random_vertical_flip, {})] - image_height = 3 - image_width = 3 - images = tf.random_uniform([1, image_height, image_width, 3]) - boxes = self.createTestBoxes() - masks = self.createTestMasks() - keypoints = self.createTestKeypoints() - keypoint_flip_permutation = self.createKeypointFlipPermutation() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_instance_masks: masks, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - preprocess_options = [ - (preprocessor.random_vertical_flip, - {'keypoint_flip_permutation': keypoint_flip_permutation})] - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_instance_masks=True, include_keypoints=True) - tensor_dict = preprocessor.preprocess( - tensor_dict, preprocess_options, func_arg_map=preprocessor_arg_map) - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - masks = tensor_dict[fields.InputDataFields.groundtruth_instance_masks] - keypoints = tensor_dict[fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - boxes, masks, keypoints = sess.run([boxes, masks, keypoints]) - self.assertTrue(boxes is not None) - self.assertTrue(masks is not None) - self.assertTrue(keypoints is not None) - - def testRandomRotation90(self): - preprocess_options = [(preprocessor.random_rotation90, {})] - images = self.expectedImagesAfterNormalization() - boxes = self.createTestBoxes() - tensor_dict = {fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes} - images_expected1 = self.expectedImagesAfterRot90() - boxes_expected1 = self.expectedBoxesAfterRot90() - images_expected2 = images - boxes_expected2 = boxes - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - - boxes_diff1 = tf.squared_difference(boxes, boxes_expected1) - boxes_diff2 = tf.squared_difference(boxes, boxes_expected2) - boxes_diff = tf.multiply(boxes_diff1, boxes_diff2) - boxes_diff_expected = tf.zeros_like(boxes_diff) - - images_diff1 = tf.squared_difference(images, images_expected1) - images_diff2 = tf.squared_difference(images, images_expected2) - images_diff = tf.multiply(images_diff1, images_diff2) - images_diff_expected = tf.zeros_like(images_diff) - - with self.test_session() as sess: - (images_diff_, images_diff_expected_, boxes_diff_, - boxes_diff_expected_) = sess.run([images_diff, images_diff_expected, - boxes_diff, boxes_diff_expected]) - self.assertAllClose(boxes_diff_, boxes_diff_expected_) - self.assertAllClose(images_diff_, images_diff_expected_) - - def testRandomRotation90WithEmptyBoxes(self): - preprocess_options = [(preprocessor.random_rotation90, {})] - images = self.expectedImagesAfterNormalization() - boxes = self.createEmptyTestBoxes() - tensor_dict = {fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes} - images_expected1 = self.expectedImagesAfterRot90() - boxes_expected = self.createEmptyTestBoxes() - images_expected2 = images - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images = tensor_dict[fields.InputDataFields.image] - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - - images_diff1 = tf.squared_difference(images, images_expected1) - images_diff2 = tf.squared_difference(images, images_expected2) - images_diff = tf.multiply(images_diff1, images_diff2) - images_diff_expected = tf.zeros_like(images_diff) - - with self.test_session() as sess: - (images_diff_, images_diff_expected_, boxes_, - boxes_expected_) = sess.run([images_diff, images_diff_expected, boxes, - boxes_expected]) - self.assertAllClose(boxes_, boxes_expected_) - self.assertAllClose(images_diff_, images_diff_expected_) - - def testRunRandomRotation90WithMaskAndKeypoints(self): - preprocess_options = [(preprocessor.random_rotation90, {})] - image_height = 3 - image_width = 3 - images = tf.random_uniform([1, image_height, image_width, 3]) - boxes = self.createTestBoxes() - masks = self.createTestMasks() - keypoints = self.createTestKeypoints() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_instance_masks: masks, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_instance_masks=True, include_keypoints=True) - tensor_dict = preprocessor.preprocess( - tensor_dict, preprocess_options, func_arg_map=preprocessor_arg_map) - boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - masks = tensor_dict[fields.InputDataFields.groundtruth_instance_masks] - keypoints = tensor_dict[fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - boxes, masks, keypoints = sess.run([boxes, masks, keypoints]) - self.assertTrue(boxes is not None) - self.assertTrue(masks is not None) - self.assertTrue(keypoints is not None) - - def testRandomPixelValueScale(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_pixel_value_scale, {})) - images = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images_min = tf.to_float(images) * 0.9 / 255.0 - images_max = tf.to_float(images) * 1.1 / 255.0 - images = tensor_dict[fields.InputDataFields.image] - values_greater = tf.greater_equal(images, images_min) - values_less = tf.less_equal(images, images_max) - values_true = tf.fill([1, 4, 4, 3], True) - with self.test_session() as sess: - (values_greater_, values_less_, values_true_) = sess.run( - [values_greater, values_less, values_true]) - self.assertAllClose(values_greater_, values_true_) - self.assertAllClose(values_less_, values_true_) - - def testRandomImageScale(self): - preprocess_options = [(preprocessor.random_image_scale, {})] - images_original = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images_original} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images_scaled = tensor_dict[fields.InputDataFields.image] - images_original_shape = tf.shape(images_original) - images_scaled_shape = tf.shape(images_scaled) - with self.test_session() as sess: - (images_original_shape_, images_scaled_shape_) = sess.run( - [images_original_shape, images_scaled_shape]) - self.assertTrue( - images_original_shape_[1] * 0.5 <= images_scaled_shape_[1]) - self.assertTrue( - images_original_shape_[1] * 2.0 >= images_scaled_shape_[1]) - self.assertTrue( - images_original_shape_[2] * 0.5 <= images_scaled_shape_[2]) - self.assertTrue( - images_original_shape_[2] * 2.0 >= images_scaled_shape_[2]) - - def testRandomRGBtoGray(self): - preprocess_options = [(preprocessor.random_rgb_to_gray, {})] - images_original = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images_original} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocess_options) - images_gray = tensor_dict[fields.InputDataFields.image] - images_gray_r, images_gray_g, images_gray_b = tf.split( - value=images_gray, num_or_size_splits=3, axis=3) - images_r, images_g, images_b = tf.split( - value=images_original, num_or_size_splits=3, axis=3) - images_r_diff1 = tf.squared_difference(tf.to_float(images_r), - tf.to_float(images_gray_r)) - images_r_diff2 = tf.squared_difference(tf.to_float(images_gray_r), - tf.to_float(images_gray_g)) - images_r_diff = tf.multiply(images_r_diff1, images_r_diff2) - images_g_diff1 = tf.squared_difference(tf.to_float(images_g), - tf.to_float(images_gray_g)) - images_g_diff2 = tf.squared_difference(tf.to_float(images_gray_g), - tf.to_float(images_gray_b)) - images_g_diff = tf.multiply(images_g_diff1, images_g_diff2) - images_b_diff1 = tf.squared_difference(tf.to_float(images_b), - tf.to_float(images_gray_b)) - images_b_diff2 = tf.squared_difference(tf.to_float(images_gray_b), - tf.to_float(images_gray_r)) - images_b_diff = tf.multiply(images_b_diff1, images_b_diff2) - image_zero1 = tf.constant(0, dtype=tf.float32, shape=[1, 4, 4, 1]) - with self.test_session() as sess: - (images_r_diff_, images_g_diff_, images_b_diff_, image_zero1_) = sess.run( - [images_r_diff, images_g_diff, images_b_diff, image_zero1]) - self.assertAllClose(images_r_diff_, image_zero1_) - self.assertAllClose(images_g_diff_, image_zero1_) - self.assertAllClose(images_b_diff_, image_zero1_) - - def testRandomAdjustBrightness(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_adjust_brightness, {})) - images_original = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images_original} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images_bright = tensor_dict[fields.InputDataFields.image] - image_original_shape = tf.shape(images_original) - image_bright_shape = tf.shape(images_bright) - with self.test_session() as sess: - (image_original_shape_, image_bright_shape_) = sess.run( - [image_original_shape, image_bright_shape]) - self.assertAllEqual(image_original_shape_, image_bright_shape_) - - def testRandomAdjustContrast(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_adjust_contrast, {})) - images_original = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images_original} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images_contrast = tensor_dict[fields.InputDataFields.image] - image_original_shape = tf.shape(images_original) - image_contrast_shape = tf.shape(images_contrast) - with self.test_session() as sess: - (image_original_shape_, image_contrast_shape_) = sess.run( - [image_original_shape, image_contrast_shape]) - self.assertAllEqual(image_original_shape_, image_contrast_shape_) - - def testRandomAdjustHue(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_adjust_hue, {})) - images_original = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images_original} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images_hue = tensor_dict[fields.InputDataFields.image] - image_original_shape = tf.shape(images_original) - image_hue_shape = tf.shape(images_hue) - with self.test_session() as sess: - (image_original_shape_, image_hue_shape_) = sess.run( - [image_original_shape, image_hue_shape]) - self.assertAllEqual(image_original_shape_, image_hue_shape_) - - def testRandomDistortColor(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_distort_color, {})) - images_original = self.createTestImages() - images_original_shape = tf.shape(images_original) - tensor_dict = {fields.InputDataFields.image: images_original} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images_distorted_color = tensor_dict[fields.InputDataFields.image] - images_distorted_color_shape = tf.shape(images_distorted_color) - with self.test_session() as sess: - (images_original_shape_, images_distorted_color_shape_) = sess.run( - [images_original_shape, images_distorted_color_shape]) - self.assertAllEqual(images_original_shape_, images_distorted_color_shape_) - - def testRandomJitterBoxes(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.random_jitter_boxes, {})) - boxes = self.createTestBoxes() - boxes_shape = tf.shape(boxes) - tensor_dict = {fields.InputDataFields.groundtruth_boxes: boxes} - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - distorted_boxes = tensor_dict[fields.InputDataFields.groundtruth_boxes] - distorted_boxes_shape = tf.shape(distorted_boxes) - - with self.test_session() as sess: - (boxes_shape_, distorted_boxes_shape_) = sess.run( - [boxes_shape, distorted_boxes_shape]) - self.assertAllEqual(boxes_shape_, distorted_boxes_shape_) - - def testRandomCropImage(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_crop_image, {})) - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - distorted_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_rank = tf.rank(boxes) - distorted_boxes_rank = tf.rank(distorted_boxes) - images_rank = tf.rank(images) - distorted_images_rank = tf.rank(distorted_images) - self.assertEqual(3, distorted_images.get_shape()[3]) - - with self.test_session() as sess: - (boxes_rank_, distorted_boxes_rank_, images_rank_, - distorted_images_rank_) = sess.run([ - boxes_rank, distorted_boxes_rank, images_rank, distorted_images_rank - ]) - self.assertAllEqual(boxes_rank_, distorted_boxes_rank_) - self.assertAllEqual(images_rank_, distorted_images_rank_) - - def testRandomCropImageGrayscale(self): - preprocessing_options = [(preprocessor.rgb_to_gray, {}), - (preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1, - }), - (preprocessor.random_crop_image, {})] - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options) - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_rank = tf.rank(boxes) - distorted_boxes_rank = tf.rank(distorted_boxes) - images_rank = tf.rank(images) - distorted_images_rank = tf.rank(distorted_images) - self.assertEqual(1, distorted_images.get_shape()[3]) - - with self.test_session() as sess: - session_results = sess.run([ - boxes_rank, distorted_boxes_rank, images_rank, distorted_images_rank - ]) - (boxes_rank_, distorted_boxes_rank_, images_rank_, - distorted_images_rank_) = session_results - self.assertAllEqual(boxes_rank_, distorted_boxes_rank_) - self.assertAllEqual(images_rank_, distorted_images_rank_) - - def testRandomCropImageWithBoxOutOfImage(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_crop_image, {})) - images = self.createTestImages() - boxes = self.createTestBoxesOutOfImage() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - distorted_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_rank = tf.rank(boxes) - distorted_boxes_rank = tf.rank(distorted_boxes) - images_rank = tf.rank(images) - distorted_images_rank = tf.rank(distorted_images) - - with self.test_session() as sess: - (boxes_rank_, distorted_boxes_rank_, images_rank_, - distorted_images_rank_) = sess.run( - [boxes_rank, distorted_boxes_rank, images_rank, - distorted_images_rank]) - self.assertAllEqual(boxes_rank_, distorted_boxes_rank_) - self.assertAllEqual(images_rank_, distorted_images_rank_) - - def testRandomCropImageWithRandomCoefOne(self): - preprocessing_options = [(preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })] - - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_label_scores: label_scores - } - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images = tensor_dict[fields.InputDataFields.image] - - preprocessing_options = [(preprocessor.random_crop_image, { - 'random_coef': 1.0 - })] - distorted_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_label_scores = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_label_scores] - boxes_shape = tf.shape(boxes) - distorted_boxes_shape = tf.shape(distorted_boxes) - images_shape = tf.shape(images) - distorted_images_shape = tf.shape(distorted_images) - - with self.test_session() as sess: - (boxes_shape_, distorted_boxes_shape_, images_shape_, - distorted_images_shape_, images_, distorted_images_, - boxes_, distorted_boxes_, labels_, distorted_labels_, - label_scores_, distorted_label_scores_) = sess.run( - [boxes_shape, distorted_boxes_shape, images_shape, - distorted_images_shape, images, distorted_images, - boxes, distorted_boxes, labels, distorted_labels, - label_scores, distorted_label_scores]) - self.assertAllEqual(boxes_shape_, distorted_boxes_shape_) - self.assertAllEqual(images_shape_, distorted_images_shape_) - self.assertAllClose(images_, distorted_images_) - self.assertAllClose(boxes_, distorted_boxes_) - self.assertAllEqual(labels_, distorted_labels_) - self.assertAllEqual(label_scores_, distorted_label_scores_) - - def testRandomCropWithMockSampleDistortedBoundingBox(self): - preprocessing_options = [(preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })] - - images = self.createColorfulTestImage() - boxes = tf.constant([[0.1, 0.1, 0.8, 0.3], - [0.2, 0.4, 0.75, 0.75], - [0.3, 0.1, 0.4, 0.7]], dtype=tf.float32) - labels = tf.constant([1, 7, 11], dtype=tf.int32) - - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images = tensor_dict[fields.InputDataFields.image] - - preprocessing_options = [(preprocessor.random_crop_image, {})] - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box') as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = (tf.constant( - [6, 143, 0], dtype=tf.int32), tf.constant( - [190, 237, -1], dtype=tf.int32), tf.constant( - [[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - - distorted_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - expected_boxes = tf.constant([[0.178947, 0.07173, 0.75789469, 0.66244733], - [0.28421, 0.0, 0.38947365, 0.57805908]], - dtype=tf.float32) - expected_labels = tf.constant([7, 11], dtype=tf.int32) - - with self.test_session() as sess: - (distorted_boxes_, distorted_labels_, - expected_boxes_, expected_labels_) = sess.run( - [distorted_boxes, distorted_labels, - expected_boxes, expected_labels]) - self.assertAllClose(distorted_boxes_, expected_boxes_) - self.assertAllEqual(distorted_labels_, expected_labels_) - - def testStrictRandomCropImageWithLabelScores(self): - image = self.createColorfulTestImage()[0] - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box' - ) as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = ( - tf.constant([6, 143, 0], dtype=tf.int32), - tf.constant([190, 237, -1], dtype=tf.int32), - tf.constant([[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - new_image, new_boxes, new_labels, new_label_scores = ( - preprocessor._strict_random_crop_image( - image, boxes, labels, label_scores)) - with self.test_session() as sess: - new_image, new_boxes, new_labels, new_label_scores = ( - sess.run( - [new_image, new_boxes, new_labels, new_label_scores]) - ) - - expected_boxes = np.array( - [[0.0, 0.0, 0.75789469, 1.0], - [0.23157893, 0.24050637, 0.75789469, 1.0]], dtype=np.float32) - self.assertAllEqual(new_image.shape, [190, 237, 3]) - self.assertAllEqual(new_label_scores, [1.0, 0.5]) - self.assertAllClose( - new_boxes.flatten(), expected_boxes.flatten()) - - def testStrictRandomCropImageWithMasks(self): - image = self.createColorfulTestImage()[0] - boxes = self.createTestBoxes() - labels = self.createTestLabels() - masks = tf.random_uniform([2, 200, 400], dtype=tf.float32) - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box' - ) as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = ( - tf.constant([6, 143, 0], dtype=tf.int32), - tf.constant([190, 237, -1], dtype=tf.int32), - tf.constant([[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - new_image, new_boxes, new_labels, new_masks = ( - preprocessor._strict_random_crop_image( - image, boxes, labels, masks=masks)) - with self.test_session() as sess: - new_image, new_boxes, new_labels, new_masks = sess.run( - [new_image, new_boxes, new_labels, new_masks]) - expected_boxes = np.array( - [[0.0, 0.0, 0.75789469, 1.0], - [0.23157893, 0.24050637, 0.75789469, 1.0]], dtype=np.float32) - self.assertAllEqual(new_image.shape, [190, 237, 3]) - self.assertAllEqual(new_masks.shape, [2, 190, 237]) - self.assertAllClose( - new_boxes.flatten(), expected_boxes.flatten()) - - def testStrictRandomCropImageWithKeypoints(self): - image = self.createColorfulTestImage()[0] - boxes = self.createTestBoxes() - labels = self.createTestLabels() - keypoints = self.createTestKeypoints() - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box' - ) as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = ( - tf.constant([6, 143, 0], dtype=tf.int32), - tf.constant([190, 237, -1], dtype=tf.int32), - tf.constant([[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - new_image, new_boxes, new_labels, new_keypoints = ( - preprocessor._strict_random_crop_image( - image, boxes, labels, keypoints=keypoints)) - with self.test_session() as sess: - new_image, new_boxes, new_labels, new_keypoints = sess.run( - [new_image, new_boxes, new_labels, new_keypoints]) - - expected_boxes = np.array([ - [0.0, 0.0, 0.75789469, 1.0], - [0.23157893, 0.24050637, 0.75789469, 1.0],], dtype=np.float32) - expected_keypoints = np.array([ - [[np.nan, np.nan], - [np.nan, np.nan], - [np.nan, np.nan]], - [[0.38947368, 0.07173], - [0.49473682, 0.24050637], - [0.60000002, 0.40928277]] - ], dtype=np.float32) - self.assertAllEqual(new_image.shape, [190, 237, 3]) - self.assertAllClose( - new_boxes.flatten(), expected_boxes.flatten()) - self.assertAllClose( - new_keypoints.flatten(), expected_keypoints.flatten()) - - def testRunRandomCropImageWithMasks(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - masks = tf.random_uniform([2, 200, 400], dtype=tf.float32) - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_instance_masks: masks, - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_instance_masks=True) - - preprocessing_options = [(preprocessor.random_crop_image, {})] - - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box' - ) as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = ( - tf.constant([6, 143, 0], dtype=tf.int32), - tf.constant([190, 237, -1], dtype=tf.int32), - tf.constant([[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_masks = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_instance_masks] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_masks_) = sess.run( - [distorted_image, distorted_boxes, distorted_labels, - distorted_masks]) - - expected_boxes = np.array([ - [0.0, 0.0, 0.75789469, 1.0], - [0.23157893, 0.24050637, 0.75789469, 1.0], - ], dtype=np.float32) - self.assertAllEqual(distorted_image_.shape, [1, 190, 237, 3]) - self.assertAllEqual(distorted_masks_.shape, [2, 190, 237]) - self.assertAllEqual(distorted_labels_, [1, 2]) - self.assertAllClose( - distorted_boxes_.flatten(), expected_boxes.flatten()) - - def testRunRandomCropImageWithKeypointsInsideCrop(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - keypoints = self.createTestKeypointsInsideCrop() - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_keypoints=True) - - preprocessing_options = [(preprocessor.random_crop_image, {})] - - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box' - ) as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = ( - tf.constant([6, 143, 0], dtype=tf.int32), - tf.constant([190, 237, -1], dtype=tf.int32), - tf.constant([[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_keypoints = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_keypoints_) = sess.run( - [distorted_image, distorted_boxes, distorted_labels, - distorted_keypoints]) - - expected_boxes = np.array([ - [0.0, 0.0, 0.75789469, 1.0], - [0.23157893, 0.24050637, 0.75789469, 1.0], - ], dtype=np.float32) - expected_keypoints = np.array([ - [[0.38947368, 0.07173], - [0.49473682, 0.24050637], - [0.60000002, 0.40928277]], - [[0.38947368, 0.07173], - [0.49473682, 0.24050637], - [0.60000002, 0.40928277]] - ]) - self.assertAllEqual(distorted_image_.shape, [1, 190, 237, 3]) - self.assertAllEqual(distorted_labels_, [1, 2]) - self.assertAllClose( - distorted_boxes_.flatten(), expected_boxes.flatten()) - self.assertAllClose( - distorted_keypoints_.flatten(), expected_keypoints.flatten()) - - def testRunRandomCropImageWithKeypointsOutsideCrop(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - keypoints = self.createTestKeypointsOutsideCrop() - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_keypoints=True) - - preprocessing_options = [(preprocessor.random_crop_image, {})] - - with mock.patch.object( - tf.image, - 'sample_distorted_bounding_box' - ) as mock_sample_distorted_bounding_box: - mock_sample_distorted_bounding_box.return_value = ( - tf.constant([6, 143, 0], dtype=tf.int32), - tf.constant([190, 237, -1], dtype=tf.int32), - tf.constant([[[0.03, 0.3575, 0.98, 0.95]]], dtype=tf.float32)) - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_keypoints = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_keypoints_) = sess.run( - [distorted_image, distorted_boxes, distorted_labels, - distorted_keypoints]) - - expected_boxes = np.array([ - [0.0, 0.0, 0.75789469, 1.0], - [0.23157893, 0.24050637, 0.75789469, 1.0], - ], dtype=np.float32) - expected_keypoints = np.array([ - [[np.nan, np.nan], - [np.nan, np.nan], - [np.nan, np.nan]], - [[np.nan, np.nan], - [np.nan, np.nan], - [np.nan, np.nan]], - ]) - self.assertAllEqual(distorted_image_.shape, [1, 190, 237, 3]) - self.assertAllEqual(distorted_labels_, [1, 2]) - self.assertAllClose( - distorted_boxes_.flatten(), expected_boxes.flatten()) - self.assertAllClose( - distorted_keypoints_.flatten(), expected_keypoints.flatten()) - - def testRunRetainBoxesAboveThreshold(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - - tensor_dict = { - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_label_scores: label_scores - } - - preprocessing_options = [ - (preprocessor.retain_boxes_above_threshold, {'threshold': 0.6}) - ] - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_label_scores=True) - retained_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - retained_boxes = retained_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - retained_labels = retained_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - retained_label_scores = retained_tensor_dict[ - fields.InputDataFields.groundtruth_label_scores] - - with self.test_session() as sess: - (retained_boxes_, retained_labels_, - retained_label_scores_, expected_retained_boxes_, - expected_retained_labels_, expected_retained_label_scores_) = sess.run( - [retained_boxes, retained_labels, retained_label_scores, - self.expectedBoxesAfterThresholding(), - self.expectedLabelsAfterThresholding(), - self.expectedLabelScoresAfterThresholding()]) - - self.assertAllClose(retained_boxes_, expected_retained_boxes_) - self.assertAllClose(retained_labels_, expected_retained_labels_) - self.assertAllClose( - retained_label_scores_, expected_retained_label_scores_) - - def testRunRetainBoxesAboveThresholdWithMasks(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - masks = self.createTestMasks() - - tensor_dict = { - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_label_scores: label_scores, - fields.InputDataFields.groundtruth_instance_masks: masks - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_label_scores=True, - include_instance_masks=True) - - preprocessing_options = [ - (preprocessor.retain_boxes_above_threshold, {'threshold': 0.6}) - ] - - retained_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - retained_masks = retained_tensor_dict[ - fields.InputDataFields.groundtruth_instance_masks] - - with self.test_session() as sess: - (retained_masks_, expected_masks_) = sess.run( - [retained_masks, - self.expectedMasksAfterThresholding()]) - self.assertAllClose(retained_masks_, expected_masks_) - - def testRunRetainBoxesAboveThresholdWithKeypoints(self): - boxes = self.createTestBoxes() - labels = self.createTestLabels() - label_scores = self.createTestLabelScores() - keypoints = self.createTestKeypoints() - - tensor_dict = { - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_label_scores: label_scores, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_label_scores=True, - include_keypoints=True) - - preprocessing_options = [ - (preprocessor.retain_boxes_above_threshold, {'threshold': 0.6}) - ] - - retained_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - retained_keypoints = retained_tensor_dict[ - fields.InputDataFields.groundtruth_keypoints] - - with self.test_session() as sess: - (retained_keypoints_, expected_keypoints_) = sess.run( - [retained_keypoints, - self.expectedKeypointsAfterThresholding()]) - self.assertAllClose(retained_keypoints_, expected_keypoints_) - - def testRunRandomCropToAspectRatioWithMasks(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - masks = tf.random_uniform([2, 200, 400], dtype=tf.float32) - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_instance_masks: masks - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_instance_masks=True) - - preprocessing_options = [(preprocessor.random_crop_to_aspect_ratio, {})] - - with mock.patch.object(preprocessor, - '_random_integer') as mock_random_integer: - mock_random_integer.return_value = tf.constant(0, dtype=tf.int32) - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_masks = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_instance_masks] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_masks_) = sess.run([ - distorted_image, distorted_boxes, distorted_labels, distorted_masks - ]) - - expected_boxes = np.array([0.0, 0.5, 0.75, 1.0], dtype=np.float32) - self.assertAllEqual(distorted_image_.shape, [1, 200, 200, 3]) - self.assertAllEqual(distorted_labels_, [1]) - self.assertAllClose(distorted_boxes_.flatten(), - expected_boxes.flatten()) - self.assertAllEqual(distorted_masks_.shape, [1, 200, 200]) - - def testRunRandomCropToAspectRatioWithKeypoints(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - keypoints = self.createTestKeypoints() - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_keypoints=True) - - preprocessing_options = [(preprocessor.random_crop_to_aspect_ratio, {})] - - with mock.patch.object(preprocessor, - '_random_integer') as mock_random_integer: - mock_random_integer.return_value = tf.constant(0, dtype=tf.int32) - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_keypoints = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_keypoints_) = sess.run([ - distorted_image, distorted_boxes, distorted_labels, - distorted_keypoints - ]) - - expected_boxes = np.array([0.0, 0.5, 0.75, 1.0], dtype=np.float32) - expected_keypoints = np.array( - [[0.1, 0.2], [0.2, 0.4], [0.3, 0.6]], dtype=np.float32) - self.assertAllEqual(distorted_image_.shape, [1, 200, 200, 3]) - self.assertAllEqual(distorted_labels_, [1]) - self.assertAllClose(distorted_boxes_.flatten(), - expected_boxes.flatten()) - self.assertAllClose(distorted_keypoints_.flatten(), - expected_keypoints.flatten()) - - def testRunRandomPadToAspectRatioWithMasks(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - masks = tf.random_uniform([2, 200, 400], dtype=tf.float32) - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_instance_masks: masks - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_instance_masks=True) - - preprocessing_options = [(preprocessor.random_pad_to_aspect_ratio, {})] - - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_masks = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_instance_masks] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_masks_) = sess.run([ - distorted_image, distorted_boxes, distorted_labels, distorted_masks - ]) - - expected_boxes = np.array( - [[0.0, 0.25, 0.375, 1.0], [0.125, 0.5, 0.375, 1.0]], dtype=np.float32) - self.assertAllEqual(distorted_image_.shape, [1, 400, 400, 3]) - self.assertAllEqual(distorted_labels_, [1, 2]) - self.assertAllClose(distorted_boxes_.flatten(), - expected_boxes.flatten()) - self.assertAllEqual(distorted_masks_.shape, [2, 400, 400]) - - def testRunRandomPadToAspectRatioWithKeypoints(self): - image = self.createColorfulTestImage() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - keypoints = self.createTestKeypoints() - - tensor_dict = { - fields.InputDataFields.image: image, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - fields.InputDataFields.groundtruth_keypoints: keypoints - } - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_keypoints=True) - - preprocessing_options = [(preprocessor.random_pad_to_aspect_ratio, {})] - - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_image = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - distorted_labels = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_classes] - distorted_keypoints = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_keypoints] - with self.test_session() as sess: - (distorted_image_, distorted_boxes_, distorted_labels_, - distorted_keypoints_) = sess.run([ - distorted_image, distorted_boxes, distorted_labels, - distorted_keypoints - ]) - - expected_boxes = np.array( - [[0.0, 0.25, 0.375, 1.0], [0.125, 0.5, 0.375, 1.0]], dtype=np.float32) - expected_keypoints = np.array([ - [[0.05, 0.1], [0.1, 0.2], [0.15, 0.3]], - [[0.2, 0.4], [0.25, 0.5], [0.3, 0.6]], - ], dtype=np.float32) - self.assertAllEqual(distorted_image_.shape, [1, 400, 400, 3]) - self.assertAllEqual(distorted_labels_, [1, 2]) - self.assertAllClose(distorted_boxes_.flatten(), - expected_boxes.flatten()) - self.assertAllClose(distorted_keypoints_.flatten(), - expected_keypoints.flatten()) - - def testRandomPadImage(self): - preprocessing_options = [(preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })] - - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images = tensor_dict[fields.InputDataFields.image] - - preprocessing_options = [(preprocessor.random_pad_image, {})] - padded_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - - padded_images = padded_tensor_dict[fields.InputDataFields.image] - padded_boxes = padded_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_shape = tf.shape(boxes) - padded_boxes_shape = tf.shape(padded_boxes) - images_shape = tf.shape(images) - padded_images_shape = tf.shape(padded_images) - - with self.test_session() as sess: - (boxes_shape_, padded_boxes_shape_, images_shape_, - padded_images_shape_, boxes_, padded_boxes_) = sess.run( - [boxes_shape, padded_boxes_shape, images_shape, - padded_images_shape, boxes, padded_boxes]) - self.assertAllEqual(boxes_shape_, padded_boxes_shape_) - self.assertTrue((images_shape_[1] >= padded_images_shape_[1] * 0.5).all) - self.assertTrue((images_shape_[2] >= padded_images_shape_[2] * 0.5).all) - self.assertTrue((images_shape_[1] <= padded_images_shape_[1]).all) - self.assertTrue((images_shape_[2] <= padded_images_shape_[2]).all) - self.assertTrue(np.all((boxes_[:, 2] - boxes_[:, 0]) >= ( - padded_boxes_[:, 2] - padded_boxes_[:, 0]))) - self.assertTrue(np.all((boxes_[:, 3] - boxes_[:, 1]) >= ( - padded_boxes_[:, 3] - padded_boxes_[:, 1]))) - - def testRandomCropPadImageWithRandomCoefOne(self): - preprocessing_options = [(preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })] - - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - tensor_dict = preprocessor.preprocess(tensor_dict, preprocessing_options) - images = tensor_dict[fields.InputDataFields.image] - - preprocessing_options = [(preprocessor.random_crop_pad_image, { - 'random_coef': 1.0 - })] - padded_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - - padded_images = padded_tensor_dict[fields.InputDataFields.image] - padded_boxes = padded_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_shape = tf.shape(boxes) - padded_boxes_shape = tf.shape(padded_boxes) - images_shape = tf.shape(images) - padded_images_shape = tf.shape(padded_images) - - with self.test_session() as sess: - (boxes_shape_, padded_boxes_shape_, images_shape_, - padded_images_shape_, boxes_, padded_boxes_) = sess.run( - [boxes_shape, padded_boxes_shape, images_shape, - padded_images_shape, boxes, padded_boxes]) - self.assertAllEqual(boxes_shape_, padded_boxes_shape_) - self.assertTrue((images_shape_[1] >= padded_images_shape_[1] * 0.5).all) - self.assertTrue((images_shape_[2] >= padded_images_shape_[2] * 0.5).all) - self.assertTrue((images_shape_[1] <= padded_images_shape_[1]).all) - self.assertTrue((images_shape_[2] <= padded_images_shape_[2]).all) - self.assertTrue(np.all((boxes_[:, 2] - boxes_[:, 0]) >= ( - padded_boxes_[:, 2] - padded_boxes_[:, 0]))) - self.assertTrue(np.all((boxes_[:, 3] - boxes_[:, 1]) >= ( - padded_boxes_[:, 3] - padded_boxes_[:, 1]))) - - def testRandomCropToAspectRatio(self): - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - tensor_dict = preprocessor.preprocess(tensor_dict, []) - images = tensor_dict[fields.InputDataFields.image] - - preprocessing_options = [(preprocessor.random_crop_to_aspect_ratio, { - 'aspect_ratio': 2.0 - })] - cropped_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - - cropped_images = cropped_tensor_dict[fields.InputDataFields.image] - cropped_boxes = cropped_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_shape = tf.shape(boxes) - cropped_boxes_shape = tf.shape(cropped_boxes) - images_shape = tf.shape(images) - cropped_images_shape = tf.shape(cropped_images) - - with self.test_session() as sess: - (boxes_shape_, cropped_boxes_shape_, images_shape_, - cropped_images_shape_) = sess.run([ - boxes_shape, cropped_boxes_shape, images_shape, cropped_images_shape - ]) - self.assertAllEqual(boxes_shape_, cropped_boxes_shape_) - self.assertEqual(images_shape_[1], cropped_images_shape_[1] * 2) - self.assertEqual(images_shape_[2], cropped_images_shape_[2]) - - def testRandomPadToAspectRatio(self): - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - tensor_dict = preprocessor.preprocess(tensor_dict, []) - images = tensor_dict[fields.InputDataFields.image] - - preprocessing_options = [(preprocessor.random_pad_to_aspect_ratio, { - 'aspect_ratio': 2.0 - })] - padded_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - - padded_images = padded_tensor_dict[fields.InputDataFields.image] - padded_boxes = padded_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - boxes_shape = tf.shape(boxes) - padded_boxes_shape = tf.shape(padded_boxes) - images_shape = tf.shape(images) - padded_images_shape = tf.shape(padded_images) - - with self.test_session() as sess: - (boxes_shape_, padded_boxes_shape_, images_shape_, - padded_images_shape_) = sess.run([ - boxes_shape, padded_boxes_shape, images_shape, padded_images_shape - ]) - self.assertAllEqual(boxes_shape_, padded_boxes_shape_) - self.assertEqual(images_shape_[1], padded_images_shape_[1]) - self.assertEqual(2 * images_shape_[2], padded_images_shape_[2]) - - def testRandomBlackPatches(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_black_patches, { - 'size_to_image_ratio': 0.5 - })) - images = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images} - blacked_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - blacked_images = blacked_tensor_dict[fields.InputDataFields.image] - images_shape = tf.shape(images) - blacked_images_shape = tf.shape(blacked_images) - - with self.test_session() as sess: - (images_shape_, blacked_images_shape_) = sess.run( - [images_shape, blacked_images_shape]) - self.assertAllEqual(images_shape_, blacked_images_shape_) - - def testRandomResizeMethod(self): - preprocessing_options = [] - preprocessing_options.append((preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - })) - preprocessing_options.append((preprocessor.random_resize_method, { - 'target_size': (75, 150) - })) - images = self.createTestImages() - tensor_dict = {fields.InputDataFields.image: images} - resized_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - resized_images = resized_tensor_dict[fields.InputDataFields.image] - resized_images_shape = tf.shape(resized_images) - expected_images_shape = tf.constant([1, 75, 150, 3], dtype=tf.int32) - - with self.test_session() as sess: - (expected_images_shape_, resized_images_shape_) = sess.run( - [expected_images_shape, resized_images_shape]) - self.assertAllEqual(expected_images_shape_, - resized_images_shape_) - - def testResizeImageWithMasks(self): - """Tests image resizing, checking output sizes.""" - in_image_shape_list = [[60, 40, 3], [15, 30, 3]] - in_masks_shape_list = [[15, 60, 40], [10, 15, 30]] - height = 50 - width = 100 - expected_image_shape_list = [[50, 100, 3], [50, 100, 3]] - expected_masks_shape_list = [[15, 50, 100], [10, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.random_uniform(in_image_shape) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_image( - in_image, in_masks, new_height=height, new_width=width) - out_image_shape = tf.shape(out_image) - out_masks_shape = tf.shape(out_masks) - - with self.test_session() as sess: - out_image_shape, out_masks_shape = sess.run( - [out_image_shape, out_masks_shape]) - self.assertAllEqual(out_image_shape, expected_image_shape) - self.assertAllEqual(out_masks_shape, expected_mask_shape) - - def testResizeImageWithNoInstanceMask(self): - """Tests image resizing, checking output sizes.""" - in_image_shape_list = [[60, 40, 3], [15, 30, 3]] - in_masks_shape_list = [[0, 60, 40], [0, 15, 30]] - height = 50 - width = 100 - expected_image_shape_list = [[50, 100, 3], [50, 100, 3]] - expected_masks_shape_list = [[0, 50, 100], [0, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.random_uniform(in_image_shape) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_image( - in_image, in_masks, new_height=height, new_width=width) - out_image_shape = tf.shape(out_image) - out_masks_shape = tf.shape(out_masks) - - with self.test_session() as sess: - out_image_shape, out_masks_shape = sess.run( - [out_image_shape, out_masks_shape]) - self.assertAllEqual(out_image_shape, expected_image_shape) - self.assertAllEqual(out_masks_shape, expected_mask_shape) - - def testResizeToRangePreservesStaticSpatialShape(self): - """Tests image resizing, checking output sizes.""" - in_shape_list = [[60, 40, 3], [15, 30, 3], [15, 50, 3]] - min_dim = 50 - max_dim = 100 - expected_shape_list = [[75, 50, 3], [50, 100, 3], [30, 100, 3]] - - for in_shape, expected_shape in zip(in_shape_list, expected_shape_list): - in_image = tf.random_uniform(in_shape) - out_image = preprocessor.resize_to_range( - in_image, min_dimension=min_dim, max_dimension=max_dim) - self.assertAllEqual(out_image.get_shape().as_list(), expected_shape) - - def testResizeToRangeWithDynamicSpatialShape(self): - """Tests image resizing, checking output sizes.""" - in_shape_list = [[60, 40, 3], [15, 30, 3], [15, 50, 3]] - min_dim = 50 - max_dim = 100 - expected_shape_list = [[75, 50, 3], [50, 100, 3], [30, 100, 3]] - - for in_shape, expected_shape in zip(in_shape_list, expected_shape_list): - in_image = tf.placeholder(tf.float32, shape=(None, None, 3)) - out_image = preprocessor.resize_to_range( - in_image, min_dimension=min_dim, max_dimension=max_dim) - out_image_shape = tf.shape(out_image) - with self.test_session() as sess: - out_image_shape = sess.run(out_image_shape, - feed_dict={in_image: - np.random.randn(*in_shape)}) - self.assertAllEqual(out_image_shape, expected_shape) - - def testResizeToRangeWithMasksPreservesStaticSpatialShape(self): - """Tests image resizing, checking output sizes.""" - in_image_shape_list = [[60, 40, 3], [15, 30, 3]] - in_masks_shape_list = [[15, 60, 40], [10, 15, 30]] - min_dim = 50 - max_dim = 100 - expected_image_shape_list = [[75, 50, 3], [50, 100, 3]] - expected_masks_shape_list = [[15, 75, 50], [10, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.random_uniform(in_image_shape) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_to_range( - in_image, in_masks, min_dimension=min_dim, max_dimension=max_dim) - self.assertAllEqual(out_masks.get_shape().as_list(), expected_mask_shape) - self.assertAllEqual(out_image.get_shape().as_list(), expected_image_shape) - - def testResizeToRangeWithMasksAndDynamicSpatialShape(self): - """Tests image resizing, checking output sizes.""" - in_image_shape_list = [[60, 40, 3], [15, 30, 3]] - in_masks_shape_list = [[15, 60, 40], [10, 15, 30]] - min_dim = 50 - max_dim = 100 - expected_image_shape_list = [[75, 50, 3], [50, 100, 3]] - expected_masks_shape_list = [[15, 75, 50], [10, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.placeholder(tf.float32, shape=(None, None, 3)) - in_masks = tf.placeholder(tf.float32, shape=(None, None, None)) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_to_range( - in_image, in_masks, min_dimension=min_dim, max_dimension=max_dim) - out_image_shape = tf.shape(out_image) - out_masks_shape = tf.shape(out_masks) - - with self.test_session() as sess: - out_image_shape, out_masks_shape = sess.run( - [out_image_shape, out_masks_shape], - feed_dict={ - in_image: np.random.randn(*in_image_shape), - in_masks: np.random.randn(*in_masks_shape) - }) - self.assertAllEqual(out_image_shape, expected_image_shape) - self.assertAllEqual(out_masks_shape, expected_mask_shape) - - def testResizeToRangeWithInstanceMasksTensorOfSizeZero(self): - """Tests image resizing, checking output sizes.""" - in_image_shape_list = [[60, 40, 3], [15, 30, 3]] - in_masks_shape_list = [[0, 60, 40], [0, 15, 30]] - min_dim = 50 - max_dim = 100 - expected_image_shape_list = [[75, 50, 3], [50, 100, 3]] - expected_masks_shape_list = [[0, 75, 50], [0, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.random_uniform(in_image_shape) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_to_range( - in_image, in_masks, min_dimension=min_dim, max_dimension=max_dim) - out_image_shape = tf.shape(out_image) - out_masks_shape = tf.shape(out_masks) - - with self.test_session() as sess: - out_image_shape, out_masks_shape = sess.run( - [out_image_shape, out_masks_shape]) - self.assertAllEqual(out_image_shape, expected_image_shape) - self.assertAllEqual(out_masks_shape, expected_mask_shape) - - def testResizeToRange4DImageTensor(self): - image = tf.random_uniform([1, 200, 300, 3]) - with self.assertRaises(ValueError): - preprocessor.resize_to_range(image, 500, 600) - - def testResizeToRangeSameMinMax(self): - """Tests image resizing, checking output sizes.""" - in_shape_list = [[312, 312, 3], [299, 299, 3]] - min_dim = 320 - max_dim = 320 - expected_shape_list = [[320, 320, 3], [320, 320, 3]] - - for in_shape, expected_shape in zip(in_shape_list, expected_shape_list): - in_image = tf.random_uniform(in_shape) - out_image = preprocessor.resize_to_range( - in_image, min_dimension=min_dim, max_dimension=max_dim) - out_image_shape = tf.shape(out_image) - - with self.test_session() as sess: - out_image_shape = sess.run(out_image_shape) - self.assertAllEqual(out_image_shape, expected_shape) - - def testResizeToMinDimensionTensorShapes(self): - in_image_shape_list = [[60, 55, 3], [15, 30, 3]] - in_masks_shape_list = [[15, 60, 55], [10, 15, 30]] - min_dim = 50 - expected_image_shape_list = [[60, 55, 3], [50, 100, 3]] - expected_masks_shape_list = [[15, 60, 55], [10, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.placeholder(tf.float32, shape=(None, None, 3)) - in_masks = tf.placeholder(tf.float32, shape=(None, None, None)) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_to_min_dimension( - in_image, in_masks, min_dimension=min_dim) - out_image_shape = tf.shape(out_image) - out_masks_shape = tf.shape(out_masks) - - with self.test_session() as sess: - out_image_shape, out_masks_shape = sess.run( - [out_image_shape, out_masks_shape], - feed_dict={ - in_image: np.random.randn(*in_image_shape), - in_masks: np.random.randn(*in_masks_shape) - }) - self.assertAllEqual(out_image_shape, expected_image_shape) - self.assertAllEqual(out_masks_shape, expected_mask_shape) - - def testResizeToMinDimensionWithInstanceMasksTensorOfSizeZero(self): - """Tests image resizing, checking output sizes.""" - in_image_shape_list = [[60, 40, 3], [15, 30, 3]] - in_masks_shape_list = [[0, 60, 40], [0, 15, 30]] - min_dim = 50 - expected_image_shape_list = [[75, 50, 3], [50, 100, 3]] - expected_masks_shape_list = [[0, 75, 50], [0, 50, 100]] - - for (in_image_shape, expected_image_shape, in_masks_shape, - expected_mask_shape) in zip(in_image_shape_list, - expected_image_shape_list, - in_masks_shape_list, - expected_masks_shape_list): - in_image = tf.random_uniform(in_image_shape) - in_masks = tf.random_uniform(in_masks_shape) - out_image, out_masks = preprocessor.resize_to_min_dimension( - in_image, in_masks, min_dimension=min_dim) - out_image_shape = tf.shape(out_image) - out_masks_shape = tf.shape(out_masks) - - with self.test_session() as sess: - out_image_shape, out_masks_shape = sess.run( - [out_image_shape, out_masks_shape]) - self.assertAllEqual(out_image_shape, expected_image_shape) - self.assertAllEqual(out_masks_shape, expected_mask_shape) - - def testResizeToMinDimensionRaisesErrorOn4DImage(self): - image = tf.random_uniform([1, 200, 300, 3]) - with self.assertRaises(ValueError): - preprocessor.resize_to_min_dimension(image, 500) - - def testScaleBoxesToPixelCoordinates(self): - """Tests box scaling, checking scaled values.""" - in_shape = [60, 40, 3] - in_boxes = [[0.1, 0.2, 0.4, 0.6], - [0.5, 0.3, 0.9, 0.7]] - - expected_boxes = [[6., 8., 24., 24.], - [30., 12., 54., 28.]] - - in_image = tf.random_uniform(in_shape) - in_boxes = tf.constant(in_boxes) - _, out_boxes = preprocessor.scale_boxes_to_pixel_coordinates( - in_image, boxes=in_boxes) - with self.test_session() as sess: - out_boxes = sess.run(out_boxes) - self.assertAllClose(out_boxes, expected_boxes) - - def testScaleBoxesToPixelCoordinatesWithKeypoints(self): - """Tests box and keypoint scaling, checking scaled values.""" - in_shape = [60, 40, 3] - in_boxes = self.createTestBoxes() - in_keypoints = self.createTestKeypoints() - - expected_boxes = [[0., 10., 45., 40.], - [15., 20., 45., 40.]] - expected_keypoints = [ - [[6., 4.], [12., 8.], [18., 12.]], - [[24., 16.], [30., 20.], [36., 24.]], - ] - - in_image = tf.random_uniform(in_shape) - _, out_boxes, out_keypoints = preprocessor.scale_boxes_to_pixel_coordinates( - in_image, boxes=in_boxes, keypoints=in_keypoints) - with self.test_session() as sess: - out_boxes_, out_keypoints_ = sess.run([out_boxes, out_keypoints]) - self.assertAllClose(out_boxes_, expected_boxes) - self.assertAllClose(out_keypoints_, expected_keypoints) - - def testSubtractChannelMean(self): - """Tests whether channel means have been subtracted.""" - with self.test_session(): - image = tf.zeros((240, 320, 3)) - means = [1, 2, 3] - actual = preprocessor.subtract_channel_mean(image, means=means) - actual = actual.eval() - - self.assertTrue((actual[:, :, 0] == -1).all()) - self.assertTrue((actual[:, :, 1] == -2).all()) - self.assertTrue((actual[:, :, 2] == -3).all()) - - def testOneHotEncoding(self): - """Tests one hot encoding of multiclass labels.""" - with self.test_session(): - labels = tf.constant([1, 4, 2], dtype=tf.int32) - one_hot = preprocessor.one_hot_encoding(labels, num_classes=5) - one_hot = one_hot.eval() - - self.assertAllEqual([0, 1, 1, 0, 1], one_hot) - - def testSSDRandomCrop(self): - preprocessing_options = [ - (preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - }), - (preprocessor.ssd_random_crop, {})] - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - distorted_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - - images_rank = tf.rank(images) - distorted_images_rank = tf.rank(distorted_images) - boxes_rank = tf.rank(boxes) - distorted_boxes_rank = tf.rank(distorted_boxes) - - with self.test_session() as sess: - (boxes_rank_, distorted_boxes_rank_, images_rank_, - distorted_images_rank_) = sess.run( - [boxes_rank, distorted_boxes_rank, images_rank, - distorted_images_rank]) - self.assertAllEqual(boxes_rank_, distorted_boxes_rank_) - self.assertAllEqual(images_rank_, distorted_images_rank_) - - def testSSDRandomCropPad(self): - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - preprocessing_options = [ - (preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - }), - (preprocessor.ssd_random_crop_pad, {})] - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels, - } - distorted_tensor_dict = preprocessor.preprocess(tensor_dict, - preprocessing_options) - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - - images_rank = tf.rank(images) - distorted_images_rank = tf.rank(distorted_images) - boxes_rank = tf.rank(boxes) - distorted_boxes_rank = tf.rank(distorted_boxes) - - with self.test_session() as sess: - (boxes_rank_, distorted_boxes_rank_, images_rank_, - distorted_images_rank_) = sess.run([ - boxes_rank, distorted_boxes_rank, images_rank, distorted_images_rank - ]) - self.assertAllEqual(boxes_rank_, distorted_boxes_rank_) - self.assertAllEqual(images_rank_, distorted_images_rank_) - - def _testSSDRandomCropFixedAspectRatio(self, - include_label_scores, - include_instance_masks, - include_keypoints): - images = self.createTestImages() - boxes = self.createTestBoxes() - labels = self.createTestLabels() - preprocessing_options = [ - (preprocessor.normalize_image, { - 'original_minval': 0, - 'original_maxval': 255, - 'target_minval': 0, - 'target_maxval': 1 - }), - (preprocessor.ssd_random_crop_fixed_aspect_ratio, {})] - tensor_dict = { - fields.InputDataFields.image: images, - fields.InputDataFields.groundtruth_boxes: boxes, - fields.InputDataFields.groundtruth_classes: labels - } - if include_label_scores: - label_scores = self.createTestLabelScores() - tensor_dict[fields.InputDataFields.groundtruth_label_scores] = ( - label_scores) - if include_instance_masks: - masks = self.createTestMasks() - tensor_dict[fields.InputDataFields.groundtruth_instance_masks] = masks - if include_keypoints: - keypoints = self.createTestKeypoints() - tensor_dict[fields.InputDataFields.groundtruth_keypoints] = keypoints - - preprocessor_arg_map = preprocessor.get_default_func_arg_map( - include_label_scores=include_label_scores, - include_instance_masks=include_instance_masks, - include_keypoints=include_keypoints) - distorted_tensor_dict = preprocessor.preprocess( - tensor_dict, preprocessing_options, func_arg_map=preprocessor_arg_map) - distorted_images = distorted_tensor_dict[fields.InputDataFields.image] - distorted_boxes = distorted_tensor_dict[ - fields.InputDataFields.groundtruth_boxes] - images_rank = tf.rank(images) - distorted_images_rank = tf.rank(distorted_images) - boxes_rank = tf.rank(boxes) - distorted_boxes_rank = tf.rank(distorted_boxes) - - with self.test_session() as sess: - (boxes_rank_, distorted_boxes_rank_, images_rank_, - distorted_images_rank_) = sess.run( - [boxes_rank, distorted_boxes_rank, images_rank, - distorted_images_rank]) - self.assertAllEqual(boxes_rank_, distorted_boxes_rank_) - self.assertAllEqual(images_rank_, distorted_images_rank_) - - def testSSDRandomCropFixedAspectRatio(self): - self._testSSDRandomCropFixedAspectRatio(include_label_scores=False, - include_instance_masks=False, - include_keypoints=False) - - def testSSDRandomCropFixedAspectRatioWithMasksAndKeypoints(self): - self._testSSDRandomCropFixedAspectRatio(include_label_scores=False, - include_instance_masks=True, - include_keypoints=True) - - def testSSDRandomCropFixedAspectRatioWithLabelScoresMasksAndKeypoints(self): - self._testSSDRandomCropFixedAspectRatio(include_label_scores=True, - include_instance_masks=True, - include_keypoints=True) - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/region_similarity_calculator.py b/object_detection/core/region_similarity_calculator.py deleted file mode 100644 index f344006a..00000000 --- a/object_detection/core/region_similarity_calculator.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Region Similarity Calculators for BoxLists. - -Region Similarity Calculators compare a pairwise measure of similarity -between the boxes in two BoxLists. -""" -from abc import ABCMeta -from abc import abstractmethod - -import tensorflow as tf - -from object_detection.core import box_list_ops - - -class RegionSimilarityCalculator(object): - """Abstract base class for region similarity calculator.""" - __metaclass__ = ABCMeta - - def compare(self, boxlist1, boxlist2, scope=None): - """Computes matrix of pairwise similarity between BoxLists. - - This op (to be overriden) computes a measure of pairwise similarity between - the boxes in the given BoxLists. Higher values indicate more similarity. - - Note that this method simply measures similarity and does not explicitly - perform a matching. - - Args: - boxlist1: BoxList holding N boxes. - boxlist2: BoxList holding M boxes. - scope: Op scope name. Defaults to 'Compare' if None. - - Returns: - a (float32) tensor of shape [N, M] with pairwise similarity score. - """ - with tf.name_scope(scope, 'Compare', [boxlist1, boxlist2]) as scope: - return self._compare(boxlist1, boxlist2) - - @abstractmethod - def _compare(self, boxlist1, boxlist2): - pass - - -class IouSimilarity(RegionSimilarityCalculator): - """Class to compute similarity based on Intersection over Union (IOU) metric. - - This class computes pairwise similarity between two BoxLists based on IOU. - """ - - def _compare(self, boxlist1, boxlist2): - """Compute pairwise IOU similarity between the two BoxLists. - - Args: - boxlist1: BoxList holding N boxes. - boxlist2: BoxList holding M boxes. - - Returns: - A tensor with shape [N, M] representing pairwise iou scores. - """ - return box_list_ops.iou(boxlist1, boxlist2) - - -class NegSqDistSimilarity(RegionSimilarityCalculator): - """Class to compute similarity based on the squared distance metric. - - This class computes pairwise similarity between two BoxLists based on the - negative squared distance metric. - """ - - def _compare(self, boxlist1, boxlist2): - """Compute matrix of (negated) sq distances. - - Args: - boxlist1: BoxList holding N boxes. - boxlist2: BoxList holding M boxes. - - Returns: - A tensor with shape [N, M] representing negated pairwise squared distance. - """ - return -1 * box_list_ops.sq_dist(boxlist1, boxlist2) - - -class IoaSimilarity(RegionSimilarityCalculator): - """Class to compute similarity based on Intersection over Area (IOA) metric. - - This class computes pairwise similarity between two BoxLists based on their - pairwise intersections divided by the areas of second BoxLists. - """ - - def _compare(self, boxlist1, boxlist2): - """Compute pairwise IOA similarity between the two BoxLists. - - Args: - boxlist1: BoxList holding N boxes. - boxlist2: BoxList holding M boxes. - - Returns: - A tensor with shape [N, M] representing pairwise IOA scores. - """ - return box_list_ops.ioa(boxlist1, boxlist2) diff --git a/object_detection/core/region_similarity_calculator_test.py b/object_detection/core/region_similarity_calculator_test.py deleted file mode 100644 index 162151a3..00000000 --- a/object_detection/core/region_similarity_calculator_test.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for region_similarity_calculator.""" -import tensorflow as tf - -from object_detection.core import box_list -from object_detection.core import region_similarity_calculator - - -class RegionSimilarityCalculatorTest(tf.test.TestCase): - - def test_get_correct_pairwise_similarity_based_on_iou(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - exp_output = [[2.0 / 16.0, 0, 6.0 / 400.0], [1.0 / 16.0, 0.0, 5.0 / 400.0]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - iou_similarity_calculator = region_similarity_calculator.IouSimilarity() - iou_similarity = iou_similarity_calculator.compare(boxes1, boxes2) - with self.test_session() as sess: - iou_output = sess.run(iou_similarity) - self.assertAllClose(iou_output, exp_output) - - def test_get_correct_pairwise_similarity_based_on_squared_distances(self): - corners1 = tf.constant([[0.0, 0.0, 0.0, 0.0], - [1.0, 1.0, 0.0, 2.0]]) - corners2 = tf.constant([[3.0, 4.0, 1.0, 0.0], - [-4.0, 0.0, 0.0, 3.0], - [0.0, 0.0, 0.0, 0.0]]) - exp_output = [[-26, -25, 0], [-18, -27, -6]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - dist_similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - dist_similarity = dist_similarity_calc.compare(boxes1, boxes2) - with self.test_session() as sess: - dist_output = sess.run(dist_similarity) - self.assertAllClose(dist_output, exp_output) - - def test_get_correct_pairwise_similarity_based_on_ioa(self): - corners1 = tf.constant([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]]) - corners2 = tf.constant([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0], - [0.0, 0.0, 20.0, 20.0]]) - exp_output_1 = [[2.0 / 12.0, 0, 6.0 / 400.0], - [1.0 / 12.0, 0.0, 5.0 / 400.0]] - exp_output_2 = [[2.0 / 6.0, 1.0 / 5.0], - [0, 0], - [6.0 / 6.0, 5.0 / 5.0]] - boxes1 = box_list.BoxList(corners1) - boxes2 = box_list.BoxList(corners2) - ioa_similarity_calculator = region_similarity_calculator.IoaSimilarity() - ioa_similarity_1 = ioa_similarity_calculator.compare(boxes1, boxes2) - ioa_similarity_2 = ioa_similarity_calculator.compare(boxes2, boxes1) - with self.test_session() as sess: - iou_output_1, iou_output_2 = sess.run( - [ioa_similarity_1, ioa_similarity_2]) - self.assertAllClose(iou_output_1, exp_output_1) - self.assertAllClose(iou_output_2, exp_output_2) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/core/standard_fields.py b/object_detection/core/standard_fields.py deleted file mode 100644 index 7cbf5ee8..00000000 --- a/object_detection/core/standard_fields.py +++ /dev/null @@ -1,205 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Contains classes specifying naming conventions used for object detection. - - -Specifies: - InputDataFields: standard fields used by reader/preprocessor/batcher. - DetectionResultFields: standard fields returned by object detector. - BoxListFields: standard field used by BoxList - TfExampleFields: standard fields for tf-example data format (go/tf-example). -""" - - -class InputDataFields(object): - """Names for the input tensors. - - Holds the standard data field names to use for identifying input tensors. This - should be used by the decoder to identify keys for the returned tensor_dict - containing input tensors. And it should be used by the model to identify the - tensors it needs. - - Attributes: - image: image. - original_image: image in the original input size. - key: unique key corresponding to image. - source_id: source of the original image. - filename: original filename of the dataset (without common path). - groundtruth_image_classes: image-level class labels. - groundtruth_boxes: coordinates of the ground truth boxes in the image. - groundtruth_classes: box-level class labels. - groundtruth_label_types: box-level label types (e.g. explicit negative). - groundtruth_is_crowd: [DEPRECATED, use groundtruth_group_of instead] - is the groundtruth a single object or a crowd. - groundtruth_area: area of a groundtruth segment. - groundtruth_difficult: is a `difficult` object - groundtruth_group_of: is a `group_of` objects, e.g. multiple objects of the - same class, forming a connected group, where instances are heavily - occluding each other. - proposal_boxes: coordinates of object proposal boxes. - proposal_objectness: objectness score of each proposal. - groundtruth_instance_masks: ground truth instance masks. - groundtruth_instance_boundaries: ground truth instance boundaries. - groundtruth_instance_classes: instance mask-level class labels. - groundtruth_keypoints: ground truth keypoints. - groundtruth_keypoint_visibilities: ground truth keypoint visibilities. - groundtruth_label_scores: groundtruth label scores. - """ - image = 'image' - original_image = 'original_image' - key = 'key' - source_id = 'source_id' - filename = 'filename' - groundtruth_image_classes = 'groundtruth_image_classes' - groundtruth_boxes = 'groundtruth_boxes' - groundtruth_classes = 'groundtruth_classes' - groundtruth_label_types = 'groundtruth_label_types' - groundtruth_is_crowd = 'groundtruth_is_crowd' - groundtruth_area = 'groundtruth_area' - groundtruth_difficult = 'groundtruth_difficult' - groundtruth_group_of = 'groundtruth_group_of' - proposal_boxes = 'proposal_boxes' - proposal_objectness = 'proposal_objectness' - groundtruth_instance_masks = 'groundtruth_instance_masks' - groundtruth_instance_boundaries = 'groundtruth_instance_boundaries' - groundtruth_instance_classes = 'groundtruth_instance_classes' - groundtruth_keypoints = 'groundtruth_keypoints' - groundtruth_keypoint_visibilities = 'groundtruth_keypoint_visibilities' - groundtruth_label_scores = 'groundtruth_label_scores' - - -class DetectionResultFields(object): - """Naming converntions for storing the output of the detector. - - Attributes: - source_id: source of the original image. - key: unique key corresponding to image. - detection_boxes: coordinates of the detection boxes in the image. - detection_scores: detection scores for the detection boxes in the image. - detection_classes: detection-level class labels. - detection_masks: contains a segmentation mask for each detection box. - detection_boundaries: contains an object boundary for each detection box. - detection_keypoints: contains detection keypoints for each detection box. - num_detections: number of detections in the batch. - """ - - source_id = 'source_id' - key = 'key' - detection_boxes = 'detection_boxes' - detection_scores = 'detection_scores' - detection_classes = 'detection_classes' - detection_masks = 'detection_masks' - detection_boundaries = 'detection_boundaries' - detection_keypoints = 'detection_keypoints' - num_detections = 'num_detections' - - -class BoxListFields(object): - """Naming conventions for BoxLists. - - Attributes: - boxes: bounding box coordinates. - classes: classes per bounding box. - scores: scores per bounding box. - weights: sample weights per bounding box. - objectness: objectness score per bounding box. - masks: masks per bounding box. - boundaries: boundaries per bounding box. - keypoints: keypoints per bounding box. - keypoint_heatmaps: keypoint heatmaps per bounding box. - """ - boxes = 'boxes' - classes = 'classes' - scores = 'scores' - weights = 'weights' - objectness = 'objectness' - masks = 'masks' - boundaries = 'boundaries' - keypoints = 'keypoints' - keypoint_heatmaps = 'keypoint_heatmaps' - - -class TfExampleFields(object): - """TF-example proto feature names for object detection. - - Holds the standard feature names to load from an Example proto for object - detection. - - Attributes: - image_encoded: JPEG encoded string - image_format: image format, e.g. "JPEG" - filename: filename - channels: number of channels of image - colorspace: colorspace, e.g. "RGB" - height: height of image in pixels, e.g. 462 - width: width of image in pixels, e.g. 581 - source_id: original source of the image - object_class_text: labels in text format, e.g. ["person", "cat"] - object_class_label: labels in numbers, e.g. [16, 8] - object_bbox_xmin: xmin coordinates of groundtruth box, e.g. 10, 30 - object_bbox_xmax: xmax coordinates of groundtruth box, e.g. 50, 40 - object_bbox_ymin: ymin coordinates of groundtruth box, e.g. 40, 50 - object_bbox_ymax: ymax coordinates of groundtruth box, e.g. 80, 70 - object_view: viewpoint of object, e.g. ["frontal", "left"] - object_truncated: is object truncated, e.g. [true, false] - object_occluded: is object occluded, e.g. [true, false] - object_difficult: is object difficult, e.g. [true, false] - object_group_of: is object a single object or a group of objects - object_depiction: is object a depiction - object_is_crowd: [DEPRECATED, use object_group_of instead] - is the object a single object or a crowd - object_segment_area: the area of the segment. - instance_masks: instance segmentation masks. - instance_boundaries: instance boundaries. - instance_classes: Classes for each instance segmentation mask. - detection_class_label: class label in numbers. - detection_bbox_ymin: ymin coordinates of a detection box. - detection_bbox_xmin: xmin coordinates of a detection box. - detection_bbox_ymax: ymax coordinates of a detection box. - detection_bbox_xmax: xmax coordinates of a detection box. - detection_score: detection score for the class label and box. - """ - image_encoded = 'image/encoded' - image_format = 'image/format' # format is reserved keyword - filename = 'image/filename' - channels = 'image/channels' - colorspace = 'image/colorspace' - height = 'image/height' - width = 'image/width' - source_id = 'image/source_id' - object_class_text = 'image/object/class/text' - object_class_label = 'image/object/class/label' - object_bbox_ymin = 'image/object/bbox/ymin' - object_bbox_xmin = 'image/object/bbox/xmin' - object_bbox_ymax = 'image/object/bbox/ymax' - object_bbox_xmax = 'image/object/bbox/xmax' - object_view = 'image/object/view' - object_truncated = 'image/object/truncated' - object_occluded = 'image/object/occluded' - object_difficult = 'image/object/difficult' - object_group_of = 'image/object/group_of' - object_depiction = 'image/object/depiction' - object_is_crowd = 'image/object/is_crowd' - object_segment_area = 'image/object/segment/area' - instance_masks = 'image/segmentation/object' - instance_boundaries = 'image/boundaries/object' - instance_classes = 'image/segmentation/object/class' - detection_class_label = 'image/detection/label' - detection_bbox_ymin = 'image/detection/bbox/ymin' - detection_bbox_xmin = 'image/detection/bbox/xmin' - detection_bbox_ymax = 'image/detection/bbox/ymax' - detection_bbox_xmax = 'image/detection/bbox/xmax' - detection_score = 'image/detection/score' diff --git a/object_detection/core/target_assigner.py b/object_detection/core/target_assigner.py deleted file mode 100644 index d028dd59..00000000 --- a/object_detection/core/target_assigner.py +++ /dev/null @@ -1,455 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Base target assigner module. - -The job of a TargetAssigner is, for a given set of anchors (bounding boxes) and -groundtruth detections (bounding boxes), to assign classification and regression -targets to each anchor as well as weights to each anchor (specifying, e.g., -which anchors should not contribute to training loss). - -It assigns classification/regression targets by performing the following steps: -1) Computing pairwise similarity between anchors and groundtruth boxes using a - provided RegionSimilarity Calculator -2) Computing a matching based on the similarity matrix using a provided Matcher -3) Assigning regression targets based on the matching and a provided BoxCoder -4) Assigning classification targets based on the matching and groundtruth labels - -Note that TargetAssigners only operate on detections from a single -image at a time, so any logic for applying a TargetAssigner to multiple -images must be handled externally. -""" -import tensorflow as tf - -from object_detection.box_coders import faster_rcnn_box_coder -from object_detection.box_coders import mean_stddev_box_coder -from object_detection.core import box_coder as bcoder -from object_detection.core import box_list -from object_detection.core import box_list_ops -from object_detection.core import matcher as mat -from object_detection.core import region_similarity_calculator as sim_calc -from object_detection.matchers import argmax_matcher -from object_detection.matchers import bipartite_matcher - - -class TargetAssigner(object): - """Target assigner to compute classification and regression targets.""" - - def __init__(self, similarity_calc, matcher, box_coder, - positive_class_weight=1.0, negative_class_weight=1.0, - unmatched_cls_target=None): - """Construct Object Detection Target Assigner. - - Args: - similarity_calc: a RegionSimilarityCalculator - matcher: an object_detection.core.Matcher used to match groundtruth to - anchors. - box_coder: an object_detection.core.BoxCoder used to encode matching - groundtruth boxes with respect to anchors. - positive_class_weight: classification weight to be associated to positive - anchors (default: 1.0) - negative_class_weight: classification weight to be associated to negative - anchors (default: 1.0) - unmatched_cls_target: a float32 tensor with shape [d_1, d_2, ..., d_k] - which is consistent with the classification target for each - anchor (and can be empty for scalar targets). This shape must thus be - compatible with the groundtruth labels that are passed to the "assign" - function (which have shape [num_gt_boxes, d_1, d_2, ..., d_k]). - If set to None, unmatched_cls_target is set to be [0] for each anchor. - - Raises: - ValueError: if similarity_calc is not a RegionSimilarityCalculator or - if matcher is not a Matcher or if box_coder is not a BoxCoder - """ - if not isinstance(similarity_calc, sim_calc.RegionSimilarityCalculator): - raise ValueError('similarity_calc must be a RegionSimilarityCalculator') - if not isinstance(matcher, mat.Matcher): - raise ValueError('matcher must be a Matcher') - if not isinstance(box_coder, bcoder.BoxCoder): - raise ValueError('box_coder must be a BoxCoder') - self._similarity_calc = similarity_calc - self._matcher = matcher - self._box_coder = box_coder - self._positive_class_weight = positive_class_weight - self._negative_class_weight = negative_class_weight - if unmatched_cls_target is None: - self._unmatched_cls_target = tf.constant([0], tf.float32) - else: - self._unmatched_cls_target = unmatched_cls_target - - @property - def box_coder(self): - return self._box_coder - - def assign(self, anchors, groundtruth_boxes, groundtruth_labels=None, - **params): - """Assign classification and regression targets to each anchor. - - For a given set of anchors and groundtruth detections, match anchors - to groundtruth_boxes and assign classification and regression targets to - each anchor as well as weights based on the resulting match (specifying, - e.g., which anchors should not contribute to training loss). - - Anchors that are not matched to anything are given a classification target - of self._unmatched_cls_target which can be specified via the constructor. - - Args: - anchors: a BoxList representing N anchors - groundtruth_boxes: a BoxList representing M groundtruth boxes - groundtruth_labels: a tensor of shape [M, d_1, ... d_k] - with labels for each of the ground_truth boxes. The subshape - [d_1, ... d_k] can be empty (corresponding to scalar inputs). When set - to None, groundtruth_labels assumes a binary problem where all - ground_truth boxes get a positive label (of 1). - **params: Additional keyword arguments for specific implementations of - the Matcher. - - Returns: - cls_targets: a float32 tensor with shape [num_anchors, d_1, d_2 ... d_k], - where the subshape [d_1, ..., d_k] is compatible with groundtruth_labels - which has shape [num_gt_boxes, d_1, d_2, ... d_k]. - cls_weights: a float32 tensor with shape [num_anchors] - reg_targets: a float32 tensor with shape [num_anchors, box_code_dimension] - reg_weights: a float32 tensor with shape [num_anchors] - match: a matcher.Match object encoding the match between anchors and - groundtruth boxes, with rows corresponding to groundtruth boxes - and columns corresponding to anchors. - - Raises: - ValueError: if anchors or groundtruth_boxes are not of type - box_list.BoxList - """ - if not isinstance(anchors, box_list.BoxList): - raise ValueError('anchors must be an BoxList') - if not isinstance(groundtruth_boxes, box_list.BoxList): - raise ValueError('groundtruth_boxes must be an BoxList') - - if groundtruth_labels is None: - groundtruth_labels = tf.ones(tf.expand_dims(groundtruth_boxes.num_boxes(), - 0)) - groundtruth_labels = tf.expand_dims(groundtruth_labels, -1) - unmatched_shape_assert = tf.assert_equal( - tf.shape(groundtruth_labels)[1:], tf.shape(self._unmatched_cls_target), - message='Unmatched class target shape incompatible ' - 'with groundtruth labels shape!') - labels_and_box_shapes_assert = tf.assert_equal( - tf.shape(groundtruth_labels)[0], groundtruth_boxes.num_boxes(), - message='Groundtruth boxes and labels have incompatible shapes!') - - with tf.control_dependencies( - [unmatched_shape_assert, labels_and_box_shapes_assert]): - match_quality_matrix = self._similarity_calc.compare(groundtruth_boxes, - anchors) - match = self._matcher.match(match_quality_matrix, **params) - reg_targets = self._create_regression_targets(anchors, - groundtruth_boxes, - match) - cls_targets = self._create_classification_targets(groundtruth_labels, - match) - reg_weights = self._create_regression_weights(match) - cls_weights = self._create_classification_weights( - match, self._positive_class_weight, self._negative_class_weight) - - num_anchors = anchors.num_boxes_static() - if num_anchors is not None: - reg_targets = self._reset_target_shape(reg_targets, num_anchors) - cls_targets = self._reset_target_shape(cls_targets, num_anchors) - reg_weights = self._reset_target_shape(reg_weights, num_anchors) - cls_weights = self._reset_target_shape(cls_weights, num_anchors) - - return cls_targets, cls_weights, reg_targets, reg_weights, match - - def _reset_target_shape(self, target, num_anchors): - """Sets the static shape of the target. - - Args: - target: the target tensor. Its first dimension will be overwritten. - num_anchors: the number of anchors, which is used to override the target's - first dimension. - - Returns: - A tensor with the shape info filled in. - """ - target_shape = target.get_shape().as_list() - target_shape[0] = num_anchors - target.set_shape(target_shape) - return target - - def _create_regression_targets(self, anchors, groundtruth_boxes, match): - """Returns a regression target for each anchor. - - Args: - anchors: a BoxList representing N anchors - groundtruth_boxes: a BoxList representing M groundtruth_boxes - match: a matcher.Match object - - Returns: - reg_targets: a float32 tensor with shape [N, box_code_dimension] - """ - matched_anchor_indices = match.matched_column_indices() - unmatched_ignored_anchor_indices = (match. - unmatched_or_ignored_column_indices()) - matched_gt_indices = match.matched_row_indices() - matched_anchors = box_list_ops.gather(anchors, - matched_anchor_indices) - matched_gt_boxes = box_list_ops.gather(groundtruth_boxes, - matched_gt_indices) - matched_reg_targets = self._box_coder.encode(matched_gt_boxes, - matched_anchors) - unmatched_ignored_reg_targets = tf.tile( - self._default_regression_target(), - tf.stack([tf.size(unmatched_ignored_anchor_indices), 1])) - reg_targets = tf.dynamic_stitch( - [matched_anchor_indices, unmatched_ignored_anchor_indices], - [matched_reg_targets, unmatched_ignored_reg_targets]) - # TODO: summarize the number of matches on average. - return reg_targets - - def _default_regression_target(self): - """Returns the default target for anchors to regress to. - - Default regression targets are set to zero (though in - this implementation what these targets are set to should - not matter as the regression weight of any box set to - regress to the default target is zero). - - Returns: - default_target: a float32 tensor with shape [1, box_code_dimension] - """ - return tf.constant([self._box_coder.code_size*[0]], tf.float32) - - def _create_classification_targets(self, groundtruth_labels, match): - """Create classification targets for each anchor. - - Assign a classification target of for each anchor to the matching - groundtruth label that is provided by match. Anchors that are not matched - to anything are given the target self._unmatched_cls_target - - Args: - groundtruth_labels: a tensor of shape [num_gt_boxes, d_1, ... d_k] - with labels for each of the ground_truth boxes. The subshape - [d_1, ... d_k] can be empty (corresponding to scalar labels). - match: a matcher.Match object that provides a matching between anchors - and groundtruth boxes. - - Returns: - cls_targets: a float32 tensor with shape [num_anchors, d_1, d_2 ... d_k], - where the subshape [d_1, ..., d_k] is compatible with groundtruth_labels - which has shape [num_gt_boxes, d_1, d_2, ... d_k]. - """ - matched_anchor_indices = match.matched_column_indices() - unmatched_ignored_anchor_indices = (match. - unmatched_or_ignored_column_indices()) - matched_gt_indices = match.matched_row_indices() - matched_cls_targets = tf.gather(groundtruth_labels, matched_gt_indices) - - ones = self._unmatched_cls_target.shape.ndims * [1] - unmatched_ignored_cls_targets = tf.tile( - tf.expand_dims(self._unmatched_cls_target, 0), - tf.stack([tf.size(unmatched_ignored_anchor_indices)] + ones)) - - cls_targets = tf.dynamic_stitch( - [matched_anchor_indices, unmatched_ignored_anchor_indices], - [matched_cls_targets, unmatched_ignored_cls_targets]) - return cls_targets - - def _create_regression_weights(self, match): - """Set regression weight for each anchor. - - Only positive anchors are set to contribute to the regression loss, so this - method returns a weight of 1 for every positive anchor and 0 for every - negative anchor. - - Args: - match: a matcher.Match object that provides a matching between anchors - and groundtruth boxes. - - Returns: - reg_weights: a float32 tensor with shape [num_anchors] representing - regression weights - """ - reg_weights = tf.cast(match.matched_column_indicator(), tf.float32) - return reg_weights - - def _create_classification_weights(self, - match, - positive_class_weight=1.0, - negative_class_weight=1.0): - """Create classification weights for each anchor. - - Positive (matched) anchors are associated with a weight of - positive_class_weight and negative (unmatched) anchors are associated with - a weight of negative_class_weight. When anchors are ignored, weights are set - to zero. By default, both positive/negative weights are set to 1.0, - but they can be adjusted to handle class imbalance (which is almost always - the case in object detection). - - Args: - match: a matcher.Match object that provides a matching between anchors - and groundtruth boxes. - positive_class_weight: weight to be associated to positive anchors - negative_class_weight: weight to be associated to negative anchors - - Returns: - cls_weights: a float32 tensor with shape [num_anchors] representing - classification weights. - """ - matched_indicator = tf.cast(match.matched_column_indicator(), tf.float32) - ignore_indicator = tf.cast(match.ignored_column_indicator(), tf.float32) - unmatched_indicator = 1.0 - matched_indicator - ignore_indicator - cls_weights = (positive_class_weight * matched_indicator - + negative_class_weight * unmatched_indicator) - return cls_weights - - def get_box_coder(self): - """Get BoxCoder of this TargetAssigner. - - Returns: - BoxCoder: BoxCoder object. - """ - return self._box_coder - - -# TODO: This method pulls in all the implementation dependencies into -# core. Therefore its best to have this factory method outside of core. -def create_target_assigner(reference, stage=None, - positive_class_weight=1.0, - negative_class_weight=1.0, - unmatched_cls_target=None): - """Factory function for creating standard target assigners. - - Args: - reference: string referencing the type of TargetAssigner. - stage: string denoting stage: {proposal, detection}. - positive_class_weight: classification weight to be associated to positive - anchors (default: 1.0) - negative_class_weight: classification weight to be associated to negative - anchors (default: 1.0) - unmatched_cls_target: a float32 tensor with shape [d_1, d_2, ..., d_k] - which is consistent with the classification target for each - anchor (and can be empty for scalar targets). This shape must thus be - compatible with the groundtruth labels that are passed to the Assign - function (which have shape [num_gt_boxes, d_1, d_2, ..., d_k]). - If set to None, unmatched_cls_target is set to be 0 for each anchor. - - Returns: - TargetAssigner: desired target assigner. - - Raises: - ValueError: if combination reference+stage is invalid. - """ - if reference == 'Multibox' and stage == 'proposal': - similarity_calc = sim_calc.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - - elif reference == 'FasterRCNN' and stage == 'proposal': - similarity_calc = sim_calc.IouSimilarity() - matcher = argmax_matcher.ArgMaxMatcher(matched_threshold=0.7, - unmatched_threshold=0.3, - force_match_for_each_row=True) - box_coder = faster_rcnn_box_coder.FasterRcnnBoxCoder( - scale_factors=[10.0, 10.0, 5.0, 5.0]) - - elif reference == 'FasterRCNN' and stage == 'detection': - similarity_calc = sim_calc.IouSimilarity() - # Uses all proposals with IOU < 0.5 as candidate negatives. - matcher = argmax_matcher.ArgMaxMatcher(matched_threshold=0.5, - negatives_lower_than_unmatched=True) - box_coder = faster_rcnn_box_coder.FasterRcnnBoxCoder( - scale_factors=[10.0, 10.0, 5.0, 5.0]) - - elif reference == 'FastRCNN': - similarity_calc = sim_calc.IouSimilarity() - matcher = argmax_matcher.ArgMaxMatcher(matched_threshold=0.5, - unmatched_threshold=0.1, - force_match_for_each_row=False, - negatives_lower_than_unmatched=False) - box_coder = faster_rcnn_box_coder.FasterRcnnBoxCoder() - - else: - raise ValueError('No valid combination of reference and stage.') - - return TargetAssigner(similarity_calc, matcher, box_coder, - positive_class_weight=positive_class_weight, - negative_class_weight=negative_class_weight, - unmatched_cls_target=unmatched_cls_target) - - -def batch_assign_targets(target_assigner, - anchors_batch, - gt_box_batch, - gt_class_targets_batch): - """Batched assignment of classification and regression targets. - - Args: - target_assigner: a target assigner. - anchors_batch: BoxList representing N box anchors or list of BoxList objects - with length batch_size representing anchor sets. - gt_box_batch: a list of BoxList objects with length batch_size - representing groundtruth boxes for each image in the batch - gt_class_targets_batch: a list of tensors with length batch_size, where - each tensor has shape [num_gt_boxes_i, classification_target_size] and - num_gt_boxes_i is the number of boxes in the ith boxlist of - gt_box_batch. - - Returns: - batch_cls_targets: a tensor with shape [batch_size, num_anchors, - num_classes], - batch_cls_weights: a tensor with shape [batch_size, num_anchors], - batch_reg_targets: a tensor with shape [batch_size, num_anchors, - box_code_dimension] - batch_reg_weights: a tensor with shape [batch_size, num_anchors], - match_list: a list of matcher.Match objects encoding the match between - anchors and groundtruth boxes for each image of the batch, - with rows of the Match objects corresponding to groundtruth boxes - and columns corresponding to anchors. - Raises: - ValueError: if input list lengths are inconsistent, i.e., - batch_size == len(gt_box_batch) == len(gt_class_targets_batch) - and batch_size == len(anchors_batch) unless anchors_batch is a single - BoxList. - """ - if not isinstance(anchors_batch, list): - anchors_batch = len(gt_box_batch) * [anchors_batch] - if not all( - isinstance(anchors, box_list.BoxList) for anchors in anchors_batch): - raise ValueError('anchors_batch must be a BoxList or list of BoxLists.') - if not (len(anchors_batch) - == len(gt_box_batch) - == len(gt_class_targets_batch)): - raise ValueError('batch size incompatible with lengths of anchors_batch, ' - 'gt_box_batch and gt_class_targets_batch.') - cls_targets_list = [] - cls_weights_list = [] - reg_targets_list = [] - reg_weights_list = [] - match_list = [] - for anchors, gt_boxes, gt_class_targets in zip( - anchors_batch, gt_box_batch, gt_class_targets_batch): - (cls_targets, cls_weights, reg_targets, - reg_weights, match) = target_assigner.assign( - anchors, gt_boxes, gt_class_targets) - cls_targets_list.append(cls_targets) - cls_weights_list.append(cls_weights) - reg_targets_list.append(reg_targets) - reg_weights_list.append(reg_weights) - match_list.append(match) - batch_cls_targets = tf.stack(cls_targets_list) - batch_cls_weights = tf.stack(cls_weights_list) - batch_reg_targets = tf.stack(reg_targets_list) - batch_reg_weights = tf.stack(reg_weights_list) - return (batch_cls_targets, batch_cls_weights, batch_reg_targets, - batch_reg_weights, match_list) diff --git a/object_detection/core/target_assigner_test.py b/object_detection/core/target_assigner_test.py deleted file mode 100644 index 5055e170..00000000 --- a/object_detection/core/target_assigner_test.py +++ /dev/null @@ -1,717 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.core.target_assigner.""" -import numpy as np -import tensorflow as tf - -from object_detection.box_coders import mean_stddev_box_coder -from object_detection.core import box_list -from object_detection.core import region_similarity_calculator -from object_detection.core import target_assigner as targetassigner -from object_detection.matchers import argmax_matcher -from object_detection.matchers import bipartite_matcher - - -class TargetAssignerTest(tf.test.TestCase): - - def test_assign_agnostic(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, unmatched_cls_target=None) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0, 0.5, .5, 1.0]]) - prior_stddevs = tf.constant(3 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], [0.5, 0.5, 0.9, 0.9]] - boxes = box_list.BoxList(tf.constant(box_corners)) - exp_cls_targets = [[1], [1], [0]] - exp_cls_weights = [1, 1, 1] - exp_reg_targets = [[0, 0, 0, 0], - [0, 0, -1, 1], - [0, 0, 0, 0]] - exp_reg_weights = [1, 1, 0] - exp_matching_anchors = [0, 1] - - result = target_assigner.assign(priors, boxes, num_valid_rows=2) - (cls_targets, cls_weights, reg_targets, reg_weights, match) = result - - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, - reg_targets_out, reg_weights_out, matching_anchors_out) = sess.run( - [cls_targets, cls_weights, reg_targets, reg_weights, - match.matched_column_indices()]) - - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(matching_anchors_out, exp_matching_anchors) - self.assertEquals(cls_targets_out.dtype, np.float32) - self.assertEquals(cls_weights_out.dtype, np.float32) - self.assertEquals(reg_targets_out.dtype, np.float32) - self.assertEquals(reg_weights_out.dtype, np.float32) - self.assertEquals(matching_anchors_out.dtype, np.int32) - - def test_assign_with_ignored_matches(self): - # Note: test is very similar to above. The third box matched with an IOU - # of 0.35, which is between the matched and unmatched threshold. This means - # That like above the expected classification targets are [1, 1, 0]. - # Unlike above, the third target is ignored and therefore expected - # classification weights are [1, 1, 0]. - similarity_calc = region_similarity_calculator.IouSimilarity() - matcher = argmax_matcher.ArgMaxMatcher(matched_threshold=0.5, - unmatched_threshold=0.3) - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0.0, 0.5, .9, 1.0]]) - prior_stddevs = tf.constant(3 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.9, 0.9]] - boxes = box_list.BoxList(tf.constant(box_corners)) - exp_cls_targets = [[1], [1], [0]] - exp_cls_weights = [1, 1, 0] - exp_reg_targets = [[0, 0, 0, 0], - [0, 0, -1, 1], - [0, 0, 0, 0]] - exp_reg_weights = [1, 1, 0] - exp_matching_anchors = [0, 1] - - result = target_assigner.assign(priors, boxes) - (cls_targets, cls_weights, reg_targets, reg_weights, match) = result - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, - reg_targets_out, reg_weights_out, matching_anchors_out) = sess.run( - [cls_targets, cls_weights, reg_targets, reg_weights, - match.matched_column_indices()]) - - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(matching_anchors_out, exp_matching_anchors) - self.assertEquals(cls_targets_out.dtype, np.float32) - self.assertEquals(cls_weights_out.dtype, np.float32) - self.assertEquals(reg_targets_out.dtype, np.float32) - self.assertEquals(reg_weights_out.dtype, np.float32) - self.assertEquals(matching_anchors_out.dtype, np.int32) - - def test_assign_multiclass(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([1, 0, 0, 0, 0, 0, 0], tf.float32) - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - unmatched_cls_target=unmatched_cls_target) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0, 0.5, .5, 1.0], - [.75, 0, 1.0, .25]]) - prior_stddevs = tf.constant(4 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.9, 0.9], - [.75, 0, .95, .27]] - boxes = box_list.BoxList(tf.constant(box_corners)) - - groundtruth_labels = tf.constant([[0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 1, 0, 0, 0]], tf.float32) - - exp_cls_targets = [[0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 1, 0], - [1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0]] - exp_cls_weights = [1, 1, 1, 1] - exp_reg_targets = [[0, 0, 0, 0], - [0, 0, -1, 1], - [0, 0, 0, 0], - [0, 0, -.5, .2]] - exp_reg_weights = [1, 1, 0, 1] - exp_matching_anchors = [0, 1, 3] - - result = target_assigner.assign(priors, boxes, groundtruth_labels, - num_valid_rows=3) - (cls_targets, cls_weights, reg_targets, reg_weights, match) = result - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, - reg_targets_out, reg_weights_out, matching_anchors_out) = sess.run( - [cls_targets, cls_weights, reg_targets, reg_weights, - match.matched_column_indices()]) - - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(matching_anchors_out, exp_matching_anchors) - self.assertEquals(cls_targets_out.dtype, np.float32) - self.assertEquals(cls_weights_out.dtype, np.float32) - self.assertEquals(reg_targets_out.dtype, np.float32) - self.assertEquals(reg_weights_out.dtype, np.float32) - self.assertEquals(matching_anchors_out.dtype, np.int32) - - def test_assign_multiclass_unequal_class_weights(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([1, 0, 0, 0, 0, 0, 0], tf.float32) - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - positive_class_weight=1.0, negative_class_weight=0.5, - unmatched_cls_target=unmatched_cls_target) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0, 0.5, .5, 1.0], - [.75, 0, 1.0, .25]]) - prior_stddevs = tf.constant(4 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.9, 0.9], - [.75, 0, .95, .27]] - boxes = box_list.BoxList(tf.constant(box_corners)) - - groundtruth_labels = tf.constant([[0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 1, 0, 0, 0]], tf.float32) - - exp_cls_weights = [1, 1, .5, 1] - result = target_assigner.assign(priors, boxes, groundtruth_labels, - num_valid_rows=3) - (_, cls_weights, _, _, _) = result - with self.test_session() as sess: - cls_weights_out = sess.run(cls_weights) - self.assertAllClose(cls_weights_out, exp_cls_weights) - - def test_assign_multidimensional_class_targets(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([[0, 0], [0, 0]], tf.float32) - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - unmatched_cls_target=unmatched_cls_target) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0, 0.5, .5, 1.0], - [.75, 0, 1.0, .25]]) - prior_stddevs = tf.constant(4 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.9, 0.9], - [.75, 0, .95, .27]] - boxes = box_list.BoxList(tf.constant(box_corners)) - - groundtruth_labels = tf.constant([[[0, 1], [1, 0]], - [[1, 0], [0, 1]], - [[0, 1], [1, .5]]], tf.float32) - - exp_cls_targets = [[[0, 1], [1, 0]], - [[1, 0], [0, 1]], - [[0, 0], [0, 0]], - [[0, 1], [1, .5]]] - exp_cls_weights = [1, 1, 1, 1] - exp_reg_targets = [[0, 0, 0, 0], - [0, 0, -1, 1], - [0, 0, 0, 0], - [0, 0, -.5, .2]] - exp_reg_weights = [1, 1, 0, 1] - exp_matching_anchors = [0, 1, 3] - - result = target_assigner.assign(priors, boxes, groundtruth_labels, - num_valid_rows=3) - (cls_targets, cls_weights, reg_targets, reg_weights, match) = result - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, - reg_targets_out, reg_weights_out, matching_anchors_out) = sess.run( - [cls_targets, cls_weights, reg_targets, reg_weights, - match.matched_column_indices()]) - - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(matching_anchors_out, exp_matching_anchors) - self.assertEquals(cls_targets_out.dtype, np.float32) - self.assertEquals(cls_weights_out.dtype, np.float32) - self.assertEquals(reg_targets_out.dtype, np.float32) - self.assertEquals(reg_weights_out.dtype, np.float32) - self.assertEquals(matching_anchors_out.dtype, np.int32) - - def test_assign_empty_groundtruth(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([0, 0, 0], tf.float32) - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - unmatched_cls_target=unmatched_cls_target) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0, 0.5, .5, 1.0], - [.75, 0, 1.0, .25]]) - prior_stddevs = tf.constant(4 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners_expanded = tf.constant([[0.0, 0.0, 0.0, 0.0]]) - box_corners = tf.slice(box_corners_expanded, [0, 0], [0, 4]) - boxes = box_list.BoxList(box_corners) - - groundtruth_labels_expanded = tf.constant([[0, 0, 0]], tf.float32) - groundtruth_labels = tf.slice(groundtruth_labels_expanded, [0, 0], [0, 3]) - - exp_cls_targets = [[0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0]] - exp_cls_weights = [1, 1, 1, 1] - exp_reg_targets = [[0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]] - exp_reg_weights = [0, 0, 0, 0] - exp_matching_anchors = [] - - result = target_assigner.assign(priors, boxes, groundtruth_labels) - (cls_targets, cls_weights, reg_targets, reg_weights, match) = result - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, - reg_targets_out, reg_weights_out, matching_anchors_out) = sess.run( - [cls_targets, cls_weights, reg_targets, reg_weights, - match.matched_column_indices()]) - - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(matching_anchors_out, exp_matching_anchors) - self.assertEquals(cls_targets_out.dtype, np.float32) - self.assertEquals(cls_weights_out.dtype, np.float32) - self.assertEquals(reg_targets_out.dtype, np.float32) - self.assertEquals(reg_weights_out.dtype, np.float32) - self.assertEquals(matching_anchors_out.dtype, np.int32) - - def test_raises_error_on_incompatible_groundtruth_boxes_and_labels(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([1, 0, 0, 0, 0, 0, 0], tf.float32) - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - unmatched_cls_target=unmatched_cls_target) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 1.0, 0.8], - [0, 0.5, .5, 1.0], - [.75, 0, 1.0, .25]]) - prior_stddevs = tf.constant(4 * [4 * [.1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], - [0.0, 0.0, 0.5, 0.8], - [0.5, 0.5, 0.9, 0.9], - [.75, 0, .95, .27]] - boxes = box_list.BoxList(tf.constant(box_corners)) - - groundtruth_labels = tf.constant([[0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 1, 0, 0, 0]], tf.float32) - result = target_assigner.assign(priors, boxes, groundtruth_labels, - num_valid_rows=3) - (cls_targets, cls_weights, reg_targets, reg_weights, _) = result - with self.test_session() as sess: - with self.assertRaisesWithPredicateMatch( - tf.errors.InvalidArgumentError, - 'Groundtruth boxes and labels have incompatible shapes!'): - sess.run([cls_targets, cls_weights, reg_targets, reg_weights]) - - def test_raises_error_on_invalid_groundtruth_labels(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([[0, 0], [0, 0], [0, 0]], tf.float32) - target_assigner = targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - unmatched_cls_target=unmatched_cls_target) - - prior_means = tf.constant([[0.0, 0.0, 0.5, 0.5]]) - prior_stddevs = tf.constant([[1.0, 1.0, 1.0, 1.0]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - box_corners = [[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.9, 0.9], - [.75, 0, .95, .27]] - boxes = box_list.BoxList(tf.constant(box_corners)) - - groundtruth_labels = tf.constant([[[0, 1], [1, 0]]], tf.float32) - - with self.assertRaises(ValueError): - target_assigner.assign(priors, boxes, groundtruth_labels, - num_valid_rows=3) - - -class BatchTargetAssignerTest(tf.test.TestCase): - - def _get_agnostic_target_assigner(self): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - return targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - positive_class_weight=1.0, - negative_class_weight=1.0, - unmatched_cls_target=None) - - def _get_multi_class_target_assigner(self, num_classes): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant([1] + num_classes * [0], tf.float32) - return targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - positive_class_weight=1.0, - negative_class_weight=1.0, - unmatched_cls_target=unmatched_cls_target) - - def _get_multi_dimensional_target_assigner(self, target_dimensions): - similarity_calc = region_similarity_calculator.NegSqDistSimilarity() - matcher = bipartite_matcher.GreedyBipartiteMatcher() - box_coder = mean_stddev_box_coder.MeanStddevBoxCoder() - unmatched_cls_target = tf.constant(np.zeros(target_dimensions), - tf.float32) - return targetassigner.TargetAssigner( - similarity_calc, matcher, box_coder, - positive_class_weight=1.0, - negative_class_weight=1.0, - unmatched_cls_target=unmatched_cls_target) - - def test_batch_assign_targets(self): - box_list1 = box_list.BoxList(tf.constant([[0., 0., 0.2, 0.2]])) - box_list2 = box_list.BoxList(tf.constant( - [[0, 0.25123152, 1, 1], - [0.015789, 0.0985, 0.55789, 0.3842]] - )) - - gt_box_batch = [box_list1, box_list2] - gt_class_targets = [None, None] - - prior_means = tf.constant([[0, 0, .25, .25], - [0, .25, 1, 1], - [0, .1, .5, .5], - [.75, .75, 1, 1]]) - prior_stddevs = tf.constant([[.1, .1, .1, .1], - [.1, .1, .1, .1], - [.1, .1, .1, .1], - [.1, .1, .1, .1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - exp_reg_targets = [[[0, 0, -0.5, -0.5], - [0, 0, 0, 0], - [0, 0, 0, 0,], - [0, 0, 0, 0,],], - [[0, 0, 0, 0,], - [0, 0.01231521, 0, 0], - [0.15789001, -0.01500003, 0.57889998, -1.15799987], - [0, 0, 0, 0]]] - exp_cls_weights = [[1, 1, 1, 1], - [1, 1, 1, 1]] - exp_cls_targets = [[[1], [0], [0], [0]], - [[0], [1], [1], [0]]] - exp_reg_weights = [[1, 0, 0, 0], - [0, 1, 1, 0]] - exp_match_0 = [0] - exp_match_1 = [1, 2] - - agnostic_target_assigner = self._get_agnostic_target_assigner() - (cls_targets, cls_weights, reg_targets, reg_weights, - match_list) = targetassigner.batch_assign_targets( - agnostic_target_assigner, priors, gt_box_batch, gt_class_targets) - self.assertTrue(isinstance(match_list, list) and len(match_list) == 2) - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, reg_targets_out, reg_weights_out, - match_out_0, match_out_1) = sess.run([ - cls_targets, cls_weights, reg_targets, reg_weights] + [ - match.matched_column_indices() for match in match_list]) - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(match_out_0, exp_match_0) - self.assertAllClose(match_out_1, exp_match_1) - - def test_batch_assign_multiclass_targets(self): - box_list1 = box_list.BoxList(tf.constant([[0., 0., 0.2, 0.2]])) - - box_list2 = box_list.BoxList(tf.constant( - [[0, 0.25123152, 1, 1], - [0.015789, 0.0985, 0.55789, 0.3842]] - )) - - gt_box_batch = [box_list1, box_list2] - - class_targets1 = tf.constant([[0, 1, 0, 0]], tf.float32) - class_targets2 = tf.constant([[0, 0, 0, 1], - [0, 0, 1, 0]], tf.float32) - - gt_class_targets = [class_targets1, class_targets2] - - prior_means = tf.constant([[0, 0, .25, .25], - [0, .25, 1, 1], - [0, .1, .5, .5], - [.75, .75, 1, 1]]) - prior_stddevs = tf.constant([[.1, .1, .1, .1], - [.1, .1, .1, .1], - [.1, .1, .1, .1], - [.1, .1, .1, .1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - exp_reg_targets = [[[0, 0, -0.5, -0.5], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 0, 0, 0], - [0, 0.01231521, 0, 0], - [0.15789001, -0.01500003, 0.57889998, -1.15799987], - [0, 0, 0, 0]]] - exp_cls_weights = [[1, 1, 1, 1], - [1, 1, 1, 1]] - exp_cls_targets = [[[0, 1, 0, 0], - [1, 0, 0, 0], - [1, 0, 0, 0], - [1, 0, 0, 0]], - [[1, 0, 0, 0], - [0, 0, 0, 1], - [0, 0, 1, 0], - [1, 0, 0, 0]]] - exp_reg_weights = [[1, 0, 0, 0], - [0, 1, 1, 0]] - exp_match_0 = [0] - exp_match_1 = [1, 2] - - multiclass_target_assigner = self._get_multi_class_target_assigner( - num_classes=3) - - (cls_targets, cls_weights, reg_targets, reg_weights, - match_list) = targetassigner.batch_assign_targets( - multiclass_target_assigner, priors, gt_box_batch, gt_class_targets) - self.assertTrue(isinstance(match_list, list) and len(match_list) == 2) - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, reg_targets_out, reg_weights_out, - match_out_0, match_out_1) = sess.run([ - cls_targets, cls_weights, reg_targets, reg_weights] + [ - match.matched_column_indices() for match in match_list]) - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(match_out_0, exp_match_0) - self.assertAllClose(match_out_1, exp_match_1) - - def test_batch_assign_multidimensional_targets(self): - box_list1 = box_list.BoxList(tf.constant([[0., 0., 0.2, 0.2]])) - - box_list2 = box_list.BoxList(tf.constant( - [[0, 0.25123152, 1, 1], - [0.015789, 0.0985, 0.55789, 0.3842]] - )) - - gt_box_batch = [box_list1, box_list2] - class_targets1 = tf.constant([[[0, 1, 1], - [1, 1, 0]]], tf.float32) - class_targets2 = tf.constant([[[0, 1, 1], - [1, 1, 0]], - [[0, 0, 1], - [0, 0, 1]]], tf.float32) - - gt_class_targets = [class_targets1, class_targets2] - - prior_means = tf.constant([[0, 0, .25, .25], - [0, .25, 1, 1], - [0, .1, .5, .5], - [.75, .75, 1, 1]]) - prior_stddevs = tf.constant([[.1, .1, .1, .1], - [.1, .1, .1, .1], - [.1, .1, .1, .1], - [.1, .1, .1, .1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - exp_reg_targets = [[[0, 0, -0.5, -0.5], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0]], - [[0, 0, 0, 0], - [0, 0.01231521, 0, 0], - [0.15789001, -0.01500003, 0.57889998, -1.15799987], - [0, 0, 0, 0]]] - exp_cls_weights = [[1, 1, 1, 1], - [1, 1, 1, 1]] - - exp_cls_targets = [[[[0., 1., 1.], - [1., 1., 0.]], - [[0., 0., 0.], - [0., 0., 0.]], - [[0., 0., 0.], - [0., 0., 0.]], - [[0., 0., 0.], - [0., 0., 0.]]], - [[[0., 0., 0.], - [0., 0., 0.]], - [[0., 1., 1.], - [1., 1., 0.]], - [[0., 0., 1.], - [0., 0., 1.]], - [[0., 0., 0.], - [0., 0., 0.]]]] - exp_reg_weights = [[1, 0, 0, 0], - [0, 1, 1, 0]] - exp_match_0 = [0] - exp_match_1 = [1, 2] - - multiclass_target_assigner = self._get_multi_dimensional_target_assigner( - target_dimensions=(2, 3)) - - (cls_targets, cls_weights, reg_targets, reg_weights, - match_list) = targetassigner.batch_assign_targets( - multiclass_target_assigner, priors, gt_box_batch, gt_class_targets) - self.assertTrue(isinstance(match_list, list) and len(match_list) == 2) - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, reg_targets_out, reg_weights_out, - match_out_0, match_out_1) = sess.run([ - cls_targets, cls_weights, reg_targets, reg_weights] + [ - match.matched_column_indices() for match in match_list]) - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(match_out_0, exp_match_0) - self.assertAllClose(match_out_1, exp_match_1) - - def test_batch_assign_empty_groundtruth(self): - box_coords_expanded = tf.zeros((1, 4), tf.float32) - box_coords = tf.slice(box_coords_expanded, [0, 0], [0, 4]) - box_list1 = box_list.BoxList(box_coords) - gt_box_batch = [box_list1] - - prior_means = tf.constant([[0, 0, .25, .25], - [0, .25, 1, 1]]) - prior_stddevs = tf.constant([[.1, .1, .1, .1], - [.1, .1, .1, .1]]) - priors = box_list.BoxList(prior_means) - priors.add_field('stddev', prior_stddevs) - - exp_reg_targets = [[[0, 0, 0, 0], - [0, 0, 0, 0]]] - exp_cls_weights = [[1, 1]] - exp_cls_targets = [[[1, 0, 0, 0], - [1, 0, 0, 0]]] - exp_reg_weights = [[0, 0]] - exp_match_0 = [] - - num_classes = 3 - pad = 1 - gt_class_targets = tf.zeros((0, num_classes + pad)) - gt_class_targets_batch = [gt_class_targets] - - multiclass_target_assigner = self._get_multi_class_target_assigner( - num_classes=3) - - (cls_targets, cls_weights, reg_targets, reg_weights, - match_list) = targetassigner.batch_assign_targets( - multiclass_target_assigner, priors, - gt_box_batch, gt_class_targets_batch) - self.assertTrue(isinstance(match_list, list) and len(match_list) == 1) - with self.test_session() as sess: - (cls_targets_out, cls_weights_out, reg_targets_out, reg_weights_out, - match_out_0) = sess.run([ - cls_targets, cls_weights, reg_targets, reg_weights] + [ - match.matched_column_indices() for match in match_list]) - self.assertAllClose(cls_targets_out, exp_cls_targets) - self.assertAllClose(cls_weights_out, exp_cls_weights) - self.assertAllClose(reg_targets_out, exp_reg_targets) - self.assertAllClose(reg_weights_out, exp_reg_weights) - self.assertAllClose(match_out_0, exp_match_0) - - -class CreateTargetAssignerTest(tf.test.TestCase): - - def test_create_target_assigner(self): - """Tests that named constructor gives working target assigners. - - TODO: Make this test more general. - """ - corners = [[0.0, 0.0, 1.0, 1.0]] - groundtruth = box_list.BoxList(tf.constant(corners)) - - priors = box_list.BoxList(tf.constant(corners)) - prior_stddevs = tf.constant([[1.0, 1.0, 1.0, 1.0]]) - priors.add_field('stddev', prior_stddevs) - multibox_ta = (targetassigner - .create_target_assigner('Multibox', stage='proposal')) - multibox_ta.assign(priors, groundtruth) - # No tests on output, as that may vary arbitrarily as new target assigners - # are added. As long as it is constructed correctly and runs without errors, - # tests on the individual assigners cover correctness of the assignments. - - anchors = box_list.BoxList(tf.constant(corners)) - faster_rcnn_proposals_ta = (targetassigner - .create_target_assigner('FasterRCNN', - stage='proposal')) - faster_rcnn_proposals_ta.assign(anchors, groundtruth) - - fast_rcnn_ta = (targetassigner - .create_target_assigner('FastRCNN')) - fast_rcnn_ta.assign(anchors, groundtruth) - - faster_rcnn_detection_ta = (targetassigner - .create_target_assigner('FasterRCNN', - stage='detection')) - faster_rcnn_detection_ta.assign(anchors, groundtruth) - - with self.assertRaises(ValueError): - targetassigner.create_target_assigner('InvalidDetector', - stage='invalid_stage') - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/data/kitti_label_map.pbtxt b/object_detection/data/kitti_label_map.pbtxt deleted file mode 100644 index 0afcc693..00000000 --- a/object_detection/data/kitti_label_map.pbtxt +++ /dev/null @@ -1,9 +0,0 @@ -item { - id: 1 - name: 'car' -} - -item { - id: 2 - name: 'pedestrian' -} diff --git a/object_detection/data/mscoco_label_map.pbtxt b/object_detection/data/mscoco_label_map.pbtxt deleted file mode 100644 index 1f4872bd..00000000 --- a/object_detection/data/mscoco_label_map.pbtxt +++ /dev/null @@ -1,400 +0,0 @@ -item { - name: "/m/01g317" - id: 1 - display_name: "person" -} -item { - name: "/m/0199g" - id: 2 - display_name: "bicycle" -} -item { - name: "/m/0k4j" - id: 3 - display_name: "car" -} -item { - name: "/m/04_sv" - id: 4 - display_name: "motorcycle" -} -item { - name: "/m/05czz6l" - id: 5 - display_name: "airplane" -} -item { - name: "/m/01bjv" - id: 6 - display_name: "bus" -} -item { - name: "/m/07jdr" - id: 7 - display_name: "train" -} -item { - name: "/m/07r04" - id: 8 - display_name: "truck" -} -item { - name: "/m/019jd" - id: 9 - display_name: "boat" -} -item { - name: "/m/015qff" - id: 10 - display_name: "traffic light" -} -item { - name: "/m/01pns0" - id: 11 - display_name: "fire hydrant" -} -item { - name: "/m/02pv19" - id: 13 - display_name: "stop sign" -} -item { - name: "/m/015qbp" - id: 14 - display_name: "parking meter" -} -item { - name: "/m/0cvnqh" - id: 15 - display_name: "bench" -} -item { - name: "/m/015p6" - id: 16 - display_name: "bird" -} -item { - name: "/m/01yrx" - id: 17 - display_name: "cat" -} -item { - name: "/m/0bt9lr" - id: 18 - display_name: "dog" -} -item { - name: "/m/03k3r" - id: 19 - display_name: "horse" -} -item { - name: "/m/07bgp" - id: 20 - display_name: "sheep" -} -item { - name: "/m/01xq0k1" - id: 21 - display_name: "cow" -} -item { - name: "/m/0bwd_0j" - id: 22 - display_name: "elephant" -} -item { - name: "/m/01dws" - id: 23 - display_name: "bear" -} -item { - name: "/m/0898b" - id: 24 - display_name: "zebra" -} -item { - name: "/m/03bk1" - id: 25 - display_name: "giraffe" -} -item { - name: "/m/01940j" - id: 27 - display_name: "backpack" -} -item { - name: "/m/0hnnb" - id: 28 - display_name: "umbrella" -} -item { - name: "/m/080hkjn" - id: 31 - display_name: "handbag" -} -item { - name: "/m/01rkbr" - id: 32 - display_name: "tie" -} -item { - name: "/m/01s55n" - id: 33 - display_name: "suitcase" -} -item { - name: "/m/02wmf" - id: 34 - display_name: "frisbee" -} -item { - name: "/m/071p9" - id: 35 - display_name: "skis" -} -item { - name: "/m/06__v" - id: 36 - display_name: "snowboard" -} -item { - name: "/m/018xm" - id: 37 - display_name: "sports ball" -} -item { - name: "/m/02zt3" - id: 38 - display_name: "kite" -} -item { - name: "/m/03g8mr" - id: 39 - display_name: "baseball bat" -} -item { - name: "/m/03grzl" - id: 40 - display_name: "baseball glove" -} -item { - name: "/m/06_fw" - id: 41 - display_name: "skateboard" -} -item { - name: "/m/019w40" - id: 42 - display_name: "surfboard" -} -item { - name: "/m/0dv9c" - id: 43 - display_name: "tennis racket" -} -item { - name: "/m/04dr76w" - id: 44 - display_name: "bottle" -} -item { - name: "/m/09tvcd" - id: 46 - display_name: "wine glass" -} -item { - name: "/m/08gqpm" - id: 47 - display_name: "cup" -} -item { - name: "/m/0dt3t" - id: 48 - display_name: "fork" -} -item { - name: "/m/04ctx" - id: 49 - display_name: "knife" -} -item { - name: "/m/0cmx8" - id: 50 - display_name: "spoon" -} -item { - name: "/m/04kkgm" - id: 51 - display_name: "bowl" -} -item { - name: "/m/09qck" - id: 52 - display_name: "banana" -} -item { - name: "/m/014j1m" - id: 53 - display_name: "apple" -} -item { - name: "/m/0l515" - id: 54 - display_name: "sandwich" -} -item { - name: "/m/0cyhj_" - id: 55 - display_name: "orange" -} -item { - name: "/m/0hkxq" - id: 56 - display_name: "broccoli" -} -item { - name: "/m/0fj52s" - id: 57 - display_name: "carrot" -} -item { - name: "/m/01b9xk" - id: 58 - display_name: "hot dog" -} -item { - name: "/m/0663v" - id: 59 - display_name: "pizza" -} -item { - name: "/m/0jy4k" - id: 60 - display_name: "donut" -} -item { - name: "/m/0fszt" - id: 61 - display_name: "cake" -} -item { - name: "/m/01mzpv" - id: 62 - display_name: "chair" -} -item { - name: "/m/02crq1" - id: 63 - display_name: "couch" -} -item { - name: "/m/03fp41" - id: 64 - display_name: "potted plant" -} -item { - name: "/m/03ssj5" - id: 65 - display_name: "bed" -} -item { - name: "/m/04bcr3" - id: 67 - display_name: "dining table" -} -item { - name: "/m/09g1w" - id: 70 - display_name: "toilet" -} -item { - name: "/m/07c52" - id: 72 - display_name: "tv" -} -item { - name: "/m/01c648" - id: 73 - display_name: "laptop" -} -item { - name: "/m/020lf" - id: 74 - display_name: "mouse" -} -item { - name: "/m/0qjjc" - id: 75 - display_name: "remote" -} -item { - name: "/m/01m2v" - id: 76 - display_name: "keyboard" -} -item { - name: "/m/050k8" - id: 77 - display_name: "cell phone" -} -item { - name: "/m/0fx9l" - id: 78 - display_name: "microwave" -} -item { - name: "/m/029bxz" - id: 79 - display_name: "oven" -} -item { - name: "/m/01k6s3" - id: 80 - display_name: "toaster" -} -item { - name: "/m/0130jx" - id: 81 - display_name: "sink" -} -item { - name: "/m/040b_t" - id: 82 - display_name: "refrigerator" -} -item { - name: "/m/0bt_c3" - id: 84 - display_name: "book" -} -item { - name: "/m/01x3z" - id: 85 - display_name: "clock" -} -item { - name: "/m/02s195" - id: 86 - display_name: "vase" -} -item { - name: "/m/01lsmm" - id: 87 - display_name: "scissors" -} -item { - name: "/m/0kmg4" - id: 88 - display_name: "teddy bear" -} -item { - name: "/m/03wvsk" - id: 89 - display_name: "hair drier" -} -item { - name: "/m/012xff" - id: 90 - display_name: "toothbrush" -} diff --git a/object_detection/data/oid_bbox_trainable_label_map.pbtxt b/object_detection/data/oid_bbox_trainable_label_map.pbtxt deleted file mode 100644 index 863e4f31..00000000 --- a/object_detection/data/oid_bbox_trainable_label_map.pbtxt +++ /dev/null @@ -1,2725 +0,0 @@ -item { - name: "/m/01g317" - id: 1 - display_name: "Person" -} -item { - name: "/m/09j2d" - id: 2 - display_name: "Clothing" -} -item { - name: "/m/04yx4" - id: 3 - display_name: "Man" -} -item { - name: "/m/0dzct" - id: 4 - display_name: "Face" -} -item { - name: "/m/07j7r" - id: 5 - display_name: "Tree" -} -item { - name: "/m/05s2s" - id: 6 - display_name: "Plant" -} -item { - name: "/m/03bt1vf" - id: 7 - display_name: "Woman" -} -item { - name: "/m/07yv9" - id: 8 - display_name: "Vehicle" -} -item { - name: "/m/0cgh4" - id: 9 - display_name: "Building" -} -item { - name: "/m/01prls" - id: 10 - display_name: "Land vehicle" -} -item { - name: "/m/09j5n" - id: 11 - display_name: "Footwear" -} -item { - name: "/m/05r655" - id: 12 - display_name: "Girl" -} -item { - name: "/m/0jbk" - id: 13 - display_name: "Animal" -} -item { - name: "/m/0k4j" - id: 14 - display_name: "Car" -} -item { - name: "/m/02wbm" - id: 15 - display_name: "Food" -} -item { - name: "/m/083wq" - id: 16 - display_name: "Wheel" -} -item { - name: "/m/0c9ph5" - id: 17 - display_name: "Flower" -} -item { - name: "/m/0c_jw" - id: 18 - display_name: "Furniture" -} -item { - name: "/m/0d4v4" - id: 19 - display_name: "Window" -} -item { - name: "/m/03jm5" - id: 20 - display_name: "House" -} -item { - name: "/m/01bl7v" - id: 21 - display_name: "Boy" -} -item { - name: "/m/0463sg" - id: 22 - display_name: "Fashion accessory" -} -item { - name: "/m/04bcr3" - id: 23 - display_name: "Table" -} -item { - name: "/m/0jyfg" - id: 24 - display_name: "Glasses" -} -item { - name: "/m/01xyhv" - id: 25 - display_name: "Suit" -} -item { - name: "/m/08dz3q" - id: 26 - display_name: "Auto part" -} -item { - name: "/m/015p6" - id: 27 - display_name: "Bird" -} -item { - name: "/m/05y5lj" - id: 28 - display_name: "Sports equipment" -} -item { - name: "/m/01d40f" - id: 29 - display_name: "Dress" -} -item { - name: "/m/0bt9lr" - id: 30 - display_name: "Dog" -} -item { - name: "/m/01lrl" - id: 31 - display_name: "Carnivore" -} -item { - name: "/m/02p0tk3" - id: 32 - display_name: "Human body" -} -item { - name: "/m/0fly7" - id: 33 - display_name: "Jeans" -} -item { - name: "/m/04szw" - id: 34 - display_name: "Musical instrument" -} -item { - name: "/m/0271t" - id: 35 - display_name: "Drink" -} -item { - name: "/m/019jd" - id: 36 - display_name: "Boat" -} -item { - name: "/m/03q69" - id: 37 - display_name: "Hair" -} -item { - name: "/m/0h9mv" - id: 38 - display_name: "Tire" -} -item { - name: "/m/04hgtk" - id: 39 - display_name: "Head" -} -item { - name: "/m/01yrx" - id: 40 - display_name: "Cat" -} -item { - name: "/m/01rzcn" - id: 41 - display_name: "Watercraft" -} -item { - name: "/m/01mzpv" - id: 42 - display_name: "Chair" -} -item { - name: "/m/0199g" - id: 43 - display_name: "Bike" -} -item { - name: "/m/01fdzj" - id: 44 - display_name: "Tower" -} -item { - name: "/m/04rky" - id: 45 - display_name: "Mammal" -} -item { - name: "/m/079cl" - id: 46 - display_name: "Skyscraper" -} -item { - name: "/m/0dzf4" - id: 47 - display_name: "Arm" -} -item { - name: "/m/0138tl" - id: 48 - display_name: "Toy" -} -item { - name: "/m/06msq" - id: 49 - display_name: "Sculpture" -} -item { - name: "/m/03xxp" - id: 50 - display_name: "Invertebrate" -} -item { - name: "/m/0hg7b" - id: 51 - display_name: "Microphone" -} -item { - name: "/m/01n5jq" - id: 52 - display_name: "Poster" -} -item { - name: "/m/03vt0" - id: 53 - display_name: "Insect" -} -item { - name: "/m/0342h" - id: 54 - display_name: "Guitar" -} -item { - name: "/m/0k0pj" - id: 55 - display_name: "Nose" -} -item { - name: "/m/02dl1y" - id: 56 - display_name: "Hat" -} -item { - name: "/m/04brg2" - id: 57 - display_name: "Tableware" -} -item { - name: "/m/02dgv" - id: 58 - display_name: "Door" -} -item { - name: "/m/01bqk0" - id: 59 - display_name: "Bicycle wheel" -} -item { - name: "/m/017ftj" - id: 60 - display_name: "Sunglasses" -} -item { - name: "/m/052lwg6" - id: 61 - display_name: "Baked goods" -} -item { - name: "/m/014sv8" - id: 62 - display_name: "Eye" -} -item { - name: "/m/0270h" - id: 63 - display_name: "Dessert" -} -item { - name: "/m/0283dt1" - id: 64 - display_name: "Mouth" -} -item { - name: "/m/0k5j" - id: 65 - display_name: "Aircraft" -} -item { - name: "/m/0cmf2" - id: 66 - display_name: "Airplane" -} -item { - name: "/m/07jdr" - id: 67 - display_name: "Train" -} -item { - name: "/m/032b3c" - id: 68 - display_name: "Jacket" -} -item { - name: "/m/033rq4" - id: 69 - display_name: "Street light" -} -item { - name: "/m/0k65p" - id: 70 - display_name: "Hand" -} -item { - name: "/m/01ww8y" - id: 71 - display_name: "Snack" -} -item { - name: "/m/0zvk5" - id: 72 - display_name: "Helmet" -} -item { - name: "/m/07mhn" - id: 73 - display_name: "Trousers" -} -item { - name: "/m/04dr76w" - id: 74 - display_name: "Bottle" -} -item { - name: "/m/03fp41" - id: 75 - display_name: "Houseplant" -} -item { - name: "/m/03k3r" - id: 76 - display_name: "Horse" -} -item { - name: "/m/01y9k5" - id: 77 - display_name: "Desk" -} -item { - name: "/m/0cdl1" - id: 78 - display_name: "Palm tree" -} -item { - name: "/m/0f4s2w" - id: 79 - display_name: "Vegetable" -} -item { - name: "/m/02xwb" - id: 80 - display_name: "Fruit" -} -item { - name: "/m/035r7c" - id: 81 - display_name: "Leg" -} -item { - name: "/m/0bt_c3" - id: 82 - display_name: "Book" -} -item { - name: "/m/01_bhs" - id: 83 - display_name: "Fast food" -} -item { - name: "/m/01599" - id: 84 - display_name: "Beer" -} -item { - name: "/m/03120" - id: 85 - display_name: "Flag" -} -item { - name: "/m/026t6" - id: 86 - display_name: "Drum" -} -item { - name: "/m/01bjv" - id: 87 - display_name: "Bus" -} -item { - name: "/m/07r04" - id: 88 - display_name: "Truck" -} -item { - name: "/m/018xm" - id: 89 - display_name: "Ball" -} -item { - name: "/m/01rkbr" - id: 90 - display_name: "Tie" -} -item { - name: "/m/0fm3zh" - id: 91 - display_name: "Flowerpot" -} -item { - name: "/m/02_n6y" - id: 92 - display_name: "Goggles" -} -item { - name: "/m/04_sv" - id: 93 - display_name: "Motorcycle" -} -item { - name: "/m/06z37_" - id: 94 - display_name: "Picture frame" -} -item { - name: "/m/01bfm9" - id: 95 - display_name: "Shorts" -} -item { - name: "/m/0h8mhzd" - id: 96 - display_name: "Sports uniform" -} -item { - name: "/m/0d_2m" - id: 97 - display_name: "Moths and butterflies" -} -item { - name: "/m/0gjbg72" - id: 98 - display_name: "Shelf" -} -item { - name: "/m/01n4qj" - id: 99 - display_name: "Shirt" -} -item { - name: "/m/0ch_cf" - id: 100 - display_name: "Fish" -} -item { - name: "/m/06m11" - id: 101 - display_name: "Rose" -} -item { - name: "/m/01jfm_" - id: 102 - display_name: "Licence plate" -} -item { - name: "/m/02crq1" - id: 103 - display_name: "Couch" -} -item { - name: "/m/083kb" - id: 104 - display_name: "Weapon" -} -item { - name: "/m/01c648" - id: 105 - display_name: "Laptop" -} -item { - name: "/m/09tvcd" - id: 106 - display_name: "Wine glass" -} -item { - name: "/m/0h2r6" - id: 107 - display_name: "Van" -} -item { - name: "/m/081qc" - id: 108 - display_name: "Wine" -} -item { - name: "/m/09ddx" - id: 109 - display_name: "Duck" -} -item { - name: "/m/03p3bw" - id: 110 - display_name: "Bicycle helmet" -} -item { - name: "/m/0cyf8" - id: 111 - display_name: "Butterfly" -} -item { - name: "/m/0b_rs" - id: 112 - display_name: "Swimming pool" -} -item { - name: "/m/039xj_" - id: 113 - display_name: "Ear" -} -item { - name: "/m/021sj1" - id: 114 - display_name: "Office" -} -item { - name: "/m/0dv5r" - id: 115 - display_name: "Camera" -} -item { - name: "/m/01lynh" - id: 116 - display_name: "Stairs" -} -item { - name: "/m/06bt6" - id: 117 - display_name: "Reptile" -} -item { - name: "/m/01226z" - id: 118 - display_name: "Football" -} -item { - name: "/m/0fszt" - id: 119 - display_name: "Cake" -} -item { - name: "/m/050k8" - id: 120 - display_name: "Mobile phone" -} -item { - name: "/m/02wbtzl" - id: 121 - display_name: "Sun hat" -} -item { - name: "/m/02p5f1q" - id: 122 - display_name: "Coffee cup" -} -item { - name: "/m/025nd" - id: 123 - display_name: "Christmas tree" -} -item { - name: "/m/02522" - id: 124 - display_name: "Computer monitor" -} -item { - name: "/m/09ct_" - id: 125 - display_name: "Helicopter" -} -item { - name: "/m/0cvnqh" - id: 126 - display_name: "Bench" -} -item { - name: "/m/0d5gx" - id: 127 - display_name: "Castle" -} -item { - name: "/m/01xygc" - id: 128 - display_name: "Coat" -} -item { - name: "/m/04m6gz" - id: 129 - display_name: "Porch" -} -item { - name: "/m/01gkx_" - id: 130 - display_name: "Swimwear" -} -item { - name: "/m/01s105" - id: 131 - display_name: "Cabinetry" -} -item { - name: "/m/01j61q" - id: 132 - display_name: "Tent" -} -item { - name: "/m/0hnnb" - id: 133 - display_name: "Umbrella" -} -item { - name: "/m/01j51" - id: 134 - display_name: "Balloon" -} -item { - name: "/m/01knjb" - id: 135 - display_name: "Billboard" -} -item { - name: "/m/03__z0" - id: 136 - display_name: "Bookcase" -} -item { - name: "/m/01m2v" - id: 137 - display_name: "Computer keyboard" -} -item { - name: "/m/0167gd" - id: 138 - display_name: "Doll" -} -item { - name: "/m/0284d" - id: 139 - display_name: "Dairy" -} -item { - name: "/m/03ssj5" - id: 140 - display_name: "Bed" -} -item { - name: "/m/02fq_6" - id: 141 - display_name: "Fedora" -} -item { - name: "/m/06nwz" - id: 142 - display_name: "Seafood" -} -item { - name: "/m/0220r2" - id: 143 - display_name: "Fountain" -} -item { - name: "/m/01mqdt" - id: 144 - display_name: "Traffic sign" -} -item { - name: "/m/0268lbt" - id: 145 - display_name: "Hiking equipment" -} -item { - name: "/m/07c52" - id: 146 - display_name: "Television" -} -item { - name: "/m/0grw1" - id: 147 - display_name: "Salad" -} -item { - name: "/m/01h3n" - id: 148 - display_name: "Bee" -} -item { - name: "/m/078n6m" - id: 149 - display_name: "Coffee table" -} -item { - name: "/m/01xq0k1" - id: 150 - display_name: "Cattle" -} -item { - name: "/m/0gd2v" - id: 151 - display_name: "Marine mammal" -} -item { - name: "/m/0dbvp" - id: 152 - display_name: "Goose" -} -item { - name: "/m/03rszm" - id: 153 - display_name: "Curtain" -} -item { - name: "/m/0h8n5zk" - id: 154 - display_name: "Kitchen & dining room table" -} -item { - name: "/m/019dx1" - id: 155 - display_name: "Home appliance" -} -item { - name: "/m/03hl4l9" - id: 156 - display_name: "Marine invertebrates" -} -item { - name: "/m/0b3fp9" - id: 157 - display_name: "Countertop" -} -item { - name: "/m/02rdsp" - id: 158 - display_name: "Office supplies" -} -item { - name: "/m/0hf58v5" - id: 159 - display_name: "Luggage and bags" -} -item { - name: "/m/04h7h" - id: 160 - display_name: "Lighthouse" -} -item { - name: "/m/024g6" - id: 161 - display_name: "Cocktail" -} -item { - name: "/m/0cffdh" - id: 162 - display_name: "Maple" -} -item { - name: "/m/03q5c7" - id: 163 - display_name: "Saucer" -} -item { - name: "/m/014y4n" - id: 164 - display_name: "Paddle" -} -item { - name: "/m/01yx86" - id: 165 - display_name: "Bronze sculpture" -} -item { - name: "/m/020jm" - id: 166 - display_name: "Beetle" -} -item { - name: "/m/025dyy" - id: 167 - display_name: "Box" -} -item { - name: "/m/01llwg" - id: 168 - display_name: "Necklace" -} -item { - name: "/m/08pbxl" - id: 169 - display_name: "Monkey" -} -item { - name: "/m/02d9qx" - id: 170 - display_name: "Whiteboard" -} -item { - name: "/m/02pkr5" - id: 171 - display_name: "Plumbing fixture" -} -item { - name: "/m/0h99cwc" - id: 172 - display_name: "Kitchen appliance" -} -item { - name: "/m/050gv4" - id: 173 - display_name: "Plate" -} -item { - name: "/m/02vqfm" - id: 174 - display_name: "Coffee" -} -item { - name: "/m/09kx5" - id: 175 - display_name: "Deer" -} -item { - name: "/m/019w40" - id: 176 - display_name: "Surfboard" -} -item { - name: "/m/09dzg" - id: 177 - display_name: "Turtle" -} -item { - name: "/m/07k1x" - id: 178 - display_name: "Tool" -} -item { - name: "/m/080hkjn" - id: 179 - display_name: "Handbag" -} -item { - name: "/m/07qxg_" - id: 180 - display_name: "Football helmet" -} -item { - name: "/m/0ph39" - id: 181 - display_name: "Canoe" -} -item { - name: "/m/018p4k" - id: 182 - display_name: "Cart" -} -item { - name: "/m/02h19r" - id: 183 - display_name: "Scarf" -} -item { - name: "/m/015h_t" - id: 184 - display_name: "Beard" -} -item { - name: "/m/0fqfqc" - id: 185 - display_name: "Drawer" -} -item { - name: "/m/025rp__" - id: 186 - display_name: "Cowboy hat" -} -item { - name: "/m/01x3z" - id: 187 - display_name: "Clock" -} -item { - name: "/m/0crjs" - id: 188 - display_name: "Convenience store" -} -item { - name: "/m/0l515" - id: 189 - display_name: "Sandwich" -} -item { - name: "/m/015qff" - id: 190 - display_name: "Traffic light" -} -item { - name: "/m/09kmb" - id: 191 - display_name: "Spider" -} -item { - name: "/m/09728" - id: 192 - display_name: "Bread" -} -item { - name: "/m/071qp" - id: 193 - display_name: "Squirrel" -} -item { - name: "/m/02s195" - id: 194 - display_name: "Vase" -} -item { - name: "/m/06c54" - id: 195 - display_name: "Rifle" -} -item { - name: "/m/01xqw" - id: 196 - display_name: "Cello" -} -item { - name: "/m/05zsy" - id: 197 - display_name: "Pumpkin" -} -item { - name: "/m/0bwd_0j" - id: 198 - display_name: "Elephant" -} -item { - name: "/m/04m9y" - id: 199 - display_name: "Lizard" -} -item { - name: "/m/052sf" - id: 200 - display_name: "Mushroom" -} -item { - name: "/m/03grzl" - id: 201 - display_name: "Baseball glove" -} -item { - name: "/m/01z1kdw" - id: 202 - display_name: "Juice" -} -item { - name: "/m/02wv6h6" - id: 203 - display_name: "Skirt" -} -item { - name: "/m/016m2d" - id: 204 - display_name: "Skull" -} -item { - name: "/m/0dtln" - id: 205 - display_name: "Lamp" -} -item { - name: "/m/057cc" - id: 206 - display_name: "Musical keyboard" -} -item { - name: "/m/06k2mb" - id: 207 - display_name: "High heels" -} -item { - name: "/m/0f6wt" - id: 208 - display_name: "Falcon" -} -item { - name: "/m/0cxn2" - id: 209 - display_name: "Ice cream" -} -item { - name: "/m/02jvh9" - id: 210 - display_name: "Mug" -} -item { - name: "/m/0gjkl" - id: 211 - display_name: "Watch" -} -item { - name: "/m/01b638" - id: 212 - display_name: "Boot" -} -item { - name: "/m/071p9" - id: 213 - display_name: "Ski" -} -item { - name: "/m/0pg52" - id: 214 - display_name: "Taxi" -} -item { - name: "/m/0ftb8" - id: 215 - display_name: "Sunflower" -} -item { - name: "/m/0hnyx" - id: 216 - display_name: "Pastry" -} -item { - name: "/m/02jz0l" - id: 217 - display_name: "Tap" -} -item { - name: "/m/04kkgm" - id: 218 - display_name: "Bowl" -} -item { - name: "/m/0174n1" - id: 219 - display_name: "Glove" -} -item { - name: "/m/0gv1x" - id: 220 - display_name: "Parrot" -} -item { - name: "/m/09csl" - id: 221 - display_name: "Eagle" -} -item { - name: "/m/02jnhm" - id: 222 - display_name: "Tin can" -} -item { - name: "/m/099ssp" - id: 223 - display_name: "Platter" -} -item { - name: "/m/03nfch" - id: 224 - display_name: "Sandal" -} -item { - name: "/m/07y_7" - id: 225 - display_name: "Violin" -} -item { - name: "/m/05z6w" - id: 226 - display_name: "Penguin" -} -item { - name: "/m/03m3pdh" - id: 227 - display_name: "Sofa bed" -} -item { - name: "/m/09ld4" - id: 228 - display_name: "Frog" -} -item { - name: "/m/09b5t" - id: 229 - display_name: "Chicken" -} -item { - name: "/m/054xkw" - id: 230 - display_name: "Lifejacket" -} -item { - name: "/m/0130jx" - id: 231 - display_name: "Sink" -} -item { - name: "/m/07fbm7" - id: 232 - display_name: "Strawberry" -} -item { - name: "/m/01dws" - id: 233 - display_name: "Bear" -} -item { - name: "/m/01tcjp" - id: 234 - display_name: "Muffin" -} -item { - name: "/m/0dftk" - id: 235 - display_name: "Swan" -} -item { - name: "/m/0c06p" - id: 236 - display_name: "Candle" -} -item { - name: "/m/034c16" - id: 237 - display_name: "Pillow" -} -item { - name: "/m/09d5_" - id: 238 - display_name: "Owl" -} -item { - name: "/m/03hlz0c" - id: 239 - display_name: "Kitchen utensil" -} -item { - name: "/m/0ft9s" - id: 240 - display_name: "Dragonfly" -} -item { - name: "/m/011k07" - id: 241 - display_name: "Tortoise" -} -item { - name: "/m/054_l" - id: 242 - display_name: "Mirror" -} -item { - name: "/m/0jqgx" - id: 243 - display_name: "Lily" -} -item { - name: "/m/0663v" - id: 244 - display_name: "Pizza" -} -item { - name: "/m/0242l" - id: 245 - display_name: "Coin" -} -item { - name: "/m/014trl" - id: 246 - display_name: "Cosmetics" -} -item { - name: "/m/05r5c" - id: 247 - display_name: "Piano" -} -item { - name: "/m/07j87" - id: 248 - display_name: "Tomato" -} -item { - name: "/m/05kyg_" - id: 249 - display_name: "Chest of drawers" -} -item { - name: "/m/0kmg4" - id: 250 - display_name: "Teddy bear" -} -item { - name: "/m/07cmd" - id: 251 - display_name: "Tank" -} -item { - name: "/m/0dv77" - id: 252 - display_name: "Squash" -} -item { - name: "/m/096mb" - id: 253 - display_name: "Lion" -} -item { - name: "/m/01gmv2" - id: 254 - display_name: "Brassiere" -} -item { - name: "/m/07bgp" - id: 255 - display_name: "Sheep" -} -item { - name: "/m/0cmx8" - id: 256 - display_name: "Spoon" -} -item { - name: "/m/029tx" - id: 257 - display_name: "Dinosaur" -} -item { - name: "/m/073bxn" - id: 258 - display_name: "Tripod" -} -item { - name: "/m/0bh9flk" - id: 259 - display_name: "Tablet computer" -} -item { - name: "/m/06mf6" - id: 260 - display_name: "Rabbit" -} -item { - name: "/m/06_fw" - id: 261 - display_name: "Skateboard" -} -item { - name: "/m/078jl" - id: 262 - display_name: "Snake" -} -item { - name: "/m/0fbdv" - id: 263 - display_name: "Shellfish" -} -item { - name: "/m/0h23m" - id: 264 - display_name: "Sparrow" -} -item { - name: "/m/014j1m" - id: 265 - display_name: "Apple" -} -item { - name: "/m/03fwl" - id: 266 - display_name: "Goat" -} -item { - name: "/m/02y6n" - id: 267 - display_name: "French fries" -} -item { - name: "/m/06c7f7" - id: 268 - display_name: "Lipstick" -} -item { - name: "/m/026qbn5" - id: 269 - display_name: "studio couch" -} -item { - name: "/m/0cdn1" - id: 270 - display_name: "Hamburger" -} -item { - name: "/m/07clx" - id: 271 - display_name: "Tea" -} -item { - name: "/m/07cx4" - id: 272 - display_name: "Telephone" -} -item { - name: "/m/03g8mr" - id: 273 - display_name: "Baseball bat" -} -item { - name: "/m/0cnyhnx" - id: 274 - display_name: "Bull" -} -item { - name: "/m/01b7fy" - id: 275 - display_name: "Headphones" -} -item { - name: "/m/04gth" - id: 276 - display_name: "Lavender" -} -item { - name: "/m/0cyfs" - id: 277 - display_name: "Parachute" -} -item { - name: "/m/021mn" - id: 278 - display_name: "Cookie" -} -item { - name: "/m/07dm6" - id: 279 - display_name: "Tiger" -} -item { - name: "/m/0k1tl" - id: 280 - display_name: "Pen" -} -item { - name: "/m/0dv9c" - id: 281 - display_name: "Racket" -} -item { - name: "/m/0dt3t" - id: 282 - display_name: "Fork" -} -item { - name: "/m/04yqq2" - id: 283 - display_name: "Bust" -} -item { - name: "/m/01cmb2" - id: 284 - display_name: "Miniskirt" -} -item { - name: "/m/0gd36" - id: 285 - display_name: "Sea lion" -} -item { - name: "/m/033cnk" - id: 286 - display_name: "Egg" -} -item { - name: "/m/06ncr" - id: 287 - display_name: "Saxophone" -} -item { - name: "/m/03bk1" - id: 288 - display_name: "Giraffe" -} -item { - name: "/m/0bjyj5" - id: 289 - display_name: "Waste container" -} -item { - name: "/m/06__v" - id: 290 - display_name: "Snowboard" -} -item { - name: "/m/0qmmr" - id: 291 - display_name: "Wheelchair" -} -item { - name: "/m/01xgg_" - id: 292 - display_name: "Medical equipment" -} -item { - name: "/m/0czz2" - id: 293 - display_name: "Antelope" -} -item { - name: "/m/02l8p9" - id: 294 - display_name: "Harbor seal" -} -item { - name: "/m/09g1w" - id: 295 - display_name: "Toilet" -} -item { - name: "/m/0ll1f78" - id: 296 - display_name: "Shrimp" -} -item { - name: "/m/0cyhj_" - id: 297 - display_name: "Orange" -} -item { - name: "/m/0642b4" - id: 298 - display_name: "Cupboard" -} -item { - name: "/m/0h8mzrc" - id: 299 - display_name: "Wall clock" -} -item { - name: "/m/068zj" - id: 300 - display_name: "Pig" -} -item { - name: "/m/02z51p" - id: 301 - display_name: "Nightstand" -} -item { - name: "/m/0h8nr_l" - id: 302 - display_name: "Bathroom accessory" -} -item { - name: "/m/0388q" - id: 303 - display_name: "Grape" -} -item { - name: "/m/02hj4" - id: 304 - display_name: "Dolphin" -} -item { - name: "/m/01jfsr" - id: 305 - display_name: "Lantern" -} -item { - name: "/m/07gql" - id: 306 - display_name: "Trumpet" -} -item { - name: "/m/0h8my_4" - id: 307 - display_name: "Tennis racket" -} -item { - name: "/m/0n28_" - id: 308 - display_name: "Crab" -} -item { - name: "/m/0120dh" - id: 309 - display_name: "Sea turtle" -} -item { - name: "/m/020kz" - id: 310 - display_name: "Cannon" -} -item { - name: "/m/0mkg" - id: 311 - display_name: "Accordion" -} -item { - name: "/m/03c7gz" - id: 312 - display_name: "Door handle" -} -item { - name: "/m/09k_b" - id: 313 - display_name: "Lemon" -} -item { - name: "/m/031n1" - id: 314 - display_name: "Foot" -} -item { - name: "/m/04rmv" - id: 315 - display_name: "Mouse" -} -item { - name: "/m/084rd" - id: 316 - display_name: "Wok" -} -item { - name: "/m/02rgn06" - id: 317 - display_name: "Volleyball" -} -item { - name: "/m/05z55" - id: 318 - display_name: "Pasta" -} -item { - name: "/m/01r546" - id: 319 - display_name: "Earrings" -} -item { - name: "/m/09qck" - id: 320 - display_name: "Banana" -} -item { - name: "/m/012w5l" - id: 321 - display_name: "Ladder" -} -item { - name: "/m/01940j" - id: 322 - display_name: "Backpack" -} -item { - name: "/m/09f_2" - id: 323 - display_name: "Crocodile" -} -item { - name: "/m/02p3w7d" - id: 324 - display_name: "Roller skates" -} -item { - name: "/m/057p5t" - id: 325 - display_name: "Scoreboard" -} -item { - name: "/m/0d8zb" - id: 326 - display_name: "Jellyfish" -} -item { - name: "/m/01nq26" - id: 327 - display_name: "Sock" -} -item { - name: "/m/01x_v" - id: 328 - display_name: "Camel" -} -item { - name: "/m/05gqfk" - id: 329 - display_name: "Plastic bag" -} -item { - name: "/m/0cydv" - id: 330 - display_name: "Caterpillar" -} -item { - name: "/m/07030" - id: 331 - display_name: "Sushi" -} -item { - name: "/m/084zz" - id: 332 - display_name: "Whale" -} -item { - name: "/m/0c29q" - id: 333 - display_name: "Leopard" -} -item { - name: "/m/02zn6n" - id: 334 - display_name: "Barrel" -} -item { - name: "/m/03tw93" - id: 335 - display_name: "Fireplace" -} -item { - name: "/m/0fqt361" - id: 336 - display_name: "Stool" -} -item { - name: "/m/0f9_l" - id: 337 - display_name: "Snail" -} -item { - name: "/m/0gm28" - id: 338 - display_name: "Candy" -} -item { - name: "/m/09rvcxw" - id: 339 - display_name: "Rocket" -} -item { - name: "/m/01nkt" - id: 340 - display_name: "Cheese" -} -item { - name: "/m/04p0qw" - id: 341 - display_name: "Billiard table" -} -item { - name: "/m/03hj559" - id: 342 - display_name: "Mixing bowl" -} -item { - name: "/m/07pj7bq" - id: 343 - display_name: "Bowling equipment" -} -item { - name: "/m/04ctx" - id: 344 - display_name: "Knife" -} -item { - name: "/m/0703r8" - id: 345 - display_name: "Loveseat" -} -item { - name: "/m/03qrc" - id: 346 - display_name: "Hamster" -} -item { - name: "/m/020lf" - id: 347 - display_name: "Mouse" -} -item { - name: "/m/0by6g" - id: 348 - display_name: "Shark" -} -item { - name: "/m/01fh4r" - id: 349 - display_name: "Teapot" -} -item { - name: "/m/07c6l" - id: 350 - display_name: "Trombone" -} -item { - name: "/m/03bj1" - id: 351 - display_name: "Panda" -} -item { - name: "/m/0898b" - id: 352 - display_name: "Zebra" -} -item { - name: "/m/02x984l" - id: 353 - display_name: "Mechanical fan" -} -item { - name: "/m/0fj52s" - id: 354 - display_name: "Carrot" -} -item { - name: "/m/0cd4d" - id: 355 - display_name: "Cheetah" -} -item { - name: "/m/02068x" - id: 356 - display_name: "Gondola" -} -item { - name: "/m/01vbnl" - id: 357 - display_name: "Bidet" -} -item { - name: "/m/0449p" - id: 358 - display_name: "Jaguar" -} -item { - name: "/m/0gj37" - id: 359 - display_name: "Ladybug" -} -item { - name: "/m/0nl46" - id: 360 - display_name: "Crown" -} -item { - name: "/m/0152hh" - id: 361 - display_name: "Snowman" -} -item { - name: "/m/03dnzn" - id: 362 - display_name: "Bathtub" -} -item { - name: "/m/05_5p_0" - id: 363 - display_name: "Table tennis racket" -} -item { - name: "/m/02jfl0" - id: 364 - display_name: "Sombrero" -} -item { - name: "/m/01dxs" - id: 365 - display_name: "Brown bear" -} -item { - name: "/m/0cjq5" - id: 366 - display_name: "Lobster" -} -item { - name: "/m/040b_t" - id: 367 - display_name: "Refrigerator" -} -item { - name: "/m/0_cp5" - id: 368 - display_name: "Oyster" -} -item { - name: "/m/0gxl3" - id: 369 - display_name: "Handgun" -} -item { - name: "/m/029bxz" - id: 370 - display_name: "Oven" -} -item { - name: "/m/02zt3" - id: 371 - display_name: "Kite" -} -item { - name: "/m/03d443" - id: 372 - display_name: "Rhinoceros" -} -item { - name: "/m/0306r" - id: 373 - display_name: "Fox" -} -item { - name: "/m/0h8l4fh" - id: 374 - display_name: "Light bulb" -} -item { - name: "/m/0633h" - id: 375 - display_name: "Polar bear" -} -item { - name: "/m/01s55n" - id: 376 - display_name: "Suitcase" -} -item { - name: "/m/0hkxq" - id: 377 - display_name: "Broccoli" -} -item { - name: "/m/0cn6p" - id: 378 - display_name: "Otter" -} -item { - name: "/m/0dbzx" - id: 379 - display_name: "Mule" -} -item { - name: "/m/01dy8n" - id: 380 - display_name: "Woodpecker" -} -item { - name: "/m/01h8tj" - id: 381 - display_name: "Starfish" -} -item { - name: "/m/03s_tn" - id: 382 - display_name: "Kettle" -} -item { - name: "/m/01xs3r" - id: 383 - display_name: "Jet ski" -} -item { - name: "/m/031b6r" - id: 384 - display_name: "Window blind" -} -item { - name: "/m/06j2d" - id: 385 - display_name: "Raven" -} -item { - name: "/m/0hqkz" - id: 386 - display_name: "Grapefruit" -} -item { - name: "/m/01_5g" - id: 387 - display_name: "Chopsticks" -} -item { - name: "/m/02zvsm" - id: 388 - display_name: "Tart" -} -item { - name: "/m/0kpqd" - id: 389 - display_name: "Watermelon" -} -item { - name: "/m/015x4r" - id: 390 - display_name: "Cucumber" -} -item { - name: "/m/061hd_" - id: 391 - display_name: "Infant bed" -} -item { - name: "/m/04ylt" - id: 392 - display_name: "Missile" -} -item { - name: "/m/02wv84t" - id: 393 - display_name: "Gas stove" -} -item { - name: "/m/04y4h8h" - id: 394 - display_name: "Bathroom cabinet" -} -item { - name: "/m/01gllr" - id: 395 - display_name: "Beehive" -} -item { - name: "/m/0pcr" - id: 396 - display_name: "Alpaca" -} -item { - name: "/m/0jy4k" - id: 397 - display_name: "Doughnut" -} -item { - name: "/m/09f20" - id: 398 - display_name: "Hippopotamus" -} -item { - name: "/m/0mcx2" - id: 399 - display_name: "Ipod" -} -item { - name: "/m/04c0y" - id: 400 - display_name: "Kangaroo" -} -item { - name: "/m/0_k2" - id: 401 - display_name: "Ant" -} -item { - name: "/m/0jg57" - id: 402 - display_name: "Bell pepper" -} -item { - name: "/m/03fj2" - id: 403 - display_name: "Goldfish" -} -item { - name: "/m/03ldnb" - id: 404 - display_name: "Ceiling fan" -} -item { - name: "/m/06nrc" - id: 405 - display_name: "Shotgun" -} -item { - name: "/m/01btn" - id: 406 - display_name: "Barge" -} -item { - name: "/m/05vtc" - id: 407 - display_name: "Potato" -} -item { - name: "/m/08hvt4" - id: 408 - display_name: "Jug" -} -item { - name: "/m/0fx9l" - id: 409 - display_name: "Microwave oven" -} -item { - name: "/m/01h44" - id: 410 - display_name: "Bat" -} -item { - name: "/m/05n4y" - id: 411 - display_name: "Ostrich" -} -item { - name: "/m/0jly1" - id: 412 - display_name: "Turkey" -} -item { - name: "/m/06y5r" - id: 413 - display_name: "Sword" -} -item { - name: "/m/05ctyq" - id: 414 - display_name: "Tennis ball" -} -item { - name: "/m/0fp6w" - id: 415 - display_name: "Pineapple" -} -item { - name: "/m/0d4w1" - id: 416 - display_name: "Closet" -} -item { - name: "/m/02pv19" - id: 417 - display_name: "Stop sign" -} -item { - name: "/m/07crc" - id: 418 - display_name: "Taco" -} -item { - name: "/m/01dwwc" - id: 419 - display_name: "Pancake" -} -item { - name: "/m/01b9xk" - id: 420 - display_name: "Hot dog" -} -item { - name: "/m/013y1f" - id: 421 - display_name: "Organ" -} -item { - name: "/m/0m53l" - id: 422 - display_name: "Rays and skates" -} -item { - name: "/m/0174k2" - id: 423 - display_name: "Washing machine" -} -item { - name: "/m/01dwsz" - id: 424 - display_name: "Waffle" -} -item { - name: "/m/04vv5k" - id: 425 - display_name: "Snowplow" -} -item { - name: "/m/04cp_" - id: 426 - display_name: "Koala" -} -item { - name: "/m/0fz0h" - id: 427 - display_name: "Honeycomb" -} -item { - name: "/m/0llzx" - id: 428 - display_name: "Sewing machine" -} -item { - name: "/m/0319l" - id: 429 - display_name: "Horn" -} -item { - name: "/m/04v6l4" - id: 430 - display_name: "Frying pan" -} -item { - name: "/m/0dkzw" - id: 431 - display_name: "Seat belt" -} -item { - name: "/m/027pcv" - id: 432 - display_name: "Zucchini" -} -item { - name: "/m/0323sq" - id: 433 - display_name: "Golf cart" -} -item { - name: "/m/054fyh" - id: 434 - display_name: "Pitcher" -} -item { - name: "/m/01pns0" - id: 435 - display_name: "Fire hydrant" -} -item { - name: "/m/012n7d" - id: 436 - display_name: "Ambulance" -} -item { - name: "/m/044r5d" - id: 437 - display_name: "Golf ball" -} -item { - name: "/m/01krhy" - id: 438 - display_name: "Tiara" -} -item { - name: "/m/0dq75" - id: 439 - display_name: "Raccoon" -} -item { - name: "/m/0176mf" - id: 440 - display_name: "Belt" -} -item { - name: "/m/0h8lkj8" - id: 441 - display_name: "Corded phone" -} -item { - name: "/m/04tn4x" - id: 442 - display_name: "Swim cap" -} -item { - name: "/m/06l9r" - id: 443 - display_name: "Red panda" -} -item { - name: "/m/0cjs7" - id: 444 - display_name: "Asparagus" -} -item { - name: "/m/01lsmm" - id: 445 - display_name: "Scissors" -} -item { - name: "/m/01lcw4" - id: 446 - display_name: "Limousine" -} -item { - name: "/m/047j0r" - id: 447 - display_name: "Filing cabinet" -} -item { - name: "/m/01fb_0" - id: 448 - display_name: "Bagel" -} -item { - name: "/m/04169hn" - id: 449 - display_name: "Wood-burning stove" -} -item { - name: "/m/076bq" - id: 450 - display_name: "Segway" -} -item { - name: "/m/0hdln" - id: 451 - display_name: "Ruler" -} -item { - name: "/m/01g3x7" - id: 452 - display_name: "Bow and arrow" -} -item { - name: "/m/0l3ms" - id: 453 - display_name: "Balance beam" -} -item { - name: "/m/058qzx" - id: 454 - display_name: "Kitchen knife" -} -item { - name: "/m/0h8n6ft" - id: 455 - display_name: "Cake stand" -} -item { - name: "/m/018j2" - id: 456 - display_name: "Banjo" -} -item { - name: "/m/0l14j_" - id: 457 - display_name: "Flute" -} -item { - name: "/m/0wdt60w" - id: 458 - display_name: "Rugby ball" -} -item { - name: "/m/02gzp" - id: 459 - display_name: "Dagger" -} -item { - name: "/m/0h8n6f9" - id: 460 - display_name: "Dog bed" -} -item { - name: "/m/0fbw6" - id: 461 - display_name: "Cabbage" -} -item { - name: "/m/07kng9" - id: 462 - display_name: "Picnic basket" -} -item { - name: "/m/0dj6p" - id: 463 - display_name: "Peach" -} -item { - name: "/m/06pcq" - id: 464 - display_name: "Submarine sandwich" -} -item { - name: "/m/061_f" - id: 465 - display_name: "Pear" -} -item { - name: "/m/04g2r" - id: 466 - display_name: "Lynx" -} -item { - name: "/m/0jwn_" - id: 467 - display_name: "Pomegranate" -} -item { - name: "/m/02f9f_" - id: 468 - display_name: "Shower" -} -item { - name: "/m/01f8m5" - id: 469 - display_name: "Blue jay" -} -item { - name: "/m/01m4t" - id: 470 - display_name: "Printer" -} -item { - name: "/m/0cl4p" - id: 471 - display_name: "Hedgehog" -} -item { - name: "/m/07xyvk" - id: 472 - display_name: "Coffeemaker" -} -item { - name: "/m/084hf" - id: 473 - display_name: "Worm" -} -item { - name: "/m/03v5tg" - id: 474 - display_name: "Drinking straw" -} -item { - name: "/m/0qjjc" - id: 475 - display_name: "Remote control" -} -item { - name: "/m/015x5n" - id: 476 - display_name: "Radish" -} -item { - name: "/m/0ccs93" - id: 477 - display_name: "Canary" -} -item { - name: "/m/0nybt" - id: 478 - display_name: "Seahorse" -} -item { - name: "/m/02vkqh8" - id: 479 - display_name: "Wardrobe" -} -item { - name: "/m/09gtd" - id: 480 - display_name: "Toilet paper" -} -item { - name: "/m/019h78" - id: 481 - display_name: "Centipede" -} -item { - name: "/m/015wgc" - id: 482 - display_name: "Croissant" -} -item { - name: "/m/01x3jk" - id: 483 - display_name: "Snowmobile" -} -item { - name: "/m/01j3zr" - id: 484 - display_name: "Burrito" -} -item { - name: "/m/0c568" - id: 485 - display_name: "Porcupine" -} -item { - name: "/m/02pdsw" - id: 486 - display_name: "Cutting board" -} -item { - name: "/m/029b3" - id: 487 - display_name: "Dice" -} -item { - name: "/m/03q5t" - id: 488 - display_name: "Harpsichord" -} -item { - name: "/m/0p833" - id: 489 - display_name: "Perfume" -} -item { - name: "/m/01d380" - id: 490 - display_name: "Drill" -} -item { - name: "/m/024d2" - id: 491 - display_name: "Calculator" -} -item { - name: "/m/0mw_6" - id: 492 - display_name: "Willow" -} -item { - name: "/m/01f91_" - id: 493 - display_name: "Pretzel" -} -item { - name: "/m/02g30s" - id: 494 - display_name: "Guacamole" -} -item { - name: "/m/01hrv5" - id: 495 - display_name: "Popcorn" -} -item { - name: "/m/03m5k" - id: 496 - display_name: "Harp" -} -item { - name: "/m/0162_1" - id: 497 - display_name: "Towel" -} -item { - name: "/m/063rgb" - id: 498 - display_name: "Mixer" -} -item { - name: "/m/06_72j" - id: 499 - display_name: "Digital clock" -} -item { - name: "/m/046dlr" - id: 500 - display_name: "Alarm clock" -} -item { - name: "/m/047v4b" - id: 501 - display_name: "Artichoke" -} -item { - name: "/m/04zpv" - id: 502 - display_name: "Milk" -} -item { - name: "/m/043nyj" - id: 503 - display_name: "Common fig" -} -item { - name: "/m/03bbps" - id: 504 - display_name: "Power plugs and sockets" -} -item { - name: "/m/02w3r3" - id: 505 - display_name: "Paper towel" -} -item { - name: "/m/02pjr4" - id: 506 - display_name: "Blender" -} -item { - name: "/m/0755b" - id: 507 - display_name: "Scorpion" -} -item { - name: "/m/02lbcq" - id: 508 - display_name: "Stretcher" -} -item { - name: "/m/0fldg" - id: 509 - display_name: "Mango" -} -item { - name: "/m/012074" - id: 510 - display_name: "Magpie" -} -item { - name: "/m/035vxb" - id: 511 - display_name: "Isopod" -} -item { - name: "/m/02w3_ws" - id: 512 - display_name: "Personal care" -} -item { - name: "/m/0f6nr" - id: 513 - display_name: "Unicycle" -} -item { - name: "/m/0420v5" - id: 514 - display_name: "Punching bag" -} -item { - name: "/m/0frqm" - id: 515 - display_name: "Envelope" -} -item { - name: "/m/03txqz" - id: 516 - display_name: "Scale" -} -item { - name: "/m/0271qf7" - id: 517 - display_name: "Wine rack" -} -item { - name: "/m/074d1" - id: 518 - display_name: "Submarine" -} -item { - name: "/m/08p92x" - id: 519 - display_name: "Cream" -} -item { - name: "/m/01j4z9" - id: 520 - display_name: "Chainsaw" -} -item { - name: "/m/0kpt_" - id: 521 - display_name: "Cantaloupe" -} -item { - name: "/m/0h8n27j" - id: 522 - display_name: "Serving tray" -} -item { - name: "/m/03y6mg" - id: 523 - display_name: "Food processor" -} -item { - name: "/m/04h8sr" - id: 524 - display_name: "Dumbbell" -} -item { - name: "/m/065h6l" - id: 525 - display_name: "Jacuzzi" -} -item { - name: "/m/02tsc9" - id: 526 - display_name: "Slow cooker" -} -item { - name: "/m/012ysf" - id: 527 - display_name: "Syringe" -} -item { - name: "/m/0ky7b" - id: 528 - display_name: "Dishwasher" -} -item { - name: "/m/02wg_p" - id: 529 - display_name: "Tree house" -} -item { - name: "/m/0584n8" - id: 530 - display_name: "Briefcase" -} -item { - name: "/m/03kt2w" - id: 531 - display_name: "Stationary bicycle" -} -item { - name: "/m/05kms" - id: 532 - display_name: "Oboe" -} -item { - name: "/m/030610" - id: 533 - display_name: "Treadmill" -} -item { - name: "/m/0lt4_" - id: 534 - display_name: "Binoculars" -} -item { - name: "/m/076lb9" - id: 535 - display_name: "Bench" -} -item { - name: "/m/02ctlc" - id: 536 - display_name: "Cricket ball" -} -item { - name: "/m/02x8cch" - id: 537 - display_name: "Salt and pepper shakers" -} -item { - name: "/m/09gys" - id: 538 - display_name: "Squid" -} -item { - name: "/m/03jbxj" - id: 539 - display_name: "Light switch" -} -item { - name: "/m/012xff" - id: 540 - display_name: "Toothbrush" -} -item { - name: "/m/0h8kx63" - id: 541 - display_name: "Spice rack" -} -item { - name: "/m/073g6" - id: 542 - display_name: "Stethoscope" -} -item { - name: "/m/02cvgx" - id: 543 - display_name: "Winter melon" -} -item { - name: "/m/027rl48" - id: 544 - display_name: "Ladle" -} -item { - name: "/m/01kb5b" - id: 545 - display_name: "Flashlight" -} diff --git a/object_detection/data/pascal_label_map.pbtxt b/object_detection/data/pascal_label_map.pbtxt deleted file mode 100644 index c9e9e2af..00000000 --- a/object_detection/data/pascal_label_map.pbtxt +++ /dev/null @@ -1,99 +0,0 @@ -item { - id: 1 - name: 'aeroplane' -} - -item { - id: 2 - name: 'bicycle' -} - -item { - id: 3 - name: 'bird' -} - -item { - id: 4 - name: 'boat' -} - -item { - id: 5 - name: 'bottle' -} - -item { - id: 6 - name: 'bus' -} - -item { - id: 7 - name: 'car' -} - -item { - id: 8 - name: 'cat' -} - -item { - id: 9 - name: 'chair' -} - -item { - id: 10 - name: 'cow' -} - -item { - id: 11 - name: 'diningtable' -} - -item { - id: 12 - name: 'dog' -} - -item { - id: 13 - name: 'horse' -} - -item { - id: 14 - name: 'motorbike' -} - -item { - id: 15 - name: 'person' -} - -item { - id: 16 - name: 'pottedplant' -} - -item { - id: 17 - name: 'sheep' -} - -item { - id: 18 - name: 'sofa' -} - -item { - id: 19 - name: 'train' -} - -item { - id: 20 - name: 'tvmonitor' -} diff --git a/object_detection/data/pet_label_map.pbtxt b/object_detection/data/pet_label_map.pbtxt deleted file mode 100644 index 54d7d351..00000000 --- a/object_detection/data/pet_label_map.pbtxt +++ /dev/null @@ -1,184 +0,0 @@ -item { - id: 1 - name: 'Abyssinian' -} - -item { - id: 2 - name: 'american_bulldog' -} - -item { - id: 3 - name: 'american_pit_bull_terrier' -} - -item { - id: 4 - name: 'basset_hound' -} - -item { - id: 5 - name: 'beagle' -} - -item { - id: 6 - name: 'Bengal' -} - -item { - id: 7 - name: 'Birman' -} - -item { - id: 8 - name: 'Bombay' -} - -item { - id: 9 - name: 'boxer' -} - -item { - id: 10 - name: 'British_Shorthair' -} - -item { - id: 11 - name: 'chihuahua' -} - -item { - id: 12 - name: 'Egyptian_Mau' -} - -item { - id: 13 - name: 'english_cocker_spaniel' -} - -item { - id: 14 - name: 'english_setter' -} - -item { - id: 15 - name: 'german_shorthaired' -} - -item { - id: 16 - name: 'great_pyrenees' -} - -item { - id: 17 - name: 'havanese' -} - -item { - id: 18 - name: 'japanese_chin' -} - -item { - id: 19 - name: 'keeshond' -} - -item { - id: 20 - name: 'leonberger' -} - -item { - id: 21 - name: 'Maine_Coon' -} - -item { - id: 22 - name: 'miniature_pinscher' -} - -item { - id: 23 - name: 'newfoundland' -} - -item { - id: 24 - name: 'Persian' -} - -item { - id: 25 - name: 'pomeranian' -} - -item { - id: 26 - name: 'pug' -} - -item { - id: 27 - name: 'Ragdoll' -} - -item { - id: 28 - name: 'Russian_Blue' -} - -item { - id: 29 - name: 'saint_bernard' -} - -item { - id: 30 - name: 'samoyed' -} - -item { - id: 31 - name: 'scottish_terrier' -} - -item { - id: 32 - name: 'shiba_inu' -} - -item { - id: 33 - name: 'Siamese' -} - -item { - id: 34 - name: 'Sphynx' -} - -item { - id: 35 - name: 'staffordshire_bull_terrier' -} - -item { - id: 36 - name: 'wheaten_terrier' -} - -item { - id: 37 - name: 'yorkshire_terrier' -} diff --git a/object_detection/data_decoders/BUILD b/object_detection/data_decoders/BUILD deleted file mode 100644 index d6b48ac0..00000000 --- a/object_detection/data_decoders/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -# Tensorflow Object Detection API: data decoders. - -package( - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) -# Apache 2.0 - -py_library( - name = "tf_example_decoder", - srcs = ["tf_example_decoder.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:data_decoder", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/utils:label_map_util", - ], -) - -py_test( - name = "tf_example_decoder_test", - srcs = ["tf_example_decoder_test.py"], - deps = [ - ":tf_example_decoder", - "//tensorflow", - "//tensorflow_models/object_detection/core:standard_fields", - ], -) diff --git a/object_detection/data_decoders/__init__.py b/object_detection/data_decoders/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/object_detection/data_decoders/__pycache__/__init__.cpython-35.pyc b/object_detection/data_decoders/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index dd75c900a4618365b019c32b82f5f13f17c1e26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmWgV<>i{qWEaH%1dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnuR#5b{M=Oiq#|?u z+|-oJ(p>%G(xS4|%$%IWyyR5cV%4pH)B$3n1=bM8qaChxPv}d317G{(ztETVJLJr2_M$4itTeYn^6>DG{LXi{xwu&W zUE$N#UpZrcXSrVq@1NmP5pF(XE!-XE7g*@9R>8a%Sy*Jf5^I&1LuDoNU1qI{{Vubx z%6c`{sxe0t*zp`YuCwEL)>>e{@GH!(vhSd@%0!7BFS55q*1AR=JZsd3e|Rn;70XT- zpYWfbdcA%qcwfdz%ze?0eIa=#mOMT@7VQM01dkw&n)UkUqY9(CTqQDyj(B2JD&CHx z#0w%4DIo(d42Hr_OR2+V+F{*vs4nU09o)j6HXOa+dx__!X5o8DC0^uv(sw(72z>?7 zwa_~hq1*HN?jQ-mHZ{$DWxRZbOFhO-z|U|b?#9EdBKgC&_Y(8V>^nFKFPZaNW#-qI zKSz#)*HQCXqpp{qchVv3S!WGzUFFW^lc((x44@xb^g~=^kosG}%zMJvvBNry(F;s6 zR=q7anDZG$WkyAnSw%%tRK2{Yc6rgf@2q_B-f@SOH-2N zoCNkm&q_{GFp|}r#P)SPC$X*8rX=f=l3<0MGv>l|Rd!sXEt8ln<8PQ9w@I7K-(vnY zd&`Px9Sjq77HK8Gwp565Sz$FN#L%p;k`rQd5Uw!)2J>$+|2^jafE}Ti_c2qMHjK_T zT+KDa0Il$PPKYsD;aX0JVOrrj34=K^#tnAvF!{#b$se#s)CL3ofYvwW z_^3$Dj`~Tik5&{SLjo4t(M7a99}8ZKMv^)CUUg?* z=y-!LabJ7kKxj5xu;mDQJulIvF#MSh-S;Z(^>MfOX{EXP=9Mozg=0z zQ^U;}B{aFim9YX(3U9bRCJL0>mhp){VT>PiIzbygoTz>z<3ZnzJ9^G&ap5jqw|+J6 zwKn!?BtrGB2>0j`jYpTr3-s=t(mO`7I%b3M)P$+Dy`MI2>O#`dOHYDR;eRQjCl+LM z#j+Az4x;4a2YT_>p3Ie2K}5Xd{yn`s2~N6VX@y?ekNSgT4=eqN;Th0Gn^v!>FzC6$ zlBSH8=<>cPoExnKU9p@%7is)8LK#{^dWGB*`2fhI>tgza((_-C1k3)5_*5_F%V{$7 zT3(XPg}qtV>FSo!0dk7~Wc&wRc;~lStB9wDr;m@nrnLsPkgn~bq6KKOcJ6>RKEX!PE=M{EdW!qrK)crMTY(vgBGR0K`+><$Jb5;QL*%B}B7$r46bk)T zkg4g$A#FmE&q`ZHF)Fjggq^gpcZeM6L8Zs zXv6RF`+Ix<4EtGTCe)cN%3nNHd-SbQ&HUHF3wktlGti7M zZES&M`tm8AE}NF%Wt2+lvY(vw#Z$S6FxXg;t9a;YN@wJI^tJr_$@saA+=5u%p|X02 zjLNl|D)z8Rmk7jlaTxUFHdVYqw;xgMQrlBV5@K#QtKI?9tFJ9z z9qk*$?xP+y6)+%)nPBL*a*2Y4V1o9y@EGyqur?T0)3qc;|P#bzw!FIi&%vb6g@)Ax#uxB2Sk{X>OQSPRzM+jJn zka839M#b*Br3uICik&uHHluD)^At7A;n3tx`Z09<371;NjV;!lx^o-XDwz6hXLx67 z7hRGsHL8?IP`>B7y6(EY*dK)SzTmouf?--xbzMJhyRQ5Yota%M$$*?ul<-Ki$LZAg zeOzh*w*{wCEK=U_n}wf9DrqdqXL#tkT`lm?iABJ58;>utpeAUEkd#2kBHakt^u|;z zI!9NMatmE09w>uDWOT@U^-9v2NPaE4&Qq#vS-dnh%^HTTJ+i*|bPcM_Sdi}&mL2>R HmWuxZek*Ct diff --git a/object_detection/data_decoders/tf_example_decoder.py b/object_detection/data_decoders/tf_example_decoder.py deleted file mode 100644 index 4dc3dc5c..00000000 --- a/object_detection/data_decoders/tf_example_decoder.py +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tensorflow Example proto decoder for object detection. - -A decoder to decode string tensors containing serialized tensorflow.Example -protos for object detection. -""" -import tensorflow as tf - -from object_detection.core import data_decoder -from object_detection.core import standard_fields as fields -from object_detection.utils import label_map_util - -slim_example_decoder = tf.contrib.slim.tfexample_decoder - - -class TfExampleDecoder(data_decoder.DataDecoder): - """Tensorflow Example proto decoder.""" - - def __init__(self, - load_instance_masks=False, - label_map_proto_file=None, - use_display_name=False): - """Constructor sets keys_to_features and items_to_handlers. - - Args: - load_instance_masks: whether or not to load and handle instance masks. - label_map_proto_file: a file path to a - object_detection.protos.StringIntLabelMap proto. If provided, then the - mapped IDs of 'image/object/class/text' will take precedence over the - existing 'image/object/class/label' ID. Also, if provided, it is - assumed that 'image/object/class/text' will be in the data. - use_display_name: whether or not to use the `display_name` for label - mapping (instead of `name`). Only used if label_map_proto_file is - provided. - """ - self.keys_to_features = { - 'image/encoded': - tf.FixedLenFeature((), tf.string, default_value=''), - 'image/format': - tf.FixedLenFeature((), tf.string, default_value='jpeg'), - 'image/filename': - tf.FixedLenFeature((), tf.string, default_value=''), - 'image/key/sha256': - tf.FixedLenFeature((), tf.string, default_value=''), - 'image/source_id': - tf.FixedLenFeature((), tf.string, default_value=''), - 'image/height': - tf.FixedLenFeature((), tf.int64, 1), - 'image/width': - tf.FixedLenFeature((), tf.int64, 1), - # Object boxes and classes. - 'image/object/bbox/xmin': - tf.VarLenFeature(tf.float32), - 'image/object/bbox/xmax': - tf.VarLenFeature(tf.float32), - 'image/object/bbox/ymin': - tf.VarLenFeature(tf.float32), - 'image/object/bbox/ymax': - tf.VarLenFeature(tf.float32), - 'image/object/class/label': - tf.VarLenFeature(tf.int64), - 'image/object/class/text': - tf.VarLenFeature(tf.string), - 'image/object/area': - tf.VarLenFeature(tf.float32), - 'image/object/is_crowd': - tf.VarLenFeature(tf.int64), - 'image/object/difficult': - tf.VarLenFeature(tf.int64), - 'image/object/group_of': - tf.VarLenFeature(tf.int64), - } - self.items_to_handlers = { - fields.InputDataFields.image: slim_example_decoder.Image( - image_key='image/encoded', format_key='image/format', channels=3), - fields.InputDataFields.source_id: ( - slim_example_decoder.Tensor('image/source_id')), - fields.InputDataFields.key: ( - slim_example_decoder.Tensor('image/key/sha256')), - fields.InputDataFields.filename: ( - slim_example_decoder.Tensor('image/filename')), - # Object boxes and classes. - fields.InputDataFields.groundtruth_boxes: ( - slim_example_decoder.BoundingBox( - ['ymin', 'xmin', 'ymax', 'xmax'], 'image/object/bbox/')), - fields.InputDataFields.groundtruth_area: slim_example_decoder.Tensor( - 'image/object/area'), - fields.InputDataFields.groundtruth_is_crowd: ( - slim_example_decoder.Tensor('image/object/is_crowd')), - fields.InputDataFields.groundtruth_difficult: ( - slim_example_decoder.Tensor('image/object/difficult')), - fields.InputDataFields.groundtruth_group_of: ( - slim_example_decoder.Tensor('image/object/group_of')) - } - if load_instance_masks: - self.keys_to_features['image/object/mask'] = tf.VarLenFeature(tf.float32) - self.items_to_handlers[ - fields.InputDataFields.groundtruth_instance_masks] = ( - slim_example_decoder.ItemHandlerCallback( - ['image/object/mask', 'image/height', 'image/width'], - self._reshape_instance_masks)) - # TODO: Add label_handler that decodes from 'image/object/class/text' - # primarily after the recent tf.contrib.slim changes make into a release - # supported by cloudml. - label_handler = slim_example_decoder.Tensor('image/object/class/label') - self.items_to_handlers[ - fields.InputDataFields.groundtruth_classes] = label_handler - - def decode(self, tf_example_string_tensor): - """Decodes serialized tensorflow example and returns a tensor dictionary. - - Args: - tf_example_string_tensor: a string tensor holding a serialized tensorflow - example proto. - - Returns: - A dictionary of the following tensors. - fields.InputDataFields.image - 3D uint8 tensor of shape [None, None, 3] - containing image. - fields.InputDataFields.source_id - string tensor containing original - image id. - fields.InputDataFields.key - string tensor with unique sha256 hash key. - fields.InputDataFields.filename - string tensor with original dataset - filename. - fields.InputDataFields.groundtruth_boxes - 2D float32 tensor of shape - [None, 4] containing box corners. - fields.InputDataFields.groundtruth_classes - 1D int64 tensor of shape - [None] containing classes for the boxes. - fields.InputDataFields.groundtruth_area - 1D float32 tensor of shape - [None] containing containing object mask area in pixel squared. - fields.InputDataFields.groundtruth_is_crowd - 1D bool tensor of shape - [None] indicating if the boxes enclose a crowd. - Optional: - fields.InputDataFields.groundtruth_difficult - 1D bool tensor of shape - [None] indicating if the boxes represent `difficult` instances. - fields.InputDataFields.groundtruth_group_of - 1D bool tensor of shape - [None] indicating if the boxes represent `group_of` instances. - fields.InputDataFields.groundtruth_instance_masks - 3D int64 tensor of - shape [None, None, None] containing instance masks. - """ - serialized_example = tf.reshape(tf_example_string_tensor, shape=[]) - decoder = slim_example_decoder.TFExampleDecoder(self.keys_to_features, - self.items_to_handlers) - keys = decoder.list_items() - tensors = decoder.decode(serialized_example, items=keys) - tensor_dict = dict(zip(keys, tensors)) - is_crowd = fields.InputDataFields.groundtruth_is_crowd - tensor_dict[is_crowd] = tf.cast(tensor_dict[is_crowd], dtype=tf.bool) - tensor_dict[fields.InputDataFields.image].set_shape([None, None, 3]) - return tensor_dict - - def _reshape_instance_masks(self, keys_to_tensors): - """Reshape instance segmentation masks. - - The instance segmentation masks are reshaped to [num_instances, height, - width] and cast to boolean type to save memory. - - Args: - keys_to_tensors: a dictionary from keys to tensors. - - Returns: - A 3-D float tensor of shape [num_instances, height, width] with values - in {0, 1}. - """ - height = keys_to_tensors['image/height'] - width = keys_to_tensors['image/width'] - to_shape = tf.cast(tf.stack([-1, height, width]), tf.int32) - masks = keys_to_tensors['image/object/mask'] - if isinstance(masks, tf.SparseTensor): - masks = tf.sparse_tensor_to_dense(masks) - masks = tf.reshape(tf.to_float(tf.greater(masks, 0.0)), to_shape) - return tf.cast(masks, tf.float32) diff --git a/object_detection/data_decoders/tf_example_decoder_test.py b/object_detection/data_decoders/tf_example_decoder_test.py deleted file mode 100644 index 04d00531..00000000 --- a/object_detection/data_decoders/tf_example_decoder_test.py +++ /dev/null @@ -1,350 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.data_decoders.tf_example_decoder.""" - -import os -import numpy as np -import tensorflow as tf - -from object_detection.core import standard_fields as fields -from object_detection.data_decoders import tf_example_decoder - - -class TfExampleDecoderTest(tf.test.TestCase): - - def _EncodeImage(self, image_tensor, encoding_type='jpeg'): - with self.test_session(): - if encoding_type == 'jpeg': - image_encoded = tf.image.encode_jpeg(tf.constant(image_tensor)).eval() - elif encoding_type == 'png': - image_encoded = tf.image.encode_png(tf.constant(image_tensor)).eval() - else: - raise ValueError('Invalid encoding type.') - return image_encoded - - def _DecodeImage(self, image_encoded, encoding_type='jpeg'): - with self.test_session(): - if encoding_type == 'jpeg': - image_decoded = tf.image.decode_jpeg(tf.constant(image_encoded)).eval() - elif encoding_type == 'png': - image_decoded = tf.image.decode_png(tf.constant(image_encoded)).eval() - else: - raise ValueError('Invalid encoding type.') - return image_decoded - - def _Int64Feature(self, value): - return tf.train.Feature(int64_list=tf.train.Int64List(value=value)) - - def _FloatFeature(self, value): - return tf.train.Feature(float_list=tf.train.FloatList(value=value)) - - def _BytesFeature(self, value): - if isinstance(value, list): - return tf.train.Feature(bytes_list=tf.train.BytesList(value=value)) - return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) - - def testDecodeJpegImage(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - decoded_jpeg = self._DecodeImage(encoded_jpeg) - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/source_id': self._BytesFeature('image_id'), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[fields.InputDataFields.image]. - get_shape().as_list()), [None, None, 3]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual(decoded_jpeg, tensor_dict[fields.InputDataFields.image]) - self.assertEqual('image_id', tensor_dict[fields.InputDataFields.source_id]) - - def testDecodeImageKeyAndFilename(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/key/sha256': self._BytesFeature('abc'), - 'image/filename': self._BytesFeature('filename') - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertEqual('abc', tensor_dict[fields.InputDataFields.key]) - self.assertEqual('filename', tensor_dict[fields.InputDataFields.filename]) - - def testDecodePngImage(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_png = self._EncodeImage(image_tensor, encoding_type='png') - decoded_png = self._DecodeImage(encoded_png, encoding_type='png') - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_png), - 'image/format': self._BytesFeature('png'), - 'image/source_id': self._BytesFeature('image_id') - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[fields.InputDataFields.image]. - get_shape().as_list()), [None, None, 3]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual(decoded_png, tensor_dict[fields.InputDataFields.image]) - self.assertEqual('image_id', tensor_dict[fields.InputDataFields.source_id]) - - def testDecodeBoundingBox(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - bbox_ymins = [0.0, 4.0] - bbox_xmins = [1.0, 5.0] - bbox_ymaxs = [2.0, 6.0] - bbox_xmaxs = [3.0, 7.0] - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/object/bbox/ymin': self._FloatFeature(bbox_ymins), - 'image/object/bbox/xmin': self._FloatFeature(bbox_xmins), - 'image/object/bbox/ymax': self._FloatFeature(bbox_ymaxs), - 'image/object/bbox/xmax': self._FloatFeature(bbox_xmaxs), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[fields.InputDataFields.groundtruth_boxes]. - get_shape().as_list()), [None, 4]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - expected_boxes = np.vstack([bbox_ymins, bbox_xmins, - bbox_ymaxs, bbox_xmaxs]).transpose() - self.assertAllEqual(expected_boxes, - tensor_dict[fields.InputDataFields.groundtruth_boxes]) - - def testDecodeObjectLabel(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - bbox_classes = [0, 1] - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/object/class/label': self._Int64Feature(bbox_classes), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[ - fields.InputDataFields.groundtruth_classes].get_shape().as_list()), - [None]) - - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual(bbox_classes, - tensor_dict[fields.InputDataFields.groundtruth_classes]) - - def testDecodeObjectArea(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - object_area = [100., 174.] - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/object/area': self._FloatFeature(object_area), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[fields.InputDataFields.groundtruth_area]. - get_shape().as_list()), [None]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual(object_area, - tensor_dict[fields.InputDataFields.groundtruth_area]) - - def testDecodeObjectIsCrowd(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - object_is_crowd = [0, 1] - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/object/is_crowd': self._Int64Feature(object_is_crowd), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[ - fields.InputDataFields.groundtruth_is_crowd].get_shape().as_list()), - [None]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual([bool(item) for item in object_is_crowd], - tensor_dict[ - fields.InputDataFields.groundtruth_is_crowd]) - - def testDecodeObjectDifficult(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - object_difficult = [0, 1] - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/object/difficult': self._Int64Feature(object_difficult), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[ - fields.InputDataFields.groundtruth_difficult].get_shape().as_list()), - [None]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual([bool(item) for item in object_difficult], - tensor_dict[ - fields.InputDataFields.groundtruth_difficult]) - - def testDecodeObjectGroupOf(self): - image_tensor = np.random.randint(255, size=(4, 5, 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - object_group_of = [0, 1] - example = tf.train.Example(features=tf.train.Features( - feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/object/group_of': self._Int64Feature(object_group_of), - })).SerializeToString() - - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual((tensor_dict[ - fields.InputDataFields.groundtruth_group_of].get_shape().as_list()), - [None]) - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual( - [bool(item) for item in object_group_of], - tensor_dict[fields.InputDataFields.groundtruth_group_of]) - - def testDecodeInstanceSegmentation(self): - num_instances = 4 - image_height = 5 - image_width = 3 - - # Randomly generate image. - image_tensor = np.random.randint(255, size=(image_height, - image_width, - 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - - # Randomly generate instance segmentation masks. - instance_masks = ( - np.random.randint(2, size=(num_instances, - image_height, - image_width)).astype(np.float32)) - instance_masks_flattened = np.reshape(instance_masks, [-1]) - - # Randomly generate class labels for each instance. - object_classes = np.random.randint( - 100, size=(num_instances)).astype(np.int64) - - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/height': self._Int64Feature([image_height]), - 'image/width': self._Int64Feature([image_width]), - 'image/object/mask': self._FloatFeature(instance_masks_flattened), - 'image/object/class/label': self._Int64Feature( - object_classes)})).SerializeToString() - example_decoder = tf_example_decoder.TfExampleDecoder( - load_instance_masks=True) - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - - self.assertAllEqual(( - tensor_dict[fields.InputDataFields.groundtruth_instance_masks]. - get_shape().as_list()), [None, None, None]) - - self.assertAllEqual(( - tensor_dict[fields.InputDataFields.groundtruth_classes]. - get_shape().as_list()), [None]) - - with self.test_session() as sess: - tensor_dict = sess.run(tensor_dict) - - self.assertAllEqual( - instance_masks.astype(np.float32), - tensor_dict[fields.InputDataFields.groundtruth_instance_masks]) - self.assertAllEqual( - object_classes, - tensor_dict[fields.InputDataFields.groundtruth_classes]) - - def testInstancesNotAvailableByDefault(self): - num_instances = 4 - image_height = 5 - image_width = 3 - # Randomly generate image. - image_tensor = np.random.randint(255, size=(image_height, - image_width, - 3)).astype(np.uint8) - encoded_jpeg = self._EncodeImage(image_tensor) - - # Randomly generate instance segmentation masks. - instance_masks = ( - np.random.randint(2, size=(num_instances, - image_height, - image_width)).astype(np.float32)) - instance_masks_flattened = np.reshape(instance_masks, [-1]) - - # Randomly generate class labels for each instance. - object_classes = np.random.randint( - 100, size=(num_instances)).astype(np.int64) - - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': self._BytesFeature(encoded_jpeg), - 'image/format': self._BytesFeature('jpeg'), - 'image/height': self._Int64Feature([image_height]), - 'image/width': self._Int64Feature([image_width]), - 'image/object/mask': self._FloatFeature(instance_masks_flattened), - 'image/object/class/label': self._Int64Feature( - object_classes)})).SerializeToString() - example_decoder = tf_example_decoder.TfExampleDecoder() - tensor_dict = example_decoder.decode(tf.convert_to_tensor(example)) - self.assertTrue(fields.InputDataFields.groundtruth_instance_masks - not in tensor_dict) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/dataset_tools/BUILD b/object_detection/dataset_tools/BUILD deleted file mode 100644 index bb5ce2e5..00000000 --- a/object_detection/dataset_tools/BUILD +++ /dev/null @@ -1,107 +0,0 @@ -# Tensorflow Object Detection API: main runnables. - -package( - default_visibility = ["//visibility:public"], -) - -licenses(["notice"]) - -# Apache 2.0 - -py_binary( - name = "create_kitti_tf_record", - srcs = [ - "create_kitti_tf_record.py", - ], - deps = [ - "//third_party/py/PIL:pil", - "//third_party/py/lxml", - "//tensorflow", - "//tensorflow_models/object_detection/utils:dataset_util", - "//tensorflow_models/object_detection/utils:label_map_util", - "//tensorflow_models/object_detection/utils:np_box_ops", - ], -) - -py_test( - name = "create_kitti_tf_record_test", - srcs = [ - "create_kitti_tf_record_test.py", - ], - deps = [ - ":create_kitti_tf_record", - "//tensorflow", - ], -) - -py_binary( - name = "create_pascal_tf_record", - srcs = [ - "create_pascal_tf_record.py", - ], - deps = [ - "//third_party/py/PIL:pil", - "//third_party/py/lxml", - "//tensorflow", - "//tensorflow_models/object_detection/utils:dataset_util", - "//tensorflow_models/object_detection/utils:label_map_util", - ], -) - -py_test( - name = "create_pascal_tf_record_test", - srcs = [ - "create_pascal_tf_record_test.py", - ], - deps = [ - ":create_pascal_tf_record", - "//tensorflow", - ], -) - -py_binary( - name = "create_pet_tf_record", - srcs = [ - "create_pet_tf_record.py", - ], - deps = [ - "//third_party/py/PIL:pil", - "//third_party/py/lxml", - "//tensorflow", - "//tensorflow_models/object_detection/utils:dataset_util", - "//tensorflow_models/object_detection/utils:label_map_util", - ], -) - -py_library( - name = "oid_tfrecord_creation", - srcs = ["oid_tfrecord_creation.py"], - deps = [ - "//tensorflow", - "//tensorflow_models/object_detection/core:standard_fields", - "//tensorflow_models/object_detection/utils:dataset_util", - ], -) - -py_test( - name = "oid_tfrecord_creation_test", - srcs = ["oid_tfrecord_creation_test.py"], - deps = [ - ":oid_tfrecord_creation", - "//third_party/py/contextlib2", - "//third_party/py/pandas", - "//third_party/py/tensorflow", - ], -) - -py_binary( - name = "create_oid_tf_record", - srcs = ["create_oid_tf_record.py"], - deps = [ - ":oid_tfrecord_creation", - "//third_party/py/contextlib2", - "//third_party/py/pandas", - "//tensorflow", - "//tensorflow_models/object_detection/utils:label_map_util", - ], -) diff --git a/object_detection/dataset_tools/create_kitti_tf_record.py b/object_detection/dataset_tools/create_kitti_tf_record.py deleted file mode 100644 index 2bf2ff34..00000000 --- a/object_detection/dataset_tools/create_kitti_tf_record.py +++ /dev/null @@ -1,310 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -r"""Convert raw KITTI detection dataset to TFRecord for object_detection. - -Converts KITTI detection dataset to TFRecords with a standard format allowing - to use this dataset to train object detectors. The raw dataset can be - downloaded from: - http://kitti.is.tue.mpg.de/kitti/data_object_image_2.zip. - http://kitti.is.tue.mpg.de/kitti/data_object_label_2.zip - Permission can be requested at the main website. - - KITTI detection dataset contains 7481 training images. Using this code with - the default settings will set aside the first 500 images as a validation set. - This can be altered using the flags, see details below. - -Example usage: - python object_detection/dataset_tools/create_kitti_tf_record.py \ - --data_dir=/home/user/kitti \ - --output_path=/home/user/kitti.record -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - - -import hashlib -import io -import os - -import numpy as np -import PIL.Image as pil -import tensorflow as tf - -from object_detection.utils import dataset_util -from object_detection.utils import label_map_util -from object_detection.utils.np_box_ops import iou - -tf.app.flags.DEFINE_string('data_dir', '', 'Location of root directory for the ' - 'data. Folder structure is assumed to be:' - '/training/label_2 (annotations) and' - '/data_object_image_2/training/image_2' - '(images).') -tf.app.flags.DEFINE_string('output_path', '', 'Path to which TFRecord files' - 'will be written. The TFRecord with the training set' - 'will be located at: _train.tfrecord.' - 'And the TFRecord with the validation set will be' - 'located at: _val.tfrecord') -tf.app.flags.DEFINE_list('classes_to_use', ['car', 'pedestrian', 'dontcare'], - 'Which classes of bounding boxes to use. Adding the' - 'dontcare class will remove all bboxs in the dontcare' - 'regions.') -tf.app.flags.DEFINE_string('label_map_path', 'data/kitti_label_map.pbtxt', - 'Path to label map proto.') -tf.app.flags.DEFINE_integer('validation_set_size', '500', 'Number of images to' - 'be used as a validation set.') -FLAGS = tf.app.flags.FLAGS - - -def convert_kitti_to_tfrecords(data_dir, output_path, classes_to_use, - label_map_path, validation_set_size): - """Convert the KITTI detection dataset to TFRecords. - - Args: - data_dir: The full path to the unzipped folder containing the unzipped data - from data_object_image_2 and data_object_label_2.zip. - Folder structure is assumed to be: data_dir/training/label_2 (annotations) - and data_dir/data_object_image_2/training/image_2 (images). - output_path: The path to which TFRecord files will be written. The TFRecord - with the training set will be located at: _train.tfrecord - And the TFRecord with the validation set will be located at: - _val.tfrecord - classes_to_use: List of strings naming the classes for which data should be - converted. Use the same names as presented in the KIITI README file. - Adding dontcare class will remove all other bounding boxes that overlap - with areas marked as dontcare regions. - label_map_path: Path to label map proto - validation_set_size: How many images should be left as the validation set. - (Ffirst `validation_set_size` examples are selected to be in the - validation set). - """ - label_map_dict = label_map_util.get_label_map_dict(label_map_path) - train_count = 0 - val_count = 0 - - annotation_dir = os.path.join(data_dir, - 'training', - 'label_2') - - image_dir = os.path.join(data_dir, - 'data_object_image_2', - 'training', - 'image_2') - - train_writer = tf.python_io.TFRecordWriter('%s_train.tfrecord'% - output_path) - val_writer = tf.python_io.TFRecordWriter('%s_val.tfrecord'% - output_path) - - images = sorted(tf.gfile.ListDirectory(image_dir)) - for img_name in images: - img_num = int(img_name.split('.')[0]) - is_validation_img = img_num < validation_set_size - img_anno = read_annotation_file(os.path.join(annotation_dir, - str(img_num).zfill(6)+'.txt')) - - image_path = os.path.join(image_dir, img_name) - - # Filter all bounding boxes of this frame that are of a legal class, and - # don't overlap with a dontcare region. - # TODO(talremez) filter out targets that are truncated or heavily occluded. - annotation_for_image = filter_annotations(img_anno, classes_to_use) - - example = prepare_example(image_path, annotation_for_image, label_map_dict) - if is_validation_img: - val_writer.write(example.SerializeToString()) - val_count += 1 - else: - train_writer.write(example.SerializeToString()) - train_count += 1 - - train_writer.close() - val_writer.close() - - -def prepare_example(image_path, annotations, label_map_dict): - """Converts a dictionary with annotations for an image to tf.Example proto. - - Args: - image_path: The complete path to image. - annotations: A dictionary representing the annotation of a single object - that appears in the image. - label_map_dict: A map from string label names to integer ids. - - Returns: - example: The converted tf.Example. - """ - with tf.gfile.GFile(image_path, 'rb') as fid: - encoded_png = fid.read() - encoded_png_io = io.BytesIO(encoded_png) - image = pil.open(encoded_png_io) - image = np.asarray(image) - - key = hashlib.sha256(encoded_png).hexdigest() - - width = int(image.shape[1]) - height = int(image.shape[0]) - - xmin_norm = annotations['2d_bbox_left'] / float(width) - ymin_norm = annotations['2d_bbox_top'] / float(height) - xmax_norm = annotations['2d_bbox_right'] / float(width) - ymax_norm = annotations['2d_bbox_bottom'] / float(height) - - difficult_obj = [0]*len(xmin_norm) - - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/height': dataset_util.int64_feature(height), - 'image/width': dataset_util.int64_feature(width), - 'image/filename': dataset_util.bytes_feature(image_path.encode('utf8')), - 'image/source_id': dataset_util.bytes_feature(image_path.encode('utf8')), - 'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')), - 'image/encoded': dataset_util.bytes_feature(encoded_png), - 'image/format': dataset_util.bytes_feature('png'.encode('utf8')), - 'image/object/bbox/xmin': dataset_util.float_list_feature(xmin_norm), - 'image/object/bbox/xmax': dataset_util.float_list_feature(xmax_norm), - 'image/object/bbox/ymin': dataset_util.float_list_feature(ymin_norm), - 'image/object/bbox/ymax': dataset_util.float_list_feature(ymax_norm), - 'image/object/class/text': dataset_util.bytes_list_feature( - [x.encode('utf8') for x in annotations['type']]), - 'image/object/class/label': dataset_util.int64_list_feature( - [label_map_dict[x] for x in annotations['type']]), - 'image/object/difficult': dataset_util.int64_list_feature(difficult_obj), - 'image/object/truncated': dataset_util.float_list_feature( - annotations['truncated']), - 'image/object/alpha': dataset_util.float_list_feature( - annotations['alpha']), - 'image/object/3d_bbox/height': dataset_util.float_list_feature( - annotations['3d_bbox_height']), - 'image/object/3d_bbox/width': dataset_util.float_list_feature( - annotations['3d_bbox_width']), - 'image/object/3d_bbox/length': dataset_util.float_list_feature( - annotations['3d_bbox_length']), - 'image/object/3d_bbox/x': dataset_util.float_list_feature( - annotations['3d_bbox_x']), - 'image/object/3d_bbox/y': dataset_util.float_list_feature( - annotations['3d_bbox_y']), - 'image/object/3d_bbox/z': dataset_util.float_list_feature( - annotations['3d_bbox_z']), - 'image/object/3d_bbox/rot_y': dataset_util.float_list_feature( - annotations['3d_bbox_rot_y']), - })) - - return example - - -def filter_annotations(img_all_annotations, used_classes): - """Filters out annotations from the unused classes and dontcare regions. - - Filters out the annotations that belong to classes we do now wish to use and - (optionally) also removes all boxes that overlap with dontcare regions. - - Args: - img_all_annotations: A list of annotation dictionaries. See documentation of - read_annotation_file for more details about the format of the annotations. - used_classes: A list of strings listing the classes we want to keep, if the - list contains "dontcare", all bounding boxes with overlapping with dont - care regions will also be filtered out. - - Returns: - img_filtered_annotations: A list of annotation dictionaries that have passed - the filtering. - """ - - img_filtered_annotations = {} - - # Filter the type of the objects. - relevant_annotation_indices = [ - i for i, x in enumerate(img_all_annotations['type']) if x in used_classes - ] - - for key in img_all_annotations.keys(): - img_filtered_annotations[key] = ( - img_all_annotations[key][relevant_annotation_indices]) - - if 'dontcare' in used_classes: - dont_care_indices = [i for i, - x in enumerate(img_filtered_annotations['type']) - if x == 'dontcare'] - - # bounding box format [y_min, x_min, y_max, x_max] - all_boxes = np.stack([img_filtered_annotations['2d_bbox_top'], - img_filtered_annotations['2d_bbox_left'], - img_filtered_annotations['2d_bbox_bottom'], - img_filtered_annotations['2d_bbox_right']], - axis=1) - - ious = iou(boxes1=all_boxes, - boxes2=all_boxes[dont_care_indices]) - - # Remove all bounding boxes that overlap with a dontcare region. - if ious.size > 0: - boxes_to_remove = np.amax(ious, axis=1) > 0.0 - for key in img_all_annotations.keys(): - img_filtered_annotations[key] = ( - img_filtered_annotations[key][np.logical_not(boxes_to_remove)]) - - return img_filtered_annotations - - -def read_annotation_file(filename): - """Reads a KITTI annotation file. - - Converts a KITTI annotation file into a dictionary containing all the - relevant information. - - Args: - filename: the path to the annotataion text file. - - Returns: - anno: A dictionary with the converted annotation information. See annotation - README file for details on the different fields. - """ - with open(filename) as f: - content = f.readlines() - content = [x.strip().split(' ') for x in content] - - anno = {} - anno['type'] = np.array([x[0].lower() for x in content]) - anno['truncated'] = np.array([float(x[1]) for x in content]) - anno['occluded'] = np.array([int(x[2]) for x in content]) - anno['alpha'] = np.array([float(x[3]) for x in content]) - - anno['2d_bbox_left'] = np.array([float(x[4]) for x in content]) - anno['2d_bbox_top'] = np.array([float(x[5]) for x in content]) - anno['2d_bbox_right'] = np.array([float(x[6]) for x in content]) - anno['2d_bbox_bottom'] = np.array([float(x[7]) for x in content]) - - anno['3d_bbox_height'] = np.array([float(x[8]) for x in content]) - anno['3d_bbox_width'] = np.array([float(x[9]) for x in content]) - anno['3d_bbox_length'] = np.array([float(x[10]) for x in content]) - anno['3d_bbox_x'] = np.array([float(x[11]) for x in content]) - anno['3d_bbox_y'] = np.array([float(x[12]) for x in content]) - anno['3d_bbox_z'] = np.array([float(x[13]) for x in content]) - anno['3d_bbox_rot_y'] = np.array([float(x[14]) for x in content]) - - return anno - - -def main(_): - convert_kitti_to_tfrecords( - data_dir=FLAGS.data_dir, - output_path=FLAGS.output_path, - classes_to_use=FLAGS.classes_to_use, - label_map_path=FLAGS.label_map_path, - validation_set_size=FLAGS.validation_set_size) - -if __name__ == '__main__': - tf.app.run() diff --git a/object_detection/dataset_tools/create_kitti_tf_record_test.py b/object_detection/dataset_tools/create_kitti_tf_record_test.py deleted file mode 100644 index 22f27f1a..00000000 --- a/object_detection/dataset_tools/create_kitti_tf_record_test.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Test for create_kitti_tf_record.py.""" - -import os - -import numpy as np -import PIL.Image -import tensorflow as tf - -from object_detection.dataset_tools import create_kitti_tf_record - - -class DictToTFExampleTest(tf.test.TestCase): - - def _assertProtoEqual(self, proto_field, expectation): - """Helper function to assert if a proto field equals some value. - - Args: - proto_field: The protobuf field to compare. - expectation: The expected value of the protobuf field. - """ - proto_list = [p for p in proto_field] - self.assertListEqual(proto_list, expectation) - - def test_dict_to_tf_example(self): - image_file_name = 'tmp_image.jpg' - image_data = np.random.rand(256, 256, 3) - save_path = os.path.join(self.get_temp_dir(), image_file_name) - image = PIL.Image.fromarray(image_data, 'RGB') - image.save(save_path) - - annotations = {} - annotations['2d_bbox_left'] = np.array([64]) - annotations['2d_bbox_top'] = np.array([64]) - annotations['2d_bbox_right'] = np.array([192]) - annotations['2d_bbox_bottom'] = np.array([192]) - annotations['type'] = ['car'] - annotations['truncated'] = np.array([1]) - annotations['alpha'] = np.array([2]) - annotations['3d_bbox_height'] = np.array([10]) - annotations['3d_bbox_width'] = np.array([11]) - annotations['3d_bbox_length'] = np.array([12]) - annotations['3d_bbox_x'] = np.array([13]) - annotations['3d_bbox_y'] = np.array([14]) - annotations['3d_bbox_z'] = np.array([15]) - annotations['3d_bbox_rot_y'] = np.array([4]) - - label_map_dict = { - 'background': 0, - 'car': 1, - } - - example = create_kitti_tf_record.prepare_example( - save_path, - annotations, - label_map_dict) - - self._assertProtoEqual( - example.features.feature['image/height'].int64_list.value, [256]) - self._assertProtoEqual( - example.features.feature['image/width'].int64_list.value, [256]) - self._assertProtoEqual( - example.features.feature['image/filename'].bytes_list.value, - [save_path]) - self._assertProtoEqual( - example.features.feature['image/source_id'].bytes_list.value, - [save_path]) - self._assertProtoEqual( - example.features.feature['image/format'].bytes_list.value, ['png']) - self._assertProtoEqual( - example.features.feature['image/object/bbox/xmin'].float_list.value, - [0.25]) - self._assertProtoEqual( - example.features.feature['image/object/bbox/ymin'].float_list.value, - [0.25]) - self._assertProtoEqual( - example.features.feature['image/object/bbox/xmax'].float_list.value, - [0.75]) - self._assertProtoEqual( - example.features.feature['image/object/bbox/ymax'].float_list.value, - [0.75]) - self._assertProtoEqual( - example.features.feature['image/object/class/text'].bytes_list.value, - ['car']) - self._assertProtoEqual( - example.features.feature['image/object/class/label'].int64_list.value, - [1]) - self._assertProtoEqual( - example.features.feature['image/object/truncated'].float_list.value, - [1]) - self._assertProtoEqual( - example.features.feature['image/object/alpha'].float_list.value, - [2]) - self._assertProtoEqual(example.features.feature[ - 'image/object/3d_bbox/height'].float_list.value, [10]) - self._assertProtoEqual( - example.features.feature['image/object/3d_bbox/width'].float_list.value, - [11]) - self._assertProtoEqual(example.features.feature[ - 'image/object/3d_bbox/length'].float_list.value, [12]) - self._assertProtoEqual( - example.features.feature['image/object/3d_bbox/x'].float_list.value, - [13]) - self._assertProtoEqual( - example.features.feature['image/object/3d_bbox/y'].float_list.value, - [14]) - self._assertProtoEqual( - example.features.feature['image/object/3d_bbox/z'].float_list.value, - [15]) - self._assertProtoEqual( - example.features.feature['image/object/3d_bbox/rot_y'].float_list.value, - [4]) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/dataset_tools/create_oid_tf_record.py b/object_detection/dataset_tools/create_oid_tf_record.py deleted file mode 100644 index f58efee2..00000000 --- a/object_detection/dataset_tools/create_oid_tf_record.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -r"""Creates TFRecords of Open Images dataset for object detection. - -Example usage: - python object_detection/dataset_tools/create_oid_tf_record.py \ - --input_annotations_csv=/path/to/input/annotations-human-bbox.csv \ - --input_images_directory=/path/to/input/image_pixels_directory \ - --input_label_map=/path/to/input/labels_bbox_545.labelmap \ - --output_tf_record_path_prefix=/path/to/output/prefix.tfrecord - -CSVs with bounding box annotations and image metadata (including the image URLs) -can be downloaded from the Open Images GitHub repository: -https://github.com/openimages/dataset - -This script will include every image found in the input_images_directory in the -output TFRecord, even if the image has no corresponding bounding box annotations -in the input_annotations_csv. -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import os - -import contextlib2 -import pandas as pd -import tensorflow as tf - -from object_detection.dataset_tools import oid_tfrecord_creation -from object_detection.utils import label_map_util - -tf.flags.DEFINE_string('input_annotations_csv', None, - 'Path to CSV containing image bounding box annotations') -tf.flags.DEFINE_string('input_images_directory', None, - 'Directory containing the image pixels ' - 'downloaded from the OpenImages GitHub repository.') -tf.flags.DEFINE_string('input_label_map', None, 'Path to the label map proto') -tf.flags.DEFINE_string( - 'output_tf_record_path_prefix', None, - 'Path to the output TFRecord. The shard index and the number of shards ' - 'will be appended for each output shard.') -tf.flags.DEFINE_integer('num_shards', 100, 'Number of TFRecord shards') - -FLAGS = tf.flags.FLAGS - - -def main(_): - tf.logging.set_verbosity(tf.logging.INFO) - - required_flags = [ - 'input_annotations_csv', 'input_images_directory', 'input_label_map', - 'output_tf_record_path_prefix' - ] - for flag_name in required_flags: - if not getattr(FLAGS, flag_name): - raise ValueError('Flag --{} is required'.format(flag_name)) - - label_map = label_map_util.get_label_map_dict(FLAGS.input_label_map) - all_annotations = pd.read_csv(FLAGS.input_annotations_csv) - all_images = tf.gfile.Glob( - os.path.join(FLAGS.input_images_directory, '*.jpg')) - all_image_ids = [os.path.splitext(os.path.basename(v))[0] for v in all_images] - all_image_ids = pd.DataFrame({'ImageID': all_image_ids}) - all_annotations = pd.concat([all_annotations, all_image_ids]) - - tf.logging.log(tf.logging.INFO, 'Found %d images...', len(all_image_ids)) - - with contextlib2.ExitStack() as tf_record_close_stack: - output_tfrecords = oid_tfrecord_creation.open_sharded_output_tfrecords( - tf_record_close_stack, FLAGS.output_tf_record_path_prefix, - FLAGS.num_shards) - - for counter, image_data in enumerate(all_annotations.groupby('ImageID')): - tf.logging.log_every_n(tf.logging.INFO, 'Processed %d images...', 1000, - counter) - - image_id, image_annotations = image_data - # In OID image file names are formed by appending ".jpg" to the image ID. - image_path = os.path.join(FLAGS.input_images_directory, image_id + '.jpg') - with tf.gfile.Open(image_path) as image_file: - encoded_image = image_file.read() - - tf_example = oid_tfrecord_creation.tf_example_from_annotations_data_frame( - image_annotations, label_map, encoded_image) - if tf_example: - shard_idx = long(image_id, 16) % FLAGS.num_shards - output_tfrecords[shard_idx].write(tf_example.SerializeToString()) - - -if __name__ == '__main__': - tf.app.run() diff --git a/object_detection/dataset_tools/create_pascal_tf_record.py b/object_detection/dataset_tools/create_pascal_tf_record.py deleted file mode 100644 index 83d2b128..00000000 --- a/object_detection/dataset_tools/create_pascal_tf_record.py +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -r"""Convert raw PASCAL dataset to TFRecord for object_detection. - -Example usage: - python object_detection/dataset_tools/create_pascal_tf_record.py \ - --data_dir=/home/user/VOCdevkit \ - --year=VOC2012 \ - --output_path=/home/user/pascal.record -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import hashlib -import io -import logging -import os - -from lxml import etree -import PIL.Image -import tensorflow as tf - -from object_detection.utils import dataset_util -from object_detection.utils import label_map_util - - -flags = tf.app.flags -flags.DEFINE_string('data_dir', '', 'Root directory to raw PASCAL VOC dataset.') -flags.DEFINE_string('set', 'train', 'Convert training set, validation set or ' - 'merged set.') -flags.DEFINE_string('annotations_dir', 'Annotations', - '(Relative) path to annotations directory.') -flags.DEFINE_string('year', 'VOC2007', 'Desired challenge year.') -flags.DEFINE_string('output_path', '', 'Path to output TFRecord') -flags.DEFINE_string('label_map_path', 'data/pascal_label_map.pbtxt', - 'Path to label map proto') -flags.DEFINE_boolean('ignore_difficult_instances', False, 'Whether to ignore ' - 'difficult instances') -FLAGS = flags.FLAGS - -SETS = ['train', 'val', 'trainval', 'test'] -YEARS = ['VOC2007', 'VOC2012', 'merged'] - - -def dict_to_tf_example(data, - dataset_directory, - label_map_dict, - ignore_difficult_instances=False, - image_subdirectory='JPEGImages'): - """Convert XML derived dict to tf.Example proto. - - Notice that this function normalizes the bounding box coordinates provided - by the raw data. - - Args: - data: dict holding PASCAL XML fields for a single image (obtained by - running dataset_util.recursive_parse_xml_to_dict) - dataset_directory: Path to root directory holding PASCAL dataset - label_map_dict: A map from string label names to integers ids. - ignore_difficult_instances: Whether to skip difficult instances in the - dataset (default: False). - image_subdirectory: String specifying subdirectory within the - PASCAL dataset directory holding the actual image data. - - Returns: - example: The converted tf.Example. - - Raises: - ValueError: if the image pointed to by data['filename'] is not a valid JPEG - """ - img_path = os.path.join(data['folder'], image_subdirectory, data['filename']) - full_path = os.path.join(dataset_directory, img_path) - with tf.gfile.GFile(full_path, 'rb') as fid: - encoded_jpg = fid.read() - encoded_jpg_io = io.BytesIO(encoded_jpg) - image = PIL.Image.open(encoded_jpg_io) - if image.format != 'JPEG': - raise ValueError('Image format not JPEG') - key = hashlib.sha256(encoded_jpg).hexdigest() - - width = int(data['size']['width']) - height = int(data['size']['height']) - - xmin = [] - ymin = [] - xmax = [] - ymax = [] - classes = [] - classes_text = [] - truncated = [] - poses = [] - difficult_obj = [] - for obj in data['object']: - difficult = bool(int(obj['difficult'])) - if ignore_difficult_instances and difficult: - continue - - difficult_obj.append(int(difficult)) - - xmin.append(float(obj['bndbox']['xmin']) / width) - ymin.append(float(obj['bndbox']['ymin']) / height) - xmax.append(float(obj['bndbox']['xmax']) / width) - ymax.append(float(obj['bndbox']['ymax']) / height) - classes_text.append(obj['name'].encode('utf8')) - classes.append(label_map_dict[obj['name']]) - truncated.append(int(obj['truncated'])) - poses.append(obj['pose'].encode('utf8')) - - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/height': dataset_util.int64_feature(height), - 'image/width': dataset_util.int64_feature(width), - 'image/filename': dataset_util.bytes_feature( - data['filename'].encode('utf8')), - 'image/source_id': dataset_util.bytes_feature( - data['filename'].encode('utf8')), - 'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')), - 'image/encoded': dataset_util.bytes_feature(encoded_jpg), - 'image/format': dataset_util.bytes_feature('jpeg'.encode('utf8')), - 'image/object/bbox/xmin': dataset_util.float_list_feature(xmin), - 'image/object/bbox/xmax': dataset_util.float_list_feature(xmax), - 'image/object/bbox/ymin': dataset_util.float_list_feature(ymin), - 'image/object/bbox/ymax': dataset_util.float_list_feature(ymax), - 'image/object/class/text': dataset_util.bytes_list_feature(classes_text), - 'image/object/class/label': dataset_util.int64_list_feature(classes), - 'image/object/difficult': dataset_util.int64_list_feature(difficult_obj), - 'image/object/truncated': dataset_util.int64_list_feature(truncated), - 'image/object/view': dataset_util.bytes_list_feature(poses), - })) - return example - - -def main(_): - if FLAGS.set not in SETS: - raise ValueError('set must be in : {}'.format(SETS)) - if FLAGS.year not in YEARS: - raise ValueError('year must be in : {}'.format(YEARS)) - - data_dir = FLAGS.data_dir - years = ['VOC2007', 'VOC2012'] - if FLAGS.year != 'merged': - years = [FLAGS.year] - - writer = tf.python_io.TFRecordWriter(FLAGS.output_path) - - label_map_dict = label_map_util.get_label_map_dict(FLAGS.label_map_path) - - for year in years: - logging.info('Reading from PASCAL %s dataset.', year) - examples_path = os.path.join(data_dir, year, 'ImageSets', 'Main', - 'aeroplane_' + FLAGS.set + '.txt') - annotations_dir = os.path.join(data_dir, year, FLAGS.annotations_dir) - examples_list = dataset_util.read_examples_list(examples_path) - for idx, example in enumerate(examples_list): - if idx % 100 == 0: - logging.info('On image %d of %d', idx, len(examples_list)) - path = os.path.join(annotations_dir, example + '.xml') - with tf.gfile.GFile(path, 'r') as fid: - xml_str = fid.read() - xml = etree.fromstring(xml_str) - data = dataset_util.recursive_parse_xml_to_dict(xml)['annotation'] - - tf_example = dict_to_tf_example(data, FLAGS.data_dir, label_map_dict, - FLAGS.ignore_difficult_instances) - writer.write(tf_example.SerializeToString()) - - writer.close() - - -if __name__ == '__main__': - tf.app.run() diff --git a/object_detection/dataset_tools/create_pascal_tf_record_test.py b/object_detection/dataset_tools/create_pascal_tf_record_test.py deleted file mode 100644 index a1c31fac..00000000 --- a/object_detection/dataset_tools/create_pascal_tf_record_test.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Test for create_pascal_tf_record.py.""" - -import os - -import numpy as np -import PIL.Image -import tensorflow as tf - -from object_detection.dataset_tools import create_pascal_tf_record - - -class DictToTFExampleTest(tf.test.TestCase): - - def _assertProtoEqual(self, proto_field, expectation): - """Helper function to assert if a proto field equals some value. - - Args: - proto_field: The protobuf field to compare. - expectation: The expected value of the protobuf field. - """ - proto_list = [p for p in proto_field] - self.assertListEqual(proto_list, expectation) - - def test_dict_to_tf_example(self): - image_file_name = 'tmp_image.jpg' - image_data = np.random.rand(256, 256, 3) - save_path = os.path.join(self.get_temp_dir(), image_file_name) - image = PIL.Image.fromarray(image_data, 'RGB') - image.save(save_path) - - data = { - 'folder': '', - 'filename': image_file_name, - 'size': { - 'height': 256, - 'width': 256, - }, - 'object': [ - { - 'difficult': 1, - 'bndbox': { - 'xmin': 64, - 'ymin': 64, - 'xmax': 192, - 'ymax': 192, - }, - 'name': 'person', - 'truncated': 0, - 'pose': '', - }, - ], - } - - label_map_dict = { - 'background': 0, - 'person': 1, - 'notperson': 2, - } - - example = create_pascal_tf_record.dict_to_tf_example( - data, self.get_temp_dir(), label_map_dict, image_subdirectory='') - self._assertProtoEqual( - example.features.feature['image/height'].int64_list.value, [256]) - self._assertProtoEqual( - example.features.feature['image/width'].int64_list.value, [256]) - self._assertProtoEqual( - example.features.feature['image/filename'].bytes_list.value, - [image_file_name]) - self._assertProtoEqual( - example.features.feature['image/source_id'].bytes_list.value, - [image_file_name]) - self._assertProtoEqual( - example.features.feature['image/format'].bytes_list.value, ['jpeg']) - self._assertProtoEqual( - example.features.feature['image/object/bbox/xmin'].float_list.value, - [0.25]) - self._assertProtoEqual( - example.features.feature['image/object/bbox/ymin'].float_list.value, - [0.25]) - self._assertProtoEqual( - example.features.feature['image/object/bbox/xmax'].float_list.value, - [0.75]) - self._assertProtoEqual( - example.features.feature['image/object/bbox/ymax'].float_list.value, - [0.75]) - self._assertProtoEqual( - example.features.feature['image/object/class/text'].bytes_list.value, - ['person']) - self._assertProtoEqual( - example.features.feature['image/object/class/label'].int64_list.value, - [1]) - self._assertProtoEqual( - example.features.feature['image/object/difficult'].int64_list.value, - [1]) - self._assertProtoEqual( - example.features.feature['image/object/truncated'].int64_list.value, - [0]) - self._assertProtoEqual( - example.features.feature['image/object/view'].bytes_list.value, ['']) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/dataset_tools/create_pet_tf_record.py b/object_detection/dataset_tools/create_pet_tf_record.py deleted file mode 100644 index a8663297..00000000 --- a/object_detection/dataset_tools/create_pet_tf_record.py +++ /dev/null @@ -1,272 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -r"""Convert the Oxford pet dataset to TFRecord for object_detection. - -See: O. M. Parkhi, A. Vedaldi, A. Zisserman, C. V. Jawahar - Cats and Dogs - IEEE Conference on Computer Vision and Pattern Recognition, 2012 - http://www.robots.ox.ac.uk/~vgg/data/pets/ - -Example usage: - python object_detection/dataset_tools/create_pet_tf_record.py \ - --data_dir=/home/user/pet \ - --output_dir=/home/user/pet/output -""" - -import hashlib -import io -import logging -import os -import random -import re - -from lxml import etree -import numpy as np -import PIL.Image -import tensorflow as tf - -from object_detection.utils import dataset_util -from object_detection.utils import label_map_util - -flags = tf.app.flags -flags.DEFINE_string('data_dir', '', 'Root directory to raw pet dataset.') -flags.DEFINE_string('output_dir', '', 'Path to directory to output TFRecords.') -flags.DEFINE_string('label_map_path', 'data/pet_label_map.pbtxt', - 'Path to label map proto') -flags.DEFINE_boolean('faces_only', True, 'If True, generates bounding boxes ' - 'for pet faces. Otherwise generates bounding boxes (as ' - 'well as segmentations for full pet bodies). Note that ' - 'in the latter case, the resulting files are much larger.') -FLAGS = flags.FLAGS - - -def get_class_name_from_filename(file_name): - """Gets the class name from a file. - - Args: - file_name: The file name to get the class name from. - ie. "american_pit_bull_terrier_105.jpg" - - Returns: - A string of the class name. - """ - match = re.match(r'([A-Za-z_]+)(_[0-9]+\.jpg)', file_name, re.I) - return match.groups()[0] - - -def dict_to_tf_example(data, - mask_path, - label_map_dict, - image_subdirectory, - ignore_difficult_instances=False, - faces_only=True): - """Convert XML derived dict to tf.Example proto. - - Notice that this function normalizes the bounding box coordinates provided - by the raw data. - - Args: - data: dict holding PASCAL XML fields for a single image (obtained by - running dataset_util.recursive_parse_xml_to_dict) - mask_path: String path to PNG encoded mask. - label_map_dict: A map from string label names to integers ids. - image_subdirectory: String specifying subdirectory within the - Pascal dataset directory holding the actual image data. - ignore_difficult_instances: Whether to skip difficult instances in the - dataset (default: False). - faces_only: If True, generates bounding boxes for pet faces. Otherwise - generates bounding boxes (as well as segmentations for full pet bodies). - - Returns: - example: The converted tf.Example. - - Raises: - ValueError: if the image pointed to by data['filename'] is not a valid JPEG - """ - img_path = os.path.join(image_subdirectory, data['filename']) - with tf.gfile.GFile(img_path, 'rb') as fid: - encoded_jpg = fid.read() - encoded_jpg_io = io.BytesIO(encoded_jpg) - image = PIL.Image.open(encoded_jpg_io) - if image.format != 'JPEG': - raise ValueError('Image format not JPEG') - key = hashlib.sha256(encoded_jpg).hexdigest() - - with tf.gfile.GFile(mask_path, 'rb') as fid: - encoded_mask_png = fid.read() - encoded_png_io = io.BytesIO(encoded_mask_png) - mask = PIL.Image.open(encoded_png_io) - if mask.format != 'PNG': - raise ValueError('Mask format not PNG') - - mask_np = np.asarray(mask) - nonbackground_indices_x = np.any(mask_np != 2, axis=0) - nonbackground_indices_y = np.any(mask_np != 2, axis=1) - nonzero_x_indices = np.where(nonbackground_indices_x) - nonzero_y_indices = np.where(nonbackground_indices_y) - - width = int(data['size']['width']) - height = int(data['size']['height']) - - xmins = [] - ymins = [] - xmaxs = [] - ymaxs = [] - classes = [] - classes_text = [] - truncated = [] - poses = [] - difficult_obj = [] - masks = [] - for obj in data['object']: - difficult = bool(int(obj['difficult'])) - if ignore_difficult_instances and difficult: - continue - difficult_obj.append(int(difficult)) - - if faces_only: - xmin = float(obj['bndbox']['xmin']) - xmax = float(obj['bndbox']['xmax']) - ymin = float(obj['bndbox']['ymin']) - ymax = float(obj['bndbox']['ymax']) - else: - xmin = float(np.min(nonzero_x_indices)) - xmax = float(np.max(nonzero_x_indices)) - ymin = float(np.min(nonzero_y_indices)) - ymax = float(np.max(nonzero_y_indices)) - - xmins.append(xmin / width) - ymins.append(ymin / height) - xmaxs.append(xmax / width) - ymaxs.append(ymax / height) - class_name = get_class_name_from_filename(data['filename']) - classes_text.append(class_name.encode('utf8')) - classes.append(label_map_dict[class_name]) - truncated.append(int(obj['truncated'])) - poses.append(obj['pose'].encode('utf8')) - if not faces_only: - mask_remapped = mask_np != 2 - masks.append(mask_remapped) - - feature_dict = { - 'image/height': dataset_util.int64_feature(height), - 'image/width': dataset_util.int64_feature(width), - 'image/filename': dataset_util.bytes_feature( - data['filename'].encode('utf8')), - 'image/source_id': dataset_util.bytes_feature( - data['filename'].encode('utf8')), - 'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')), - 'image/encoded': dataset_util.bytes_feature(encoded_jpg), - 'image/format': dataset_util.bytes_feature('jpeg'.encode('utf8')), - 'image/object/bbox/xmin': dataset_util.float_list_feature(xmins), - 'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs), - 'image/object/bbox/ymin': dataset_util.float_list_feature(ymins), - 'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs), - 'image/object/class/text': dataset_util.bytes_list_feature(classes_text), - 'image/object/class/label': dataset_util.int64_list_feature(classes), - 'image/object/difficult': dataset_util.int64_list_feature(difficult_obj), - 'image/object/truncated': dataset_util.int64_list_feature(truncated), - 'image/object/view': dataset_util.bytes_list_feature(poses), - } - if not faces_only: - mask_stack = np.stack(masks).astype(np.float32) - masks_flattened = np.reshape(mask_stack, [-1]) - feature_dict['image/object/mask'] = ( - dataset_util.float_list_feature(masks_flattened.tolist())) - - example = tf.train.Example(features=tf.train.Features(feature=feature_dict)) - return example - - -def create_tf_record(output_filename, - label_map_dict, - annotations_dir, - image_dir, - examples, - faces_only=True): - """Creates a TFRecord file from examples. - - Args: - output_filename: Path to where output file is saved. - label_map_dict: The label map dictionary. - annotations_dir: Directory where annotation files are stored. - image_dir: Directory where image files are stored. - examples: Examples to parse and save to tf record. - faces_only: If True, generates bounding boxes for pet faces. Otherwise - generates bounding boxes (as well as segmentations for full pet bodies). - """ - writer = tf.python_io.TFRecordWriter(output_filename) - for idx, example in enumerate(examples): - if idx % 100 == 0: - logging.info('On image %d of %d', idx, len(examples)) - xml_path = os.path.join(annotations_dir, 'xmls', example + '.xml') - mask_path = os.path.join(annotations_dir, 'trimaps', example + '.png') - - if not os.path.exists(xml_path): - logging.warning('Could not find %s, ignoring example.', xml_path) - continue - with tf.gfile.GFile(xml_path, 'r') as fid: - xml_str = fid.read() - xml = etree.fromstring(xml_str) - data = dataset_util.recursive_parse_xml_to_dict(xml)['annotation'] - - try: - tf_example = dict_to_tf_example( - data, mask_path, label_map_dict, image_dir, faces_only=faces_only) - writer.write(tf_example.SerializeToString()) - except ValueError: - logging.warning('Invalid example: %s, ignoring.', xml_path) - - writer.close() - - -# TODO(derekjchow): Add test for pet/PASCAL main files. -def main(_): - data_dir = FLAGS.data_dir - label_map_dict = label_map_util.get_label_map_dict(FLAGS.label_map_path) - - logging.info('Reading from Pet dataset.') - image_dir = os.path.join(data_dir, 'images') - annotations_dir = os.path.join(data_dir, 'annotations') - examples_path = os.path.join(annotations_dir, 'trainval.txt') - examples_list = dataset_util.read_examples_list(examples_path) - - # Test images are not included in the downloaded data set, so we shall perform - # our own split. - random.seed(42) - random.shuffle(examples_list) - num_examples = len(examples_list) - num_train = int(0.7 * num_examples) - train_examples = examples_list[:num_train] - val_examples = examples_list[num_train:] - logging.info('%d training and %d validation examples.', - len(train_examples), len(val_examples)) - - train_output_path = os.path.join(FLAGS.output_dir, 'pet_train.record') - val_output_path = os.path.join(FLAGS.output_dir, 'pet_val.record') - if FLAGS.faces_only: - train_output_path = os.path.join(FLAGS.output_dir, - 'pet_train_with_masks.record') - val_output_path = os.path.join(FLAGS.output_dir, - 'pet_val_with_masks.record') - create_tf_record(train_output_path, label_map_dict, annotations_dir, - image_dir, train_examples, faces_only=FLAGS.faces_only) - create_tf_record(val_output_path, label_map_dict, annotations_dir, - image_dir, val_examples, faces_only=FLAGS.faces_only) - - -if __name__ == '__main__': - tf.app.run() diff --git a/object_detection/dataset_tools/oid_tfrecord_creation.py b/object_detection/dataset_tools/oid_tfrecord_creation.py deleted file mode 100644 index 1bc41c0b..00000000 --- a/object_detection/dataset_tools/oid_tfrecord_creation.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -r"""Utilities for creating TFRecords of TF examples for the Open Images dataset. -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf - -from object_detection.core import standard_fields -from object_detection.utils import dataset_util - - -def tf_example_from_annotations_data_frame(annotations_data_frame, label_map, - encoded_image): - """Populates a TF Example message with image annotations from a data frame. - - Args: - annotations_data_frame: Data frame containing the annotations for a single - image. - label_map: String to integer label map. - encoded_image: The encoded image string - - Returns: - The populated TF Example, if the label of at least one object is present in - label_map. Otherwise, returns None. - """ - - filtered_data_frame = annotations_data_frame[ - annotations_data_frame.LabelName.isin(label_map)] - - image_id = annotations_data_frame.ImageID.iloc[0] - - feature_map = { - standard_fields.TfExampleFields.object_bbox_ymin: - dataset_util.float_list_feature(filtered_data_frame.YMin.as_matrix()), - standard_fields.TfExampleFields.object_bbox_xmin: - dataset_util.float_list_feature(filtered_data_frame.XMin.as_matrix()), - standard_fields.TfExampleFields.object_bbox_ymax: - dataset_util.float_list_feature(filtered_data_frame.YMax.as_matrix()), - standard_fields.TfExampleFields.object_bbox_xmax: - dataset_util.float_list_feature(filtered_data_frame.XMax.as_matrix()), - standard_fields.TfExampleFields.object_class_text: - dataset_util.bytes_list_feature( - filtered_data_frame.LabelName.as_matrix()), - standard_fields.TfExampleFields.object_class_label: - dataset_util.int64_list_feature( - filtered_data_frame.LabelName.map(lambda x: label_map[x]) - .as_matrix()), - standard_fields.TfExampleFields.filename: - dataset_util.bytes_feature('{}.jpg'.format(image_id)), - standard_fields.TfExampleFields.source_id: - dataset_util.bytes_feature(image_id), - standard_fields.TfExampleFields.image_encoded: - dataset_util.bytes_feature(encoded_image), - } - - if 'IsGroupOf' in filtered_data_frame.columns: - feature_map[standard_fields.TfExampleFields. - object_group_of] = dataset_util.int64_list_feature( - filtered_data_frame.IsGroupOf.as_matrix().astype(int)) - if 'IsOccluded' in filtered_data_frame.columns: - feature_map[standard_fields.TfExampleFields. - object_occluded] = dataset_util.int64_list_feature( - filtered_data_frame.IsOccluded.as_matrix().astype(int)) - if 'IsTruncated' in filtered_data_frame.columns: - feature_map[standard_fields.TfExampleFields. - object_truncated] = dataset_util.int64_list_feature( - filtered_data_frame.IsTruncated.as_matrix().astype(int)) - if 'IsDepiction' in filtered_data_frame.columns: - feature_map[standard_fields.TfExampleFields. - object_depiction] = dataset_util.int64_list_feature( - filtered_data_frame.IsDepiction.as_matrix().astype(int)) - - return tf.train.Example(features=tf.train.Features(feature=feature_map)) - - -def open_sharded_output_tfrecords(exit_stack, base_path, num_shards): - """Opens all TFRecord shards for writing and adds them to an exit stack. - - Args: - exit_stack: A context2.ExitStack used to automatically closed the TFRecords - opened in this function. - base_path: The base path for all shards - num_shards: The number of shards - - Returns: - The list of opened TFRecords. Position k in the list corresponds to shard k. - """ - tf_record_output_filenames = [ - '{}-{:05d}-of-{:05d}'.format(base_path, idx, num_shards) - for idx in xrange(num_shards) - ] - - tfrecords = [ - exit_stack.enter_context(tf.python_io.TFRecordWriter(file_name)) - for file_name in tf_record_output_filenames - ] - - return tfrecords diff --git a/object_detection/dataset_tools/oid_tfrecord_creation_test.py b/object_detection/dataset_tools/oid_tfrecord_creation_test.py deleted file mode 100644 index 383af8a8..00000000 --- a/object_detection/dataset_tools/oid_tfrecord_creation_test.py +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Tests for oid_tfrecord_creation.py.""" - -import os -import contextlib2 -import pandas as pd -import tensorflow as tf - -from object_detection.dataset_tools import oid_tfrecord_creation - - -def create_test_data(): - data = { - 'ImageID': ['i1', 'i1', 'i1', 'i1', 'i2', 'i2'], - 'LabelName': ['a', 'a', 'b', 'b', 'b', 'c'], - 'YMin': [0.3, 0.6, 0.8, 0.1, 0.0, 0.0], - 'XMin': [0.1, 0.3, 0.7, 0.0, 0.1, 0.1], - 'XMax': [0.2, 0.3, 0.8, 0.5, 0.9, 0.9], - 'YMax': [0.3, 0.6, 1, 0.8, 0.8, 0.8], - 'IsOccluded': [0, 1, 1, 0, 0, 0], - 'IsTruncated': [0, 0, 0, 1, 0, 0], - 'IsGroupOf': [0, 0, 0, 0, 0, 1], - 'IsDepiction': [1, 0, 0, 0, 0, 0], - } - df = pd.DataFrame(data=data) - label_map = {'a': 0, 'b': 1, 'c': 2} - return label_map, df - - -class TfExampleFromAnnotationsDataFrameTests(tf.test.TestCase): - - def test_simple(self): - label_map, df = create_test_data() - - tf_example = oid_tfrecord_creation.tf_example_from_annotations_data_frame( - df[df.ImageID == 'i1'], label_map, 'encoded_image_test') - self.assertProtoEquals(""" - features { - feature { - key: "image/encoded" - value { bytes_list { value: "encoded_image_test" } } } - feature { - key: "image/filename" - value { bytes_list { value: "i1.jpg" } } } - feature { - key: "image/object/bbox/ymin" - value { float_list { value: [0.3, 0.6, 0.8, 0.1] } } } - feature { - key: "image/object/bbox/xmin" - value { float_list { value: [0.1, 0.3, 0.7, 0.0] } } } - feature { - key: "image/object/bbox/ymax" - value { float_list { value: [0.3, 0.6, 1.0, 0.8] } } } - feature { - key: "image/object/bbox/xmax" - value { float_list { value: [0.2, 0.3, 0.8, 0.5] } } } - feature { - key: "image/object/class/label" - value { int64_list { value: [0, 0, 1, 1] } } } - feature { - key: "image/object/class/text" - value { bytes_list { value: ["a", "a", "b", "b"] } } } - feature { - key: "image/source_id" - value { bytes_list { value: "i1" } } } - feature { - key: "image/object/depiction" - value { int64_list { value: [1, 0, 0, 0] } } } - feature { - key: "image/object/group_of" - value { int64_list { value: [0, 0, 0, 0] } } } - feature { - key: "image/object/occluded" - value { int64_list { value: [0, 1, 1, 0] } } } - feature { - key: "image/object/truncated" - value { int64_list { value: [0, 0, 0, 1] } } } } - """, tf_example) - - def test_no_attributes(self): - label_map, df = create_test_data() - - del df['IsDepiction'] - del df['IsGroupOf'] - del df['IsOccluded'] - del df['IsTruncated'] - - tf_example = oid_tfrecord_creation.tf_example_from_annotations_data_frame( - df[df.ImageID == 'i2'], label_map, 'encoded_image_test') - self.assertProtoEquals(""" - features { - feature { - key: "image/encoded" - value { bytes_list { value: "encoded_image_test" } } } - feature { - key: "image/filename" - value { bytes_list { value: "i2.jpg" } } } - feature { - key: "image/object/bbox/ymin" - value { float_list { value: [0.0, 0.0] } } } - feature { - key: "image/object/bbox/xmin" - value { float_list { value: [0.1, 0.1] } } } - feature { - key: "image/object/bbox/ymax" - value { float_list { value: [0.8, 0.8] } } } - feature { - key: "image/object/bbox/xmax" - value { float_list { value: [0.9, 0.9] } } } - feature { - key: "image/object/class/label" - value { int64_list { value: [1, 2] } } } - feature { - key: "image/object/class/text" - value { bytes_list { value: ["b", "c"] } } } - feature { - key: "image/source_id" - value { bytes_list { value: "i2" } } } } - """, tf_example) - - def test_label_filtering(self): - label_map, df = create_test_data() - - label_map = {'a': 0} - - tf_example = oid_tfrecord_creation.tf_example_from_annotations_data_frame( - df[df.ImageID == 'i1'], label_map, 'encoded_image_test') - self.assertProtoEquals(""" - features { - feature { - key: "image/encoded" - value { bytes_list { value: "encoded_image_test" } } } - feature { - key: "image/filename" - value { bytes_list { value: "i1.jpg" } } } - feature { - key: "image/object/bbox/ymin" - value { float_list { value: [0.3, 0.6] } } } - feature { - key: "image/object/bbox/xmin" - value { float_list { value: [0.1, 0.3] } } } - feature { - key: "image/object/bbox/ymax" - value { float_list { value: [0.3, 0.6] } } } - feature { - key: "image/object/bbox/xmax" - value { float_list { value: [0.2, 0.3] } } } - feature { - key: "image/object/class/label" - value { int64_list { value: [0, 0] } } } - feature { - key: "image/object/class/text" - value { bytes_list { value: ["a", "a"] } } } - feature { - key: "image/source_id" - value { bytes_list { value: "i1" } } } - feature { - key: "image/object/depiction" - value { int64_list { value: [1, 0] } } } - feature { - key: "image/object/group_of" - value { int64_list { value: [0, 0] } } } - feature { - key: "image/object/occluded" - value { int64_list { value: [0, 1] } } } - feature { - key: "image/object/truncated" - value { int64_list { value: [0, 0] } } } } - """, tf_example) - - -class OpenOutputTfrecordsTests(tf.test.TestCase): - - def test_sharded_tfrecord_writes(self): - with contextlib2.ExitStack() as tf_record_close_stack: - output_tfrecords = oid_tfrecord_creation.open_sharded_output_tfrecords( - tf_record_close_stack, - os.path.join(tf.test.get_temp_dir(), 'test.tfrec'), 10) - for idx in range(10): - output_tfrecords[idx].write('test_{}'.format(idx)) - - for idx in range(10): - tf_record_path = '{}-{:05d}-of-00010'.format( - os.path.join(tf.test.get_temp_dir(), 'test.tfrec'), idx) - records = list(tf.python_io.tf_record_iterator(tf_record_path)) - self.assertAllEqual(records, ['test_{}'.format(idx)]) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/eval.py b/object_detection/eval.py deleted file mode 100644 index 175ac1ee..00000000 --- a/object_detection/eval.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -r"""Evaluation executable for detection models. - -This executable is used to evaluate DetectionModels. There are two ways of -configuring the eval job. - -1) A single pipeline_pb2.TrainEvalPipelineConfig file maybe specified instead. -In this mode, the --eval_training_data flag may be given to force the pipeline -to evaluate on training data instead. - -Example usage: - ./eval \ - --logtostderr \ - --checkpoint_dir=path/to/checkpoint_dir \ - --eval_dir=path/to/eval_dir \ - --pipeline_config_path=pipeline_config.pbtxt - -2) Three configuration files may be provided: a model_pb2.DetectionModel -configuration file to define what type of DetectionModel is being evaluated, an -input_reader_pb2.InputReader file to specify what data the model is evaluating -and an eval_pb2.EvalConfig file to configure evaluation parameters. - -Example usage: - ./eval \ - --logtostderr \ - --checkpoint_dir=path/to/checkpoint_dir \ - --eval_dir=path/to/eval_dir \ - --eval_config_path=eval_config.pbtxt \ - --model_config_path=model_config.pbtxt \ - --input_config_path=eval_input_config.pbtxt -""" -import functools -import os -import tensorflow as tf - -from object_detection import evaluator -from object_detection.builders import input_reader_builder -from object_detection.builders import model_builder -from object_detection.utils import config_util -from object_detection.utils import label_map_util - - -tf.logging.set_verbosity(tf.logging.INFO) - -flags = tf.app.flags -flags.DEFINE_boolean('eval_training_data', False, - 'If training data should be evaluated for this job.') -flags.DEFINE_string('checkpoint_dir', '', - 'Directory containing checkpoints to evaluate, typically ' - 'set to `train_dir` used in the training job.') -flags.DEFINE_string('eval_dir', '', - 'Directory to write eval summaries to.') -flags.DEFINE_string('pipeline_config_path', '', - 'Path to a pipeline_pb2.TrainEvalPipelineConfig config ' - 'file. If provided, other configs are ignored') -flags.DEFINE_string('eval_config_path', '', - 'Path to an eval_pb2.EvalConfig config file.') -flags.DEFINE_string('input_config_path', '', - 'Path to an input_reader_pb2.InputReader config file.') -flags.DEFINE_string('model_config_path', '', - 'Path to a model_pb2.DetectionModel config file.') -flags.DEFINE_boolean('run_once', False, 'Option to only run a single pass of ' - 'evaluation. Overrides the `max_evals` parameter in the ' - 'provided config.') -FLAGS = flags.FLAGS - - -def main(unused_argv): - assert FLAGS.checkpoint_dir, '`checkpoint_dir` is missing.' - assert FLAGS.eval_dir, '`eval_dir` is missing.' - tf.gfile.MakeDirs(FLAGS.eval_dir) - if FLAGS.pipeline_config_path: - configs = config_util.get_configs_from_pipeline_file( - FLAGS.pipeline_config_path) - tf.gfile.Copy(FLAGS.pipeline_config_path, - os.path.join(FLAGS.eval_dir, 'pipeline.config'), - overwrite=True) - else: - configs = config_util.get_configs_from_multiple_files( - model_config_path=FLAGS.model_config_path, - eval_config_path=FLAGS.eval_config_path, - eval_input_config_path=FLAGS.input_config_path) - for name, config in [('model.config', FLAGS.model_config_path), - ('eval.config', FLAGS.eval_config_path), - ('input.config', FLAGS.input_config_path)]: - tf.gfile.Copy(config, - os.path.join(FLAGS.eval_dir, name), - overwrite=True) - - model_config = configs['model'] - eval_config = configs['eval_config'] - if FLAGS.eval_training_data: - input_config = configs['train_input_config'] - else: - input_config = configs['eval_input_config'] - - model_fn = functools.partial( - model_builder.build, - model_config=model_config, - is_training=False) - - create_input_dict_fn = functools.partial( - input_reader_builder.build, - input_config) - - label_map = label_map_util.load_labelmap(input_config.label_map_path) - max_num_classes = max([item.id for item in label_map.item]) - categories = label_map_util.convert_label_map_to_categories( - label_map, max_num_classes) - - if FLAGS.run_once: - eval_config.max_evals = 1 - - evaluator.evaluate(create_input_dict_fn, model_fn, eval_config, categories, - FLAGS.checkpoint_dir, FLAGS.eval_dir) - - -if __name__ == '__main__': - tf.app.run() diff --git a/object_detection/eval_util.py b/object_detection/eval_util.py deleted file mode 100644 index 6a37be76..00000000 --- a/object_detection/eval_util.py +++ /dev/null @@ -1,516 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Common functions for repeatedly evaluating a checkpoint.""" -import logging -import os -import time - -import numpy as np -import tensorflow as tf - -from object_detection.core import box_list -from object_detection.core import box_list_ops -from object_detection.core import keypoint_ops -from object_detection.core import standard_fields as fields -from object_detection.utils import label_map_util -from object_detection.utils import ops -from object_detection.utils import visualization_utils as vis_utils - -slim = tf.contrib.slim - - -def write_metrics(metrics, global_step, summary_dir): - """Write metrics to a summary directory. - - Args: - metrics: A dictionary containing metric names and values. - global_step: Global step at which the metrics are computed. - summary_dir: Directory to write tensorflow summaries to. - """ - logging.info('Writing metrics to tf summary.') - summary_writer = tf.summary.FileWriter(summary_dir) - for key in sorted(metrics): - summary = tf.Summary(value=[ - tf.Summary.Value(tag=key, simple_value=metrics[key]), - ]) - summary_writer.add_summary(summary, global_step) - logging.info('%s: %f', key, metrics[key]) - summary_writer.close() - logging.info('Metrics written to tf summary.') - - -# TODO: Add tests. -def visualize_detection_results(result_dict, - tag, - global_step, - categories, - summary_dir='', - export_dir='', - agnostic_mode=False, - show_groundtruth=False, - min_score_thresh=.5, - max_num_predictions=20): - """Visualizes detection results and writes visualizations to image summaries. - - This function visualizes an image with its detected bounding boxes and writes - to image summaries which can be viewed on tensorboard. It optionally also - writes images to a directory. In the case of missing entry in the label map, - unknown class name in the visualization is shown as "N/A". - - Args: - result_dict: a dictionary holding groundtruth and detection - data corresponding to each image being evaluated. The following keys - are required: - 'original_image': a numpy array representing the image with shape - [1, height, width, 3] - 'detection_boxes': a numpy array of shape [N, 4] - 'detection_scores': a numpy array of shape [N] - 'detection_classes': a numpy array of shape [N] - The following keys are optional: - 'groundtruth_boxes': a numpy array of shape [N, 4] - 'groundtruth_keypoints': a numpy array of shape [N, num_keypoints, 2] - Detections are assumed to be provided in decreasing order of score and for - display, and we assume that scores are probabilities between 0 and 1. - tag: tensorboard tag (string) to associate with image. - global_step: global step at which the visualization are generated. - categories: a list of dictionaries representing all possible categories. - Each dict in this list has the following keys: - 'id': (required) an integer id uniquely identifying this category - 'name': (required) string representing category name - e.g., 'cat', 'dog', 'pizza' - 'supercategory': (optional) string representing the supercategory - e.g., 'animal', 'vehicle', 'food', etc - summary_dir: the output directory to which the image summaries are written. - export_dir: the output directory to which images are written. If this is - empty (default), then images are not exported. - agnostic_mode: boolean (default: False) controlling whether to evaluate in - class-agnostic mode or not. - show_groundtruth: boolean (default: False) controlling whether to show - groundtruth boxes in addition to detected boxes - min_score_thresh: minimum score threshold for a box to be visualized - max_num_predictions: maximum number of detections to visualize - Raises: - ValueError: if result_dict does not contain the expected keys (i.e., - 'original_image', 'detection_boxes', 'detection_scores', - 'detection_classes') - """ - if not set([ - 'original_image', 'detection_boxes', 'detection_scores', - 'detection_classes' - ]).issubset(set(result_dict.keys())): - raise ValueError('result_dict does not contain all expected keys.') - if show_groundtruth and 'groundtruth_boxes' not in result_dict: - raise ValueError('If show_groundtruth is enabled, result_dict must contain ' - 'groundtruth_boxes.') - logging.info('Creating detection visualizations.') - category_index = label_map_util.create_category_index(categories) - - image = np.squeeze(result_dict['original_image'], axis=0) - detection_boxes = result_dict['detection_boxes'] - detection_scores = result_dict['detection_scores'] - detection_classes = np.int32((result_dict['detection_classes'])) - detection_keypoints = result_dict.get('detection_keypoints', None) - detection_masks = result_dict.get('detection_masks', None) - - # Plot groundtruth underneath detections - if show_groundtruth: - groundtruth_boxes = result_dict['groundtruth_boxes'] - groundtruth_keypoints = result_dict.get('groundtruth_keypoints', None) - vis_utils.visualize_boxes_and_labels_on_image_array( - image, - groundtruth_boxes, - None, - None, - category_index, - keypoints=groundtruth_keypoints, - use_normalized_coordinates=False, - max_boxes_to_draw=None) - vis_utils.visualize_boxes_and_labels_on_image_array( - image, - detection_boxes, - detection_classes, - detection_scores, - category_index, - instance_masks=detection_masks, - keypoints=detection_keypoints, - use_normalized_coordinates=False, - max_boxes_to_draw=max_num_predictions, - min_score_thresh=min_score_thresh, - agnostic_mode=agnostic_mode) - - if export_dir: - export_path = os.path.join(export_dir, 'export-{}.png'.format(tag)) - vis_utils.save_image_array_as_png(image, export_path) - - summary = tf.Summary(value=[ - tf.Summary.Value( - tag=tag, - image=tf.Summary.Image( - encoded_image_string=vis_utils.encode_image_array_as_png_str( - image))) - ]) - summary_writer = tf.summary.FileWriter(summary_dir) - summary_writer.add_summary(summary, global_step) - summary_writer.close() - - logging.info('Detection visualizations written to summary with tag %s.', tag) - - -def _run_checkpoint_once(tensor_dict, - evaluators=None, - batch_processor=None, - checkpoint_dirs=None, - variables_to_restore=None, - restore_fn=None, - num_batches=1, - master='', - save_graph=False, - save_graph_dir=''): - """Evaluates metrics defined in evaluators. - - This function loads the latest checkpoint in checkpoint_dirs and evaluates - all metrics defined in evaluators. The metrics are processed in batch by the - batch_processor. - - Args: - tensor_dict: a dictionary holding tensors representing a batch of detections - and corresponding groundtruth annotations. - evaluators: a list of object of type DetectionEvaluator to be used for - evaluation. Note that the metric names produced by different evaluators - must be unique. - batch_processor: a function taking four arguments: - 1. tensor_dict: the same tensor_dict that is passed in as the first - argument to this function. - 2. sess: a tensorflow session - 3. batch_index: an integer representing the index of the batch amongst - all batches - By default, batch_processor is None, which defaults to running: - return sess.run(tensor_dict) - To skip an image, it suffices to return an empty dictionary in place of - result_dict. - checkpoint_dirs: list of directories to load into an EnsembleModel. If it - has only one directory, EnsembleModel will not be used -- - a DetectionModel - will be instantiated directly. Not used if restore_fn is set. - variables_to_restore: None, or a dictionary mapping variable names found in - a checkpoint to model variables. The dictionary would normally be - generated by creating a tf.train.ExponentialMovingAverage object and - calling its variables_to_restore() method. Not used if restore_fn is set. - restore_fn: None, or a function that takes a tf.Session object and correctly - restores all necessary variables from the correct checkpoint file. If - None, attempts to restore from the first directory in checkpoint_dirs. - num_batches: the number of batches to use for evaluation. - master: the location of the Tensorflow session. - save_graph: whether or not the Tensorflow graph is stored as a pbtxt file. - save_graph_dir: where to store the Tensorflow graph on disk. If save_graph - is True this must be non-empty. - - Returns: - global_step: the count of global steps. - all_evaluator_metrics: A dictionary containing metric names and values. - - Raises: - ValueError: if restore_fn is None and checkpoint_dirs doesn't have at least - one element. - ValueError: if save_graph is True and save_graph_dir is not defined. - """ - if save_graph and not save_graph_dir: - raise ValueError('`save_graph_dir` must be defined.') - sess = tf.Session(master, graph=tf.get_default_graph()) - sess.run(tf.global_variables_initializer()) - sess.run(tf.local_variables_initializer()) - sess.run(tf.tables_initializer()) - if restore_fn: - restore_fn(sess) - else: - if not checkpoint_dirs: - raise ValueError('`checkpoint_dirs` must have at least one entry.') - checkpoint_file = tf.train.latest_checkpoint(checkpoint_dirs[0]) - saver = tf.train.Saver(variables_to_restore) - saver.restore(sess, checkpoint_file) - - if save_graph: - tf.train.write_graph(sess.graph_def, save_graph_dir, 'eval.pbtxt') - - counters = {'skipped': 0, 'success': 0} - with tf.contrib.slim.queues.QueueRunners(sess): - try: - for batch in range(int(num_batches)): - if (batch + 1) % 100 == 0: - logging.info('Running eval ops batch %d/%d', batch + 1, num_batches) - if not batch_processor: - try: - result_dict = sess.run(tensor_dict) - counters['success'] += 1 - except tf.errors.InvalidArgumentError: - logging.info('Skipping image') - counters['skipped'] += 1 - result_dict = {} - else: - result_dict = batch_processor(tensor_dict, sess, batch, counters) - for evaluator in evaluators: - # TODO: Use image_id tensor once we fix the input data - # decoders to return correct image_id. - # TODO: result_dict contains batches of images, while - # add_single_ground_truth_image_info expects a single image. Fix - evaluator.add_single_ground_truth_image_info( - image_id=batch, groundtruth_dict=result_dict) - evaluator.add_single_detected_image_info( - image_id=batch, detections_dict=result_dict) - logging.info('Running eval batches done.') - except tf.errors.OutOfRangeError: - logging.info('Done evaluating -- epoch limit reached') - finally: - # When done, ask the threads to stop. - logging.info('# success: %d', counters['success']) - logging.info('# skipped: %d', counters['skipped']) - all_evaluator_metrics = {} - for evaluator in evaluators: - metrics = evaluator.evaluate() - evaluator.clear() - if any(key in all_evaluator_metrics for key in metrics): - raise ValueError('Metric names between evaluators must not collide.') - all_evaluator_metrics.update(metrics) - global_step = tf.train.global_step(sess, tf.train.get_global_step()) - sess.close() - return (global_step, all_evaluator_metrics) - - -# TODO: Add tests. -def repeated_checkpoint_run(tensor_dict, - summary_dir, - evaluators, - batch_processor=None, - checkpoint_dirs=None, - variables_to_restore=None, - restore_fn=None, - num_batches=1, - eval_interval_secs=120, - max_number_of_evaluations=None, - master='', - save_graph=False, - save_graph_dir=''): - """Periodically evaluates desired tensors using checkpoint_dirs or restore_fn. - - This function repeatedly loads a checkpoint and evaluates a desired - set of tensors (provided by tensor_dict) and hands the resulting numpy - arrays to a function result_processor which can be used to further - process/save/visualize the results. - - Args: - tensor_dict: a dictionary holding tensors representing a batch of detections - and corresponding groundtruth annotations. - summary_dir: a directory to write metrics summaries. - evaluators: a list of object of type DetectionEvaluator to be used for - evaluation. Note that the metric names produced by different evaluators - must be unique. - batch_processor: a function taking three arguments: - 1. tensor_dict: the same tensor_dict that is passed in as the first - argument to this function. - 2. sess: a tensorflow session - 3. batch_index: an integer representing the index of the batch amongst - all batches - By default, batch_processor is None, which defaults to running: - return sess.run(tensor_dict) - checkpoint_dirs: list of directories to load into a DetectionModel or an - EnsembleModel if restore_fn isn't set. Also used to determine when to run - next evaluation. Must have at least one element. - variables_to_restore: None, or a dictionary mapping variable names found in - a checkpoint to model variables. The dictionary would normally be - generated by creating a tf.train.ExponentialMovingAverage object and - calling its variables_to_restore() method. Not used if restore_fn is set. - restore_fn: a function that takes a tf.Session object and correctly restores - all necessary variables from the correct checkpoint file. - num_batches: the number of batches to use for evaluation. - eval_interval_secs: the number of seconds between each evaluation run. - max_number_of_evaluations: the max number of iterations of the evaluation. - If the value is left as None the evaluation continues indefinitely. - master: the location of the Tensorflow session. - save_graph: whether or not the Tensorflow graph is saved as a pbtxt file. - save_graph_dir: where to save on disk the Tensorflow graph. If store_graph - is True this must be non-empty. - - Returns: - metrics: A dictionary containing metric names and values in the latest - evaluation. - - Raises: - ValueError: if max_num_of_evaluations is not None or a positive number. - ValueError: if checkpoint_dirs doesn't have at least one element. - """ - if max_number_of_evaluations and max_number_of_evaluations <= 0: - raise ValueError( - '`number_of_steps` must be either None or a positive number.') - - if not checkpoint_dirs: - raise ValueError('`checkpoint_dirs` must have at least one entry.') - - last_evaluated_model_path = None - number_of_evaluations = 0 - while True: - start = time.time() - logging.info('Starting evaluation at ' + time.strftime( - '%Y-%m-%d-%H:%M:%S', time.gmtime())) - model_path = tf.train.latest_checkpoint(checkpoint_dirs[0]) - if not model_path: - logging.info('No model found in %s. Will try again in %d seconds', - checkpoint_dirs[0], eval_interval_secs) - elif model_path == last_evaluated_model_path: - logging.info('Found already evaluated checkpoint. Will try again in %d ' - 'seconds', eval_interval_secs) - else: - last_evaluated_model_path = model_path - global_step, metrics = _run_checkpoint_once(tensor_dict, evaluators, - batch_processor, - checkpoint_dirs, - variables_to_restore, - restore_fn, num_batches, - master, save_graph, - save_graph_dir) - write_metrics(metrics, global_step, summary_dir) - number_of_evaluations += 1 - - if (max_number_of_evaluations and - number_of_evaluations >= max_number_of_evaluations): - logging.info('Finished evaluation!') - break - time_to_next_eval = start + eval_interval_secs - time.time() - if time_to_next_eval > 0: - time.sleep(time_to_next_eval) - - return metrics - - -def result_dict_for_single_example(image, - key, - detections, - groundtruth=None, - class_agnostic=False, - scale_to_absolute=False): - """Merges all detection and groundtruth information for a single example. - - Note that evaluation tools require classes that are 1-indexed, and so this - function performs the offset. If `class_agnostic` is True, all output classes - have label 1. - - Args: - image: A single 4D image tensor of shape [1, H, W, C]. - key: A single string tensor identifying the image. - detections: A dictionary of detections, returned from - DetectionModel.postprocess(). - groundtruth: (Optional) Dictionary of groundtruth items, with fields: - 'groundtruth_boxes': [num_boxes, 4] float32 tensor of boxes, in - normalized coordinates. - 'groundtruth_classes': [num_boxes] int64 tensor of 1-indexed classes. - 'groundtruth_area': [num_boxes] float32 tensor of bbox area. (Optional) - 'groundtruth_is_crowd': [num_boxes] int64 tensor. (Optional) - 'groundtruth_difficult': [num_boxes] int64 tensor. (Optional) - 'groundtruth_group_of': [num_boxes] int64 tensor. (Optional) - 'groundtruth_instance_masks': 3D int64 tensor of instance masks - (Optional). - class_agnostic: Boolean indicating whether the detections are class-agnostic - (i.e. binary). Default False. - scale_to_absolute: Boolean indicating whether boxes, masks, keypoints should - be scaled to absolute coordinates. Note that for IoU based evaluations, - it does not matter whether boxes are expressed in absolute or relative - coordinates. Default False. - - Returns: - A dictionary with: - 'original_image': A [1, H, W, C] uint8 image tensor. - 'key': A string tensor with image identifier. - 'detection_boxes': [max_detections, 4] float32 tensor of boxes, in - normalized or absolute coordinates, depending on the value of - `scale_to_absolute`. - 'detection_scores': [max_detections] float32 tensor of scores. - 'detection_classes': [max_detections] int64 tensor of 1-indexed classes. - 'detection_masks': [max_detections, None, None] float32 tensor of binarized - masks. (Only present if available in `detections`) - 'groundtruth_boxes': [num_boxes, 4] float32 tensor of boxes, in - normalized or absolute coordinates, depending on the value of - `scale_to_absolute`. (Optional) - 'groundtruth_classes': [num_boxes] int64 tensor of 1-indexed classes. - (Optional) - 'groundtruth_area': [num_boxes] float32 tensor of bbox area. (Optional) - 'groundtruth_is_crowd': [num_boxes] int64 tensor. (Optional) - 'groundtruth_difficult': [num_boxes] int64 tensor. (Optional) - 'groundtruth_group_of': [num_boxes] int64 tensor. (Optional) - 'groundtruth_instance_masks': 3D int64 tensor of instance masks - (Optional). - - """ - label_id_offset = 1 # Applying label id offset (b/63711816) - - input_data_fields = fields.InputDataFields() - output_dict = { - input_data_fields.original_image: image, - input_data_fields.key: key, - } - - detection_fields = fields.DetectionResultFields - detection_boxes = detections[detection_fields.detection_boxes][0] - output_dict[detection_fields.detection_boxes] = detection_boxes - image_shape = tf.shape(image) - if scale_to_absolute: - absolute_detection_boxlist = box_list_ops.to_absolute_coordinates( - box_list.BoxList(detection_boxes), image_shape[1], image_shape[2]) - output_dict[detection_fields.detection_boxes] = ( - absolute_detection_boxlist.get()) - detection_scores = detections[detection_fields.detection_scores][0] - output_dict[detection_fields.detection_scores] = detection_scores - - if class_agnostic: - detection_classes = tf.ones_like(detection_scores, dtype=tf.int64) - else: - detection_classes = ( - tf.to_int64(detections[detection_fields.detection_classes][0]) + - label_id_offset) - output_dict[detection_fields.detection_classes] = detection_classes - - if detection_fields.detection_masks in detections: - detection_masks = detections[detection_fields.detection_masks][0] - output_dict[detection_fields.detection_masks] = detection_masks - if scale_to_absolute: - # TODO: This should be done in model's postprocess - # function ideally. - detection_masks_reframed = ops.reframe_box_masks_to_image_masks( - detection_masks, detection_boxes, image_shape[1], image_shape[2]) - detection_masks_reframed = tf.to_float( - tf.greater(detection_masks_reframed, 0.5)) - output_dict[detection_fields.detection_masks] = detection_masks_reframed - if detection_fields.detection_keypoints in detections: - detection_keypoints = detections[detection_fields.detection_keypoints][0] - output_dict[detection_fields.detection_keypoints] = detection_keypoints - if scale_to_absolute: - absolute_detection_keypoints = keypoint_ops.scale( - detection_keypoints, image_shape[1], image_shape[2]) - output_dict[detection_fields.detection_keypoints] = ( - absolute_detection_keypoints) - - if groundtruth: - output_dict.update(groundtruth) - if scale_to_absolute: - groundtruth_boxes = groundtruth[input_data_fields.groundtruth_boxes] - absolute_gt_boxlist = box_list_ops.to_absolute_coordinates( - box_list.BoxList(groundtruth_boxes), image_shape[1], image_shape[2]) - output_dict[input_data_fields.groundtruth_boxes] = ( - absolute_gt_boxlist.get()) - # For class-agnostic models, groundtruth classes all become 1. - if class_agnostic: - groundtruth_classes = groundtruth[input_data_fields.groundtruth_classes] - groundtruth_classes = tf.ones_like(groundtruth_classes, dtype=tf.int64) - output_dict[input_data_fields.groundtruth_classes] = groundtruth_classes - - return output_dict diff --git a/object_detection/evaluator.py b/object_detection/evaluator.py deleted file mode 100644 index 74722d00..00000000 --- a/object_detection/evaluator.py +++ /dev/null @@ -1,212 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Detection model evaluator. - -This file provides a generic evaluation method that can be used to evaluate a -DetectionModel. -""" - -import logging -import tensorflow as tf - -from object_detection import eval_util -from object_detection.core import prefetcher -from object_detection.core import standard_fields as fields -from object_detection.utils import object_detection_evaluation - -# A dictionary of metric names to classes that implement the metric. The classes -# in the dictionary must implement -# utils.object_detection_evaluation.DetectionEvaluator interface. -EVAL_METRICS_CLASS_DICT = { - 'pascal_voc_metrics': - object_detection_evaluation.PascalDetectionEvaluator, - 'weighted_pascal_voc_metrics': - object_detection_evaluation.WeightedPascalDetectionEvaluator, - 'open_images_metrics': - object_detection_evaluation.OpenImagesDetectionEvaluator -} - - -def _extract_prediction_tensors(model, - create_input_dict_fn, - ignore_groundtruth=False): - """Restores the model in a tensorflow session. - - Args: - model: model to perform predictions with. - create_input_dict_fn: function to create input tensor dictionaries. - ignore_groundtruth: whether groundtruth should be ignored. - - Returns: - tensor_dict: A tensor dictionary with evaluations. - """ - input_dict = create_input_dict_fn() - prefetch_queue = prefetcher.prefetch(input_dict, capacity=500) - input_dict = prefetch_queue.dequeue() - original_image = tf.expand_dims(input_dict[fields.InputDataFields.image], 0) - preprocessed_image = model.preprocess(tf.to_float(original_image)) - prediction_dict = model.predict(preprocessed_image) - detections = model.postprocess(prediction_dict) - - groundtruth = None - if not ignore_groundtruth: - groundtruth = { - fields.InputDataFields.groundtruth_boxes: - input_dict[fields.InputDataFields.groundtruth_boxes], - fields.InputDataFields.groundtruth_classes: - input_dict[fields.InputDataFields.groundtruth_classes], - fields.InputDataFields.groundtruth_area: - input_dict[fields.InputDataFields.groundtruth_area], - fields.InputDataFields.groundtruth_is_crowd: - input_dict[fields.InputDataFields.groundtruth_is_crowd], - fields.InputDataFields.groundtruth_difficult: - input_dict[fields.InputDataFields.groundtruth_difficult] - } - if fields.InputDataFields.groundtruth_group_of in input_dict: - groundtruth[fields.InputDataFields.groundtruth_group_of] = ( - input_dict[fields.InputDataFields.groundtruth_group_of]) - if fields.DetectionResultFields.detection_masks in detections: - groundtruth[fields.InputDataFields.groundtruth_instance_masks] = ( - input_dict[fields.InputDataFields.groundtruth_instance_masks]) - - return eval_util.result_dict_for_single_example( - original_image, - input_dict[fields.InputDataFields.source_id], - detections, - groundtruth, - class_agnostic=( - fields.DetectionResultFields.detection_classes not in detections), - scale_to_absolute=True) - - -def get_evaluators(eval_config, categories): - """Returns the evaluator class according to eval_config, valid for categories. - - Args: - eval_config: evaluation configurations. - categories: a list of categories to evaluate. - Returns: - An list of instances of DetectionEvaluator. - - Raises: - ValueError: if metric is not in the metric class dictionary. - """ - eval_metric_fn_key = eval_config.metrics_set - if eval_metric_fn_key not in EVAL_METRICS_CLASS_DICT: - raise ValueError('Metric not found: {}'.format(eval_metric_fn_key)) - return [ - EVAL_METRICS_CLASS_DICT[eval_metric_fn_key]( - categories=categories) - ] - - -def evaluate(create_input_dict_fn, create_model_fn, eval_config, categories, - checkpoint_dir, eval_dir): - """Evaluation function for detection models. - - Args: - create_input_dict_fn: a function to create a tensor input dictionary. - create_model_fn: a function that creates a DetectionModel. - eval_config: a eval_pb2.EvalConfig protobuf. - categories: a list of category dictionaries. Each dict in the list should - have an integer 'id' field and string 'name' field. - checkpoint_dir: directory to load the checkpoints to evaluate from. - eval_dir: directory to write evaluation metrics summary to. - - Returns: - metrics: A dictionary containing metric names and values from the latest - run. - """ - - model = create_model_fn() - - if eval_config.ignore_groundtruth and not eval_config.export_path: - logging.fatal('If ignore_groundtruth=True then an export_path is ' - 'required. Aborting!!!') - - tensor_dict = _extract_prediction_tensors( - model=model, - create_input_dict_fn=create_input_dict_fn, - ignore_groundtruth=eval_config.ignore_groundtruth) - - def _process_batch(tensor_dict, sess, batch_index, counters): - """Evaluates tensors in tensor_dict, visualizing the first K examples. - - This function calls sess.run on tensor_dict, evaluating the original_image - tensor only on the first K examples and visualizing detections overlaid - on this original_image. - - Args: - tensor_dict: a dictionary of tensors - sess: tensorflow session - batch_index: the index of the batch amongst all batches in the run. - counters: a dictionary holding 'success' and 'skipped' fields which can - be updated to keep track of number of successful and failed runs, - respectively. If these fields are not updated, then the success/skipped - counter values shown at the end of evaluation will be incorrect. - - Returns: - result_dict: a dictionary of numpy arrays - """ - try: - result_dict = sess.run(tensor_dict) - counters['success'] += 1 - except tf.errors.InvalidArgumentError: - logging.info('Skipping image') - counters['skipped'] += 1 - return {} - global_step = tf.train.global_step(sess, tf.train.get_global_step()) - if batch_index < eval_config.num_visualizations: - tag = 'image-{}'.format(batch_index) - eval_util.visualize_detection_results( - result_dict, - tag, - global_step, - categories=categories, - summary_dir=eval_dir, - export_dir=eval_config.visualization_export_dir, - show_groundtruth=eval_config.visualization_export_dir) - return result_dict - - variables_to_restore = tf.global_variables() - global_step = tf.train.get_or_create_global_step() - variables_to_restore.append(global_step) - if eval_config.use_moving_averages: - variable_averages = tf.train.ExponentialMovingAverage(0.0) - variables_to_restore = variable_averages.variables_to_restore() - saver = tf.train.Saver(variables_to_restore) - - def _restore_latest_checkpoint(sess): - latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir) - saver.restore(sess, latest_checkpoint) - - metrics = eval_util.repeated_checkpoint_run( - tensor_dict=tensor_dict, - summary_dir=eval_dir, - evaluators=get_evaluators(eval_config, categories), - batch_processor=_process_batch, - checkpoint_dirs=[checkpoint_dir], - variables_to_restore=None, - restore_fn=_restore_latest_checkpoint, - num_batches=eval_config.num_examples, - eval_interval_secs=eval_config.eval_interval_secs, - max_number_of_evaluations=(1 if eval_config.ignore_groundtruth else - eval_config.max_evals - if eval_config.max_evals else None), - master=eval_config.eval_master, - save_graph=eval_config.save_graph, - save_graph_dir=(eval_dir if eval_config.save_graph else '')) - - return metrics diff --git a/object_detection/export_inference_graph.py b/object_detection/export_inference_graph.py deleted file mode 100644 index 279d1d16..00000000 --- a/object_detection/export_inference_graph.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -r"""Tool to export an object detection model for inference. - -Prepares an object detection tensorflow graph for inference using model -configuration and an optional trained checkpoint. Outputs inference -graph, associated checkpoint files, a frozen inference graph and a -SavedModel (https://tensorflow.github.io/serving/serving_basic.html). - -The inference graph contains one of three input nodes depending on the user -specified option. - * `image_tensor`: Accepts a uint8 4-D tensor of shape [None, None, None, 3] - * `encoded_image_string_tensor`: Accepts a 1-D string tensor of shape [None] - containing encoded PNG or JPEG images. Image resolutions are expected to be - the same if more than 1 image is provided. - * `tf_example`: Accepts a 1-D string tensor of shape [None] containing - serialized TFExample protos. Image resolutions are expected to be the same - if more than 1 image is provided. - -and the following output nodes returned by the model.postprocess(..): - * `num_detections`: Outputs float32 tensors of the form [batch] - that specifies the number of valid boxes per image in the batch. - * `detection_boxes`: Outputs float32 tensors of the form - [batch, num_boxes, 4] containing detected boxes. - * `detection_scores`: Outputs float32 tensors of the form - [batch, num_boxes] containing class scores for the detections. - * `detection_classes`: Outputs float32 tensors of the form - [batch, num_boxes] containing classes for the detections. - * `detection_masks`: Outputs float32 tensors of the form - [batch, num_boxes, mask_height, mask_width] containing predicted instance - masks for each box if its present in the dictionary of postprocessed - tensors returned by the model. - -Notes: - * This tool uses `use_moving_averages` from eval_config to decide which - weights to freeze. - -Example Usage: --------------- -python export_inference_graph \ - --input_type image_tensor \ - --pipeline_config_path path/to/ssd_inception_v2.config \ - --trained_checkpoint_prefix path/to/model.ckpt \ - --output_directory path/to/exported_model_directory - -The expected output would be in the directory -path/to/exported_model_directory (which is created if it does not exist) -with contents: - - graph.pbtxt - - model.ckpt.data-00000-of-00001 - - model.ckpt.info - - model.ckpt.meta - - frozen_inference_graph.pb - + saved_model (a directory) -""" -import tensorflow as tf -from google.protobuf import text_format -from object_detection import exporter -from object_detection.protos import pipeline_pb2 - -slim = tf.contrib.slim -flags = tf.app.flags - -flags.DEFINE_string('input_type', 'image_tensor', 'Type of input node. Can be ' - 'one of [`image_tensor`, `encoded_image_string_tensor`, ' - '`tf_example`]') -flags.DEFINE_string('input_shape', None, - 'If input_type is `image_tensor`, this can explicitly set ' - 'the shape of this input tensor to a fixed size. The ' - 'dimensions are to be provided as a comma-separated list ' - 'of integers. A value of -1 can be used for unknown ' - 'dimensions. If not specified, for an `image_tensor, the ' - 'default shape will be partially specified as ' - '`[None, None, None, 3]`.') -flags.DEFINE_string('pipeline_config_path', None, - 'Path to a pipeline_pb2.TrainEvalPipelineConfig config ' - 'file.') -flags.DEFINE_string('trained_checkpoint_prefix', None, - 'Path to trained checkpoint, typically of the form ' - 'path/to/model.ckpt') -flags.DEFINE_string('output_directory', None, 'Path to write outputs.') - -tf.app.flags.mark_flag_as_required('pipeline_config_path') -tf.app.flags.mark_flag_as_required('trained_checkpoint_prefix') -tf.app.flags.mark_flag_as_required('output_directory') -FLAGS = flags.FLAGS - - -def main(_): - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - with tf.gfile.GFile(FLAGS.pipeline_config_path, 'r') as f: - text_format.Merge(f.read(), pipeline_config) - if FLAGS.input_shape: - input_shape = [ - int(dim) if dim != '-1' else None - for dim in FLAGS.input_shape.split(',') - ] - else: - input_shape = None - exporter.export_inference_graph(FLAGS.input_type, pipeline_config, - FLAGS.trained_checkpoint_prefix, - FLAGS.output_directory, input_shape) - - -if __name__ == '__main__': - tf.app.run() diff --git a/object_detection/exporter.py b/object_detection/exporter.py deleted file mode 100644 index 95469e68..00000000 --- a/object_detection/exporter.py +++ /dev/null @@ -1,426 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Functions to export object detection inference graph.""" -import logging -import os -import tempfile -import tensorflow as tf -from tensorflow.core.protobuf import rewriter_config_pb2 -from tensorflow.python import pywrap_tensorflow -from tensorflow.python.client import session -from tensorflow.python.framework import graph_util -from tensorflow.python.platform import gfile -from tensorflow.python.saved_model import signature_constants -from tensorflow.python.training import saver as saver_lib -from object_detection.builders import model_builder -from object_detection.core import standard_fields as fields -from object_detection.data_decoders import tf_example_decoder - -slim = tf.contrib.slim - - -# TODO: Replace with freeze_graph.freeze_graph_with_def_protos when -# newer version of Tensorflow becomes more common. -def freeze_graph_with_def_protos( - input_graph_def, - input_saver_def, - input_checkpoint, - output_node_names, - restore_op_name, - filename_tensor_name, - clear_devices, - initializer_nodes, - optimize_graph=True, - variable_names_blacklist=''): - """Converts all variables in a graph and checkpoint into constants.""" - del restore_op_name, filename_tensor_name # Unused by updated loading code. - - # 'input_checkpoint' may be a prefix if we're using Saver V2 format - if not saver_lib.checkpoint_exists(input_checkpoint): - raise ValueError( - 'Input checkpoint "' + input_checkpoint + '" does not exist!') - - if not output_node_names: - raise ValueError( - 'You must supply the name of a node to --output_node_names.') - - # Remove all the explicit device specifications for this node. This helps to - # make the graph more portable. - if clear_devices: - for node in input_graph_def.node: - node.device = '' - - with tf.Graph().as_default(): - tf.import_graph_def(input_graph_def, name='') - - if optimize_graph: - logging.info('Graph Rewriter optimizations enabled') - rewrite_options = rewriter_config_pb2.RewriterConfig() - rewrite_options.optimizers.append('pruning') - rewrite_options.optimizers.append('constfold') - rewrite_options.optimizers.append('layout') - graph_options = tf.GraphOptions( - rewrite_options=rewrite_options, infer_shapes=True) - else: - logging.info('Graph Rewriter optimizations disabled') - graph_options = tf.GraphOptions() - config = tf.ConfigProto(graph_options=graph_options) - with session.Session(config=config) as sess: - if input_saver_def: - saver = saver_lib.Saver(saver_def=input_saver_def) - saver.restore(sess, input_checkpoint) - else: - var_list = {} - reader = pywrap_tensorflow.NewCheckpointReader(input_checkpoint) - var_to_shape_map = reader.get_variable_to_shape_map() - for key in var_to_shape_map: - try: - tensor = sess.graph.get_tensor_by_name(key + ':0') - except KeyError: - # This tensor doesn't exist in the graph (for example it's - # 'global_step' or a similar housekeeping element) so skip it. - continue - var_list[key] = tensor - saver = saver_lib.Saver(var_list=var_list) - saver.restore(sess, input_checkpoint) - if initializer_nodes: - sess.run(initializer_nodes) - - variable_names_blacklist = (variable_names_blacklist.split(',') if - variable_names_blacklist else None) - output_graph_def = graph_util.convert_variables_to_constants( - sess, - input_graph_def, - output_node_names.split(','), - variable_names_blacklist=variable_names_blacklist) - - return output_graph_def - - -def replace_variable_values_with_moving_averages(graph, - current_checkpoint_file, - new_checkpoint_file): - """Replaces variable values in the checkpoint with their moving averages. - - If the current checkpoint has shadow variables maintaining moving averages of - the variables defined in the graph, this function generates a new checkpoint - where the variables contain the values of their moving averages. - - Args: - graph: a tf.Graph object. - current_checkpoint_file: a checkpoint containing both original variables and - their moving averages. - new_checkpoint_file: file path to write a new checkpoint. - """ - with graph.as_default(): - variable_averages = tf.train.ExponentialMovingAverage(0.0) - ema_variables_to_restore = variable_averages.variables_to_restore() - with tf.Session() as sess: - read_saver = tf.train.Saver(ema_variables_to_restore) - read_saver.restore(sess, current_checkpoint_file) - write_saver = tf.train.Saver() - write_saver.save(sess, new_checkpoint_file) - - -def _image_tensor_input_placeholder(input_shape=None): - """Returns input placeholder and a 4-D uint8 image tensor.""" - if input_shape is None: - input_shape = (None, None, None, 3) - input_tensor = tf.placeholder( - dtype=tf.uint8, shape=input_shape, name='image_tensor') - return input_tensor, input_tensor - - -def _tf_example_input_placeholder(): - """Returns input that accepts a batch of strings with tf examples. - - Returns: - a tuple of input placeholder and the output decoded images. - """ - batch_tf_example_placeholder = tf.placeholder( - tf.string, shape=[None], name='tf_example') - def decode(tf_example_string_tensor): - tensor_dict = tf_example_decoder.TfExampleDecoder().decode( - tf_example_string_tensor) - image_tensor = tensor_dict[fields.InputDataFields.image] - return image_tensor - return (batch_tf_example_placeholder, - tf.map_fn(decode, - elems=batch_tf_example_placeholder, - dtype=tf.uint8, - parallel_iterations=32, - back_prop=False)) - - -def _encoded_image_string_tensor_input_placeholder(): - """Returns input that accepts a batch of PNG or JPEG strings. - - Returns: - a tuple of input placeholder and the output decoded images. - """ - batch_image_str_placeholder = tf.placeholder( - dtype=tf.string, - shape=[None], - name='encoded_image_string_tensor') - def decode(encoded_image_string_tensor): - image_tensor = tf.image.decode_image(encoded_image_string_tensor, - channels=3) - image_tensor.set_shape((None, None, 3)) - return image_tensor - return (batch_image_str_placeholder, - tf.map_fn( - decode, - elems=batch_image_str_placeholder, - dtype=tf.uint8, - parallel_iterations=32, - back_prop=False)) - - -input_placeholder_fn_map = { - 'image_tensor': _image_tensor_input_placeholder, - 'encoded_image_string_tensor': - _encoded_image_string_tensor_input_placeholder, - 'tf_example': _tf_example_input_placeholder, -} - - -def _add_output_tensor_nodes(postprocessed_tensors, - output_collection_name='inference_op'): - """Adds output nodes for detection boxes and scores. - - Adds the following nodes for output tensors - - * num_detections: float32 tensor of shape [batch_size]. - * detection_boxes: float32 tensor of shape [batch_size, num_boxes, 4] - containing detected boxes. - * detection_scores: float32 tensor of shape [batch_size, num_boxes] - containing scores for the detected boxes. - * detection_classes: float32 tensor of shape [batch_size, num_boxes] - containing class predictions for the detected boxes. - * detection_masks: (Optional) float32 tensor of shape - [batch_size, num_boxes, mask_height, mask_width] containing masks for each - detection box. - - Args: - postprocessed_tensors: a dictionary containing the following fields - 'detection_boxes': [batch, max_detections, 4] - 'detection_scores': [batch, max_detections] - 'detection_classes': [batch, max_detections] - 'detection_masks': [batch, max_detections, mask_height, mask_width] - (optional). - 'num_detections': [batch] - output_collection_name: Name of collection to add output tensors to. - - Returns: - A tensor dict containing the added output tensor nodes. - """ - label_id_offset = 1 - boxes = postprocessed_tensors.get('detection_boxes') - scores = postprocessed_tensors.get('detection_scores') - classes = postprocessed_tensors.get('detection_classes') + label_id_offset - masks = postprocessed_tensors.get('detection_masks') - num_detections = postprocessed_tensors.get('num_detections') - outputs = {} - outputs['detection_boxes'] = tf.identity(boxes, name='detection_boxes') - outputs['detection_scores'] = tf.identity(scores, name='detection_scores') - outputs['detection_classes'] = tf.identity(classes, name='detection_classes') - outputs['num_detections'] = tf.identity(num_detections, name='num_detections') - if masks is not None: - outputs['detection_masks'] = tf.identity(masks, name='detection_masks') - for output_key in outputs: - tf.add_to_collection(output_collection_name, outputs[output_key]) - if masks is not None: - tf.add_to_collection(output_collection_name, outputs['detection_masks']) - return outputs - - -def _write_frozen_graph(frozen_graph_path, frozen_graph_def): - """Writes frozen graph to disk. - - Args: - frozen_graph_path: Path to write inference graph. - frozen_graph_def: tf.GraphDef holding frozen graph. - """ - with gfile.GFile(frozen_graph_path, 'wb') as f: - f.write(frozen_graph_def.SerializeToString()) - logging.info('%d ops in the final graph.', len(frozen_graph_def.node)) - - -def _write_saved_model(saved_model_path, - frozen_graph_def, - inputs, - outputs): - """Writes SavedModel to disk. - - If checkpoint_path is not None bakes the weights into the graph thereby - eliminating the need of checkpoint files during inference. If the model - was trained with moving averages, setting use_moving_averages to true - restores the moving averages, otherwise the original set of variables - is restored. - - Args: - saved_model_path: Path to write SavedModel. - frozen_graph_def: tf.GraphDef holding frozen graph. - inputs: The input image tensor to use for detection. - outputs: A tensor dictionary containing the outputs of a DetectionModel. - """ - with tf.Graph().as_default(): - with session.Session() as sess: - - tf.import_graph_def(frozen_graph_def, name='') - - builder = tf.saved_model.builder.SavedModelBuilder(saved_model_path) - - tensor_info_inputs = { - 'inputs': tf.saved_model.utils.build_tensor_info(inputs)} - tensor_info_outputs = {} - for k, v in outputs.items(): - tensor_info_outputs[k] = tf.saved_model.utils.build_tensor_info(v) - - detection_signature = ( - tf.saved_model.signature_def_utils.build_signature_def( - inputs=tensor_info_inputs, - outputs=tensor_info_outputs, - method_name=signature_constants.PREDICT_METHOD_NAME)) - - builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map={ - signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: - detection_signature, - }, - ) - builder.save() - - -def _write_graph_and_checkpoint(inference_graph_def, - model_path, - input_saver_def, - trained_checkpoint_prefix): - for node in inference_graph_def.node: - node.device = '' - with tf.Graph().as_default(): - tf.import_graph_def(inference_graph_def, name='') - with session.Session() as sess: - saver = saver_lib.Saver(saver_def=input_saver_def, - save_relative_paths=True) - saver.restore(sess, trained_checkpoint_prefix) - saver.save(sess, model_path) - - -def _export_inference_graph(input_type, - detection_model, - use_moving_averages, - trained_checkpoint_prefix, - output_directory, - additional_output_tensor_names=None, - input_shape=None, - optimize_graph=True, - output_collection_name='inference_op'): - """Export helper.""" - tf.gfile.MakeDirs(output_directory) - frozen_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - saved_model_path = os.path.join(output_directory, 'saved_model') - model_path = os.path.join(output_directory, 'model.ckpt') - - if input_type not in input_placeholder_fn_map: - raise ValueError('Unknown input type: {}'.format(input_type)) - placeholder_args = {} - if input_shape is not None: - if input_type != 'image_tensor': - raise ValueError('Can only specify input shape for `image_tensor` ' - 'inputs.') - placeholder_args['input_shape'] = input_shape - placeholder_tensor, input_tensors = input_placeholder_fn_map[input_type]( - **placeholder_args) - inputs = tf.to_float(input_tensors) - preprocessed_inputs = detection_model.preprocess(inputs) - output_tensors = detection_model.predict(preprocessed_inputs) - postprocessed_tensors = detection_model.postprocess(output_tensors) - outputs = _add_output_tensor_nodes(postprocessed_tensors, - output_collection_name) - # Add global step to the graph. - slim.get_or_create_global_step() - - if use_moving_averages: - temp_checkpoint_file = tempfile.NamedTemporaryFile() - replace_variable_values_with_moving_averages( - tf.get_default_graph(), trained_checkpoint_prefix, - temp_checkpoint_file.name) - checkpoint_to_use = temp_checkpoint_file.name - else: - checkpoint_to_use = trained_checkpoint_prefix - - saver = tf.train.Saver() - input_saver_def = saver.as_saver_def() - - _write_graph_and_checkpoint( - inference_graph_def=tf.get_default_graph().as_graph_def(), - model_path=model_path, - input_saver_def=input_saver_def, - trained_checkpoint_prefix=checkpoint_to_use) - - if additional_output_tensor_names is not None: - output_node_names = ','.join(outputs.keys()+additional_output_tensor_names) - else: - output_node_names = ','.join(outputs.keys()) - - frozen_graph_def = freeze_graph_with_def_protos( - input_graph_def=tf.get_default_graph().as_graph_def(), - input_saver_def=input_saver_def, - input_checkpoint=checkpoint_to_use, - output_node_names=output_node_names, - restore_op_name='save/restore_all', - filename_tensor_name='save/Const:0', - clear_devices=True, - optimize_graph=optimize_graph, - initializer_nodes='') - _write_frozen_graph(frozen_graph_path, frozen_graph_def) - _write_saved_model(saved_model_path, frozen_graph_def, - placeholder_tensor, outputs) - - -def export_inference_graph(input_type, - pipeline_config, - trained_checkpoint_prefix, - output_directory, - input_shape=None, - optimize_graph=True, - output_collection_name='inference_op', - additional_output_tensor_names=None): - """Exports inference graph for the model specified in the pipeline config. - - Args: - input_type: Type of input for the graph. Can be one of [`image_tensor`, - `tf_example`]. - pipeline_config: pipeline_pb2.TrainAndEvalPipelineConfig proto. - trained_checkpoint_prefix: Path to the trained checkpoint file. - output_directory: Path to write outputs. - input_shape: Sets a fixed shape for an `image_tensor` input. If not - specified, will default to [None, None, None, 3]. - optimize_graph: Whether to optimize graph using Grappler. - output_collection_name: Name of collection to add output tensors to. - If None, does not add output tensors to a collection. - additional_output_tensor_names: list of additional output - tensors to include in the frozen graph. - """ - detection_model = model_builder.build(pipeline_config.model, - is_training=False) - _export_inference_graph(input_type, detection_model, - pipeline_config.eval_config.use_moving_averages, - trained_checkpoint_prefix, - output_directory, additional_output_tensor_names, - input_shape, optimize_graph, output_collection_name) diff --git a/object_detection/exporter_test.py b/object_detection/exporter_test.py deleted file mode 100644 index 0a999005..00000000 --- a/object_detection/exporter_test.py +++ /dev/null @@ -1,604 +0,0 @@ -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -"""Tests for object_detection.export_inference_graph.""" -import os -import numpy as np -import six -import tensorflow as tf -from object_detection import exporter -from object_detection.builders import model_builder -from object_detection.core import model -from object_detection.protos import pipeline_pb2 - -if six.PY2: - import mock # pylint: disable=g-import-not-at-top -else: - from unittest import mock # pylint: disable=g-import-not-at-top - -slim = tf.contrib.slim - - -class FakeModel(model.DetectionModel): - - def __init__(self, add_detection_masks=False): - self._add_detection_masks = add_detection_masks - - def preprocess(self, inputs): - return tf.identity(inputs) - - def predict(self, preprocessed_inputs): - return {'image': tf.layers.conv2d(preprocessed_inputs, 3, 1)} - - def postprocess(self, prediction_dict): - with tf.control_dependencies(prediction_dict.values()): - postprocessed_tensors = { - 'detection_boxes': tf.constant([[[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.8, 0.8]], - [[0.5, 0.5, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0]]], tf.float32), - 'detection_scores': tf.constant([[0.7, 0.6], - [0.9, 0.0]], tf.float32), - 'detection_classes': tf.constant([[0, 1], - [1, 0]], tf.float32), - 'num_detections': tf.constant([2, 1], tf.float32) - } - if self._add_detection_masks: - postprocessed_tensors['detection_masks'] = tf.constant( - np.arange(64).reshape([2, 2, 4, 4]), tf.float32) - return postprocessed_tensors - - def restore_map(self, checkpoint_path, from_detection_checkpoint): - pass - - def loss(self, prediction_dict): - pass - - -class ExportInferenceGraphTest(tf.test.TestCase): - - def _save_checkpoint_from_mock_model(self, checkpoint_path, - use_moving_averages): - g = tf.Graph() - with g.as_default(): - mock_model = FakeModel() - preprocessed_inputs = mock_model.preprocess( - tf.placeholder(tf.float32, shape=[None, None, None, 3])) - predictions = mock_model.predict(preprocessed_inputs) - mock_model.postprocess(predictions) - if use_moving_averages: - tf.train.ExponentialMovingAverage(0.0).apply() - slim.get_or_create_global_step() - saver = tf.train.Saver() - init = tf.global_variables_initializer() - with self.test_session() as sess: - sess.run(init) - saver.save(sess, checkpoint_path) - - def _load_inference_graph(self, inference_graph_path): - od_graph = tf.Graph() - with od_graph.as_default(): - od_graph_def = tf.GraphDef() - with tf.gfile.GFile(inference_graph_path) as fid: - serialized_graph = fid.read() - od_graph_def.ParseFromString(serialized_graph) - tf.import_graph_def(od_graph_def, name='') - return od_graph - - def _create_tf_example(self, image_array): - with self.test_session(): - encoded_image = tf.image.encode_jpeg(tf.constant(image_array)).eval() - def _bytes_feature(value): - return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) - example = tf.train.Example(features=tf.train.Features(feature={ - 'image/encoded': _bytes_feature(encoded_image), - 'image/format': _bytes_feature('jpg'), - 'image/source_id': _bytes_feature('image_id') - })).SerializeToString() - return example - - def test_export_graph_with_image_tensor_input(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=False) - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel() - output_directory = os.path.join(tmp_dir, 'output') - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='image_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - self.assertTrue(os.path.exists(os.path.join( - output_directory, 'saved_model', 'saved_model.pb'))) - - def test_export_graph_with_fixed_size_image_tensor_input(self): - input_shape = [1, 320, 320, 3] - - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model( - trained_checkpoint_prefix, use_moving_averages=False) - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel() - output_directory = os.path.join(tmp_dir, 'output') - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='image_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory, - input_shape=input_shape) - saved_model_path = os.path.join(output_directory, 'saved_model') - self.assertTrue( - os.path.exists(os.path.join(saved_model_path, 'saved_model.pb'))) - - with tf.Graph().as_default() as od_graph: - with self.test_session(graph=od_graph) as sess: - meta_graph = tf.saved_model.loader.load( - sess, [tf.saved_model.tag_constants.SERVING], saved_model_path) - signature = meta_graph.signature_def['serving_default'] - input_tensor_name = signature.inputs['inputs'].name - image_tensor = od_graph.get_tensor_by_name(input_tensor_name) - self.assertSequenceEqual(image_tensor.get_shape().as_list(), - input_shape) - - def test_export_graph_with_tf_example_input(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=False) - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel() - output_directory = os.path.join(tmp_dir, 'output') - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='tf_example', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - self.assertTrue(os.path.exists(os.path.join( - output_directory, 'saved_model', 'saved_model.pb'))) - - def test_export_graph_with_encoded_image_string_input(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=False) - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel() - output_directory = os.path.join(tmp_dir, 'output') - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='encoded_image_string_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - self.assertTrue(os.path.exists(os.path.join( - output_directory, 'saved_model', 'saved_model.pb'))) - - def _get_variables_in_checkpoint(self, checkpoint_file): - return set([ - var_name - for var_name, _ in tf.train.list_variables(checkpoint_file)]) - - def test_replace_variable_values_with_moving_averages(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - new_checkpoint_prefix = os.path.join(tmp_dir, 'new.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - graph = tf.Graph() - with graph.as_default(): - fake_model = FakeModel() - preprocessed_inputs = fake_model.preprocess( - tf.placeholder(dtype=tf.float32, shape=[None, None, None, 3])) - predictions = fake_model.predict(preprocessed_inputs) - fake_model.postprocess(predictions) - exporter.replace_variable_values_with_moving_averages( - graph, trained_checkpoint_prefix, new_checkpoint_prefix) - - expected_variables = set(['conv2d/bias', 'conv2d/kernel']) - variables_in_old_ckpt = self._get_variables_in_checkpoint( - trained_checkpoint_prefix) - self.assertIn('conv2d/bias/ExponentialMovingAverage', - variables_in_old_ckpt) - self.assertIn('conv2d/kernel/ExponentialMovingAverage', - variables_in_old_ckpt) - variables_in_new_ckpt = self._get_variables_in_checkpoint( - new_checkpoint_prefix) - self.assertTrue(expected_variables.issubset(variables_in_new_ckpt)) - self.assertNotIn('conv2d/bias/ExponentialMovingAverage', - variables_in_new_ckpt) - self.assertNotIn('conv2d/kernel/ExponentialMovingAverage', - variables_in_new_ckpt) - - def test_export_graph_with_moving_averages(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel() - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = True - exporter.export_inference_graph( - input_type='image_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - self.assertTrue(os.path.exists(os.path.join( - output_directory, 'saved_model', 'saved_model.pb'))) - expected_variables = set(['conv2d/bias', 'conv2d/kernel', 'global_step']) - actual_variables = set( - [var_name for var_name, _ in tf.train.list_variables(output_directory)]) - self.assertTrue(expected_variables.issubset(actual_variables)) - - def test_export_model_with_all_output_nodes(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - inference_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - exporter.export_inference_graph( - input_type='image_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - inference_graph = self._load_inference_graph(inference_graph_path) - with self.test_session(graph=inference_graph): - inference_graph.get_tensor_by_name('image_tensor:0') - inference_graph.get_tensor_by_name('detection_boxes:0') - inference_graph.get_tensor_by_name('detection_scores:0') - inference_graph.get_tensor_by_name('detection_classes:0') - inference_graph.get_tensor_by_name('detection_masks:0') - inference_graph.get_tensor_by_name('num_detections:0') - - def test_export_model_with_detection_only_nodes(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - inference_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=False) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - exporter.export_inference_graph( - input_type='image_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - inference_graph = self._load_inference_graph(inference_graph_path) - with self.test_session(graph=inference_graph): - inference_graph.get_tensor_by_name('image_tensor:0') - inference_graph.get_tensor_by_name('detection_boxes:0') - inference_graph.get_tensor_by_name('detection_scores:0') - inference_graph.get_tensor_by_name('detection_classes:0') - inference_graph.get_tensor_by_name('num_detections:0') - with self.assertRaises(KeyError): - inference_graph.get_tensor_by_name('detection_masks:0') - - def test_export_and_run_inference_with_image_tensor(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - inference_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='image_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - - inference_graph = self._load_inference_graph(inference_graph_path) - with self.test_session(graph=inference_graph) as sess: - image_tensor = inference_graph.get_tensor_by_name('image_tensor:0') - boxes = inference_graph.get_tensor_by_name('detection_boxes:0') - scores = inference_graph.get_tensor_by_name('detection_scores:0') - classes = inference_graph.get_tensor_by_name('detection_classes:0') - masks = inference_graph.get_tensor_by_name('detection_masks:0') - num_detections = inference_graph.get_tensor_by_name('num_detections:0') - (boxes_np, scores_np, classes_np, masks_np, num_detections_np) = sess.run( - [boxes, scores, classes, masks, num_detections], - feed_dict={image_tensor: np.ones((2, 4, 4, 3)).astype(np.uint8)}) - self.assertAllClose(boxes_np, [[[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.8, 0.8]], - [[0.5, 0.5, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0]]]) - self.assertAllClose(scores_np, [[0.7, 0.6], - [0.9, 0.0]]) - self.assertAllClose(classes_np, [[1, 2], - [2, 1]]) - self.assertAllClose(masks_np, np.arange(64).reshape([2, 2, 4, 4])) - self.assertAllClose(num_detections_np, [2, 1]) - - def _create_encoded_image_string(self, image_array_np, encoding_format): - od_graph = tf.Graph() - with od_graph.as_default(): - if encoding_format == 'jpg': - encoded_string = tf.image.encode_jpeg(image_array_np) - elif encoding_format == 'png': - encoded_string = tf.image.encode_png(image_array_np) - else: - raise ValueError('Supports only the following formats: `jpg`, `png`') - with self.test_session(graph=od_graph): - return encoded_string.eval() - - def test_export_and_run_inference_with_encoded_image_string_tensor(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - inference_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='encoded_image_string_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - - inference_graph = self._load_inference_graph(inference_graph_path) - jpg_image_str = self._create_encoded_image_string( - np.ones((4, 4, 3)).astype(np.uint8), 'jpg') - png_image_str = self._create_encoded_image_string( - np.ones((4, 4, 3)).astype(np.uint8), 'png') - with self.test_session(graph=inference_graph) as sess: - image_str_tensor = inference_graph.get_tensor_by_name( - 'encoded_image_string_tensor:0') - boxes = inference_graph.get_tensor_by_name('detection_boxes:0') - scores = inference_graph.get_tensor_by_name('detection_scores:0') - classes = inference_graph.get_tensor_by_name('detection_classes:0') - masks = inference_graph.get_tensor_by_name('detection_masks:0') - num_detections = inference_graph.get_tensor_by_name('num_detections:0') - for image_str in [jpg_image_str, png_image_str]: - image_str_batch_np = np.hstack([image_str]* 2) - (boxes_np, scores_np, classes_np, masks_np, - num_detections_np) = sess.run( - [boxes, scores, classes, masks, num_detections], - feed_dict={image_str_tensor: image_str_batch_np}) - self.assertAllClose(boxes_np, [[[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.8, 0.8]], - [[0.5, 0.5, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0]]]) - self.assertAllClose(scores_np, [[0.7, 0.6], - [0.9, 0.0]]) - self.assertAllClose(classes_np, [[1, 2], - [2, 1]]) - self.assertAllClose(masks_np, np.arange(64).reshape([2, 2, 4, 4])) - self.assertAllClose(num_detections_np, [2, 1]) - - def test_raise_runtime_error_on_images_with_different_sizes(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - inference_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='encoded_image_string_tensor', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - - inference_graph = self._load_inference_graph(inference_graph_path) - large_image = self._create_encoded_image_string( - np.ones((4, 4, 3)).astype(np.uint8), 'jpg') - small_image = self._create_encoded_image_string( - np.ones((2, 2, 3)).astype(np.uint8), 'jpg') - - image_str_batch_np = np.hstack([large_image, small_image]) - with self.test_session(graph=inference_graph) as sess: - image_str_tensor = inference_graph.get_tensor_by_name( - 'encoded_image_string_tensor:0') - boxes = inference_graph.get_tensor_by_name('detection_boxes:0') - scores = inference_graph.get_tensor_by_name('detection_scores:0') - classes = inference_graph.get_tensor_by_name('detection_classes:0') - masks = inference_graph.get_tensor_by_name('detection_masks:0') - num_detections = inference_graph.get_tensor_by_name('num_detections:0') - with self.assertRaisesRegexp(tf.errors.InvalidArgumentError, - '^TensorArray has inconsistent shapes.'): - sess.run([boxes, scores, classes, masks, num_detections], - feed_dict={image_str_tensor: image_str_batch_np}) - - def test_export_and_run_inference_with_tf_example(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=True) - output_directory = os.path.join(tmp_dir, 'output') - inference_graph_path = os.path.join(output_directory, - 'frozen_inference_graph.pb') - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='tf_example', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - - inference_graph = self._load_inference_graph(inference_graph_path) - tf_example_np = np.expand_dims(self._create_tf_example( - np.ones((4, 4, 3)).astype(np.uint8)), axis=0) - with self.test_session(graph=inference_graph) as sess: - tf_example = inference_graph.get_tensor_by_name('tf_example:0') - boxes = inference_graph.get_tensor_by_name('detection_boxes:0') - scores = inference_graph.get_tensor_by_name('detection_scores:0') - classes = inference_graph.get_tensor_by_name('detection_classes:0') - masks = inference_graph.get_tensor_by_name('detection_masks:0') - num_detections = inference_graph.get_tensor_by_name('num_detections:0') - (boxes_np, scores_np, classes_np, masks_np, num_detections_np) = sess.run( - [boxes, scores, classes, masks, num_detections], - feed_dict={tf_example: tf_example_np}) - self.assertAllClose(boxes_np, [[[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.8, 0.8]], - [[0.5, 0.5, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0]]]) - self.assertAllClose(scores_np, [[0.7, 0.6], - [0.9, 0.0]]) - self.assertAllClose(classes_np, [[1, 2], - [2, 1]]) - self.assertAllClose(masks_np, np.arange(64).reshape([2, 2, 4, 4])) - self.assertAllClose(num_detections_np, [2, 1]) - - def test_export_saved_model_and_run_inference(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=False) - output_directory = os.path.join(tmp_dir, 'output') - saved_model_path = os.path.join(output_directory, 'saved_model') - - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='tf_example', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - - tf_example_np = np.hstack([self._create_tf_example( - np.ones((4, 4, 3)).astype(np.uint8))] * 2) - with tf.Graph().as_default() as od_graph: - with self.test_session(graph=od_graph) as sess: - meta_graph = tf.saved_model.loader.load( - sess, [tf.saved_model.tag_constants.SERVING], saved_model_path) - - signature = meta_graph.signature_def['serving_default'] - input_tensor_name = signature.inputs['inputs'].name - tf_example = od_graph.get_tensor_by_name(input_tensor_name) - - boxes = od_graph.get_tensor_by_name( - signature.outputs['detection_boxes'].name) - scores = od_graph.get_tensor_by_name( - signature.outputs['detection_scores'].name) - classes = od_graph.get_tensor_by_name( - signature.outputs['detection_classes'].name) - masks = od_graph.get_tensor_by_name( - signature.outputs['detection_masks'].name) - num_detections = od_graph.get_tensor_by_name( - signature.outputs['num_detections'].name) - - (boxes_np, scores_np, classes_np, masks_np, - num_detections_np) = sess.run( - [boxes, scores, classes, masks, num_detections], - feed_dict={tf_example: tf_example_np}) - self.assertAllClose(boxes_np, [[[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.8, 0.8]], - [[0.5, 0.5, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0]]]) - self.assertAllClose(scores_np, [[0.7, 0.6], - [0.9, 0.0]]) - self.assertAllClose(classes_np, [[1, 2], - [2, 1]]) - self.assertAllClose(masks_np, np.arange(64).reshape([2, 2, 4, 4])) - self.assertAllClose(num_detections_np, [2, 1]) - - def test_export_checkpoint_and_run_inference(self): - tmp_dir = self.get_temp_dir() - trained_checkpoint_prefix = os.path.join(tmp_dir, 'model.ckpt') - self._save_checkpoint_from_mock_model(trained_checkpoint_prefix, - use_moving_averages=False) - output_directory = os.path.join(tmp_dir, 'output') - model_path = os.path.join(output_directory, 'model.ckpt') - meta_graph_path = model_path + '.meta' - - with mock.patch.object( - model_builder, 'build', autospec=True) as mock_builder: - mock_builder.return_value = FakeModel(add_detection_masks=True) - pipeline_config = pipeline_pb2.TrainEvalPipelineConfig() - pipeline_config.eval_config.use_moving_averages = False - exporter.export_inference_graph( - input_type='tf_example', - pipeline_config=pipeline_config, - trained_checkpoint_prefix=trained_checkpoint_prefix, - output_directory=output_directory) - - tf_example_np = np.hstack([self._create_tf_example( - np.ones((4, 4, 3)).astype(np.uint8))] * 2) - with tf.Graph().as_default() as od_graph: - with self.test_session(graph=od_graph) as sess: - new_saver = tf.train.import_meta_graph(meta_graph_path) - new_saver.restore(sess, model_path) - - tf_example = od_graph.get_tensor_by_name('tf_example:0') - boxes = od_graph.get_tensor_by_name('detection_boxes:0') - scores = od_graph.get_tensor_by_name('detection_scores:0') - classes = od_graph.get_tensor_by_name('detection_classes:0') - masks = od_graph.get_tensor_by_name('detection_masks:0') - num_detections = od_graph.get_tensor_by_name('num_detections:0') - (boxes_np, scores_np, classes_np, masks_np, - num_detections_np) = sess.run( - [boxes, scores, classes, masks, num_detections], - feed_dict={tf_example: tf_example_np}) - self.assertAllClose(boxes_np, [[[0.0, 0.0, 0.5, 0.5], - [0.5, 0.5, 0.8, 0.8]], - [[0.5, 0.5, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0]]]) - self.assertAllClose(scores_np, [[0.7, 0.6], - [0.9, 0.0]]) - self.assertAllClose(classes_np, [[1, 2], - [2, 1]]) - self.assertAllClose(masks_np, np.arange(64).reshape([2, 2, 4, 4])) - self.assertAllClose(num_detections_np, [2, 1]) - - -if __name__ == '__main__': - tf.test.main() diff --git a/object_detection/faster_rcnn_inception_resnet_v2_atrous_oid.config b/object_detection/faster_rcnn_inception_resnet_v2_atrous_oid.config deleted file mode 100644 index 6f9a275e..00000000 --- a/object_detection/faster_rcnn_inception_resnet_v2_atrous_oid.config +++ /dev/null @@ -1,146 +0,0 @@ -# Faster R-CNN with Inception Resnet v2, Atrous version; -# Configured for Open Images Dataset. -# Users should configure the fine_tune_checkpoint field in the train config as -# well as the label_map_path and input_path fields in the train_input_reader and -# eval_input_reader. Search for "PATH_TO_BE_CONFIGURED" to find the fields that -# should be configured. - -model { - faster_rcnn { - num_classes: 546 - image_resizer { - keep_aspect_ratio_resizer { - min_dimension: 600 - max_dimension: 1024 - } - } - feature_extractor { - type: 'faster_rcnn_inception_resnet_v2' - first_stage_features_stride: 8 - } - first_stage_anchor_generator { - grid_anchor_generator { - scales: [0.25, 0.5, 1.0, 2.0] - aspect_ratios: [0.5, 1.0, 2.0] - height_stride: 8 - width_stride: 8 - } - } - first_stage_atrous_rate: 2 - first_stage_box_predictor_conv_hyperparams { - op: CONV - regularizer { - l2_regularizer { - weight: 0.0 - } - } - initializer { - truncated_normal_initializer { - stddev: 0.01 - } - } - } - first_stage_nms_score_threshold: 0.0 - first_stage_nms_iou_threshold: 0.7 - first_stage_max_proposals: 300 - first_stage_localization_loss_weight: 2.0 - first_stage_objectness_loss_weight: 1.0 - initial_crop_size: 17 - maxpool_kernel_size: 1 - maxpool_stride: 1 - second_stage_box_predictor { - mask_rcnn_box_predictor { - use_dropout: false - dropout_keep_probability: 1.0 - fc_hyperparams { - op: FC - regularizer { - l2_regularizer { - weight: 0.0 - } - } - initializer { - variance_scaling_initializer { - factor: 1.0 - uniform: true - mode: FAN_AVG - } - } - } - } - } - second_stage_post_processing { - batch_non_max_suppression { - score_threshold: 0.0 - iou_threshold: 0.6 - max_detections_per_class: 100 - max_total_detections: 100 - } - score_converter: SOFTMAX - } - second_stage_localization_loss_weight: 2.0 - second_stage_classification_loss_weight: 1.0 - } -} - -train_config: { - batch_size: 1 - optimizer { - momentum_optimizer: { - learning_rate: { - manual_step_learning_rate { - initial_learning_rate: 0.00006 - schedule { - step: 0 - learning_rate: .00006 - } - schedule { - step: 6000000 - learning_rate: .000006 - } - schedule { - step: 7000000 - learning_rate: .0000006 - } - } - } - momentum_optimizer_value: 0.9 - } - use_moving_average: false - } - gradient_clipping_by_norm: 10.0 - fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt" - # Note: The below line limits the training process to 800K steps, which we - # empirically found to be sufficient enough to train the Open Images dataset. - # This effectively bypasses the learning rate schedule (the learning rate will - # never decay). Remove the below line to train indefinitely. - num_steps: 8000000 - data_augmentation_options { - random_horizontal_flip { - } - } -} - -train_input_reader: { - tf_record_input_reader { - input_path: "PATH_TO_BE_CONFIGURED/oid_bbox_trainable_train.record" - } - label_map_path: "PATH_TO_BE_CONFIGURED/oid_bbox_trainable_label_map.pbtxt" -} - -eval_config: { - metrics_set: "open_images_metrics" - num_examples: 8000 - # Note: The below line limits the evaluation process to 10 evaluations. - # Remove the below line to evaluate indefinitely. - max_evals: 10 -} - -eval_input_reader: { - tf_record_input_reader { - input_path: "PATH_TO_BE_CONFIGURED/oid_bbox_trainable_val.record" - } - label_map_path: "PATH_TO_BE_CONFIGURED/oid_bbox_trainable_label_map.pbtxt" - shuffle: false - num_readers: 1 -} diff --git a/object_detection/g3doc/configuring_jobs.md b/object_detection/g3doc/configuring_jobs.md deleted file mode 100644 index 78f77bc4..00000000 --- a/object_detection/g3doc/configuring_jobs.md +++ /dev/null @@ -1,162 +0,0 @@ -# Configuring the Object Detection Training Pipeline - -## Overview - -The Tensorflow Object Detection API uses protobuf files to configure the -training and evaluation process. The schema for the training pipeline can be -found in object_detection/protos/pipeline.proto. At a high level, the config -file is split into 5 parts: - -1. The `model` configuration. This defines what type of model will be trained -(ie. meta-architecture, feature extractor). -2. The `train_config`, which decides what parameters should be used to train -model parameters (ie. SGD parameters, input preprocessing and feature extractor -initialization values). -3. The `eval_config`, which determines what set of metrics will be reported for -evaluation (currently we only support the PASCAL VOC metrics). -4. The `train_input_config`, which defines what dataset the model should be -trained on. -5. The `eval_input_config`, which defines what dataset the model will be -evaluated on. Typically this should be different than the training input -dataset. - -A skeleton configuration file is shown below: - -``` -model { -(... Add model config here...) -} - -train_config : { -(... Add train_config here...) -} - -train_input_reader: { -(... Add train_input configuration here...) -} - -eval_config: { -} - -eval_input_reader: { -(... Add eval_input configuration here...) -} -``` - -## Picking Model Parameters - -There are a large number of model parameters to configure. The best settings -will depend on your given application. Faster R-CNN models are better suited to -cases where high accuracy is desired and latency is of lower priority. -Conversely, if processing time is the most important factor, SSD models are -recommended. Read [our paper](https://arxiv.org/abs/1611.10012) for a more -detailed discussion on the speed vs accuracy tradeoff. - -To help new users get started, sample model configurations have been provided -in the object_detection/samples/model_configs folder. The contents of these -configuration files can be pasted into `model` field of the skeleton -configuration. Users should note that the `num_classes` field should be changed -to a value suited for the dataset the user is training on. - -## Defining Inputs - -The Tensorflow Object Detection API accepts inputs in the TFRecord file format. -Users must specify the locations of both the training and evaluation files. -Additionally, users should also specify a label map, which define the mapping -between a class id and class name. The label map should be identical between -training and evaluation datasets. - -An example input configuration looks as follows: - -``` -tf_record_input_reader { - input_path: "/usr/home/username/data/train.record" -} -label_map_path: "/usr/home/username/data/label_map.pbtxt" -``` - -Users should substitute the `input_path` and `label_map_path` arguments and -insert the input configuration into the `train_input_reader` and -`eval_input_reader` fields in the skeleton configuration. Note that the paths -can also point to Google Cloud Storage buckets (ie. -"gs://project_bucket/train.record") for use on Google Cloud. - -## Configuring the Trainer - -The `train_config` defines parts of the training process: - -1. Model parameter initialization. -2. Input preprocessing. -3. SGD parameters. - -A sample `train_config` is below: - -``` -batch_size: 1 -optimizer { - momentum_optimizer: { - learning_rate: { - manual_step_learning_rate { - initial_learning_rate: 0.0002 - schedule { - step: 0 - learning_rate: .0002 - } - schedule { - step: 900000 - learning_rate: .00002 - } - schedule { - step: 1200000 - learning_rate: .000002 - } - } - } - momentum_optimizer_value: 0.9 - } - use_moving_average: false -} -fine_tune_checkpoint: "/usr/home/username/tmp/model.ckpt-#####" -from_detection_checkpoint: true -gradient_clipping_by_norm: 10.0 -data_augmentation_options { - random_horizontal_flip { - } -} -``` - -### Model Parameter Initialization - -While optional, it is highly recommended that users utilize other object -detection checkpoints. Training an object detector from scratch can take days. -To speed up the training process, it is recommended that users re-use the -feature extractor parameters from a pre-existing object classification or -detection checkpoint. `train_config` provides two fields to specify -pre-existing checkpoints: `fine_tune_checkpoint` and -`from_detection_checkpoint`. `fine_tune_checkpoint` should provide a path to -the pre-existing checkpoint -(ie:"/usr/home/username/checkpoint/model.ckpt-#####"). -`from_detection_checkpoint` is a boolean value. If false, it assumes the -checkpoint was from an object classification checkpoint. Note that starting -from a detection checkpoint will usually result in a faster training job than -a classification checkpoint. - -The list of provided checkpoints can be found [here](detection_model_zoo.md). - -### Input Preprocessing - -The `data_augmentation_options` in `train_config` can be used to specify -how training data can be modified. This field is optional. - -### SGD Parameters - -The remainings parameters in `train_config` are hyperparameters for gradient -descent. Please note that the optimal learning rates provided in these -configuration files may depend on the specifics of the training setup (e.g. -number of workers, gpu type). - -## Configuring the Evaluator - -Currently evaluation is fixed to generating metrics as defined by the PASCAL VOC -challenge. The parameters for `eval_config` are set to reasonable defaults and -typically do not need to be configured. diff --git a/object_detection/g3doc/defining_your_own_model.md b/object_detection/g3doc/defining_your_own_model.md deleted file mode 100644 index 865f6af1..00000000 --- a/object_detection/g3doc/defining_your_own_model.md +++ /dev/null @@ -1,137 +0,0 @@ -# So you want to create a new model! - -In this section, we discuss some of the abstractions that we use -for defining detection models. If you would like to define a new model -architecture for detection and use it in the Tensorflow Detection API, -then this section should also serve as a high level guide to the files that you -will need to edit to get your new model working. - -## DetectionModels (`object_detection/core/model.py`) - -In order to be trained, evaluated, and exported for serving using our -provided binaries, all models under the Tensorflow Object Detection API must -implement the `DetectionModel` interface (see the full definition in `object_detection/core/model.py`). In particular, -each of these models are responsible for implementing 5 functions: - -* `preprocess`: Run any preprocessing (e.g., scaling/shifting/reshaping) of - input values that is necessary prior to running the detector on an input - image. -* `predict`: Produce “raw” prediction tensors that can be passed to loss or - postprocess functions. -* `postprocess`: Convert predicted output tensors to final detections. -* `loss`: Compute scalar loss tensors with respect to provided groundtruth. -* `restore`: Load a checkpoint into the Tensorflow graph. - -Given a `DetectionModel` at training time, we pass each image batch through -the following sequence of functions to compute a loss which can be optimized via -SGD: - -``` -inputs (images tensor) -> preprocess -> predict -> loss -> outputs (loss tensor) -``` - -And at eval time, we pass each image batch through the following sequence of -functions to produce a set of detections: - -``` -inputs (images tensor) -> preprocess -> predict -> postprocess -> - outputs (boxes tensor, scores tensor, classes tensor, num_detections tensor) -``` - -Some conventions to be aware of: - -* `DetectionModel`s should make no assumptions about the input size or aspect - ratio --- they are responsible for doing any resize/reshaping necessary - (see docstring for the `preprocess` function). -* Output classes are always integers in the range `[0, num_classes)`. - Any mapping of these integers to semantic labels is to be handled outside - of this class. We never explicitly emit a “background class” --- thus 0 is - the first non-background class and any logic of predicting and removing - implicit background classes must be handled internally by the implementation. -* Detected boxes are to be interpreted as being in - `[y_min, x_min, y_max, x_max]` format and normalized relative to the - image window. -* We do not specifically assume any kind of probabilistic interpretation of the - scores --- the only important thing is their relative ordering. Thus - implementations of the postprocess function are free to output logits, - probabilities, calibrated probabilities, or anything else. - -## Defining a new Faster R-CNN or SSD Feature Extractor - -In most cases, you probably will not implement a `DetectionModel` from scratch ---- instead you might create a new feature extractor to be used by one of the -SSD or Faster R-CNN meta-architectures. (We think of meta-architectures as -classes that define entire families of models using the `DetectionModel` -abstraction). - -Note: For the following discussion to make sense, we recommend first becoming -familiar with the [Faster R-CNN](https://arxiv.org/abs/1506.01497) paper. - -Let’s now imagine that you have invented a brand new network architecture -(say, “InceptionV100”) for classification and want to see how InceptionV100 -would behave as a feature extractor for detection (say, with Faster R-CNN). -A similar procedure would hold for SSD models, but we’ll discuss Faster R-CNN. - -To use InceptionV100, we will have to define a new -`FasterRCNNFeatureExtractor` and pass it to our `FasterRCNNMetaArch` -constructor as input. See -`object_detection/meta_architectures/faster_rcnn_meta_arch.py` for definitions -of `FasterRCNNFeatureExtractor` and `FasterRCNNMetaArch`, respectively. -A `FasterRCNNFeatureExtractor` must define a few -functions: - -* `preprocess`: Run any preprocessing of input values that is necessary prior - to running the detector on an input image. -* `_extract_proposal_features`: Extract first stage Region Proposal Network - (RPN) features. -* `_extract_box_classifier_features`: Extract second stage Box Classifier - features. -* `restore_from_classification_checkpoint_fn`: Load a checkpoint into the - Tensorflow graph. - -See the `object_detection/models/faster_rcnn_resnet_v1_feature_extractor.py` -definition as one example. Some remarks: - -* We typically initialize the weights of this feature extractor - using those from the - [Slim Resnet-101 classification checkpoint](https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models), - and we know - that images were preprocessed when training this checkpoint - by subtracting a channel mean from each input - image. Thus, we implement the preprocess function to replicate the same - channel mean subtraction behavior. -* The “full” resnet classification network defined in slim is cut into two - parts --- all but the last “resnet block” is put into the - `_extract_proposal_features` function and the final block is separately - defined in the `_extract_box_classifier_features function`. In general, - some experimentation may be required to decide on an optimal layer at - which to “cut” your feature extractor into these two pieces for Faster R-CNN. - -## Register your model for configuration - -Assuming that your new feature extractor does not require nonstandard -configuration, you will want to ideally be able to simply change the -“feature_extractor.type” fields in your configuration protos to point to a -new feature extractor. In order for our API to know how to understand this -new type though, you will first have to register your new feature -extractor with the model builder (`object_detection/builders/model_builder.py`), -whose job is to create models from config protos.. - -Registration is simple --- just add a pointer to the new Feature Extractor -class that you have defined in one of the SSD or Faster R-CNN Feature -Extractor Class maps at the top of the -`object_detection/builders/model_builder.py` file. -We recommend adding a test in `object_detection/builders/model_builder_test.py` -to make sure that parsing your proto will work as expected. - -## Taking your new model for a spin - -After registration you are ready to go with your model! Some final tips: - -* To save time debugging, try running your configuration file locally first - (both training and evaluation). -* Do a sweep of learning rates to figure out which learning rate is best - for your model. -* A small but often important detail: you may find it necessary to disable - batchnorm training (that is, load the batch norm parameters from the - classification checkpoint, but do not update them during gradient descent). diff --git a/object_detection/g3doc/detection_model_zoo.md b/object_detection/g3doc/detection_model_zoo.md deleted file mode 100644 index d6d31e0d..00000000 --- a/object_detection/g3doc/detection_model_zoo.md +++ /dev/null @@ -1,101 +0,0 @@ -# Tensorflow detection model zoo - -We provide a collection of detection models pre-trained on the [COCO -dataset](http://mscoco.org), the [Kitti dataset](http://www.cvlibs.net/datasets/kitti/), and the -[Open Images dataset](https://github.com/openimages/dataset). These models can -be useful for -out-of-the-box inference if you are interested in categories already in COCO -(e.g., humans, cars, etc) or in Open Images (e.g., -surfboard, jacuzzi, etc). They are also useful for initializing your models when -training on novel datasets. - -In the table below, we list each such pre-trained model including: - -* a model name that corresponds to a config file that was used to train this - model in the `samples/configs` directory, -* a download link to a tar.gz file containing the pre-trained model, -* model speed --- we report running time in ms per 600x600 image (including all - pre and post-processing), but please be - aware that these timings depend highly on one's specific hardware - configuration (these timings were performed using an Nvidia - GeForce GTX TITAN X card) and should be treated more as relative timings in - many cases. -* detector performance on subset of the COCO validation set or Open Images test split as measured by the dataset-specific mAP measure. - Here, higher is better, and we only report bounding box mAP rounded to the - nearest integer. -* Output types (currently only `Boxes`) - -You can un-tar each tar.gz file via, e.g.,: - -``` -tar -xzvf ssd_mobilenet_v1_coco.tar.gz -``` - -Inside the un-tar'ed directory, you will find: - -* a graph proto (`graph.pbtxt`) -* a checkpoint - (`model.ckpt.data-00000-of-00001`, `model.ckpt.index`, `model.ckpt.meta`) -* a frozen graph proto with weights baked into the graph as constants - (`frozen_inference_graph.pb`) to be used for out of the box inference - (try this out in the Jupyter notebook!) -* a config file (`pipeline.config`) which was used to generate the graph. These - directly correspond to a config file in the - [samples/configs](https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs)) directory but often with a modified score threshold. In the case - of the heavier Faster R-CNN models, we also provide a version of the model - that uses a highly reduced number of proposals for speed. - -Some remarks on frozen inference graphs: - -* If you try to evaluate the frozen graph, you may find performance numbers for - some of the models to be slightly lower than what we report in the below - tables. This is because we discard detections with scores below a - threshold (typically 0.3) when creating the frozen graph. This corresponds - effectively to picking a point on the precision recall curve of - a detector (and discarding the part past that point), which negatively impacts - standard mAP metrics. -* Our frozen inference graphs are generated using the - [v1.4.0](https://github.com/tensorflow/tensorflow/tree/v1.4.0) - release version of Tensorflow and we do not guarantee that these will work - with other versions; this being said, each frozen inference graph can be - regenerated using your current version of Tensorflow by re-running the - [exporter](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/exporting_models.md), - pointing it at the model directory as well as the config file inside of it. - - -## COCO-trained models {#coco-models} - -| Model name | Speed (ms) | COCO mAP[^1] | Outputs | -| ------------ | :--------------: | :--------------: | :-------------: | -| [ssd_mobilenet_v1_coco](http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz) | 30 | 21 | Boxes | -| [ssd_inception_v2_coco](http://download.tensorflow.org/models/object_detection/ssd_inception_v2_coco_2017_11_17.tar.gz) | 42 | 24 | Boxes | -| [faster_rcnn_inception_v2_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2017_11_08.tar.gz) | 58 | 28 | Boxes | -| [faster_rcnn_resnet50_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet50_coco_2017_11_08.tar.gz) | 89 | 30 | Boxes | -| [faster_rcnn_resnet50_lowproposals_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet50_lowproposals_coco_2017_11_08.tar.gz) | 64 | | Boxes | -| [rfcn_resnet101_coco](http://download.tensorflow.org/models/object_detection/rfcn_resnet101_coco_2017_11_08.tar.gz) | 92 | 30 | Boxes | -| [faster_rcnn_resnet101_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_2017_11_08.tar.gz) | 106 | 32 | Boxes | -| [faster_rcnn_resnet101_lowproposals_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_lowproposals_coco_2017_11_08.tar.gz) | 82 | | Boxes | -| [faster_rcnn_inception_resnet_v2_atrous_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_resnet_v2_atrous_coco_2017_11_08.tar.gz) | 620 | 37 | Boxes | -| [faster_rcnn_inception_resnet_v2_atrous_lowproposals_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_resnet_v2_atrous_lowproposals_coco_2017_11_08.tar.gz) | 241 | | Boxes | -| [faster_rcnn_nas](http://download.tensorflow.org/models/object_detection/faster_rcnn_nas_coco_2017_11_08.tar.gz) | 1833 | 43 | Boxes | -| [faster_rcnn_nas_lowproposals_coco](http://download.tensorflow.org/models/object_detection/faster_rcnn_nas_lowproposals_coco_2017_11_08.tar.gz) | 540 | | Boxes | - - - -## Kitti-trained models {#kitti-models} - -Model name | Speed (ms) | Pascal mAP@0.5 (ms) | Outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---: | :-------------: | :-----: -[faster_rcnn_resnet101_kitti](http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_kitti_2017_11_08.tar.gz) | 79 | 87 | Boxes - -## Open Images-trained models {#open-images-models} - -Model name | Speed (ms) | Open Images mAP@0.5[^2] | Outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---: | :-------------: | :-----: -[faster_rcnn_inception_resnet_v2_atrous_oid](http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_resnet_v2_atrous_oid_2017_11_08.tar.gz) | 727 | 37 | Boxes -[faster_rcnn_inception_resnet_v2_atrous_lowproposals_oid](http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_resnet_v2_atrous_lowproposals_oid_2017_11_08.tar.gz) | 347 | | Boxes - - -[^1]: See [MSCOCO evaluation protocol](http://cocodataset.org/#detections-eval). -[^2]: This is PASCAL mAP with a slightly different way of true positives computation: see [Open Images evaluation protocol](evaluation_protocols.md#open-images). - diff --git a/object_detection/g3doc/evaluation_protocols.md b/object_detection/g3doc/evaluation_protocols.md deleted file mode 100644 index 033a1adf..00000000 --- a/object_detection/g3doc/evaluation_protocols.md +++ /dev/null @@ -1,94 +0,0 @@ -# Supported object detection evaluation protocols - -The Tensorflow Object Detection API currently supports three evaluation protocols, -that can be configured in `EvalConfig` by setting `metrics_set` to the -corresponding value. - -## PASCAL VOC 2007 metric - -`EvalConfig.metrics_set='pascal_voc_metrics'` - -The commonly used mAP metric for evaluating the quality of object detectors, computed according to the protocol of the PASCAL VOC Challenge 2007. -The protocol is available [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2007/devkit_doc_07-Jun-2007.pdf). - - -## Weighted PASCAL VOC metric - -`EvalConfig.metrics_set='weighted_pascal_voc_metrics'` - -The weighted PASCAL metric computes the mean average precision as the average -precision when treating all classes as a single class. In comparison, -PASCAL metrics computes the mean average precision as the mean of the -per-class average precisions. - -For example, the test set consists of two classes, "cat" and "dog", and there are ten times more boxes of "cat" than those of "dog". -According to PASCAL VOC 2007 metric, performance on each of the two classes would contribute equally towards the final mAP value, -while for the Weighted PASCAL VOC metric the final mAP value will be influenced by frequency of each class. - -## Open Images metric {#open-images} - -`EvalConfig.metrics_set='open_images_metrics'` - -This metric is defined originally for evaluating detector performance on [Open Images V2 dataset](https://github.com/openimages/dataset) -and is fairly similar to the PASCAL VOC 2007 metric mentioned above. -It computes interpolated average precision (AP) for each class and averages it among all classes (mAP). - -The difference to the PASCAL VOC 2007 metric is the following: Open Images -annotations contain `group-of` ground-truth boxes (see [Open Images data -description](https://github.com/openimages/dataset#annotations-human-bboxcsv)), -that are treated differently for the purpose of deciding whether detections are -"true positives", "ignored", "false positives". Here we define these three -cases: - -A detection is a "true positive" if there is a non-group-of ground-truth box, -such that: - -* The detection box and the ground-truth box are of the same class, and - intersection-over-union (IoU) between the detection box and the ground-truth - box is greater than the IoU threshold (default value 0.5). \ - Illustration of handling non-group-of boxes: \ - ![alt - groupof_case_eval](img/nongroupof_case_eval.png "illustration of handling non-group-of boxes: yellow box - ground truth bounding box; green box - true positive; red box - false positives."){width="500" height="270"} - - * yellow box - ground-truth box; - * green box - true positive; - * red boxes - false positives. - -* This is the highest scoring detection for this ground truth box that - satisfies the criteria above. - -A detection is "ignored" if it is not a true positive, and there is a `group-of` -ground-truth box such that: - -* The detection box and the ground-truth box are of the same class, and the - area of intersection between the detection box and the ground-truth box - divided by the area of the detection is greater than 0.5. This is intended - to measure whether the detection box is approximately inside the group-of - ground-truth box. \ - Illustration of handling `group-of` boxes: \ - ![alt - groupof_case_eval](img/groupof_case_eval.png "illustration of handling group-of boxes: yellow box - ground truth bounding box; grey boxes - two detections of cars, that are ignored; red box - false positive."){width="500" height="270"} - - * yellow box - ground-truth box; - * grey boxes - two detections on cars, that are ignored; - * red box - false positive. - -A detection is a "false positive" if it is neither a "true positive" nor -"ignored". - -Precision and recall are defined as: - -* Precision = number-of-true-positives/(number-of-true-positives + number-of-false-positives) -* Recall = number-of-true-positives/number-of-non-group-of-boxes - -Note that detections ignored as firing on a `group-of` ground-truth box do not -contribute to the number of true positives. - -The labels in Open Images are organized in a -[hierarchy](https://storage.googleapis.com/openimages/2017_07/bbox_labels_vis/bbox_labels_vis.html). -Ground-truth bounding-boxes are annotated with the most specific class available -in the hierarchy. For example, "car" has two children "limousine" and "van". Any -other kind of car is annotated as "car" (for example, a sedan). Given this -convention, the evaluation software treats all classes independently, ignoring -the hierarchy. To achieve high performance values, object detectors should -output bounding-boxes labelled in the same manner. diff --git a/object_detection/g3doc/exporting_models.md b/object_detection/g3doc/exporting_models.md deleted file mode 100644 index 2da97908..00000000 --- a/object_detection/g3doc/exporting_models.md +++ /dev/null @@ -1,22 +0,0 @@ -# Exporting a trained model for inference - -After your model has been trained, you should export it to a Tensorflow -graph proto. A checkpoint will typically consist of three files: - -* model.ckpt-${CHECKPOINT_NUMBER}.data-00000-of-00001, -* model.ckpt-${CHECKPOINT_NUMBER}.index -* model.ckpt-${CHECKPOINT_NUMBER}.meta - -After you've identified a candidate checkpoint to export, run the following -command from tensorflow/models/research/: - -``` bash -# From tensorflow/models/research/ -python object_detection/export_inference_graph.py \ - --input_type image_tensor \ - --pipeline_config_path ${PIPELINE_CONFIG_PATH} \ - --trained_checkpoint_prefix ${TRAIN_PATH} \ - --output_directory output_inference_graph.pb -``` - -Afterwards, you should see a graph named output_inference_graph.pb. diff --git a/object_detection/g3doc/img/dogs_detections_output.jpg b/object_detection/g3doc/img/dogs_detections_output.jpg deleted file mode 100644 index 9e88a7010fa90f5c4a74f6caee78f5c975f77e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372894 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
    sjYXQID<)38 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νdgK;AU{OM9%y) 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�V`*B&}JIse0-GP_4pz`4?vD1^D3?m zcy>nGEFxpu?qX{I_e6>Dm30xu6c&n@4Ud1nZl;--f#;j1e9pvp&(_1(p`J4ZQ7IF{ zn3Y6G6EnhRiheZkPXzGK4A)p+0_)}1W@qI>MyyZjL5_C+0P#627~A%VlfyuYrvX4| zN?@p!*AWcXG=Gdwkg<9<8AALsscN@gOK8ifire~6U!wbWcG?*U2XJRkX zKm-wAST2FYUgon&tRghFUF<8~C4D!*e^FcI=D#!hHa{vX$zg(j=iZpTa^q zY~y0G%Sqi-!rCD`hCD?hdVYFoDm0lk(u&a|i`^2{s%b2}D`2_WO)@|4G zU+Y=eZ;7B`oI60_*1y>w6Um9bW$r@$PiFJ0^O!{SP$F|EuX^HV+i1WUk8DD)ti&RBH+XI_InE05i@|gcn2`X3sINDh!qUk7 z$4K<|U2)hT;&=VejtO4P^v|*6Y3?gU#;fzZ2MUmp?=03K1Ad` zCp(*@z00|u$|uT^fl=C1R7#>JO0hnVUdGcIvTa_m9Y~hE@&%r6lieHb*iJ%s(U(<| zt_tO4T#Qa9CwQE~u{}hfZhGw8@`3s8;_h=PyVT3Y=2%bWWD8!!PI;&|s27Kv;(w{M zPfig21!s|;G7E*Ii26+G*;cmmPA^uJ9oGxHT=lGw~zogf1QPWlPylic`Snt&= z?H3^Fi1>`qA!rfigALCy%z{2)uk0uczU=L`!N0&O$-Syh?7drCF4u)^sLw3d4~$ z_GOw)Oj)eNFvoeho6N;9Kp@66%m_qSgK6P`AXpdKq3$wfctM(JF1Hh(&+h9yg}u=; zD@n#l#z|Vl5mJ3dn2j+VeVe(;e6f7R`89-twBIq*vR6*($Z>5$IQWL@yR?;FO!EzO z4>#2dtpTNI~7{&x6^{HDGrm_&?Y3DoP^dVu?KGoz`U!I+te?R7$O zc>XrBe)RFU`vFd~2XFH6j5>7uw^FwjjcoEw54D=a=|&-fkv|z{<4V(6TBO!^?8wiz z^P)nL)XgTQV9w?ttV2{Zh}4K_$F?TM28v?55MnL_%vcAuVQAj`j!LBGdXTbN@-NhH zyg(u>sV5emsjm{Wh>$Kl)?gW-mV9G@3xO@^jlUi{46y{b=>3a|gpQ%v>*mB)t+Q>9}Wi= zfl_sm>|vRUgFGU51k)2AEK6xDN@9MncO8s5!5aHrPUDV+IX}h@3zcSE!1H{Lo@xYY z_6=UMP-c*Qu-IvcE7}^&T6QVK5o%?dP1iNtCzM6jd;$0wuWXQ0yztFT8J}~gYRvI= z$qaKCh_Rh$7Fp zOmA(y+v$g5a<+!g?bdS{#Qs@KQS4*1J+(-=b6Bl4BFnX&X-k~%3uXyY2=o&;^|CP# zAeu^en=0{@7U#g^jb6>#B`p9cHX>|YU({J5a^2^fd8jjyUMTeSEp-RLY38ena6z6o ziE%=XFMBT=enV`J>_lm#Ow7)Ywv$NUODgZj0%9`zILya*oUxdU3Qo-eS2B zY`bKfUy!Ga6bg!1{{Xig&R4(oHJU+uTO!(!TCs*^f?Z$7Ph%VCz9U*EE1QYPBS`N%;B(BnX10npFTvqR$*qU|G1I zaIDsMl}yhJE2O|_q#%Pd4Gn!7qtzOz;E6;^;w=6nLm2hRyF})4OS9am74VELF#ex@N=tkASj zV{x)8t@B9l!VJ^2Qj@oXuvg4bRi-Iq&w zIFE5L*up)jeI;D28lGUDMQM(_csfE1R)+=-js^&bf@c$W*>JS9)34(Z2e<1wn}apl zV_EStN!WtHk1|gnpB9*n87EVy(DyYEB+?IU@jSD5>1ZV*I68hLJpIrBwvw zAzm+{{{ZUoc4_$+M7NrV2<(oj3CSa&y+!ek3PkT z-ODaXY;~GL9S*qGKg93STvAoaD=X*3S`?a?-$iD#1xwv#KPJ&XIEZiZL%dgU1RnW^Fsm7?G0#^xBKq)IdsN4} zeX{#lFnB5bs#CgGArdSD{jC~#I=0BqGc4*gKML1$PCtK-8mWCIa;Yl%e7rlYX{%Uu zeFi#(u@cj$e~+6XEx||3uj3WBoz6N>6w(z)$RboT`Yr6Pyvnvd93RIfelAc`hFWnL z3^@rrnLL|6;`%dd$y>LDw2t|dWoM>7%!f#aG1hWHkDWq%Rq#I|Hzee8I^Qr@aydUL z-y=OHBI13=No{iU?5t|xSp6waizi~dj}DL_6ZuvkrzDAACJUfw8!+J! z^9=l!&*Z!pv|dSw@hmgVnYTT>{IE`dy_H!)z+HINm;wKLS z@%4>_g@Knh#?%(i30Bs4zHi146*Y&9P@XnLJbt`59s;G;6O7#?tu~a=xvG#R0EZFr z8O-87O9f%cR0h+7w#J0+o*G#>94{Qix~7)oP4t&q8;|KH9EZs(Vld3(&OM*qZbK^Y z?>Kichrxp^7HUj<;90QyioG&m1eLT#%)o#}`?aGC%aS@qQwm2+zmL6h7O=y|m{(X5 z6pFbYP&rv&EP%YJ`H*w=mvam}gFJ>mvSngn%Ftqn2~vkKFhZ=>e;Q0;ZyNQ6fpXBdqM>VFLoWxYW(v(uA2TGIg+5kwxr z``;n$mfO?YH-^b=k>9w_tTf7M%6R+r0pgXsXWVatjK|~6BgIU%gu%z}@c;vlACJ-D z7geOIRZd46jVr5IraScZ;9YS6ZZelI7Q>Ex!#+*oRv1@auv|cXL%eBy=2>ZDp)$@t z_I*6!<+gpnD|6+gd~bF&qTxdRVzO1q+}N3oLADM9tYj-ZGP+De#3N~>{bE^&m&Cg; zTMjY&SdpuYk(PMoF*J;ws!tDoI8rJ`T+Jb>c;}BZNv!bgJTYnO@b!sLLyR+_SQ2VP zK^1+2P5at5R&HVWLs^(GB+_bTvl9_MF_#|8F*KO=w&Y2Fs8*)$QWDN{!^+-%!HJ#B z%*LD=w|`w-IbNQ+@T+{p`A_3{zeT(9>l=_G-5%NI5&09%wBOpuiP8>;@0Z8(uP24# zmR3foh=50@DWqDu{Ap(zak$-a>D5jqVeH=udn@ZM<`oZN zz6$XZWj<-9(W{SH3(1R1%4sb*Uk*Q~f8Er1<<=|w(%d&C$B*(|;N|Hlj%hTS%^{`= zx=Ns@Gr>Gs9~=l)X%?QvB6vjb_v41B>+OhhHHx!HP=B)?$rUoXVq#)xnWiO`iE>tD zwNxeABE8BZ+XcO|YXJw?pKnhZPwE4=FVp+r(js*j!)CBu8raw7TWo$rd*_?4DS_g) zO14A&4{y1NWg*tiHezwGMLCVf>ygGeZZKKN!!-v5S1`{3+Nx)V;`C3_D||7NV(Mjy zymZI02R5K6iP=LM%?ISRYvvV{^Tnp(3ObVwXCZMpz0v85wf-RuS)ME&kkmZWlABZz zBo=nVbfV)?tCK6_?+fG?CMU)z+HHV)hGJ;~N|q{576T!dFUMK0L`*;?zUnYa!joB~ z#L_5=v&Rj6C)SW=X#fx;`-7>UX8Q7xJdvixZwr_l&EP-m#K*OE>Tczl$@O3$^=jeu z1z~roIu2i~=5jqr@_k0uDbKcfjNhpJud#r4!}yO}{{YwN`1}NDwnJog+t|5`-CJi? zyz;{Feo+=xT+>MZ09(zr3H9v%0C<66Uag#($d+-U@tbs6q+X>hG4W{C<)~Z_77eM8 z)%B!2eWjc|WtB#ZxP{~QEFl57xvBeH>Vq(_6CLwc9Dho%SIBN`UQW@TZM@=qBa%nS zqpahCk*m?ef}-sO9Nf<~V0e&xjMgeZkwj0iZ+m8DT#%&GGftT?F%P)*#L{9ibRZBX zc$k`el_rryQS31fv2r207RdH>nEwE3z$UX7__No4_4;}L0D>NFCfW9L8RI@>%`Lhc4rxMV6!%pi#H0ygOTPEW zSAqIBP4hAB^&9mkyCbK1Vpg%?60d>t{7tc5R{4ZaxXFouKUsV9=P}dddWrahMJTwoKpFNyL6gGuQSILW|2}lYZY@b{_f@@RXiqm zjM5aEO(99F)_CIAG40&UFAdla$Wb1|GWV+_*Dk8NL+Y&07Q+M0y@YXt?O*N3N$bD* z{XM_ohwQxDrg+Vm@!nj~*CxI;Wjsv-& z0|a323kjGTX^H$Lx|QVSQ-_Q@bBNE=jKf!EnQc+yu$Nt=+&HB^RSXLO#n7D%{EfJN zjsfIdfd}tZeFf|Fi1>FIE`&{S1L9oxn{GOkyY0hXk}2#7^*0bVu`~G#F%V2mU=fl! zN3Im_ScwI3QxjO#&mI^jdPE&!Vlc=-3_kew>UHhZ(rG+#sfL-P)??V)KPG-biF|%a z!*WM)EM2EEq9-Q%tCw?~OxaDGt)Ya* zF{9PA@Jg%1<4|JL60-$A9$1eA*u;UmW&~}BmPS7jWFI(wF}rOs8FLDI*0`CPMqcGM z5O?^O$uVYt$4>03a}dYOzRuF@9y7`aD&S+4S=!dITI;hYXiNrQbxrnD^$#RAF(4e$#Tgs&R5=U`Q9qPS#ZQZ`c%RBoRXOBwU;ZXy z`(_wg6YPl+sm559KmtoI6Pfhibz9$%K>ZUof%`|EPPT~s{?o?~$Jaw_UL*IW%Q?H1~HLWw?2iQdDs>gIC7RKGOaq_2hEAaXn)}#r3qX*I=wasCOXQ_YR z!WrW0?U|U-rZW<(#HLYBXC9qSpBoU%I+uK>`6K3SiROuCS(%%dt=2OK?2p#lM;i|u z&}*b_p^RYY7oJYT_4LEAeW{ocqom~Vw-;~rM%#kLoTp?wpG4n9O?PafWY3S;>1RCy-Kd zeM-|0IPUchK&y<}F7&q}h`{F$PBB=VcPQEd5pe><7!ug8 zXE8f*1LaMDrJr?^D}85WV3g4A)bR!rMIJ*phQk(lf=A>_c^&z3)#V~qUR7Q_wiwdOW#nc=!XB zaIEq9wWQ{Hho9RKTSLS32Z`%0Muzw{{UX&ULTiTgOpL{BhzfO z^F1e#vGhxs6Vv%zX5`RXaqh0MZwHT+9C(RT9z5}g5Y-fPf?`?P*sz*p;;M!(_7P_WW<<>p#|jKao|j?b1ImVfp$- z=c`Z8!2bYKumra2r$5vMcJl5aNy+yMF$YuA6hAlmf7E{`m;GhH92L9N8dcA~3+k7N zU#mJF%(BI9Zz*NG`^lq|Y^&NVp|B=MCC1TXV<0$f2P_fVb;PaH*+sF(mP$S34Md_0kXaKYq_ytBzZ!pzKO z4~%Gw+aSY7V>`_zR+}SL@nqH`YZH(J^D9k+be~Hr_UZBUg~z9VN}PIw zw{P~CBVLC?mNtD1RqYq!b#tYaVrEpt&32mNeNW277c3V=`9s;{^E^VdenI?{pniR8 z7u8hC?k^Jm02LGcLPWGRKp4 zgOSM9c>{Cui*1;#%f}N*quAU|2B8pRo4}^V^$s}W-|bf&?{7~2j^=Xbs`^v``NwMgOA?-D#;dlO_OI&`5JEEw80ir^M3s$2&(XN$ ztORGTBM5y!pifrXQ_Bw!hk*p}j0C~QUc86>JNj_rn`OO)-D^&@#I^O8j{f0XMEZ2u zd@{P_dMt8?cP|UzZyaU}tgTBju~p<>qMQTB^#G#pR5r3*xT^3CT#-tCf8^ZNXuSUb zQqgI?%Lgl(E93fiIa-zV5q0)+yk&3QE%hVEwx3l;lw2MpILDI{e~WzD*AykU`CpSz zuq7Ct1)dQXj3wL-zZd0AK_Uo(e^XrbT26hvKZ9pKk?0yPfuO_NYN0p{!Nh?^Z@pOh+_K5;dTNveWE&l+8yf#lH;^BpOiR=zT&3&65 z*8SGK!(`rlz$TMP*qcX}cONmb8oSC4H##RUMdSvH$p{ygC*}$Hh+_im~}&qFhj*7BcZ7@$_3CNpsFc#iuiqEp)zJ#V>cHahjytQDxWy zx*Dk;MKycR2R7yQHl@`S~ev6MMrh7lJF zENzj~<;oJTi)3M?wFj4QrL+`bnZ&-tZa=8>o}{^}l8&CYhV*a$03WX2v1b@YPU>BQ z@phb^9wXE6yUSJWR^|Lx#O;(;ts7kf}Lby@xXSeRyM-^t8-ev+;N*%U?F+TX`1U7MHSJ>9OsW^qex1a>Io5GgX-#wbtYg$@TySifW^slkZ`C%%utv3U`9mvUXd|e_&8&N6w-~NT zjL~c&d3*egrgsgI9Fsmk-u*k6_II~kzzK``j-uH&iEzNTs_yx5`5H<&0hAD7OwBqd zHouMJU&JWFzl%LGCa#CGh zvFSM!A1L6Myf292p)z$B9CT{a05X z{Vs|RFOle;lTV~@f2_Z$M>5KIjc})iD+%ng(r>Ge&Gim{1-QJr>Nb5HH-@cdu%y;v zY1*vT1fNrl6WQOQ(cfuOY&dlFU0RRo{=G|${{V^p@tBcLB~J_XZ8IiT@h*bzjqM&1 zU_Geo{W+uYu>wlaMtxUkV=%`c<#mpoGR#hBC)2q6e^BE;m)B>L*QfsgKMDSznf2&@)}tq@ zLszMp`2L{>8`R*Z)v@9AiQx5^)Owu!ZhRDalok5iBi5D^>d=o+FxSkUE>RzieEfSv z@ZUUE&lRz$+7+Q+!Ai+T-(mZl&aUrz4cL zTqt(+eqF2h#g3M&#nTteUq9qe`7<1uo<#oq$0B2sF?{~?#nbz<`?LGg7tMK7#ma$s zf)CH1{DeQB3Fc4vQ9nGuJy=b>W?#qW+|)5%Esfg!C(wvyBi8~!?Xkn0gB~w(zpE3Y z#s(f3o(wnR!(1uVqgi4{r!dlCq~+-`5aHLh7%0&XOK-}%qFk{r5v|0pk=k=78=E}) zMR@0R(^mfg9~|(=bgjJ+~wnNS|=mJbfAj{9zl4Bhep=nacFQ;{O0oG&pyrf2mr_oS*50 zPZv9dS2m7k9Pqh3KV0Q-*8W5Ctl?7ka$ovqm33Ud>C3puWh{sKZTJ;ld0bv)+&X6- zfTLNDYaA@(-WES3We8y_eM-J(t8fo4pI%O1751NVg~HZUuvQu#G}jZyH0x885$S;- zs(A4pp^p!KDd5EL_287#5|~pEBu{JQuibsmPkk)cSZ6Ks9P~Rmm3>7pSx1r zZX#S3SIqfv`61UaXWY^Xx(FqrTD{UTQof$79Wx(~JUSGwXtnAbMt+BGUrFYkSeJEM z^j>*{R|a0`kJyC3=5j*IIU%R+bZJ_dq{IoBX%XoWsSwg5@r1jE8gjiUXCu?fN8_?j zPW3A|4@dPK4!*ec@>7e&vy}XgM&$8R`e=pqit*#Jq_BTg{{T-?c&2|z+6Oz2@fLC! zSzVc1EZ8?;rZW^pFy3W%7J5uXz7M|*D-aR|%^ zCV;@Wnba+rj^8G7JV;j5kC77XV%!>a9T38TGDk^u zB3;Mo-XLjrrpDnokG?%C)W-sFJywo=UbE?EgLm}z^<`JmeL}Fm)nC*VHwc;O{O`i% z@I6s4r}9K==j9kL>YhMWZa^^I)7~=NkR`sXw4OJw*1`Rj zELDP`JQCUr}$hhne-zD(nzqE(@ zOu=il@m)@Bva7yIW6KUJ`LY8oi`fI%T`RhIOwY2vv-?|CMapX@J5<|@Vp(p*zTF^M zj=rIo$XC`2J4cD!K{hKBp2-uOaryA`+(h*=gy-zb%2O$@FzR^(@(6AaIEL&?tjuo6 z>TMI)8MFssuggfN2y2p+=X1onl3pW-UOY!CY3KBB4jZ`ZE6fHoVHyz~Bhep=ABi7? zvHdtpJungYck!E%>Kv0!#2@u8MjFz@n0r2n&cB8#^)Y1p+4+5^Dt>sM>Lxd+6Ca-} z=Dm|*VD47#uyU4Ndt1S}T953e8{!h|>ZHV~GCWwDHdtVpkDj z2tJ2?*CF=O9LtbQK(RWS$CiEn0Ezp85s*_@Cmpb9>@U%e9kDYKD3~+Uy&XAA%HzKQ z_}9()#$s1IIhsXI+PQT(jYtyO`?({GO*`IWGNr-m4xNG1FLfYOzd@jg{TmKEus60d z7u%>-ELHBY?O)g2B4Pm^eft+Bkw~6VRONb*Ny+tn-5+?hE>jCDA}<|WS;xeB;^kVm z1Yj8GBOsnAmCqc+?iGxa>KsC`l6dn!A2Y!`Gs6!bug0D{PaN=wIHDdmO->=Ic&CdK z$2@b#Jbmc`VkAgv+76<25sJ))9YAJ%nPs(2AV{ed1n}k>;mCsRV)BL(;Lzg^p3NO$ zPQA@M$?*xK5tFYLXM{sYnnkB0!#q>PJX6O!Q4%W0NQ9|hZD;Zn z;3=4zW*R4l6G$R=3iMVz0K-X1xkFzgWwG+U%^70*ZH2MAdoc^fcrJ}+d;4ZmK{QY2 zY({9&CESe%nW4R+n5{pnc$-wWc9&}t)HF2up2Ph}0=}ReH#oSjE)Ol1 zzO%{gzK~hpnj=K{#as~3JYf^q%*ANE$M}Yw#P(K-*q&h$+|8kA9wW_{56epB-mVmK z{bbHhJlcP0T_DP<(kxl1VC#udJ5mm=k;WmJGdYx>WkO)4J!U#hCyY-VB59f7>%|>$ zKF5#094Q1`8RCskW|^m2%_CLTlD?;lBf~s1!`F&+JF+wzLf%V(dHKPGv^9G>5k+ZDBJ6Usz3>_f(Un!8oA zN%nxXF-h~pG5O)U_6R!Iyf&82+H|8T<(Sinw{(aIPvve_Ct%ChZ6I0Cr1 z6Uu@;pvN<*_X^EBZlbQxiFfRREqNXo_2M;Mg@C~V!%S-6NQo_@y(MQz7icS4M_9=@7U&uK`iMFTATu+Qc8Ti@IW5cKy(~E;0`hY_)AB?% zPd96H@@8)y*q2KW$04R7{?4ByeJf9#*R+=;T!OZIO~n;HbH~wQBD@_f?pWVoLN1(Z zyT0?EDT{H>l)-7wntnl#%4lymWvsnl5}iYXBZqJ zQX$Jpj2VV8h#873amv;(in1hQY$IEQq%4V0_BHxFbk6y_&-?Rz{l5Qvd(F%1?tY$o zyY6ehuIIj0LTKeR2{n_qpW&^>}=jnhst$JW1l%T3N{CvcqY-TeSlE{Z-?i>2_X=fKNr(j2eHiDwSs zT)es`JwSRnAC5j**%SPbQNzKPNgFUb@i<-)G>!2Yo=3>Enw_(ucOIRbX(f<1KTp^$ zJ;Pn{)0i`=f4msd^rYe2WJjMJIr9<-6daxGy4>NiFnR4wb#G}%duzL|@K2_bI4ol6 zX31DeBxJ*y#3Emi{AcVF!)y6{bPiv`x9oFDq?@lCYsG=RGpYQH4i%9C6dx z77Oc3SK;Bb_3CgA(Z_{L=fRRgB*wep+40*s{?-Z^cen4_}yx=|lqvX61ArYItaogt<58Gqz zv8SaTrB>a7UK-;m)=Sq%?X#_Dm3p+-T_=%fD+|l4CjtZoM{f-!{YPRsPRhf%)Q}`D zwDR=}1E;w`Uq-icE^G|jG$~rD^ge zTb8vXvY#s`RS#wzS^r0lZsE%Ua^0SCgvoO>7q1a^qaFw3Zn4`N(@#G3x z{pm_=KIL_(A@xB(5S4xTx7VXDb&8)A`HD8YMnXr9Joo_6FN z`mQ+Tbt~sQGFYH!IPT?0;P>a03&V0bLzq$t`D74|)C?2O{@r)_?09|Rlcsj&?AS3F z_B#wFHf!C^-2X6*Xm7&pS9IHGB(kqJyX4IM+$Xm3Nr=h*qc*vRceIi}>~{Emdyzlz z6!D7gy@De|oWIWHkfTHplzZR{gc(n{&%t44xlRijIEi3Q+9Iu@Ud`erGvW@!eu&R( zZm1YK`?W#CRSopD{nTR>d6_gQ&w080NF%01MaO3)8_@ausHghU`jH9#7g_Ffs{f|R z_ZZ)5c1hb-E&%ztcuvq;-odu+7P-84j;46Vwl;TS>(c!+cv=^(!8?;B?9fC1ojHw| z+QLC!rrEg+m8ZAZXd#Sx30e3T!~4YF-;>@TbrVxLKw8-ofk*pgp2!cT(l)O+BN0X_ z&UELqUgu9m4dV#9CqD|75k$$`<-57*wLubIze}^XZu51>UH=wI;ZutwRB(siD129s zPLVO@Gat`^pRJG0(Gh|^#=c~6^t#khjFIk=t&T9IQRZk?0yjP>8H=)J;7vr5vjuGq z-=zK_eD3neu@of)w(?zei_EKHi56@Mm&qdhT&>Av$xH6R$ii)mT9%PjUle6b`7YZ} zCMAX;kuIy+yVWiJ`;I2V#BnmANb}-J62tS}du#y>|=kVLl z6Is_pzl~^uzf7L915eIN;qCMyXANxEA1|eE2-PfqeN?@!58Dur9gNnb#TW#Yv`^aN z%wAWS-kJPS@Ef)7Fd~n^ctfwKSSS3RU%H4%LTGj|FSZEZ@qTNhCMSEXbngbk$(z8V z6vA-&lK3Q5Gg|UD9cfv|97$@Xh8(<_qEa<1G|VTn6Z`!HANojbN5>HR#$kXw+jzsO zV7w~bhkdkh!KH8_!64;3GlwRg*ym7xt5Uc^;KiQQ>}kz9?+veSeun{(rG5+B4r;@B zUXfeTZ|M+t3G0Nv>YDzFnqbYk%cWN>W=(JEsd&0$BU#!RTGgUl4so9j8j&9)XY>y| zeqSVu3>G}SUN4G&bD8Wkwe&bSNMbVbs>p;^PwAko9cTZG%refyKIk)pY?RaY)U)+s)tRPke<9&{+GM`4E7Nw1`Vc4dl73%hUxWTro$@Q~BHGZqa)(HXe`cTSc|TMNXzfw1y2a55 zgY)zHOU(L1K>h_(up2z_;a|z>OSy%^D=qI&YOgaf%f!v?!8pR!|=-5gGq%g?KZ6 zF6ulQy{$Z2mgJ^zp&;sO@`Z?zmX~Ud`jZt7_!DNi!WG{hlPx&q_#NA6GIc%Yk?*ht zJW`&{=Zlvy-ot$$P5ha4-v()&Kok_ZfWzPR(PN7 z?EUFk-tS?5vYrU&nacIjx$`J}R^p5zkm+>7j3Nb6N!Z$;(LF8!Y z*a`l()mt4-C-?1LNd1PYYxkK_nsON=dv2P%fLOR{Uwb!J6BEq}i)j4g1RtYB5xHbL ze05M8BJW#w(aM-a^U3woh?8sR@J>B59SP)}uSc>fn96a$U|Q>vL+gDabt@*7Vx0c) zvj|gY8mtu#<;Tj~O5c!L$9v`4%OQ1*T(UVX1;Q!G%Yzw`sUM_pZHyG%0}$GT1!siCE15O?%e$hl~r?~?PDx(}Q`=VgC#4CsAFmF#*u7F3GEPO+`8 zXBY)qM+bOC-~N-^&++7Bi#rf;=9on+nkc3ES3#hv!|a8xFlRbzIf;4*dgH14_j$LHQLTKD-nr8K zxGBa*hlP}Br0vZ#+)Xd7^Od6Y1p^=23!vHfVV{g)OwqT^V$EQ=+mbCv8HkVV3scM0 z3qZm|dGT{VG(bz@PF$d3Q>)W)76>;aq)?My9$K92tC?l&An3PHIH<9m?3Fs5{95CB zFTP=zr+d=T@eV^5`YCG9B%<=(Gq}70`7T1zoVqMTP8^-IHz0iWP_w#yWQ01RO@U^~ zJ}8*JsvXY<`~DF~hD0915!Su=e95GxcQ6T}KK2`1#vFX5^IfXT=(8)m7i=7!Usaqs zzasIOAUUMEPNHPMfN8wb0tgCg&I zvlY}?=Uym6^-C6Hl~qf)jT}z@Apv%yIouzm*J6aTFNOKDV&HD0ib9N4lywA!TxD%_K$IIT6$mtsFDgGnT2K zLy7|HF$>RkQ@jNIZ2F|j70Z_!6S!eIW^O1F~Glyc}*oTuB>$Yb=GNNq)w$Gy+}Ri*Fn3!jLp#{ByN=6 zi|}MD-oK=Q!%p}bV4i4(YTOX28K4(Q!heKPn=W%ezoBmfr@9D!_u+nef+NgBwxJNU z>>u31=;Mc``jRJOQV;w|{5(Z+X)Rp3IpW6V6;bdeN8tW2?*t!t!!YL2u4%elkVe+o z)P@OpR~^6guxD~Tb&o&!KBw>jX$#ikeSo3r3k6stAy|%*27KQ+NghFjR&Y0*RyY?k zZ>`oW-0$!;l6)wcM5f6dfh}O$HPuv*GNw5f&BGidEk}_^ye>BRkav<0B@8ygTU%B=HA2FAfvoj-Y^{xef2pWvo)RQscl+C zMdix;NPz^iC)0N3j=ctM@P=PEpX4(`^o15DsGG!!<6lX)7y>h8!x#CnTsMLT`SD$o zjwpIc_}zpH=G^MgE&|@!6M1x1J7LKc&0gB)t1&+aNHmRgMg3$zC9ynm_hTh_gB5)C zT)um$Waq*&4_Xz^FwU#UKn8Qc^U9I<;_^WlaIGr(!{hZio%J_zi)i`2ouGvn?_%1s zD?(MRlW%}SMIWB7QLvNm$Kmqul{pV9W&0!Es6O69ybslX#vuiq;H_saDD|6Jq!(nn zCw@>}c?~;ONH>so&*&)AwR%dE9NIWR;yrzy^DRT9R1H^3Yo#ze)h;6kj+s8}X8z%$ zv(hAlm%9^L7e=rOxucbkQaUK! zyAO@@_gpVg->2rzFbieJF+DIKCDhn zpY0l2uQF)(&TY_@_k2nH(o^c4j|ft7mvT=t4IGazc8zqn^XTRqin9A3A4mjvRhQso zvVm%|PSm5C=WjEpjf0)p_2&y#?l-r=80eo&kgyzcAm7T&Tl7*cYmw-5S__LvZW0{U zddymU$(l0+FDLgDixB9NORv& zRgngK_+?sj#rgN?8d7{dVaasC6_8r~46R!YCM#i7Wvyfnl;((=owS67c+Q>(AUB3Iiwpr`JN^r%`q%9;CAO<^OsX1Q4_{=F}C1bviNKHJi8t=3RQ z!ZqiI%_Zrz!tmHWz3b*!UVhBu$@$+zYl}U+lVxok1T{Q_tLb(Nx+>SP8qoGbaKrc~~P? zAD8Z4Oe>_()Ep2(*4pTAIsKwD{@GnC^X($iAs3E)=v}9KCx?3fVa=WcoK4ux?ug}O zrYUO1BJNpiW91iTiJkeUBAz%-&V3F1aLd2$>-7cdaSz`O&M`>Gw?DeJKknwXQpj=B zNU}L?GWZ5uGW6b4ic^i^oogPTR!TWDDK{w9S2IpNnK|n`T8}ZvjIH8x#M=4s{@Ery za17}y5k9DH{DcJqBzE6yu8wrd91faC+=zq7^qsbT3)o_>BGZO$3;bbHdLH~lThhl4 z!dT-RaoXKOc#pstu+5R<(+~LHlCO=RMrxS7vW(5D*)D~8PkJUREjC?@JtTp6YhlN3 zd;7zMzA^nr2)hhxr6-%T)62GYBWQHsAK#fr>^%*>cR!0BzAq5$Wff!%Gk>+FWDzLH zhN^X(%Duk%lgWDp%0^0%lLN2oG0vu$;WY6ng?&=)T3KtjLW)P?;T>iM`!R;4Y;MGv zAb7v;26t8Dgt}=F^BuXALTPUh_tQ{HWc7M$1Et?_O6>#SO=7N{-i;?Se5pr=osQ-< znYEJ!x=wt({2HZJbYk6B5E7R#CuJ)Fd8fSD5}4}v;VOv|MS)VECkwl@^l{^#c1ng_ z^KEc3nfOYT>0;RBdRo`6eJ4ME7PLU78X&qK|2P{Y*p~4|b|vX6i@Z>7&6Qip#Ak=NuQLQg2qeK!by3_T?e|Zc z9p7?aOn&sO8{;@*H=;cNTyC($v(f5PS(N(<_;>)4M(-J+OtK}FPA+?``akcpAv^_n zh0u#f$v|oWl5{h)iz^LBpB62|LlI6yeAk6dNnI0+Bx6Tk>}GOa(#k5saO_RBza3tO`%#2!vr z1G-(s+zR9aRe97%YkkkQA_4)#HD*gqX_j8MtT0Iq88#X@I)5TsjZG^->hdW{+Df;C zYh$Z-jCh0I7e*NS$K7Kzk51XvOfMy**6-fF>}BV!WAAD$1#>au%|^Ny{G>5m1Th^x z%*1?%mF*ZS8_N-vLrhGE4ug&`^YETv0jp^SQ&{%}a=Pm|aPi^Ww%5QVo zohU7%Zs>6*uK;$*7U?NyvF++ri__+y5 zwXpzgP84d~5Q&W76Q*Norj-2~&nAEmAFH|e;ugb8IM-qgC3_kgWX^BTmof$A#PK75 zZlt^DlRzhdYC*!SMi17ef*LQ2NPD=5Y2xKgli#Oq=kouYwk0w zu1Fb(3AaAs z3Nb0wlcJEJoO-K=vPi>H^Xmm6vy zej8_nc6RmrqATpsK0z9559 ze*sK<6_|P)q8)LG|Aj~gZn76{*U^wfAo#M)zU;lYeOj@gOldSg`xug3GwNCrH)r(6 zgpG?nKOCiAdxKxaBM4YEt9ay$ zZ5s>Zk5h+L!aw`qIGrf@3A2uDT3(g!jYUoReR_I&-brNkeMYFT>hjWL6W~UC{FyqL z5*bi%+jZ4D>}&{-n+3(MX3U5Oqd-w|o{)iFvoQ{#*fGl8g7`Bs9Da4sn54Y= zIAVzi4|XV|9L1q-y-w@{R;W}JRAa~!8wUzUNfqa*t3%Y+%C+kx31*f^U1%*)`v7V&qRSJ|bKKDn?2=4aAmqy=OmtkQ6CT-1h^tGoGFBO;NJ9Ca3_jSqx+1`Xn6Z>?y zSeIVIDNyvrIn}i%KbdTTt>yJ^WX69WOhxdue|*{et)gvHJ`K3TDE@;RanV|S?>qO4 zM#!fe>)kP_8&RfB@Z6m`{jWa=F<}N9p^*byQq0TI-xhaDmi5_zV~anGZ`kj5^polT zNl&3}#E#FEYB{X@$c+kh%jwJuEoGU_#vwl8d49%h&4y9}T-u(bAM=h7n3{jK&$s&Ij5$zw6%3ToEUCgo(qG zndJ%0Zy~#%cZ4=c4mF{R4x~$$tiL$#N@42Vj*ooH?9sUTss3UO@~qKhzGWQIGl)~^ zlDbkl*6c%*7pH%Qv@AaAY3QU7Zx?+fl){p5Rcp>g`5NWx(9qD7BNB9+t$>)B9=uz# z)3(?OYEILt_-?MUu_+!G`!o!8SaA=yM=ICg=w5o;1Zn~e{dVDe<52B~A0Nr&Mboq( z_d(uk(a+w0hx2wJUx$unjd*OVQ(C@G< z%roOa$0*=4vXiEuY$!=xNnH>f5kyonbSS*es->6K0{5tC&{9v}1(@xTiK?Kwu>ge^ z+JM}eXy?K@(Qpzx#C8c(=0fY3i9RPx_)-(ixo=u6s49mY?G=|OF{J*J>2t->Zplxk z+4ym9*$Z0J?*?uR zelp2V-}-^yh$COkQBC_6O6X$zWa4X5(j5MhIUU0p(647hh7 z=TvL#1?EjY{%-MZ@iss-H8Y;UufTnkEM;hp5&jWM5&nUR^o!G4jx|ff`sZ(~#g0pj zq#CBCQsEIYv+cft=!1NSw-2ake%Wk{kb}md|Du=R926%t^ai=p& z)A@}py^GJ~_m;Tp8e!wE*1Ho@VNu?%>vDH!`pZAMX;`i$z8o*vQXYxyL*WLJum+|E`$&tKy$GmZQJ(?6(yF`1=@mBXc@J z5#aB?Mz9AY#jo}ie@`di@9B*GJ)K&EgRw}%-^>`TXnhs&%*~priH*nW+=*kwL;9-W zx$c|wUnB4S->Y8kzx92;VFS=mWxrwVSG~IvU;YHDatijV2!B`o^VT--)_*npr|Qf8 zTRHoE{ZsW%_y31^{U6@?R~5@orsBOozIjQbHP@yox8LR^jn`b;_X|0Q{Tl0EH3yG! z{&{4w|4tzA&OssCem=)^E$X0#@JT9{wsW-QyY0M`P^9(K2$wberlnhNfvS&xS2?dq zHr+{?@_&2llZQupbWGwmT{}>7_cWNr{DRAO%qF06%s2plSMzu$QR;yK$GeAym7ME7 zAnmmm)GG;u)TX_b=zD1lBW=CxzL=F2fGU47u~~AUXEduh#JF|!hEgp!rW*|gmCXE? zfQ(=Seqwx5HT#Xyo1?GAHl7Uc*e^);Cr@o9TUkpwkXv^*y4E1DRN(w`4?^a98@I7W zgN13u^gX_xOz)R+RQJA?eS9pJ5#fY5-sW!%9=O6Lg zxW?@2COWAV(Bpf|=+0K&e|)&2|9%4*-0FzF9lVh%kzHN6EvV-J95tBqTDHXqI}ug( zoY&S(XSpX6o^Q%!N|q{dk8W#B1&iyH5fk#f)W82^x*9Em^h#fJJubECpUi(5?$$Le zXbOBOVqwtEas13pd+43J!pfA(*eCGI+M6SLnOS?`yBICoR-s%jvka&460oF}N{q>ADGrfO+IHQ~c8Bg$1|4%o>%X)b z`+2PjnlD20l2XZ&Y;9ir#$5ataS)$gV=*?v>Jl)2f6j<_-}Rb(i|SXE;L1**`o_nq_qcjbd0;ZbqS=Y_n{Ktw1Xm+QmC6-s*;CJZM012nC#GXT(PN&(&5KPnR( zeqPvyA5n9KVp>4oYd2W9*tR(~DWHt2aKo794Ajj~JMP{yPES``@i!DMf;y;-x zQPF;JU`gh+ke$F6@`^W-QO{Mw@ZrM|La*DhaTE%rEm%Ar+%{@qoOs`43@OftO`1r_ z`O{e$gkwt?0G`kOCE-mmyDrB^HoSUmoHguwOB2+3>RA(@aJoiVx1hgP_KijPUmIfw z=>EV$W`WDZ%>k3qDEwkiJ1i)!yHFy}^nOC0y7Zdics_{VxCG@j_rJO}Y4&(JV&i6d zj>k0)Jz*kaG4WsB&J1mOwp#^@sUl)EG|a`Ubb8umC3whQbAU~F0;}v#A>2(p-KzYa zP)Fc;@j{~dTW3syDF6AQCig_PA%86~Zb3`V3=tU_gZziFasA(vMt@6|J29mzmei6F z3L5BNXuK(}xOM=eZ4Mx%dDd9WqLr1e%+S(TF`E-_4A5VOA7IZ*6=s@^;UD?-XX$t==t?BWL{!Mq zE8WJ}4-J*m6?F8i@-?+ae?j#gNz0{2c!)_{3g;y z!ov{}X@j~^qmfew=u&ah8RTh(^K;?iO(LaiOR)2}Xo^|%bq*9rUbZkI0#?^2)n6oC zHmJK#(lh)rGBRLJR0#4qj^CJ_!$~236^lubj+O3|GWusLKOA65^I-{iujWj3S%zbz z00?2BT998|uTbDiC1$PgeX;@)a!R~^k?{dAW*lnzcoh+PP{%I-@s@LF3)&H-Z4dyI zwuA*m8iE z{PW{S#KzXMfK^1uxzNNfGHZsWe?0ibrk^`Zp8?o3*DBUf#)?8ozZmP1s#FOvluQ}m zD4NRISL?q+nghz?uimcwJCNMtrR9vd%L>_*@pKaN;~rhD2+NI!|kwER)#|7+x7NU@p?(I8zE=> zK4czK-$Ux15rs-?Hk$xL*zg{#;>9sVOaecPl#!KFfOa;OW}=~xtu2PFRQj6{Im~gk z2Dp6hac}cQ;CMe(CTa^hkZP3ff@j1Ju;+F!pivqD8f8l+WQHFJEfSGk{h)G8p|f7_d9!g)TdG#}d0+>&RXSBI6h^LUr9)|5Ph_@e(lR!Gi<|Nv z1^a04wVHl0W0IR0Z!wU>*UM=uq(csO2c*!O?&B$c#A@iFtuI5(tm=7k($(d-1+LjRJ0Bn?0Pp7q@TTDbj(@9H z%RYZNk~8Fu(Kf5bDU_ih3V!G-E2i0Sn!wZ*nq`P7UmISeLN zIS>)obc7|G`)_&iOAZD>I1~F4_Kq4siaf51RChOjI{Mp0WC74u=W>qsg8X+V;Jc|@ z%a0R+966NIl#kbtaSXS19rVx$!?Vfo^ zOWysrmgIa*tzCT^-MX4TX$TzGLPy(eMw{;1Lh`n>>B1(scR^EC*Yl~6+} zByf@a^EjWF;Y|;tq)lYl>#vB7qhxTtAm5s*pqFOCM^=xU&v7;e=*=v?D;a<9(l=Sj ziOKwN$b~D7n4PJ6lDBVlSMrA40fbdK;;xPBg8BJ(b=jP@|MZNfxe8-x~wG6BiRULtmGcg$ll!nSSn93G*`@ht# zAh58f1whgTM%y0sT$*Frq7P|_wlg;G`(aauN1UnV%I)X0yy{qQ`$FkY56j89`z2JK4tz5aU8}y zz0M&vUfZXH#JBMNPV#4DEU)~}Xpz50>-Dp zcA`@KEkQ?CFE?E&?f*t~f$Ug@b_w8yF7FRCjLV<#Z#bhZ=$4-sG_i$my^r#&F)-D$ z-CxSQ`x9K$Hg z-2E5>i&mg*e+&c79bU~APZ|xPL9lWvCzH5%5gC~UeKdNT<^4`eAV3F5y#KVNTn>Y{ z4O3E5h^|S-;r{muGl$z{IVglI0~t;;sB;WU3VWactnmlQ0- zVFYY|jWHLOprZ+^T>nx2yA9d@g8xgE1j%?q!&QrImMuIm+v8kSs(&!VrFnFProPYp z0A+2N$Peyx^Z{mzRrWXlihMav>@})p6BNgPv8NZ1?#vz?gsjgT?UPBz|xHvmI?PoKD%8yZ(i2In|R{1C>c543XZX zrWQVsaZs@Re;S*a#)m>K4FJ;Dlx+#!mvF$9qZCf?Y0ueu!OiQT?ZrGO~W zl2jVHD$a^Ow;c(XoMK61cLY6X$#rqdzLC)}Ft?Mm1^r!BbLdQKFJ;k@ohLjG?}-z1 zRAKd4Z0U{125M(E|98)VnSF)s7NjDNwo%8LvCzJGn(XW_KHcS^2? zdLLNFA#8?%RC~Tp%^*QX&)VUHI51zhmO-IA_IFzH+28JE`YoFHeb&jn@_i72f#Urm zkICT5_;}*LR+j*;3j&w<==Yv#9KT~tnzj%iHS=|z8IRrndt)=(z<>;!;fYoDDNm5` zG!}G}yooX;E!`+wZOnU?9j=oP2bqE+vfKdF{MZqs|NLVqjuRyUMA%NIrVIfdb7IP{ zNRHZApte}o^fChQM0fTjDgmmjP!p@6r%1cs_TJHbS=lVb|72oD@7dzk8g?D%^le3@N_BAzeJwVz&uT0X?mKyY zdWjJXa5w%I=}v92HNye0utU5|$I8}$%!&WCnv@qpEuJz6Pfy)6BA|%c7)P?kB7%8h zV}qsIKdIAlWNSB;Sg&AxkDY1F$Xz0hSQLOiFb)o zf5kLf1`UC@f(nkK*boeR6NYOnoXGYC_-iG{@u3h$etrdQ?{&`=jLEj@j+D-4iRpu2LhaH%&P4Co^Yeoa9ul z^UeBzIpT@>)~XeYCV`)Y0UYe}Pm|eplr}%)C!Iv$Xynv4JZ4U7t=^;ILhoX}qv$*V}mdr;XA%J+~F0S0ZEG=>L#E&eOiYD=g zKbguV)^o$;%vX1~Fk`IopjV-u4}s4La+Ha8s6#fa4spCtg*2H?=}x&dLlF^Qr(jhl zuc$uBWw^oDIs>Zfd<`Fe9G(G3sv>mbcLRl} zJDW567I=-87&{{4c^R)E5HEkIlO9^-%SJ>X!If72l}eR?ac$T_`C{q6cBFZ)q z>B5ma)H20~m2Zrqe*4uw@pK9Ig3wE4?d;gLG$S6o(j}c%d{uYvH|WD%Dv%AUR zxDeRChxi(M;HmJ52)Rg4P(X=_0v7)XYJu;*5@Kh`mH|?@SC-k@7U}nkz@%4#?G6ZR zpYRNgP<_m1ZOJFak?PywojfE`t}(2sBK3bj6iSPYYZgx8O8Q!(Ee0SHkfQ<&hXs6_ zl}hyrW}ajj4Lv0*XXp6AS~qHZ9idPA^7wB42HM7$$5^NoAqN%?jmdoI)=Ra^kdyB< zTMV2^-QQ#Gdy_XGeJr$bHU}8|Sc#?T6(9jXL-}%?x{_BC-X}=h8Y?bSKd#Yd#QXU#&HlJl9RO0Y|4cA>U7g}HZ zu@wlCi;1b4`R;qEeVn1>Iv`#^3z91_hnnHBfGsK>KS=(y3P`!dJ}R}<_fGfy z8qI6YE5kLjnfjg{3(V1nb_XXaqd-I;Fqk)nnfHSCnW*M|Lx-oDcgvjL4WcVeR zbW5+jfIxvbrc*Vqaq$g>4fq(PqwRy}jsM<+k3LpzURdx=r8H>l1D672tgx}t)P8^B+ z0SxKiAU089SZ~W8+gkb%piOn~8TcfwEwSS-lu-T613(E+%_lsujworcpD@u72}B2g zSR}BxRXN$-VZ{0TPS{aZ0G!q8j-K6b)6m{vhEA`rV|7Y%nsgQ<(U3+(lf7`bnVOzh z$X_h)_GbrRQ)zU1=O@F-{Cbw8M2kMvJ1Zp8O$%v2pVqmLulq}=fY%OC-pHwpzeT-M z1jKQ<1rk(O$qJAF1scv_=)!B7sL=eH;tobQx6BHQ9fPTo7|KP=$*9982`s!#f>O{d zlfF2RsWCkkEPi*{7tpl4qipw=Zw0KLStX-$W~viXhD$KTt8{1)I75+GqA8@})aQN9 zXJGc=xA^tM4=J0Df?%J-eXGgJ3dalBWl)fau_M5AWNZu(L>F~r%F)t+Lmy z+?79%hBbUu^CP$ivdyq40^T#YGW7^AuVWJj=480nLc`W>6e#l>;JdVv! z_vlm~KwaGtCHo9iU(h;NWM}vy_6W zW?r|?6Iq-BhOphY6&Q%-S64}4=e%r`n9zUe;a+329$wyt|&;w_1%EAQu1(qVLU znBa*eD{}$@(vr;_3oL+j^}dBdnWED>Vh|+0L)W*f&o*gy3bjm-Mi*2`i5>I%;dOM( z?XG^oZsiY=HK~QnPu+k1Wb)sv{%Y`EUum1L-km53JgXD@$pn0Q;a|aGuml8m6`QPo zM6Y)>9E)N!?w~)iG@{*hs{&(wGF7SW4L@&+9?tylcWHHkTaETW?Zw5wX$Pr=>B@Opu>8iiYvoEW!gjRSqSVXVx zrq-$s>_Fln5px{F(p!o<4XVTN2S84FrJG#EmLAbEt>J1;+a7mRWbRDBRQ1aEj`Xha z*0bn`lPOU*xL5hZ^up2&dg>B>GG*>^v;oW6ySr=pWq2?4QG4{qP#_w=AG$w?>i<(P z_`Bv`g@ZW%f7WmuCCW}G3q3VDn&$D7>A0F(Naj~p->W~F&bco;eX(g?KmQ}EA@sKF zvgOKVqvx_|$-1>n_RgnD8LfYSt{(lMw&HriT3N+8$Z?#__ z0EM=_iea@Xcy7$I@eAzHcTH|uINo4 z!&9xR0Ab?<7zWKEHsaxsMC84+*JIX-Cbp!dmu6^{%fN>)6o$n-z7U^-zHqs#z4iWQ z=2ZB6eo|3iO`)8-#YOb-o0+=s782o>z^Z-Ec%nJpL_eB_ej1#TJbU3MQ-|Ukz+!H= zp1v|Pe4g^^RcNyP^t9z%H1tk~8{5=)*8Ar-R>FRC6=>%yIV1u(21R=))%#2Rp$^3N znk&Lv-9iR@aT3cvnZ7(ANBCP^aj3Zsq(H&eMmxVGySy8$*b?!l!E~b3nMc#FBs{Y| zbH6$9e&vtOy;U#DkDG^Ev))I1c`ZED*!SvHFk#`vo>>konLBA{ui}0O`ZMYN;uo%R z&6T}=DJk03tJk&N?DGp%FbM-mTp%34OpE$3`g(u`z~ZT9=8+C$&pz=CVw+}3z_tq~ z21yKAyICRGsYF4x{Ny_q5p7vkl=N!}Ed-k#y!N;oAE?9+rUyXI6I2IwvPe9le&e zM!qzT;OS`H&;Wot^rtO8x*Pk$d%bW0xHLWaQlJp}lEKFa;2hGG`#{QEe_Jy1~?pdYJF=NBNgP8mptTi+1beEb>8xBGzZYR$*W7k%0|TtJ{V zK>L~v0%_wc2wmz$sLeMu@hh0+Cny#>zka|WkcT>Mffl={{cYvmAx&O~*bk&$#fN~2 zHFS06dylkZ1ow8P^0(;WRzfv5aQN;$;JkamM*F6v+~?co_A9#jx{PPy>O(ae_g22S zP5hvHbBJ+Bt=)g|@^bIpxFlTCHvM!3Svu5VI3f(?uH4~zV_JPPlprt-t<9dU7{W$9 zp9Heg1;4CZFGn2_nT#^Obuk{@{e4^sFr5K6WPSCzGPu*ez};J~3K!Kx174DqRN1Aqx#!=_W^$<1tS^ zJ#0YYKEc&j8_({Wk1u3m1GN3Tmc|m!;NkVeruWz{!%XkWIwsZd! z0M0b96P3X`OPd8rADC?b4em#Rukv&N?B#!csDV7#)s!aBYb-G`(o{3c&0`6QNu<;Q zDY5&sdr5erGH|0Y=Zf#$*eOQC6;iSb$005*VItLGZ$gzy=wfy>S}r+ zg12q5TffKyEX_aMhF1pSvTmi1vyd`wI#{`5+GbYbdG> zKNqHHJdw@8?4qHWR|wUfWmm%Z_qazHZiYA!hJ}enS!xOp1ufgpf564xMIU#Bu!>!b zhlDj+faJ`1aR7VVpS%JNV4(jByaV|m777)njm3)QFQAl@A`CyMd>LTYu@UbGlN?M0 zLGg#At_Kz>w(X+dCrfDt(fiw@fMxI0>jDvj@xeHKP|{jZY%HfZjGMW+ zS?!a;OnY0sf8{3d{>4m7;}9yqzNq$nH}ZKE3rpa?k@2;p*ZDp~uuv(dlA@X#+pB~V zu2shSZW~~w;R4a@K*-pUH>gVY4jRpWp0}6VN?|y?SuG#P=MXB~wm5)uBhDX)I3_D4 zDlxY3qnwv55$e!qUQbIqJ^H{PuyUaJPbTr6lp2RNqE{O1=`>UVN^macB0GzM57+pQ zYU$m~j!sf2mxHq7QehXV{~u}Z9o5wK#E*Ivk=}ci&^w_7L4<2a=q>aJf+Tbh>C(AK z4ZVZZOXyvSH0dQYLArnAJyt+h&e?Nj@3Z&pnfc7jMt?qx zzZLRIPm-#Ef)4g9ydb0J_oyS_!OV@)k|3Lx3E)igwW!s5Nth&wXaRGn&;J_5uBfe= zya)`Dme$}Q)3+QnGcCx9&V=qtu|sI|{ITCnriqC#)M24S>u`f>zcum&*S;F+=z}cd zS2~kDd8UcE`Y$RD9+^ojOtGO71d4(*jP&W21q*&pX|8WzJCxkss2JyiGs80zd1)F) zRuRd$7|ItBI5pkyIN-KjNOtgFRb9H+*Yjp@G63BDO}>3?$FeEt)K{RjK<*vC-E84Q@93b*X5p zh0NYBykpgw28Du|UnJ^eK`mt;rYDt^ulccU4B)!M%rj&3N*q~3Ad_52)$o_6Os3f_ zRb3C!D;@vJ=((oDw#*;f@-eKj5=NAz(8bNzG~CxJ@sgr&v{!!AB+YWdY89qgwXJxCk9ya_UV9DGIXTFS$&e%OkC4g(|36;ZLmjqZ2=7?<^n~JB|rxIs{8ri8QTns@>Jnj zJWt*4Thfz0r+`>}w)xP9UMbk$swz<@rZaZ-U8ZSvt{1z4UeYjZLU@_xGg3H7>Z>la z6ok3MVSX*u3DWAD;Vbi#KovUaEOLVM4PZIaA^oS2b81jj5C`|CE{ZlFq9sYJAR&S2 zIFovN?bA-4y#-AiUy6Fsgs&7WnX5F*KVq<1Z_X>3D*W@L=$z~dl6|-KRSM6UfTlDk z%4#7z+}z%uHoO~K4;}VNRU#bv@iaH=C4Ucej3`!1 zL{XtR^K{}cHf9OEx&V7M{HGhB=tPf^hC>-N2Q+)?@0Wd0|G^_triRoDkF@1rC#{UY zfn!k&S1bX%E(M#oh)7y>e6Law<~FM~ApJe(_-)9P|7Ba`s>L=;Q$UZ4Wen8L%CWtI^si^+09+5z z0tNB-VVH6dmj49(SU)OIBfkyi&tl|=rfRkkg0z}WOxn22Auw!`5-e56EFH>lmmzaM z=`3wt`c@Tu!+UWo+Pu%WT#z5X;6L?1 z5r;2nF!x+?NFj?xVDf6t*Jg2ea^WKJlBtG#V>jfOD%2 zVec7Rt;CS&NoNI+9>30LH75c5v{f7J;XN=w`F{|N>SwJVgJzZplEC*9oB7_VqM?1L z9#pTy9?@s+S5;MASCnuUliR@4#?6MH3>RQNUB0b&E?aEBAPE$;TEJjoz#Aa~Vv=?! zu!<&3(G3scXqV?f2C>w?6uZfA&GS~BJT5j~A2ceHM3oty`yJ`uWTDT(O-)Xpmaz&+ zpCenmVm`?U{`BicGSeGl;W9w%gStOh{<`6@I^6d((xT+ojgJ>PNW0Z#`pa zzq-0@u88@uEM8h(DXr<18OnH*^)N&M#qfCcjtHn6xzqYwDQo{P;X+@QHBBO zYZ;C--iaB@*7Z=-+B){Z&5D{%eZ24%ijMUwi&&0hJZ&56q;|YFc{!dinA$~ppu(?) z>UEFSEF0+enfAz_#QL9(e%*E)qgk@OJJ21vjK*O8=vPbTVA_k?CqD#*q3maXv83JE{N~F7hO*XaV4qS*c;EVGi{?tpfsyJ1>Aa zN@QxA+-zU{K|BF&XRe~K(Dg z=MP6&W%?6*-}g&uel0@u`qzzIl|C6Vm#(+Ct)JsAh`V!-Tm2pVbd93Z6S&bH)msb>32PY z%bhI`3xC~kA4Y%Hct))5Xqk4Lr_a)!dwl)!>4W~C3Mp>h;Z5k;GtAoRYH(_O-{3&+ zb|@GUYi?0qH}3w(Y9*nh{)3$SuNx%~)E1juV*0Xii!(BsrzVd*uH!>v(GLoT zo*_|UpL;pYuqvwc^u)R|EsmVgAXXOu`kQPnsAzE=@rV341Vq37NG23bn59rz&O zttE1=_N-XlTf7poTe*`d|K2=b-?B0=VxS=~qv&Y(V;+0+d9zqUv1QVM8DOD@Tyh$W zI(+9JP7K>;e~3IW51#*ZBO)-H^F(Ro0wTK;+;bA}4EQQ^=WMy|*Nr<1`(5a3%7(R| z!Anj%+*QJv;=8yD&b`2VR(u1+{~rxr+%wZ*ZGqRWA1?c^`u^zHS2+E2mgoN?K=;9E zCx70>GVQy-ADAzlr~QZTfE&L2pKj;?ZukV;@B_Hv6u996pb+@K6dnLKwXsIrU(^k>e*1 zyC#YJkNcrC42B4ERsdr7b>s7LYn?CS2V!-lFMuSsUu@&IPl=cmkY%;>YwNO@#(tvx zuy5S=(d5FZYxF8MD6#vixn0PHp#;_RI}#^x*+bhs$&;MZbtYU-vz0Va-xk5# zY)mKc*Y3fUC;pU;D?b_Ii(M_VzU{25a#EOTGAq3?3F_N@BYxhMdQdmLzP)R-y+emx zt5z(;W@Pxh3Ful2v^=Wmb6Gfft6jl#Mj=DLAiR6!*Ae;a2H@P#2PTt6f?uV{p||Jq zrv-)N-R$VIs71~d-ISl~c;TV_4G*8pI38Cm$l|K@@(!q{uFf~E8mx~36gAfo=8rx> zh2;fm$kX}woG)Y(7u~>XV&${7&$dxJZy-{$F_8>c<iOJD3_q#ZR+?@S{|Wwe<29?!Fq?L|nHc3q-6PBQdapjS$%I;ZS6(H&a<)7`1FeMQ z6>`0T!aRHB@0ODtxW3;I{^4!;MMZ3MqwaGI|19U|hx3ibQ>pcF{C-k$m5%g9Sb#2_ ze{*f|AFjVk{1i{J*?00I4T=`1ssg&!Ue#VzSJ%GNp1wK#Q8z`Nzbl|KM?-in9i`>I zcMtab+^oyIvt;z6G7x8eCew`-@Si~_E8_>Hy-Ew74w21G=W@Y|G^yV^OFy<9?$ZR( zs=XDa8eHtZF}m%%)Gr4D)RddedSPMBQ`B%89t;-^!#1r9O9L#=-Yi?!4cN)zuMWI9jBd+4~OuEQZZl zfa{;^)cAL`4d|A_I7^Ike@1AeL+C=+RN%qJF~nt)EisIbzYA`Q15zqBo{hTOPf5#k z*=$a%wVGv{xM7Ab<0FAl+a-5(?)U&;nZ_6?>V%&D-lVEIN0IvR)E^n*kZJ) zbphWO1Z>nnRoOge^aEir<8i#~ zg7|LO0o||-?=Schu>=5Kfa*EyYL9I|k8z1?RW;SD(E`072YRtM99w@-mp~I44dm8i z`xVMJ;L#!|rWeoC{3>9};eRF8SDhPl0`KJA$G+qx=t|v&f0Joq5|FGRMo*v3;XrI> zv+?>lQ%?TSR?yYK^_+A4Ab6E#fH%rf2p0v653i8K{%z2eL0Qf)*hkuGGpymO#ZUM1 zY*`NqO)t_HgSkK+ytQd~HX5iB(I}Hk$0a%Xaq&&8j_$grYS7O>Ng(t}8J)N;+XDot zsp(wlU?e?ce9Z3h@aCp_)&{f&YUj5`^0tL>x$XeI2T;Gr2UhW@b=h1x2LWs|ByTkU z;0ynubnun3-Iz5D?AoxorSO4QrTkkT>~n2dP>_qUi{`5n0!}ntO}8Cf(`3pN?8W~qQhHEAwd+0ws$t*Y#&ym3`khJ9QjZWSH92G4Xht1@?5tBXtM zYaos?>kwV8`RC2KfJQ&peb-BDK#xQVzZlGd0u(0q0X8N+CH@R{dQQ!BRk+rZm=qxN zX$F`yWAJpm$!c3@?4lgRn+elc`s#88jIt6i$_X~Hz6GFWrhcHn1!GHM2C3sw0DgF7 zixe#vm$D%7ll!YfLt5qxgWSMma+G0-5otgG#DGuPjFU`O%)Uq;7wFXQ_aNN?2u9K_9P-n~cRXv}rt_ED zS+UFui-6te{#6G*4dgGG+|A0&Nk!@sq`61|rKs-5LIC-{y1I0+aaBD!>ZrU{&x2%a z!;Pubi2gtz7i`Wd1iGVQ#6|fvpMT4kS;$yX2BzjR8VFsG&7x-8!bY!f#Riy(|7*}; z&wpf`!~ik`5?fY%As)nIf#(E%c1b8wshIKOJ+RuuyCZq~fe>%tr+p%79SAw8xygj% za>Xx|f6t-oNkB1|&YalhXR*oXfc1y>J4a^Qd(ppMm$C#vE_paUUuf;W#<@EF3bblPVQ47 zJW!VzSaQe8ELY|$X~xM|#^fHr{%*PktVE7NMU2ZEP7f=Ra}k-y4DV0k@*yt;Y#2{n zU}?(=%cTH042H%V8Ld$0{t43NEM4lhnS_b)4{bjvejxCh-o_hStN|~`w44UVRuv0V zPljPn88)JzpNA5|2N(Tc9@zcXSKWr(Wl~=90qD3|^@y-Ek4YIIocH}Dzuj$X_IozP z4ZND+t+RlPQMb5w*cTPPN!Uq*iVKXvgOzoqgpZ5Je=8{p7IpUF_wIo2q4oTNuQX8d zhMCL9Q%S#$RYC3h(Q=WPOcpy8Fh*2haPbkCwV#_s;+5JlH8Ve~ zPM<>-Dfh{ZW1E@=#Q8^N6oxt`=D$0xmXlj%So1eGE|JO?IPiHVl+o(1wzptAn_Sti z)c;W!xC&{%7jiOlJ1oAY(2l9<>vNZwB}+iWDHbw1IhC2#pwW51AHd^dS_V@Q6Py0{ z?w>9B<(#uEm+1LNH8pID2%58U9mF@@Hspd({pZd6qmFpf4iq{rer38abM~1Nfk9>G ztYB4jcEz+fYix;Z!Q_TW$Bd>l7ZG%2bv+#S`(44Gzss2R#^KbF7)}Zt_>5e^Ogw%t zk4@_y5pu!qAL6#ZbsaRSj8$hbHn3Fhi%m>bPfP=eoX#V4l)F?MxXL+V-H}OdSyuyO?zKxU4vH z0U%zNP(_F;LX7XX$|Kwfs652pnH~1YfJ+FVD8_r%CL9`ObwY&P2G`jy)+vCU#y@YTh@W1_kjvf1q1AsAS8$6QBP)z z7~@%$elPR` zHfQ6VYgXP`9Ki0VHE3rmk`wF2y*`e0;^(T{fYV}R+QYM`BD=GAS$GaYX&FiJ7FRA_ zfdW{S!C6}vrNt#g_alSE5tZSgX(_o(^P3P!aH;eBMZMm|4&Y)#NH8KJ4)T{&reo%G z`EWxkc`zU4URoX$$gB)mK;&z2gh`1SsuxN4zmZN1;{n&7y@k`SZdEU-6e21`X!SPH zYhFw(=_pi_z&1pujH$jH+$2or7fU|}PlV)H4)s6E(;rnQ%TZtYv zFrfNSad*6Cf;kB0{;hiU_H)uiL}9s^M#XUpLF{U=??iOz25}q^f7vsp`iq@H^@wm< z5}r+LY=9;@b6vM8mZ)EuXG}KRTa#k&kHJ8&6r!wSTObLfR*-~3jYof6^vC=o%uZTN zLs#_x&o6*x`78<#s0~J~!c^W}^YMr|*Dpj(Q zWkcgt>arO=ZbVtsLCmi5Z~x>{h>WBYL-N0 zm&o# z(x?3|%hTaeiX;r*64xzRqLeEc_Za$$B2+%EP|(bq5=9b@0&6dl~^R0k@sK2fDoMUB0QHCjkYb+1M)@ABceyz zNtF4t-i+S5)KWcN2#K&7EZYIrOezkC`!mTFJIV`s>{~!8&rjnNNE#wK7ZJxx1pm@_ zO1nND{Ucwz^p9A;(`{!xF@fL91qz6LF2sfQAR4eu9TN-TmWKv1y6XkqCAE>dB(aIU%^2sp(pq=lL4zjs7eAaPy`FjMLep(CRr z$-Ha}k+grVs7OPU{^0Tpk4+t^18H@qw=ArGH&y|GZDzD%vt_7_AJWjW@TYk5WvVHAnU zinTat*=!%04F=J%9jPGji;-bUX63_;5l|Z?V*p2L*a#pMX&Ao!wKql>`ta{52RiM4 zT+o15S+0!a{uJ`5_@3QxF8#8ir49jxh8J+bIX{z=?8luoBH%u`e0gk}j=*wjxI>A& zt;qw?PT@HwB{Q`R>9?=fdc#jj$6SPs<4bPdnzEN>A;mjFe#V^LU+G%#ELk{DQqh4;UVZi${iw9n%Yu^n(U)BL)EhVTfr zp~y}O&yJ5blrU$0L?D`lrC_94uX(3qQK0@1us_$u2xr=t@%GQZIxML>^E@|WTNq#Z zfSVm^%7xPTkHXp_gd@4eFgHYNRZ@63t2r*0WhJ2MVw*o|6%qYt7YLHd-fCztA^m| zP=))Digc3GxALjM*Za9ht2BRrxm-;naHHb)Whh|Qg3;#ed`Srq9Dc%rRE1@pJq=30 z+r1G-k)s!8xkW3|3KJ7+=-!55+CG+JdioW6U=Ug%>RDq*FsX=Gk63*R8JcQ-0grJ2 zuoYm70Cq_nJY8BE0&x_9LU~hRTnYY8{}?jjzYQ7NWY>{X`%J)SD|LX9W`<`PgOf|XTZiiZb;guDLxwVVU?S@lnfTV^#X zJcm`4ZlvC$V+puP3qpNfkh{1SS^Op-iRAM14#J8YWwPE0IErMC4`~_D#i?Kc8ygK+ zV#+{9&!LvC47KP7agYDya3q>(fEwn;`$um~)w(+Uw{3x{67AfQB+++6kuE!J7&PJ} z^_?&p#{u3D*%juCs*?=#ZG^=R4b3>x(gKMpNHjXBtp1dic6`jNP2=O@6(@cU6Mv<_ zTa*Q{P~R3xN{F0K`Q2A0f=5pj4SHtd@nVc&Eh! zka<@lP>T_ux|GbLIg1w(I-Ur)tALt)GLJSLLK&c%oB^m6T0U{PSSXwdim%(1&TC^6 zJ-)Ok9FN10N&}(sTy%OkKK}H%f0i-vSIUf&mMK1PES!E2+ki*hTT=1P9r!Z<$}{#f zexxGlKcvg^Ri5Y`b|N7yfkXSj2RW4Nw>VCZZ@L^ z=mJv!qNqcdB&jlbO{nB6X7inkK|Ra4ulH^xUjzyi^Z=-F$c;dc^pBPQ?BoYbImRhY zz!FrXXK@EohHz59fyJ3rliPKpUUX`SxHw)HEj2d@df4LqVa8VERiaq?3XnPt z&rYg1&Uia1GBpv$_f&lBKh6bvT`%xv!~?+kWMR|gv&Tb^WI=@u2;WK3(FSEin1~(_OGDlz-Kg<@QmiQ8nu8jY7b`gKaamU-E zIi6DRvZ&z87i%zGX`>P|+W;q7QmLR9m9+|zN7o$?7_cxoR;9CSRbMe*(=fHiwrm8^ zAJN|gqE|j`_z(gBZK<#f%OKZA!f!_$CEkU_u%p^H<-nr}%zl|P77bxx@$Q8H7U^Uf zHUc;;HwM0NTAw0fz`#{Cr=9>DYrvzP6_;|!obX9A&nvmlxvz(2WONBpr~Cpdz(RgY zd9?r(2NdXEx%b6)4G#|eUlTGRUGjnOZHA|Z?g_2~*DmNSmg$R9EG+||By5}Q+Y`h1IDjfoe zJ%lc)x$%Z+FfYXZx$Bd-4!~EU6!(UG(zkPXb^7dO9MB=X@Wh2|uKI?d1_1YJ7zTf?`?FFZ2DLEX zu$?NM#fF?TMN-!y~jeN3IY1#{LGEW?8x|A)LJVF1)%O97f~Cb z(p@U5w;V%TaGF;y&7O7a3p@WW1c8T203^g>`NyT^SIXd3OErI>P@l=~zs5`F?^Z3A zegtTK==g!De0F-xSCe>p&AST#%>A=X{>wBcwLsHp0M?K@xzt>I&_#2S@T|Y1@WZ~s z8u0t&|M@HKaB`_D4=|AHzf65qc-Vz0Wxp;)U+4~=f1OBrUVq>p9I{4)+luZ zF=A0t=Pl7f18^d;MDZZD8A%P69F<{de#9~k#7Gou0KPo<7rYB{HkUpZSSdwn?yLY& zY_kcXsvjDj970jGc%LXCdSY~su^SdwaGbQmHZ?PjS65G?8E`aMHt|4bzEx%1NDP(ii(8@U~vvY5Ogvdf`4J*wt*ZM&5Kb&W!&nI0} zf(!SzUpI=qbHQhU?3ltMOKInCMRgFbgh=T$FKCzeXw`gET9fnMpykWD;A8gMUpM-G z-I)1mDxw`puQb`UR<+>9A@(j3ILJdfzZ-~ssh;USlkLHWlxPeWq?&N(^GX4pX7K(N zc2s1x6>43C1W*@aM{#-KZeXL8Vn4r0 zp82G*rUA9!jd@D@!TYtoWAbCq)=a&xN{t?b^g=wwKcmmt z1FzqALJEPQx7f`{JActUKTKmQfML=Yprs(Bpe8~vz@X!>X0t+8PW1;>7q+H8Sy~D< z+|5CwR4>bB@W8--KE4*a^sQ)gKiixPZ5g*6{Jt=HER6vQr$ktB6Y`DSq9hDw zp$ZdOS3`-kL2?UVA0XKrQgjQ<7G~1tL!*^J(IbG=$G7_LrvXv4gvczAQfDY+G-@7BL7q=usiiPA4GwO*q{|MNu)uX))V6J99u`O~`f(1Mryvh>qX9 z0#F37vH%ML@B;noKMlXZjpTk_Kur(z$B@qX0T=af5fOvb>jyoyqpY@sjCxo=8$%$G zAlOS=2q+rTfn5M_!0h_~n|NAPJHJ`_H(3BG`8WNnF_l7ORmV4ga@sdXVIe*YaN0;_ zX4_k``w#`O1`6qDVR>O;USOBwX5>_Fda4trz47)5%Gb3bkGukj*nRTF}dRAqXvDXU? zC`XA?VIK9&`P8^l`x5li^tZ@uD27ql8W|=gil-nB7-vbxn#b()X=%B1#>Y%iSy)Ml zI_YeRsV5qfk#B58;+ok8abO-5>mn!;S-+Z#WuzDd4A+b|aND8t;)EGP1e`IKP8ysb z&lhXY{=&9r(b>J8wZZf0y`!g@JGcRx1vnkJ!FJo0^GW#UXR~xBHS-hwU;qOG7iz^o zX&Xf1#RnLOyihFOj2bGgDM4(g*oY6mJ=chy;*+XHPK zq`$y{s7CrXa36n>`b%xMGQb_M@_|`eFYI0>O(BW3HGD&$oSpx#SZ7f=giTg>w2m#^ z=zVQw<6Sz0S)2B6VY!_yMh=YR>&ycTEoozq_3aef*~oHMmp?G!MJS$Vrm!u2E70Po&78JZ*1{>=&DyAY-}xKm*=e>H?Dl${4uM75pq+ z>6T5b(@Z^YOI+@8CZbV=dnDHUKI9TmC2Udz)Zi>?LK5p46w&)f4tr(Dx-%AGp<`i= z?{r_Y73G-c50fG7_fT#pqaU5{fG9VdBe34C;AaHn=HJ<^8KRu&X&UT;ywm zR*ZOe3AZ}0+41MZmMS>?+SU}ptkHM_06pi2(*f89Dp3TrHjNSK?=?`FeZ@Cch;rp+ zWZPTKTxn;eCiHy(dqr%OY&M$)tUUTIIDH4+(GDQ~z~;RW;4MX!^^KMer~^3)WSuHg zSljp_tUuc--Y#@p$V~}t7(S-j9t9$y)u?X#aqHHNJGV$~5fa=cxP^~|rsldy1-?ad z7xWNeB_ZiXK>H_D9~F{RP^awP!!4!fG5MJeos7K=GkEd>URb|J-@7mUI~Mwn8-z+X z_g1acgQ*ehs=7xnm$VY5SDw=y~jnL5KMh zn_kVzkRA=c5yvJ%WsKsj@|EvWpQD5SF2u$H@>)fJJe2O{UDj1BoyTKWU^4gX zhSQ*=Na&kfIC4uxi2BV(ZKLjRku{;{sG43$D;`5eVGVi{=&(={-;Vy5j^4$uZ{AiU z$mQEFWf^H8pQjMvu$O*-CWUxR@>r#Sr9vaky#qUXsgb96D=uYK@PvN=$9?CRCb*U1 z-5-?JZ)3VWcDW@6kLL~7MPB`EWcQT?e{!Qfvv zUTl}f5I?fg@U37<3N~|<^Y9P|H=pq_!2VgsrmnjqzZSA0Sxy{6JIjBIw~g!&N4EMd zwBVTC+JJzmX`hfOo^fwJE}Ze4*&}lVwNtD)Xa*^=HWl0sDi*8_$q2b3sW4h|D0*Kj zW>Tw{czL_rCyiGXdFHWAP>I)|dGuxg zK`>46SwjDMxlg@Z|D2T^6EF2(;OB9B`GTaDg~XXgqPQfONuH`NO@V&u5<_u_ozHcV zz&P%;lS|~o>03|Wt4?t@$Jz0q3_#%N-2!^Nc`C2ka@pl7&D@v zY8lNM16Y9y0b@VQUkRP~Hct&t6f;lgHc*x97Pmf0)5UOC^!%W8P6=D_RCxM5Qz)f; z$TAbCvYz9d(@tb2#nui1^Qo5Z=r{EU2npT&N~Uz{rrTzX{?AH`zF(8g&*++QMc>Pdo=y0I>rdY2;eMae=mm$<<~ZA)l#DDJ^u^Uj2kZ1gW>%h{ zOsz)pNgitWZ>n)nIEsIo!FI=q+g6q9rR_D<^LVhg!&jX2y0~UvhpD_nOnUjz^XhB{ zsma$3#s1wAVig&GzsByFY+$67Ne05T>sBG3O5pjI;YvtLQDI zxgp-{qfiK~kEZL=LAX)>wdVF$h~eknOYQ{AZT>>-(z_dYD; zbQ)%%6mLtka!?Evn1SL6DY zAMJdV-&m51MJ;EF1t0&q(b5RkI4?4s^!_K_V zhk1d@ZaH^*iHY|lQ94ATBEqc^ZHH^lxda=wO&V6?H_a|G`+G$97?YHw;_}Eo2=yM- zt9HYhqcNK^m0_gZl?C@!J&jn=gGno;GWVj|Pb1?{h>DAZ!S0|y0&RzflaHN~SD%a} zx(#%XynXV`e!*?b#xgv&C}PL(Y1)>K?hY7HP+EB94UW0D>!Q}=$rp4}nBD|NR(^AT z-RVjB`$+1qsm$T;zn4xFd%EdzrO9G?sx^Et&@T%@#X_Gf|2!wDF`Uwftz`&DUy$}& zEzOU;Gyrl6M_#(E51$Baqwn;`3T8vJkeSc#qKG9W-2~rve;q>UeGF;D5Xe0oS3oTnNTcb^yrBKt+;cw^8ssbwftI`)e4qMTIuw=3a zt?fywlE-I^_bx*sXgBS)44{01I`<_F#GkLER}hpR+G}sHFBWEBQE+kzX`~=KL#0|Z ziZ$W9(xC6T3U^fJ%$~frhOeulJ_LU}QAe*x?yuPB*`fQ$Y;}r8={D*$t>IwVvp`UNHPhdv`sD(TCwwim%&+D z=nEbcn5PeNMdy?wVD^vVmALx@$d*}!$_4nvu>4?kN%zIm7PD=TtK5RE$=@k=e7&E1 z4R|m|tPIowl2VCU+LV6nwIeT1lUkw|LY3;#dRt&CTH@%rwrY=NYB6!UZ*`F02=61Q zz(~gA@})3~{k#z!hP65>spALVQEjS!44IdW_w(Oc*z!`APwZIL{=7t&k`|EG7xZv-sRu65`v6dZdRE&DYlZ4b{Rhd{`$uku1OZ8q(LvA zM(I5|(k%P=Q06^<_T=?J)%%I{a{lbc)0Wa*L$iY3l`8LU^50Sdi7mY_ll`)0&#oZx z@NH@mPCpgB;vx5Um)kCx6wQ6qc%fhfy@$@7C7lT8FSM+4w(~f``his3=^xwX`J`6n zFgFa7-8sFmjrnNXLm}6Dv0Y%0Uc}G*dC%_{eV3?;<;*25x?b8m5YMYB!?2a|$3GwW zunlRB6_0!OFkJVEPi#GWFvGp2>f=>Oi2Ze=3>kV6=i5ap889Xj;Q89|vR2*rwq??) zBM)p)rx zQ%}EY{o}jVw2xuyPeQUZQf`9S^lZ;EL)X`s&*G!5oOhCKR*Y;n`RhRx?N_KfhWy{f zxrVg@@2CX<3Q(COaVnLXgxsKA<>T=BTq4j%xCdxlCw=Vi-j;9HVUJ+tYiXH%dD`n= zxAniRmORrqaududI!&$g{^X&S|Hmi7Nsy6#<(s^x$Kj8r{c1`L9&@Xk+zOQW%8?q$ zZ*mDOJ%`uS93+g9@%MWTVsxs7lin<;b`r%e&AS!!^P27tEnl`Ke&_#aCM2e3!Dsun zLf-War#;i!zEIAS@0kq=b+hzqpQ>b=a#LSr2Ia! zja-5Q165hMFf{d%A4Qo*6A^7@ySI%`{IH81BG#?`lc7O%(dv>;5wm*p9~VtV{2`zD z4PSFpwJ>Y3$V(U!vzR<&Njto}WB>5+=z96Kvg{jM%_lw_FiTfxj$ggo;gBkLTB9j?kU zy6a9)PqboJUE#@|iSyw^pD%n;&o2FAHwmG)$4mU#KIUQn-1pg4$BGW=JvN8e0z)Fz zMvCT}rI;}KR9HFA2!ZyTTh(#SDtk@$jW6iMpWj`AkF_t)ZD9anfH zNvjL!M@7CY>@ciVHpshE8?4)#Z(XZvF0^j)y@cw-LGV5AvG!At&O7K+R_*y<%?FoH zW-MC;SA4{URd4!I?9Z$!-PHL?CEobw$-u80R~XPd6%NL*&{Q3`&VDz=IF@ZZOnf4U zJFy+Nt<*g@0bj|9q_(GL-1Opq@RXb4o!U&YJf(wGryZQ1{}}9GdN(&=i;IxS;O|;z z_4}4nJB6=mdRI*EdVFe5vVRaL+ej{<~uSh&~T3lT!XYwXLQu zecO?T>*}p|9BloOv2~L3=2P5Q0O!=qVAPjBK5nZp3wABqP!gfB2HcNvwN(Y-q$S!A z9c-xyn<;zbXXnd^U`$0N8%bi8yQ*hs{|i@%G;x{|rZi(ZI5!Wo!RnKD)CE;PY*y|k zbvT=q^m$NMQd5< zAv!ilQcSo43P+5})rU8a1lw{nUcV{Qq$M#t0D%U%Vv|v4Jnlpf@8&jjf0w;qKJ>7q zWt^KNpZY=iPvT6at5k1hbO^X^X60Vd-%0U2T-+j$ZWrj;Y9l66+3#3ohg5*FMzD(e zOAn8-QcDe)r5!uz{{GPDS&@Ff@iKlpAeJkvi8!S#Ul{%DR)d!^g<&q-oyXAJm4TQu zE^&3??n?z#C$;wUy#PWdxwu&MfdM1-K#NjFMt*jTs?;;FgDd`WRX~8-EL5shM^Je@ z)~KL0eW+@$FiW-J@VB;OhvP`&;^Rfc<5Ww2-KFU?nSBjXEs*EK%#sqr%BW?qI0K@I zW7xOh1EzoJ)4gwyes*;$byfC6TgKTUocM&XMA_YJBQh=~YQyL9iIN2&^x~FH6}Ts%K!;0k);mF{AMmRp@ymmi1i2!9tnur6SnTeoou7w(T$!8dEZf zEhc6e9-1rGukbCkZ88GRz3U!sJ>>~w-SID?iMv@g7k^W5Xt>*|C8srEI_kxn__>}5 zW4bLNBi-;cQ#&qllol0;1E|wV0b8EDo>nWz6)%)P;J|(-G|E+-#9il>zY&Oq z?$i?1!Rt3$Z6wr0KJ%F65H8)R{irLu=bG!iMMV;81Ub8tang1%qksXncrNwJLfNQ| z;V|L{1y*1#Fx~cBzqQm}C1iD z)KW8Yzc_0sPYS_`LD{$NIV1YQ&kpk*MhqhFY^n12?6@o0wXN=IW%7;I&%*Ds;hY5K zY(u@zn$47GN*>ZiRqo70+qZE)b~NWn6EfL6Qtu1-b>m!V;c85V;=Hj!slV{>I@(?d z6!-?NiY9nsXey~Ok`wWc3t^bh3Nco`gNRg4YmGkfzQ<(M5+4KkVlT0&b)`{p;<2Li z2ae<8+|1<1>7V*-*VSHLI>G5?3(d zR*8`;|At(TqE#(2Db0+Ej!O5w2^*_!&V5T8d^D2x-}`Z-22MlU;|`a+cQDM!rg z52K$NmGG-9m&wl!#!32Ynvy)ZWHJH|@)l>wB0HbebRnkb;Vz(xvLCh$PQtX^VaD_f zx-{vtHEG)hx>X>ox)B>CD_HnhOS8%_gj9(yMabI;-@mNO-v}F zjB4Xc;<+ux^m)~Xbw8H&82U*YVhN;~Kua;g?;m}I^-fD7txAo$)HM~7Q9W;J3B zba{5UF;}>a=bpi|pV%cO*$MeUJK)bVLAOc>242El_*9LC&z=7aJB2eFn5i1WOy)|% z4Ks%YM3rOAf!}NP?xa$Kyq@HaPWwzmr$|r_|EzQ|E;bu*mXt<<6hTa zb8b%zt(Ye55wi9r0kFv}$0^6j-gv@DWQq=^ldm(cR0ry>cg-L4>&D#3Yrfh)XlK-o z)}8!1{k`PDB@=r!nfni^3J>Ml%kubk)jCO_f&yh$IvbYUttLa?jSiHan+#no1#_Qz z1w>80zfL(d`gNn|YBu=me=l6d|8w`%(m#zV0tnZh?wV`|aZX&y{3OfDyQLU+P4KfT zhBNX=iE>LfTQ@0}bK;okQoP_yNqH|Qa^;G$=Nx~LbPH$`UbrIt$n;oOZ{W`7K+0bH z1@Ob|yt22U&`f2zys{bluN5_he`g&}8~AGkQBGWP7MyV^?6aizT|d!Fa7H52q=60R}7Pc_(WHC_@x=yuzg@;>Pc<8Ss2F*Fj_Q(V_g$-Wl>IF1-4pTHWh?YU2c1OVgo^mG2Rk8KzUE_ZqG7X)5QM4|b0%hv##0jd%AjLxl>= z>RafJehzWlzOhUbxISJ#{YBQmrW5!*&qg@>ds$zJIOEW`+DGv>$qwB+pby-wlG-m% z7(}-1x}V?8ZXF!(2^25!{i%o|vv9`X?O|ie|nD4f`gpi=g zm+Oe^LqQ2_YqyQ^IaMh}KvA?igqlVz8kU@fuC8cikA2)9LSk5~;rLMhC{a-0#5V10s?Gk{Iraj&pROi0`yZRl^`sa$k+n&tx`zv1T zc?FX^E;pSD1#_o#Zq~nJZjieVc0}IMxhSUStF zwwf+n)8Z6paSarQ;BKW9cMA#b?(R@1MT&cH*AUztN^y7B;;uzn^5X^P5sFT)pU;)*U%W`x+EYp)VpoHlLjilBdCaZ?#bkDbVaK-*UcGQ90c zrZsEv`u&DwKX{Hl-k~>{K8Ns#MOinEkxMM2lPz~fRAKn4=glw~dgIqBlHi20k>h91 zwq3fObH3VKbi;79jPfFdUC0_V1CtEb^L=r=cSeQmxfpitg0w_pxso6S!obpW8eDcJ zVsnzj2kfto3%wS%-RGl?Rt@hFR(goak^|Pa5s`Hh`?n`Qh^!*s+ENU3E+Q*AEM{tN z9`%WpSjiW2rJ`m0|F|647p9~v{W{j%(vIkh%B{!Uli%&S{SF?TNQZ#p{C@ewo|4CR zPFsQ+$=d~6PhO^$IkVNQBSQ+df%^GJBAV^4t{Q3P0>Lp+E-gwP2W*(%WsL+)n>*i+ zejK8w9i@pBS?v;Dolf<(H?Tf=`sC!k88bNSxyiY2Q3?60N)_O(SQu(SO?V#td+e}5c;KIQ3 zVB*(1201M*$!Bz?pO!nkQ0!`vXzm?u2DbJR9`1}DS}f2qnVYr}U!>$U{(KoP>^bU4 zD;uBA)FEn7F8D57;^;9hN-^0XgXl)I0+;6lx1>114imnhP6S!@y|$Df$<`>QAY2Uih0i;p&Crl!e4^4A3_&k53yEj#nwD7%?_0&VUMKL z_61pY1km4yzlGrKnhBlv*;NX|k_#G$hj$uo9$zxnKn@DD6(UR8nba`U3 z&g@WSQSZMDAxwciYg!SLy>0}(0RU3eNAY%8RMNC%aWYSNk}u)M)zqceT|HMnDs+{m zSU9jSL)VCCz^Zs?z;Cp2_Lw5|Lo3n0I|l@@y<=D@pTA^f@z;B9WNFv)S?dnDwWd@kRQ; zYS>h@6o32-Vq8Ein*2YD~w0pBu@98$qA8AtqI-Piueg}J6 zkSAlY;dcElFWv%yV{dZ}U9pgc1ihXG}vi+p(*UMzcTo5HwxW(=GW zWW&|I1P%@~)7Si9cvuj=f0@S7wu$2OG+f29E0JXILJiT_HjZjv1*^QFboW%2D4cuz4=B`7?Kk*R{?5PBCs5+tO(nW+^Xx z!+7fy1}U@L^$<>6mY8-Wem`eD`l$+}!SCU>4slcs{-iaY@FTNm7m{9LAKVz=6R&qN zGg)-cXFs1?A74Dnz~omVlmQ|l>;;Oo;Ot_^#(ly?1Y|p;YTqg|yA%xFp${O1pOKOm zku_{ite7BZpt({-j%BdnUF)ViKtW$(N7a#7HjF+t7pBl&$XTf>OD0c!V84&mxC(ql z_8aDT2vgj)(3U0>N_I$4q+4}kTNQF=pu&!vAKCUHjn=%vYs-6Q5;d=^We)Zunmlvw z#1COBASKZ|*~#z2S~C>5ZNATHDl|J*v^1Ii3&35a_v-{#D3-T}L70bqyQl~JlK7b` z#`9K>KmQW+K9bVbZfq4g2L8j@P(^b_F8@K)iuc{(C5OD5>AZ2UIy~0YHV$f(e6 zUTST}YOWSuq%M#+y<|b4Q)SziX*^z9o#bQhO3fEx5-7VPG#tX&Kh>8ICA10KqYQU* zoHkX_fCxoJc~A$Bu1@+^0ex6H;iFEAKm6o$SUkgM$HiK?rw>GatwBgnzJxo{o1Hbx zNAv1|P!=?R22nhh_!+bcngZo`7>0VW`;QdSS4?IlKPQ%%pWadEh^&M`q|mT&>^h4S zBihCAg^Me$S+zm2$XB^i3J}5oI}xnYiX!Fm13p5hN_*P(C0nzQlLB}T4&W2!#S=^Y zsh1?WUi!w&DN9#-XmwqilER$Mo#eA^;l;(#(m`OXpT%;vqS z^kN=Q@xnig*+J}&RsAyYVd=T%1sBm;aU~9`iB!{|7JY=>bm0UoP@)3Vjs@%J#A<37 zKd^u{tV;je+R&^@JWs53WAOHcO)z!R063x+t^B0HN?>03aD`3kV7kmL9q0_kH00SJj?-E`cy z_W+2l56&{-{-yZEgEPL(8-H@fH5#VijXzOG7vr>;In>Fv4L1HZ0sr(NgrRg9|3mPE z4e|K>9$j3S#E{fmcd}2iM%Mx|cvHwaZkjvv1AFEW0~sRQDSR5)3RBIuEoO^}l~*2T z#l0*Y%1~Ro-iiTBwKLOxz1v>&DnTDAr%=Vyd!P4ut$p#{o%-(_GUK-u5@QcT+>*az z^sB>FL?Sx-bt`TXWnrg!q!2-k56~vn%wLO*^(N)E2et$nr;7%+T>S7wc?P=lij$S4 zPLbkRA3=o;7Aw{+G_My`E4H|1 zSv-isMZ8j-(hD}OPeudmIGU|jyPj7MeCTa}!=Lz?yh0UsW8t7>$G+uEGSJC+iO(@9 z(8O{H0g9I^R5sX7(b&&=s~b`$U(B5Yh|sE6`+yH#amqs4Sk~`F91h_QPEJ(1+O^nksF1w$ z$rvcl;?H601K_yk$Z8xLhm~OLNzChSmt}6zyAY(qe{?d@95W7=Z)kdjiN@~8*C&Jk z8|a2li-QG=e!l!B_pk);HMW&k{_sUF_$>J=2G$&{xQ6zRrAmfVje7-7CTn!`j4A0) zqR&1LF>GDFqK?SqjEYGIC^ok16rdHk%ce@N`H$m^Y)1?2l1gfzmwZ6{r$yNMOp?gK z3e~HlP9#h#9Qb^YDrWf!C3I0u2g;AY{3Xg#%1V*+rk0=@1{H`C5Su}NJDmNhAYTOU zIzq^2t=IeR-H*o|p<}t8(bAOn=JR1T_=>E*TuroOV+O>-SQ^Qd>U#Dd)8KGu1`g*DXv{EO zfGk;WQo>|@TUIwEk$7Aay&#NG7l}>u3@jcqgbGvIg)vb`>CJKZrD*qpLP>j+c+NbV z(Hv)a_;c8W$nYm@8_2$^BSdCbYK7M%=1nyl6=_BFOJT%BmWb&g!C>px-v}`tDzzB-$zs0KFG3UZ2q%pD%KkQDxyW*#sjX@=^h#hP(~L?xm9^!+qkB z^I_B!Y{N|WHE&Yvhzy`w{8(Cz)?|lsx8~$=#GBrVC|1jx@uA(zKldqA&5kIn2 z@tgfxJop~qpC-d7q*O(s4}qqzf=^&*i;`q7%Z=DZ>c2HcRYtHA3LeTHf}~r#qEQ(m zlAx+$7Fw?95%(78?usz1v5Qv}i4ARFNd&z2F(M)o_Z&!0jGoAx73kxd@S%@Zrc|a$ z=e4ZQe|EV4xtHvyfkXQQ*UCLS3BSQa)+UUK?oz;&Vf;9f%wej%Il} zb}Zm}q;kQ)r%n0eZrZUs)x0XpN`UZ+I#z}`!j5S`F(6N>Ex(L)e168es|f&cSaZsw zBQ}TLRMG&I6AMK{i<9`TXm!DslBpqNWJ3^LB2`7sNRY4+q_Yh$@;e0W8kIxjW1Ptt z`TU}i*M-?=AN$Lxn{Y{iqOr&?crN* zT_o8!nae`H`(fU?Jjo&ixT_#aP+tg)#g#u50FCwgKTElJz;rQ z{IP@mhY|JB@FJ%qw?=+OgWyvL4WYbww}nUbwY5BewkRp4`Lu~1r;e<_b;Y!*Mhk7= z6M-FpsccX1TmE+Aa+VI;1Nl`x3*Zv$`v-7&C)$du+d2l>XF3i!NN_^vK>9`g(wZ5r05Sh&P#IF#pc>KhT;s)S&)dSBf(Txsk zbb$&4^?!HI3i;oVt@rlGkF*z$;$9S2;)Muvxiyk;x&09&(z;&u5W!CS8ZI1TUFUB# zA_(!pH%azN(WG0!MbSO)vi5EltXJ`O?Cv$j7Q%xOQ-*lX} z7wE&Z27otu%ZzVMp2(#Us`8yAHpM9;oZ~o4J}M+3Rr@=EmDlb}T`=hHIWhaNE}3jI z=dKOI0-EZ?NTMDlo(Q?Xy}FfPxU{gId%(u09jEf@oHq?`;B zy)mpq!`odsnj-oh2)-8w^TV}>egFvl7UX0$gmFT-yu+nwF{{G1j5AdKl>^1?I==d& zNmPBuUSm|S;K}0^oM@;M$jNp}r}$PrbRLB7+OjQ(XDCmhE2kmOQV7|9S$4pQCcUpS)2AV9<)&=aGHMzH`0Bmgj?GnGZ!Fr4qr-?aY4N56p zPGL&dRw_Cy$@gBf}T9(~dNJh5YH8i3=(N3uOt=8lUJI)-Mx`m=YU^ z(^O22*7Z(PjM6(+at(D62)6AYcAHqZGG1*bW@C0`7H3^Zhn?{XA8@k}JBFt!v&dCe zQ_zb6%kCduZ6EWqOo@>wiAYj0f}C9Jq;=eYS(}<6@t6yW{trp9)HqnL?1lfSfHiRw zy|jh9-EJDV*ao;^=P!;)2UW!}swX*T@xuP`GwJ{S4pBRy9Wu`yXvMQ`Bwh9HI5g*6 z8Tc2u%!~hVT%ibY=M?98e#%L{I(~AH)GJnf5G|aKm;Wa~T>Kala@K}&KDecX*nXyj zLH50+DTBvx%{DkoWgQ2eh=4_}Q+E<#nj%A>kKoF3BEeWa1xa)X1AY0}$h3xewOKa*A*CSd&MS?}t36Uc=LZnzn-YB( z!BQQ??)36J->oeR+p1Q&+U-&siWnPnC3dtJIefCPw8+0eNCjL>34$5~4n+L8sNLO>p&)h)Whj)C&i5R?&zt#QiU{P5*^)B?oIYldz(pRezaH>Qi6fnKL zPzdZuZ9JPiXn*0J)%jl#9G8x!jSi?Fuu#$NL3SC^?oAYGG(dGC2v5^jNYXT|B0hCU z0s_u6^j$wDm-p6$&?i}4Hjs>bcg*b*_?ee7Q`R0@5Tg5|omMweX>w9Uu^Y{c>ei+i zH`QaspZyA$!#2*1@X4cL(o_>F2plj@zLQ8DZOj_6`l<?I(Ywwh^O6p0 zRDuINQcQHeopREYOg1%9Xn>MNs#fn$8)733tFxRvuK4UPO6HHgWR=hrd#Nj8^4b`N z6OZ%fL^c6`DAf?xGauLYVYf9V2oQ#RHJB^=>-ja7E@;lUonm-YBAHRH$S=vmjh(+> zIs{@?l&KGhmqJ6^b%s65K+N2}gma1IG}E42t|Z|MbQ^_Rl2Z`T}_l}kI6rpPc7(Dnb zBb%$%ojLOQhtsa8;wjTit$C&ptl~-R-rx^Om}^dG^#s8V>yALXjmq89Sq~r{Chf4M zm%f-V1DZK8f9nv)Xij1Tsbuf*Nf-d#$|r>f%Y{DUE#GP zQpRQXM0%Ron2hCU$v9W{RjGH&yS1TB)QLE6pCa!+Msq8BePw%a_0=6-b}XSb)f?t< zAwNn*Yy$u^!d+96M=9PFRh(%*H$9c);1+SMaCbNejV63~B5=6JablF!7;a#1kLe28 zqSI%V=q|<9XH-7h%it<+h_;B0(Fa7WRH^N~fT!F4McxxmxHr_LsqeIL-NC$YK3-0-nR%?HY(~vRCt(PM7jr)|0+F55_(YDCG^FX!z6;| z8gpVj$oQg_nA@+*in?B8cr9oCieXfpf<;c|v(s}ZqjpD>uDF!Ee4D*m^{~l!EJm{A zip*A6j-|eW3vx3wELPklR+y7sk5(s`x(sNj>F}?v6mWAj5$31^??{roCZqBuczDs3Xi$pLWD&%`j*hR!`U?49kG{eb zM$nbqxTN0=*`r~Tb{bw{h->3H6bkxWMAU|33r3EvqtVWW0?EkiBtH%yw&yiAxL3D( zqj&8^HCIJ89X5j}FS6b{BorsL@mL)3v(nj9y@d#jWO?wD9N38@RTs6c=tL<}c;7WZWb4RgAA)~!+iQevwg;FHMTSBDJ+ubx$dembqp~rSiN@@exGaAf!zo>2RcWsXwx+j!*;v0afeQU^^rnEOio&z$vJY4r*$x2IW zOpW)nDu$%X@1#0ISlaou{LN-1jnTXyHL)=Ow$$Kb9kFB%dK{Pn6W#`9&pX#f{U|)$ zO*duIZh_kX#7_7VCg)lglzrEx;r);`h0Sh(&~h*lXq+blDEINZyOj=u+6p{V$8muO zqVM^muux-uLvTcgj2Jfrl+_i^Dfl(Dea@ElWydjt$KqE~_~mrYEYq$7&3DcEEZP1o zG}8DlNyOM^jH6z>o^I8GvAHcN-B*#y0&~`uP!tVMFtnj<-m*P|)!9z(K`YnBE1%- z`r%3o1YFg}OSc(9s7gQWFL048(N$LW?}{QU->6R? z1-oyPP|fb#Cu@Z9IE2`eZ@r1+O#81mc-g~Xh19;s5-4YNpG3TYenz{lN`HPMVnn!& zm~VESDRkT0l0`Y~K8aznN0NpK-Y$#3seZyu3x={Cu@<0%6eum}Nag}%fX{i;o|4>F z5T5&Tqsi7YvvaRCrM(e)PLt5B;2da@<2#=f4^2h|DNpOf0qk}!o-eSL$<25;Lz1Y$ zDlCP-bnwttLftXPa@BrvTu;8^%r=M?+IJBM<0+|ggb)dk@mNpS*%C^yJ&Tg@u(DEvsxot_F5UpUfi{o=Jurjc_Nerk{_;A$($k% zhBqgQEdZa3ZphreR7+&l5R`X*IW$(vUPaT<%+#%!-upac7?aL`O?E~dPc?-m@Ec2< zCI30{NYipT_D4%(v`HUMe=izGv61X<-F%kX8^;nOFsy3Kv@&#K(7wl-f2NxDJjqE6R~#HBXu6 z4jyqj#`24Jr;vO2nsb03;Xm*i8n$C4x%htBh8okWp}1p{>KgL<+CA)#Yii4EMh=Ix z0(^BR<=Xq)K1%#8Ka>=*rV9U@<#3L>qlr@RVdrS^Kak!_r-u>{xmK^+;R_ID^CMPHD&4m! zZ7#I`IKJpKuvc^w2=^5UN>f{#)}PUD^#44VL9%RIr~gC^|Bw^qz)NtX*0@H>G{@sT zc@1 zYFc~DYDWGQ&^xfF`!^WVt(DHN2|RRQC$Ci9SY0WM2P?}^gBjV(&UJZ9a< z4$C`0?Asyj9O_`@yr!}}C)>kBtuVW*Pn%G0AILCd*_Bn) z#H%@smu`vKPV3Bx{J@j((Vw3V-oyyUh4bJR#q3sP zyXH=tPF~FGCU^p{bM_s>3vm9D8hVh2ZFE=1L944n7IU4FC&2B$Z2l-zfimy3B1y^2 z+SRV_iWfG3g`w-keo0uMIE19@IrBGZnm#Ec;^M$!Q8|49CXYYf;qj^|*}e0%*~RR9 zRbWj#Uv>QK%i;}!%<%vFe$IA4rA%YmqcdjFG`Z7WOR|aHTUvwP!Y@|QzbGc8K(#3~ zl|@U5rx@^uw!+%Xi_7Hap(Mv}Wt3u9vP_X2DAT^oS6vToAq%{9JFQTt(z;LlYO3)c zlI?JXe0N=;qG%J%fqj`@$tC#$EmM2=4+TS(HV|8+j0nSRC%hD`1aoyDanJv5wG8pZ z+4!C?t(kqLnU>>qSQD6BJ(nqtjb}H$VSOT33>r0V*HiacHu~i_Az&!uV@8aclqc93 zUTOdSBo49-Zlf$AhJIXhwNNBd0H9ZC-FOJ%&3mr)!k2m(_!_tLl?cHx&#_d=!>jGd zK;IHa0Hvo-3TFyX&T~qzu!?o|O8V19QnM;5QI(U%-k+HbDP2K3!9^cEi^2Z;KTLmZ zAO7$2?37cKh>(fM@CfP$*AYv=?3;ZAAf@M(G3)O;1RgP&f{o2EtyZRSLt|$HXDXvg z8(BLV@0#BuK!GB%Gt72Gej*3W@%I8ATMB$4DXdyPg|NaJ4I5i*O`=e*Np0;YHQLU` zMsHs6PotB2gJ!Z`lNVlvxnEN`+o_Cl7yDA9>MtDXo8*f!M6MJ2=ZzRIRVK^HV;_p? z=QipqR<-*~=RHou$T~c^TDNGJ4IhaRSkXgD*Y2Oz3pk9%JF3EUiSbWLiQ+#&0{LSGrG^kisArQ+-%`rj_CHB zeQFF7`=ce*yar#@282qo2|Gy zK40U}qK81u8(1s}!YHJ)kojf{D(61d4aw`cxrAEX$B(|UXgt+0BczYSqMI71v?gLC zfFo+0YIn)6yt|c(zKV!6r%Vq7TUfLmqJ}E&S&aB;UPsNIH(wrIoALh+oeIK&2pRZn zZv^cM^H2r(+7&y2n)*sAN{fw56E8TUEHyU;Jw=M*Jlt&%=I)ccjyYTAD~LozX{Oy? zv911pNObqmpmODDzi?*F2kJBOsDOetP?T)^*k??Qryj&Ws93wd(%e*DAiRzOA&AV> z$e;^?|B&{AHq{<4AM$Q{F2xUfHl1porG8icuOGtig08UwwCYah{(fbdu&>nPd(|$P zojW_`iz;o7>Jc;+fut-{jCm}SG0ehVZ5O`Ib?8yG#WKx5tCc_IXVOOIe0OKK#MUhDZ&Y%J`PUo;+T&{*|QNmT`-l~dNJ6|L)8EvR=&lM#h_dH}|w4wP{kz#kh0j-U{rTq5)y@ zA@KV5DLfX?9`6&8pU1M7-1i!3rpo7nCS9TBSr$`8ZS)*{%*Rc!*?RcvIw|}>2kM=G z9B<=2&7wK*s`C5F80~@?I0UpNSNyxbM8jx>>|7MTm;i+(**M`_-d?R~3ZwAwhb#0b;{b2vsANhs=TjXtLG3{}vXXgV-*4{*k zv%m-uepgmmVL6$UUzPE4MJ^M;my@lnu)wJXmnix@f?*|L0>#>?-?h=J-?UP1>SoMiQg?_}Y7b)@B zid;#16!&zXpwF4>s@d||P}yYPx$62ElU4T&tXd(N(W}T#Ohk@{hb0kZ*|GeO!t19! zebyk6NZP^-z&K(W451Uw>P@5C@V7b7AK~|6dDigSS*CZE@SwI$wu58A`;vd|SX`1N z*|`ghr1RQryRJmnE`E(@jN4;Lymzx0NoI6rSr+JbIGmv~!=E@>;ceXfF;}nQ7oS4v z0e~!74mAJ^DqZTCsw{I_cfC}?gT5_VERU{1Z_92@2=hnqP%R8};-RtEbVWarLW z%oiVD@i&U^4aM+C=!ECD`5$G+jfe%*Rl-^%*!s>rR=;}{J)*3%{-ZyuKO3?JB%LwN zdKoyJnb!`PoLj06k@%a>Z0E_v%X%0s$4$y3hz5-tCd zyah<|llHn;bIA$ya&4jDMF3qgq`mNNluxh21)b=kNZ(6|D#(IzxViuE;0CLJ;4Hc zUi7-<)Z2wFFp@hchM?pYHOEUhjl_8Au3nPySc(Ua#6RK6{~79b>_hmbc#{$TF9PzU z@k*ZNJ|aDvo4$Rf29)|U)|Z(QPu$iqsWdkRt>EY8#Y+zN{i8SH7%dK3Z>S5Q;9cFF zHn)vgVR{@xI5s)2SvQX4J=ykrt54v}x2~0KR%i}7tIlb>PyeGWDexh1je@X4L8E@!u5Yf7rirA zzpp=Vef0_vVCdHt#_d4^+(3`2h zQ9JE~8-M9mNQ1ipEE zQMR+2tx1>@)m{s$pPO^Nha;X|dk{ z?Jto9wW)+Qb8onl-)5VSy(*G@AG%%V^+&9ce(@J>k@UC%C-nok^$0g;#<^Hjt08(z zmJ&!B_T@PQX@uJ!Bel?lzONm0S7Xf%a@lhMySXp;E#a)b5$A5s+%YLaelWdq{4qfQ z{1%$3{(4hN@z8PoEVnMGG_4q|(;|o;#;@(H^CFe7?WP&7C3Dq}B&gzYfYS0e759_? zWsQIEZhZasF#ekFr6)XM7=_{@f4z2}5dLb}G@{6wck)?%kryVwYI&VwMgzEKJcFR*48@>P{WV`Tj<{!BAfkQ-VXv*Bi+-9BQldvGueMBaA2{Y6l+9!bo_(=I+Xm zqgpjF%Z7#M1ltazp}_}9V4Jez+8O;ek3{pX=u#gMv@q^bp6K>@rJQHR)?mrsY@0)r zGU{o3hBe)^7{!(Dx4hb`EZr{s&3Kv%L#1<{P|yW`N@=Xw8yIxB`#O;fuLagF1oS~z?3=gwLu-IyRvS3>-Y!O@QkkD>zB~qt1CXQh_qk=Omd(`?b zStRkQ_v;C}%m$rNTRhgro`G(_pv`QIV0>~qc4RErO4y(liIXIItH0-)dsM|qdq}Y2 zjk~%`vjXCdMRqh#X9k`6d~b;7e~j_x6gYU1(6G8oYTzi0b+ zv_bp81R#ffVCH;Z9jP+=E8BSp|GZ}(U8>GW{00x!R<*K^PhZj7&O*{R!f-8Cq?vXp$J!t~pY!@3oD*YDlek6K?-j2H%Szs+6ukN#9%Fhhj6Sz#+* zcB$71iP*IU2qh13Jp(Yod;D7m?Al&KUk9MAL1oRfoFq?blQO1z7<9qtyVbgTY zNVMM@4-I}E)`ll5ZfXS9EN#%OFahd&9^gaKaG1b6lQ@& z+tUV2@9=S*H!YFFZeh3!5uiRMgd0T@8_9+o*2rQH!5hWH49gU~m7a9IM{)ev=A$37 z7_EK91Xj$09FWDqm!JDn{ScG9b+3`2@q_0`UVJk9V0)LO(^_u~P%;@-mg4ON*j`vIW;-Amvvx14= z5xt6Y?9Cu_N;!ccI7tzbm~dAJgr?a|nz!;1h1rw0TFk;X2fm-J=u`#`Ti8skxt z&g}Mp(?Kl&G<($h#gcE_zO$?`9T4cF&3$?d9w3VCHe<*T;`$L$#a$CTSdt>t=PH#&&L8LmK}Gs&DrxGJ zcPGclrm@Ezk)5WH);vW@`wQ5aO8ayTxU6&k)X%(O^OZP=&btnH8#~z@_S6VqaS!zh#(_af{ zcuT&Mc88|69n>0_ciy*Gd0>`l)YIl^*!e7tvw=(6E$H_fv9yfJxNz>7Qm@4B!K;bQ zc9E&WrhLAomaPcR(8FPH@dSPoAhzmMNfsxKXL2S$(V?&>x2%bM?mg?;Jt;Y%>D4i* zW4zenE`_>BJ8_io)x6=Xui=0j1%JA{j7TsR;E}|FyZU&J=fgiPIZusy{nXH-c4s4$ zdA!2|T9O79sV77^Hf*(~wDF)v9UzZnxd)9msg!q`rs{s_p+4{98sn5&*ZLZErN5&& zKC3@+cpRQu&>f8N{%yti-zXe^zU9|4C31tpTMkN&4AqBmm)Z^4wjd2QN?`uR%{2f} z)sSJZ=+}z9@$4U>l!}SzId1#5+j5(oBqIP-Vz8Rf+PSrQ>;yvYnd-uHg2!lE>3LvG z%qGm%xUw6e%NOO5z>khg>i^xANBtHw4u(tz7M`C;xqgny=A|J1E%a~PEW1aVqm^!9 z@Sy;W#IIihb`m8%_;$ z?s=e*WT3Q$6!y+x8c9JKz=E@IMPj!q|4XA>!fe`YuOuuFYoLey%(H9FmOaU+C)9RATkjcuxVA};#2;fehb zpsD!uF9KrRrYT52ILT$|ia(8VN}r6ltkM<(k_8_0+X)iN`6 zo(kw-e;`JTma>!fn0__3_bg4@hOEu`7CG!o8tWSIkJz7U-}Wl;Ypd*Ee_{CJ=FhbF zYLV$M%2s>-hh$>8v*zw178_=^jfRHB`yZ0Qct|oRBv%mCDZHx>%T@0H$@P?UshVPnSwG&p0#x!qUK1R^iNxCx^ zxW}AuJpHJyqYMqsi%QcmJdM~CDCx4v;4Q6YShillleNtL6>2cDXql^Qx?_xbQ2oa* zFN@DWCW21rfd2cehg4PVWY7mMvF4a)h?d{w^wFwCLYW6J2f<^G~24j)r?&|Z!SvFz29^?VPo3( ztY24T)_cT0`ou;>?Ys>;vAG<2!n4I;)dJ<}jO*E>Y8VB9azcEUbCO=5=;T5N;K@N; zcV;E6W+<=D{-)dIV~m`>X8dOpV141%)vv_86#!-2MlHFK7Q6KUu^|USkvA-{tG^n2 z^Pa^NF|3zm012J}6G0c;i%Em63_~ZVty&=+s>ZJE9olp;wNk56g-22KepLqBzmCGX5Dy?3vh@Nx;Ha()3-LLOI_Ajmu!9XJMRPBw^pBxTwDpXZNE1J96*+g zTlW~!>UfdZJ|DOMKjs)yr+54en0`+Mr$xw@b>Xzm3ry*25?%X>% z8>i+oMs@IytvQS^iwU#%6I0SP!`&fGn?lrf=XIIp^{sJFyeXe(!J8lQ1q+9uU+ELJ zQ!uy@iqm-UfTneFI@;7O3H}wi?#Nj>NcUPs$p$-{HlTPjc@V+SR%?)0i|J60t^ir{92z;@+pb zH&(f-7sjb=Mas38f;RX}mI-f~IDH6JV|uW=Tcqi%<4&X6_hZXN^2 z^?<(=ZB$btsJveGoQG#AFNKrah!EZsh{?B5k1)mtwR4%QL% zF##rpZ{HW3@I!_dNb+7uhb(5W#&S@&7ghJ|tF255zO+F6!bMgsCvg8mN-z8}{6;(e z8qiYUxU{Z>E(yn$f&1GFznZ{lV^dV38sD6pzU&xa6Kb%0W3EKnR(xFNNAg(dbQMmM zqd|ziE4>=Z7Kg3>%-IlXkHAx*3%M?=s2xo^4OU595j8H`X_z@b(&RB#pAKe&!d!ib zqL||WMrMntD=x1lzc`DW$V>okl-z_RIA*A9Y!$poz`o5W z6lf<|t&9W=mCCNy)?B2O6oW!>^ioWnqi;H}cY9pB(((jckc;?nQs#VGZG6tg^(oJs z@Y(-3-*Mq==xnutcxOx=#?9M#o339J3zzDs&MSE5De?!$v_$`guaFOv+OLy#eKwTP zX|MJ3i*c%?37<3<)0VoD;^Z#sqJDs3o&NfN}+%)qO$fJFp^e{hS$ocI%^X8FeMprUFV=zuCcZilt;Y9o2qLcWu z#2naN&0B6e*a38mPVw?vu1*N=USE{IlH75t>)iHtR0;f^Z*zM44cN`FQn?G-NG95j z{(|TAnKmbQKhJYqgtWcX%^xQy(j6-7%}0|2X6GC8{tnZQCx~l} zVxasFsVCwX0-kWP4w+{K+)IC%v=@fG>q7Vze#)vSYfD(EZ%KNQgJre5QJ-i8PH-ca zaKy@pIel9+zR|jzPp8gXI1ZVF?Us-2d%B!knt?Z0v$AR(p~4ZJ3-TKQ`+g0XCCH;2o?Q< zcR&i|P|CIScwHLQ=8o$Jp#6^g&sZbnFaCH2zXz7CPNN2-4OHup!;AN%Mm159!94uB zMn&GxQUq6iV>ug6$7S%D_9wbie%5ev-OQ_b;G528i8>&FI`St;T2@WO?z>i>d9Bp$ z#}xJ=zQbFfJNwx<65A>1*D+@OVKY?IA+euTaqP>oALEe_OTK8Y{v*s2Tvvy`j+#4+x z-vc`3eeYzSv}hEa^uIl=mKuFOu)%C6U0QU)DSw~kvXEMI^)KkFWGOj`e{%hYR9$GZ z#75E+39i7o%xle5VlD*b7JMsGo61nO)D(fp%rCN}1Ji7!lHP#^Htu#zKU9~V?Cynl zY&?T0@$QA@C%JqsL`TT>bxI+2-DVM+4LdB=OQJtqU3UJ3Ij6;P&dah_4kkqfT(eB)*-!c}5*gh(Fz${mey;7qRz6(gHv5}h?uM~)!Z-pgI>TI<6sePX|!2kMw@sx!>9SW?Pt|qrr0&JTmSH0=*31QASX}VRT2F{i}QXk zhkb%@f4AS^q)s{L#_)^Ys=g0N`s>wG&{~8@3T41+K~a~W)PY0D_x8#B56#VpeN4a? zN2t9KZ-l4S0Q7S{??<6ey*m;i{+)LyMri4erw72)(GsH|n8o+3B9ym-xOQ6*f~1(Z z*v^40(zNLLPO(O-ZWCs>KIJAY#Xk2BSH1|Q#LL!9dUxlD8Qd81)|$6}pT5yp$L;7; zkT`Kp$WiQ&kGHpEo93_QH@2^=7yfe7>gwk+FB-Shw0`rfOs@CEGw22dOV?*PkU?g% zq&%&i80P(Y(xZd$D2$q2yq zW>L?q&Yx40fBByFO=QBAY0`QHItff3Ps)EQ7F%xC;9{Oq~ z1nO1N*zH=u2}G(@zV$B0T(oYYnHG!gYZ9~`tzN%V3m*mb7|j<{=&rxyV!JnvddxK` zwHUnkg0R+|b2BPjROMSr-+u%K%-e{8M?~_laNjV_FNoke2C>w+wP@NQl-_ZFsMjVQ z*ym9m1Z8{7Ce|e*ifNasyW;r&01>Xrit>joPq+U7AT-IWfa+RH(S1~7t-q2edU%!~ z<2ZwFv~@JPn+|Us!zDasWLDl@BY{*1y0e^g!l;dG+3p*(a@NaFF)^oXAAV|AnZtQ` z>Rz#kt>^y$AmO{;`usvAWa<>Me3309k{#21z_MZHrI;A4r4{4M4&HJpiFj7!*ND)DFj%8=7fp z&oZfet=!G|sai1E9rSloEtFy6B^Q1VGt+Q(IOkOW$(N^?t^NZUk(XtyuQLEl#-(}B zQMZgn2d?xdsYT$f7v8_!$1Jh>8}SLC(J$loFk43(I*nrml(bh+A})Mbzfskpu$a#H zl~^>%q<_~lYT2vjI+rXC&7oz=t4&*~peAgKZ&*CTP1eb7Zc%jEwNXVznNMuQGSo8n zaN-HlZ{Xy4^(pQmzLT5~d!{ zF|e-#g1r&3M5bnF0gNUsma0}OIfE6e8b%a1vty}ib~+tOWT8_E=iI~;DAo9vloUft zx2UL2G4DU>oL;uWhk1k%#qR4kl#DA0v5z@quAzamNNeUZR1EPAoen*v>$khf%tKtU z^N3Bb&75b%s{zXMQEeE-<_is@j2}M`Teh6vj^d!&yWC9B*7<~KnT0R}YKtiYw~2vE z5N^=&!%F~AI{x4WF;!Bu#X+@@G;UO$+jlcc7}amgKCEcR(Hh0q z>Q#GVCBUG2))~9u;_zg0@yXLU(J9CJh13bV6m2g=6r* z)V;xQEz^~PHp1S>4b+*47-M;>%v!B2A&tWb;9sJa*wMN5VaRH|9 z1~V}WOXt*KK=W~k`l$TO8g5gum0_`gi@;MlDC#t;#$B0MTBnfWp5VQV7&U?yn?UeF zEQ>1Y@iL(PVT{~bt{KA`t+GAbXC6@R%mQ0(mBHi01uI94<|S#u!K&9`>a`a(o~JPa zf>!se&L)o=KioBZrS_>vcCl4=_ZUtavat6C;MLIXD-gR4@01alaRYcrZ@hHVyjL=j-DX+KgY{=3*+V8;T4c<*zqB<4Phup2x6`UBT zwt-D^DCAe_G^N*^7suuUT^BXfKxKU1^TZ3RE0!@+0RI4DWEXpfqpa}1iE7bCYg5h6 z?WbO$C_8m}s8lIt3WvNn=@EB`s@p5n#I)!E>k`kjXbV;&AOc#w-%dX=^+#mM;yh)I zBdy0eZ_OUAHDhNjYuqCStGqQHK2F}9&i zj)IHzIzy#fqPhJ=+$l1u+&Z`#1QsM{TAOY>fGgzIph0Pd9kIw=I(q5_0t;z;{{T?x z7RTrF8xsJGYYy`UhXY0EhLBZj7w6SL3N5?M33Zme4nF0!20Z-H{1@=nh zfs8XCvi9s_t22z)Y{bi=+w}hcaMzJB!{#L%lDen5Bgee0kB`i>HLAdWv2j6k*FAjx zB^Cs{?>%{nT9&n|48W2v3^Z~=O2S(An52v1iUxX#H)8T};#UEF3W@U!snlgOad}F< zAuAQSH**^3=N94$RG`A|{&U%#Q=rnywidFc4u`01ws9FI| z@k`=6NUNQ}Q*o-Tuo~#mx-l1s#p`tVi%VNb zA2i%c$`oOuDH#>ncGbcQus6}_0IjbDlxkSjtATs1!QU(enQT`JTC15745U20!HAP; zrHKCkQ7I(vE4{^Rwi@aw?eBuM`h#BSFJ^d^PSrdhSue*7I;y12vBia+cW!YB0c`QmjmPVc#-~ zF^kMrkJNEyW^PzM?p}L6%d;oT8(39w9T+Cwt1(r-+&ZboH!f6K&NH7<;iX=1)z=X9 z8ClulGWT1~YE;p5Dggyk8Q8tPC9F7|&(i!d+Om?xbpAMn8l{+ zY>!bYkwJpdnJaCZRi~&#T+t0&0D{$37p`Ik^vhZ$wO56@Zdl8nI)%K9c`+{)=@0jb zMi_Hk{Y2wq;^s`?z8m5TGIMaM1ZcZ2{{SVs7hU3B`fwaWJD|o^7?C|SGH7>9y~hL; zime_JU`sfzEbq+Ng?Qf(s1y~1r|ae^eJ6;~L04t({{Svka;!AJn2PJRFa6BJHWIaV zN@xbpRpwP*qOzKRDRy$Y-0iD4aac9=abz6t`;WHMIMhO1OxJ(*E2AzO#8x60IkU%5 zyfWY^w)f^&CX*qJcZh@(S`xLGzMYp<>LG7@=YF9d4QjFeAcXyxnhIO4Z&L*F-VMw; z>1?UHlV*R<#>7~HWKwhgmCnFiu zF>tmwa4G~FOT#Lt$-zE2&lLdh)eBPhD8WYYFK7n;mpRKA(`$j zPmB4_=2qFYc%6w`rQeuUyija{kXu6$ZL@l1dTR9p10^=RtyBgp;he)23r|^ z^$O+=>z<Lg6;(8_$*?0=)xIPbOF$M7ERg*!Qq&w)&#&W`H(^l=M zf(Y#5`i3h-m9Rj~5@ASs~UdawH&6SkE8JDl{Yace1W z6SA=>0tjt033AaZ<^@E(E~0w|oAC}UKR-Nf9w6GC_JdiC+8x5M@Y|SK8eJ8?2$%2) zzF~+j&mR(qx&c9Hws2{2QthRWaTP@coAUr&yjF2@CmssL zMr69G4u91i^lau6;Aqd{HocBZzAjdazFbRrZ>}EVmB_*so6H1MyerSS(ol!E#I%E? z=B1lx-H+}k9}!Z+X{-MLi7&Oy+;|Ra`Ik=JMOllvh=UhyE*-@xYl|XmwcD0f11%K{ zu5=pPED3!-@@&Khq832l&UlQ=%q}xoVFD^vIo4~Kg_tmGKq~D(tGbsEV(hSga6r^s z=BuJ@S_4iyhJX-K?(sRc-QJm9Ksl=}2(nWJU5nR&^97BI}g*G&rtl`2Ee$TpJmq`-=09pPv&O3oW(#mk|I``hWt(7`>U)7>!LC zwXghuS#3CSnDgd4BA17M@(96J_{H?gYm{3#sftisU4B?*R{UNiO^6h%V)7;YDkdr{ zuOmW$QZY{ z)Hq8uqBXm9PG8Kl4OT{>)YUSMSL56SKtlT$$Knahs=9gRHADvVQ;uLkSf*G?a5!$t znFZ0;^%)W0Htqf*gIwmhCCOV_vk%N#cZyNd5n*S>Jjc|w^~QQ7s>^A*H&B7=RgAd& zMa^+qf7+H3hAb-{nS)0d@H>ZRB{{nBESS@HQ1vTFhd1nJ%)Kf@2o_&agxy(P+wX`p zL#0OO6PKPMnZgNrdEP^O;_+{&5R5OL4(4@P9uMjpKEgpf5aljlEQEsJFlO%(j5J?mK<&e~2w= zv7QN{9MPR;agZ1^aTwC3hsU2XidoM&_<-;LO7n{Pf(*Bls*a~DbqI=L?&=Qf@QMR> z+-{VNb%z7-9ct)i4C{utfpRL!9}Fv6&gJ=xKa_4JgQ?2H-voF#0yk}JmPIHu9Q;aZ z59WR`SG>yuhlCkaHU+k-1=K=}t0+opd3!wOI=rnJzU#Ox1m|^li9qIYc8B6p2mzb@ z#9GL0G^hy-BA7=pWNcO@2!fDTVd^@$mmQdG7u7?5cbs=F+1HA{G0#lDbp)!{hT6aC zJiS+6?8G}$yR7vz07uj)qj`0!ftM*+?gTVG9NcI(SDebBzB`+~R$8VS)C^J!brOgd z>-c~|(!Dau6)op`F(~Uf&m^|%ChP+p+-i5YNyPn7COX1 z32t9Gmau0Qftm<-m7?`hm0)+QN=mA$hJ1&CYzVHZK&G*9BlW(c*|Wvh+%mZ>4>L-G ztiQQd;;-1;6bf3i6;m0b%Qxn6u@R-?WhbT%qJ(FLQj-O#&%{fh7iK@XfaJZ@w|r(3 zDvheU@d<1f#oP^5$$*p>LEKdo&aV)xK^r( z`H8r?u>zGgZxV%&rSU0+Tbeac+5Ata*IlffMNt`B&TG`EBY9KY$_F$YBo&dBEq`$s zARDayc!MQuS5P5l1}pYT))J0i)KyTWZ&NBSW%+`vFg#Gj;Kg`8qi+uAE}_I$jWD8P zZQ>vmE0e7A3&m(7)F`SgzI%!=l{O^d|y)qT7J;UYi4~y>2-O*D0tJSH|_!sRyLTIfLdMF*j)iu@^Ry+wj3`H z`lbUrTepa!EY(#l>C|<>V7d-p=3@Ioy8x_xOto!R zqL3Cl2Yg==w-P0sZ>d^_j~z`bKcu{ctgT!B0ALZKxb0$EW|xiBqSP)(7QgJGo>lWG z>oQxH15}}_exrR91X#K}z+$r}3-8RdCqgpUQNch`CzHt4nt7Ia z=7TtdwMsPp=CxN>k;id{6-Hnzt1sgcpBVXPA8}iayctdA6GHMKUox$-S;$(#xdjLqF}yiIuuOSP-PclfLdS16R}B3Zjy9#2$+ISpH@uk@>!(*a2ICfX7}ti{ik0ge?Mp?M1HA{7($u z@DZdt%_s944ZI8fA-K)Zf-E<{nClm)8-n7Dd=k6%d7mE8cpKoc3cC)CK~yaZ>d*TNK;4 zG~spPQj2&i&a`nA-PbPp>SKZiF*2}S<-;A9O(24)09faSJ8hMZ zEBc5f4bp3f*s8(&!dzVyj~*dfy_QWuWu79G-qvcSP*P|*glVgFx__xqGoNSuind0d zeP$zNT3OY>*mcGJ;2jC4I=^stt9ny$L|qZiO7|Yimz-QB%a*cVBn3n&_w;O^(6`K<7Qnz0vZa5vN){I6NM(>DxJ9E|eB3XUsA2Y@~ zx42t4q!drgq#!elV-b-{PQQpn$NPa`GZ}%atL1`VXBdQ2m~8MGgur21;KZ`4L+-f< z0X?Bu@Y@)0y?jRqYi!i4Z#huEQofc_0YXk49p*1s;5{Gt9ID*tBK;Qs0PLpj@r}TD z+kP>KG#wdQ!vN88UVDvO&Tj`2=A4CBalGgIoYoTDeql=>bEtw4#nWfw?q;B}o^?34 zbW)Y~50}#8HFEOvI_KhHb47k2iU_&E=kpPR=s!~9lGV;2kxtpuG%#V$aN>)E-RJI6 zSH;`jpkNLR>gL*4;#FmCig%u34dGxGJZa_2`GAs#mioO->mx&M{{Wf1SGHagyd$_O z3qv~}h>NS2Pq=S(o4wQ;>CG*1+)7po?u-8b$i*p^u@ixJdzd!$_Ef=Zb*ha%JQ2Qm#8V0!egmB{CzxnwB)EeY? zJW5dyYx5HL4IfdN3d(pQ_2&zIrd~b|?F1HNfL8*6Lfk_>3a%PJ3tC$r{{S^g+G}SJ z-IPk9v4S+S02|D{%4Yk8Ct=D`pvi zer9EC#04lDWh!W4WhF2yqA@NFTmB=`8l7*Ul}&}P()2yYP#Vr@KbcCUk#uKJQ7m`D zDH3*Fy|6AF-FA7G;Bp-qn!=l(5%4K~i^o#HDz|efx?7FMaVqPth(HRiUSQG31J)(A ze4J`l3tc@PCKnBL9a5X|i{=Tpk=u1Kh(oo{Ib~2eyuEmtR}{L5rA3Dr2$iZH51!*# zL5-M)-zP+nPS$K-$%II<}^2$ zhQ#BNk>D;4c$t=hsGA3OZN!Xj3qsmnu3$`?%|##<>bryBX1vP~myoJu?tNCgMVuzC zvbm}>*7q1MCVY8_Ah)b$1xq>jg%Y>cnNv1#S2q+*S!~3h+hUanD=2YRR0yfRpSgRu zJ_(MiRei^e^NrlsZd#}6B@R>a{{Rq*tgxJ%*TmJy_PCkaZR<}e%+(5kMCekE6Grx@SNSgOtn#9^vL=gg(b?cT8|&C)Pdk5DL!LEWeO5|E*~B{qDQ z7oW@&6amFOcXFJ?Q!CS$l7JM&sJ66Ym&CM%8QqwUZyg=ViS{Fh%TnaTw7NQ|1!Hp> z*UvJM$);2GqxUN-We1Nj3RgG{%-YuE*>aUE!pRHfsxh>qCpen)xag*Q;QK0WQdu|M z#5`^A6~wv=cS>Iywqa#UQ+4OK0EeFl@rq?%)Mm;Yio$ghILnOM#jA+ZOnkxX1U~f> zO3kP3BJu;sXoUni{d5zHbOPowX9E)6# zwrxA7INThPIK2M=yv~Yqt|5;GZttF;0gU_pNBjSx*r~d$_G%FCkVNG{&@c=Pq z7yWZ|JPT!1wPVlvlduY@C#A?w^>jgvFE-w)YdYpIE0i8T8zs$JHo%8h@=%@zc zrJ&VjJ@(EE>Hh$*re5H$m&A7C2K--$3`Wwm5|Aj~8od4^Ukh~a#LgA1nvNCf$KaQc z&zSG>4#A`6b0=q40J8O?GcTI@hZ)3ha4WMv5W=q&c&II94H$xVZX8OrC@zbof~u;^ z7&K7e+bUEwiso2fM6-z~M63XC8i4|@lX0o?P%x*L=$$pd&Y_vgq@T$Y>$1?QJ-lu% z+GycC%V<1erl>C^^Xey8YHsfrD3OpqjmBWDqknPmFM1dC0ajtd2I$*#N6m$}w&P9f zoo)?5&_CQf%pAQ!32F;_#HnfcQ_V)umKUsRxvx!YEGoX|`H1^`W{3+&=a?C{+z^HD z@eze+qkDC}S2G~lGy_JcK*ilrU{nRMwNsqNQbKQr>$ z=4pKa(Cc5!p>x~_*USQJXx|Ng`Q$TZtGQzJn=IC^Qk4qf{{WC-!MoWiTl)^kqc>e% z_CT)7t#-vw9S&W?s%br9^#M}0E+XuzbhZBO0xe*74pARM#aJ5p{{UteAX7J4xofX2 zkbIT9c<~*&!FYwZ7;|Q9DtaqFah!^Dy~3nwj6Frivw+;CWl2SrzF?GFadRE+A=Dnf zt}9Sl=ti;THgt3S#O(evD`xZaOuA#8x1aeMmAn8R_Yt7ChR@sf3G&JADwpD{b;-lcsD~V~KW{iKT3+nG#YVIo--EX@rVW0f4ha!H&X7jHs9(~#+%C<4vbe(NH=SeCPoUEMQF_t0X4)J zTn;OlNxZNp5QuqVxv55al^sz|SNn?tma<|{tEY@a)m8zl#u`21Rjr9tSg4SW1>MFd zu&hUBAeC@k;}WrBri_rnwM*Oq%r8pZAYp^6_=zOGN~8OZN>b!8Gw!WeQ;5Uq!&l!w zh_pZlx0$U=c8QWNCF_ga1W{&wkaUdqaZF10s5THT+jA%ttzb7VaD279?2I8y4oD~m zF8NySZL;g%`r#}ihKu`~-j`|WJ;qg5HJ)W6m|E6|cb@a9N3hd)&RT|ETKq@Fq$|v# z!q88en+jETX$ss6c;Zzw-`zym3)Z1!s+{!tnT=iE^Z1lNwC_*-h@hZx(ia)QWDtP6 z!0}kT#79~@@CPqaNS2ucWgYshMVJq7yfp;_p`s0~afL?pRoWUe`VU0P*`y!pUfC@IOpP(o25- z0QvNW57|D%Y5Qi7yrTL40Oyh%3;;Eup#K2#t`9hkQNEkRB^zs9IR57t(YSnu9*!}MLY97} zy^e9rV^y~V0gJCb;LJPI0}I<^q;M}A`<3R@E01&KOkU4CLUP5hY=JUeb1%+_1Dx>6 z#)akQJwmND?{hd6n&jfHW))N|v*I^b&sXF5frE8LFc0b-0^9}Rh+G!XTo`v87jJj4 zj>a#@aQ>j9K+++S<#4=+)rv1LB8vlNE}=l9wrKf@uowNQgrvRejCC7Px-uBl4aPt+ z<^&a@v$i{ow=dKxRaS2tL9Li2WH#~7%s^XwX(o#6jA{g|9E)(ip<=*X5oPhzwwGXM z$`AuqdFmSjH>~-C%15{N0d!Ft#-*xg?`Qpp@ER((j`(sew*==^#cC6Ywgd*zd{F^Z z`0SRY)i?hDBBmGOuA;@O>N488&Krqxs>;;bP@vn&#c}R-Z#DB2Qks6Qai}?A_D8=| zREAt$mS@$2s+G%W&v3VSj9Sd<>IR4nQ<#y)<48G3k4m5{)`%&YXnn&K1I_z-nOeWu z0`H5w&S1P= z@J%<)f9>b~wtwj2AKi{i5lTzgfE;*AAon*UaUB+;Es|(4)xCGgE#Ay7%1At+o0M!t+TwBacEb+RY z=hWl)=#95%9ae>0wetW~c<@RC1mjSA2c{s9q}T)u0*)sC0GAQWQn7ST9zL-ZnPm!- zrd*+@j^CX7GQ8Q;=iE4B_?E!#t07|-AfSuY5)(o@q9`~ZbBnHH4E>`1UzvOT(Ds^9;wrzn%cq!DgJY=c>l2ZbgNuzBuofnunw}IRhZLKH*@6u^d101wFNoP|Ievjx+xNkXK4!tq0bntaFi^zPsWU)*7lj za62L&!PJH>8!x_}VjpH7m*DGa|fkHHCrPqu@&yZZ>(f~5KYi=Qc?(~pK zz!ggW0KQ=Iam_rhFwj?mti*ap<#P#j1ZbP6D;+uBJbT>O%Ve}sK)Qkp4lLvU03y}5 zt!?#C3_Ioz)D;uL3hepn9TBD8V#?b7B_Va+n3qE0t@ORXG12o8?pGOe2EYJ|vQU`5 zWshW5^$U-H-wrh~YOu5ImCr_;`+I>m!W=9w%x>frWGr6*W=QV$70moH#nIo3^ET46 zPQGK1ol9Vbnw6ZgKV|>ys$yA>QHP}IGJQp-W>U; zEbGh1nCa266CX0p79fVkt|)ODR&!SW0LewZ;*a3wM4&udX&r6rCEdj0A?}=EVUlm%pcsu zo3&cRTzZLg`7Q&_b(_StDux!Wrp0CJ)f1wNHH&}jwb^#+oND6+_&1jO{6IWod(2K^ zshfY;j$jHX%zmOaQ~=rEEX8TMvgZ9qd3;q>6#)c1kB2dU*NIuVmfmjDUSa`YEr?cp zRB#N9R#O~7LW1q6I|;ZWMgF>#taH6${{S4o6-DS>%`+Nou!uR$z4KheoLN5BN&}{F z(E)>7o*xibZgE?=L@9Rw--K2bcZk@u=A!`P86jfh#Y7nRloT9)t^xLDUuXU9GN+HI zs)kOXg)cP;Yno%sLA+DhluvwJ(c2%s?x)GJu(DQnA{ zg7U0lzz%vw!Y5{TYx&eIoxt@Hvp9^`IyFP>SC7AJYwaq z^{<#F92}phAT&m$8T&-MXDZp^0%!17%oYk7Oc~Gi!4Marto?BXc@5QmSQSF8g}uaa zuv)Xh0Md5<0PG6_HGcCb-iJ1etoIBOoIs?7Jbjln?0>?h$ z?T)ypC82YODy|j~tTyd65dht7Ozh)sh=g0qmOH!`Kk{y3vMK)nw^D((6^;J@6FGQ% z$^aaGVAXxv>C{*ZptWA5F|UpP0ICU5Z(R|tMIG}IDx5O$Ve`#sm0;k#1MN59T9@bLD0)0kyH~kM`y;2VTzQv8Dr$ zKjs=72wz5^V}89KF-ua??*nkVtYWHCJUdNfn0sQ4uhb+p7Obqx^l}T`nj%n?_sIM~ zLY7Kv`iM~tRt$Vb^eqLpCgQIE#v@px>mxJ)tM~mueYng0h}CN7OC%=4KVOYFSiV%35@!G^TN)CX`za^@k9E7*%x;uxVviT+r*{Fbp!hvSB77@qVDK zZ;Z;;(EEVpj&YHZ=4D0PKg=4bZYFFO<_6(A4q&1)W_p4bkjqf$5M7s>@fw%!5gji% z>Z%%DITo^S`GnGBGrPZ1pvD5d0F#Ek8DKs-f@XcNCd9|ZM^H(I z-PET>e9PMxEu!8CBHzTq+BnPt$mNJ_`F%jCcRGXz3z_x4;w?O4X7P>13{bITa)7NoFZMn|a=4ecqfes%Nb~d_% zm|iy%We139zX0(TtaE!HLthc5Zn9e`!+;mb?mKEBk#5)p4u;Jc-{v&}xN!3IDvBSb zCUB(HX<;ZOxvbO$j%jcrA$*Hzs5xz7A)FYys4zF^f!U8$m~^Da9NeI%Y@i6|Y)cd~ zfZk)yh*7Th_>JdI8(#G-1?v_a#m^@-fSM&;^N_p ztkiJe^+OG3FwQC9%yqT1gBkN1buO`S$S&&Y>+>w`sg=t<7p^|#_0Z}kob@c}+_{@P zn}tTO&%ps4wPQ?oms0bFf6P!|qGUISC{nW3kJZ=`ji$KWoA-~BLP`7 zguDS>2RhVOHv|KBzw;Etb%(L)G+}JcamW5k@S+&4v$h?DwcN)`th+uXH+b5d1IS)-Er{Y))1 z8YK+|^|em~TdeqV`092aU%BM3<{k@V#6hapQEu?@)I4fByfKXx_YD-ksLFsUVpU?~ z#d9tLqmH8ONz`h%tW*nb@ax?MaV;$rV-;5&N-M5DBMX&V&9x}dTy+6TCDdDAmBJu7 zCh9U8H+*@3QTVMS)vCwZ3r5ZdFuE`mP-$$djChXMruBQ*GccVPF;f@axZ0scHx|I9 zR{X#y;XH0o*mK0H+m7OBE% zU;7a`3M=`jQMMY%%kjtjm)mx%j#pD0WqfDv>RU=piKA>3I-t{s_aCrF8K_#cxsr@O z=4Ro)h|H^XtV8Ak`m~uco>5a!U^|ub%_QdS&tyE<{$<6-R%+n;KS+dD#46rbeap60 zZN~e9MVi4a33hGk)DA4vY^kH(E?@yUC8lWNID?elU^~YbG)qlxW`?y+o@@QgxY%nr zJQv<(CG>YJ#fFH87RugVs56*$eC7o~ES%W|M$jHV+nH#Lmv_FNqFbZ}@L63;y#fiM zz9Tma+Pt6QT(2fZZlm`YScd#H>N$&UDzUvvGFq2?WY^rNQ6?~Bm<&@obR}~O%HhWR z+!o%#yq=-yhn`qSvz*n$i%v#bQXKC+#Bw6>vz@>o=f(YXFUVY>`i)aJx^bDHYcwn3 za%pjxn0E3cd}mT&GPjx$#J^|+Y0B$nOYa3tLh~&Lim~tpWHFUshh|8rSClKyMTX9kPZwRsc}voa?GJP z$VRzxtKwpCNtQN z5|k;u*DO$`sKMjJ0adS;_cjf;-Y=#-L?e&X3j*P8BWt%|#0|HG@?(uln}yBbS2Cwz zT^t;Kpj0!POV(n&Z&QTqe&X8#4zGyCL5_XQ&W>0c5VN_8{yf8{(*kY&ATh5vz;j3f z4Y{a@7|a7}QLff=En!zjP;bg9Ij9#UZOMafv&K4@W7%v+76r=bnijvG5EZffsw&N5 z;sF%wdVmxJz!_kOO04egU6s2rDQpY8gl>F@V;<$#$q;JnxcYNNFBz0scpOSDy~mBu z&hflOAbULKUWcG|OtNWu%wXUioBsfjyBx1{*AmAo{pEeIy%yCH`VP!GAf;7p-yR@t z2vc`7OR#h0{-y^swqsqv1C4J=z#{0*c=+O6SW%A|<{M{rc$Q|#)qW*z(5?gS9rB87 zdCzbeJ&Hvmm|m>6Gj(otW@XHmG(is>N3x2?GMDdKfwB98WfAdA#st=-fqa!wMj1vg z?qU|^N`s0AiGB)*FEI@rqDyn@xJx@Bpvb^b%Qe-)#!u8P z{kDV*u}WZr0h54XZKbzEsFb(8_RLXB*uV%b7OQYnuFjJ3(pk(i3Mow7(l5)1Z*Co& z%2fg3&Si;QjU%%Vnee@D#GzJb)p00=<*c~t`j)M^+BCypcdhm zd6aD!MZ}0V^^RqOTixy}li6JQm&-!5>QY&gn1Xb7G7a&A#4|N+iGr&hOv~qNJ!9r* zQ{Xc)BUx;!>JbJysf;btU0l9*E;>4mKyQ)UIVMD1o5XE|P7mY#sBGnX%P{7R=;C5< zvai&tjV!cx31}AGl~%PIGF>#01ZiaGAd7$lfItYm?p;@{_o(MvdHutjtwL)nlc4Sz zH$|~!YA{qb9AEbcwyWz9mtE4{VuD^VzjB9S zHCU|ka6JJGYOAksQls`D<2LVb4pP5R!yDs$vbu(G7W*;JDK&2q;3XGWznFiB$7`xHjI&qcBaSaAPaC|omYVDY} z)-w`kixZ=qbqVacsv@|6<$;%~UEHq*$WMu`Pwoax$!`-QThF)yTkjE4cIx32In)Bg zvBN2I=HZ&GIAGjThN=~&8;6!vp5Wc7^uIQiy0 zELyx@%(fd2c^49ifAY(eD9P8<8AX{+zC6c;Y@lwPFsv>PU0lUX+abiDg@4@3EO*DL zX{K}d%+3tFHQYQe9~#8IHdxMDmkVepHq@(O-;6+D4E;iKI;a-uM*LUQ!Mn6$l059K zK+5t`nz@i0FMmA2Vbz@D>J8bCXv-S^0AdWOcvxUA@mbR;Lc1LQ0J9R0Qw=#^;#I4m z-4&Qvtn%l$wAXc>C9Kg;n54ZI%gkXDQnW)=W#=%lPaiVSbr05FSJInKJM7cNd&s*@aPFJjfd-e&|w z$#+qqYvi{ZhPyG}y-F8KtleGpn8Q`H9@x$l4{tAfm?XiF_=avb}Nb9S-X=KB3Z3$T+E zAui5w9leP$mp3m7Dyv5wejy9&ip{6$a_sX(L;;sJxa|_-n38kUR%n!ElZ{`9vjWSZTw_oB@WZJH|xB*S7M-w4jal{<}VU2!a5|Lc_B@ogS__MiJ?7Pa5 z8UtT*Xv+6c%hq4&V#U|gQvow~GJ(N!zziC8KM>-LFZFyt{e)0q3l1Mf3T=yYZ1D}E z-xGwx0?J19)VoP|l&D$rF)Pef4j?UHbJ+s&l7PrTG$J<-lW!68N}7~2r#pu>oNgh! zzGaK9Zxc9D_6{L?4Ojb9CK8zJj@?=XZpmXza@0N{t#16l(PL-aCcJ-mKw4X#80i9q zJAKTA*%J@c${5WoELrYdL-A}qH&V2=PuRr2v3gqSVXBk^B^1C$y( zOKcqah(gA&LsJEnzc?5suI?49+!eL7wd;JupmC4BE+_yMiEM=qN2p%Q&P(Bmh+^vr zE7R}bzdqn9rMox8X;)a62YIXNqsTex>k!r-)BQ`W-GQl4YXQOQh#d8mtKltdgP1&1 zV|ev*G*+(!1=iLUZd$)&YZ^0uZ~}`jJXdn))=bZVQHqlw<|ZnwIf}|V*X~#H=4g#B zZg6%J1FtsmF7gIsiFT4?g zb%FP|^u*PQ?)NUK7|Q`eekB6nyniWAa~AoGrBz;9J;B3i+^xPLp=2}DF0Qkp@Ih?@ zS%baV6kJ4l4lEz-Mu0cnT43jhNqfIisdB(`uB8Ia^DL<2Ijm*Gr52HQ$V0&_OV*>8 zHKW{ein&djmn|=jzM_ss`y<_$h{YUig0=?GcNv^uV%$eYvcSIRaqcJ$eqyb_5xyo` zJv9~EjErUjE)TTjRye)XwPymU`kQn(BA*wiEVIzS(6Cm5oHEUmBx42UyP3t8i-@w+ zW7HQ?RluhYKIK~ZIIoyAa$>j-+&f`PqY{dH9q$xs<#{mR%uZef@hBAlE%fw7adxNY z{>#ugrlS&Do4zZ=4O+~Vi1jT(>hFl7Czs92+@8Z9F<2qS{{U#1nRwOgnVu0|9551W zER5WCD_;@K6rG1VTaVv{?M>~y)e0i^Zp~_q*4}&Xt+A@M*d0b<)hJ@GBK8W3peiV0 zG>A4@s=jJe{ocI)!@17&InTN8=fP3XC4OOL4VZ2*SyqY_WBf8KY@=wd^QM+2f&Ce= z%7k1CV}4*0PU>|>JKV@>(YJW&_!z|#!oOh{3dh_#Lq+*JA-q4t?k_OeG%+XFbi);C z8gh-vx&0V4QGUKT*I2R3M#pz_H-#BTUsdRtmb0FC{g0@t`5^=YiGjCMc?i6A3YTp~ z+>|EuDj=IEX~J{PfL^A%_53cD(u^)LWGlt@_yg4GlCbu??0GICw5wZ~E^ERRNVKSj+ugyE~(OhBE5(;wJ_G5kJdbSY3u zVsSDI!!RBRlu`3Qk&4P9d*99c%?X`H2el3BJ7;u)k}mkv6bD7Z=-ijD@?`jAbfp~Y zlwxv}jFU&=vNP#JM#M}g727hbt;jQWjY)z-cDUCg)|u*V#P2FYWO{9~QPgGDlW6I5 zDf8K&7mLM{>l0#Wt?LVUA=Ds_h`B=Ih9?u@is$aC!X*2WG#xSsAVd zHpAPbC3Dn=dP6a{=UgfJN=Tv7!6P$+hg^m7vd_$R1e}m#3dbxD+^t#5*8~t_^9F3m ziMbP7ATmS#LmI8lw!9f`H_Z^DjsZ!WvrdmK*48A|hW8Y;I5%yK^l}mm6}YB73p+ih zizr%!Ugcfa@?zqfAu^1&k%;w}yl@JeQ~8;`3kl`EFoP%2g)86YD@Z?UPFF=5zo&GXgU># zS?MZ-hetRYOQ{N2DrX>;?k21^*RVJ51M+moJbStZOMujRMgg01hGYQ|nOKk=*(?G_ zenRmqeqP<-N-RjK!cZs#um;p{Rh1K;;EO44%8ZA8E=8r%CHEhGSqlW=Yr$0G-f|XNMGT) z1n*m7u}Qlc4qCN3Qp+%ZR@up9>d=Rg9*}*RUAmfoN=BIK%ZAOYJ;bX}DH*Vk_{_Kc z8?*6=5n%&){*~jZX{zC`S1rT$BX_HMUG&8vHQOj z1s}ax<2HRhW-GnTIQ6-J0}87Lhn}meR?~CGUNUU;S>tU;ScYw{vS7w@7mQ-5wlYnC zyG{j%k#4Gfk52GB7)R>;SwsZzXRH`>BwweEm{9_0zppoE`=~%Y)pE{@VM?RF&K3c9 zr4-i$eT9IXzs~b3us^M@PM?=hQ|9+PGPTcx*_H2V8Qmr4PWsuK|P|W*=_CQZ;L-xE7iTv;?}yUZnE-_tw(A5QkG=( zgSDwQpJ@AFA;&iQh0#kC{0cr&-Vxjg{R!w@*TK0FSH27H92a;KvF06Dw6($iSQ!zU z6p2WA^A1rm4Yn8VAHXt32`~ke9>jR4Tv=Is!L`{2{b8!9D@ntgp8%OUU*KxOBr>z| z(xyAEOB|HXxoe1inq7ndLM~9vCsQJ* z`QG`bnuM?=_qqO$SXKBZldCl!@iQ8d-hc-A3$mcyODXX;1#nDv7}Z2y!kEN!Pi`8m zU9?pn=Pt;~u1~Joac%&*T{!%*o6&aUHj;FUs0`_=r-SboOibB-|Gr0Xb;Y>^@k)X% zdLS*1{J97$6mTRbO-U>_6CNVdRgMx_5iQSE&)>>TPAGNLJ}7N$ zH>2MXG7lP8DjhsAQ*Cup2;-Wb&7VZK&MKYs++(_eCG}((6xwr!x1jYoHxh1OmD~j3 zH70f9ChOUQ!+`!FoXa;$P8`*0OXQpIQ4DKIE;V^0VR7V#O#-3R{@C*eC7tF3SV#vXhRq zj04EQ|0Bvg*C5eLFaNR_*{%>9xCjv|YoeMPHC55n7x`Nmv}2;9t$L~}tmybD!G!4A zlxkQFBnL4d)JjNg3gK&C&q#(Rvx7BQVzB`hbsXg7_9AVoU!gfK6gO{;x>6SkP(Mzj z8A}WrfG5^_{9yhu`W<290NsnRV)cmObFPhyB~UmMHp~0Jse4#Jou3M-u0e(W?du_| zrv*=FfkIf*Ir=l35(G@s6=}|Gt2eZsWudbFEz4rYH|N&G6x7AlkjJZ+q7}~iz;?j> zPNeLp5o%eJuA=mP@q@3F0(s8s*J7dCO&D4_l5e$l(`SFYu17H=WYs0_7(-M-pzX>5 zZT3aT)<~v?om$?LW7!MRglO~50jIUP>~JN9&wR*5A%6X|N7{D*p6Pm85KHP6SdI_T z0ald!N7`4Zw=We^C|sbGZ``|hqA2Jcu}-$PheJa}?P^fB-sM%JD!VgB7Ll#KwE9a7G?AP6e{{wb@W{NBhOAtHff`1i*JeBf2_C;Z8BPXgm z18Ad(xh#uGx#)TcC5I<@?o$f)GimZwcMy3|_HAR2&OLFoI{y^(Ih^GdM$C~te1q}D zfj%oR1G7#P&qx$lvO7vUIWE#67f^U?E~_M~qG-R%*v&hb-{(T@MthyjR5lXL_%lb) zD>b?lr^w2kh;5_!9}(T7+3Y3D39PCVe=R{5latPV5XeGHd%^sl;DE`COC|benODW> zYf8L*2KxmO19uOEnHqD>*#$MP3Jl!CY`(632P({`)BA*dA=hU!MC<%DK^;*VBamId$F*S4_hq2?Hh#GO~t|5NW6!m zA@))3>j?z^W`uoeh`o+0en9}$bardiF3_mEJTd5AKyBnvWT~kut<=Wl=t*pQJKeS^ z#$qCRBmA47n~un;qWf%`=~#%8wui(2=1PL29z~Jn%0{FGM;oU(rHXapT(et^G%x6W z{J@G^SUoqQZz!;+>g|-Tofs&hFno)61t<;RVHlG+CpT|7XEC`-yRV+9#J{5zLjLgz z*$zBsnSR*s5H^8+j-!OCW`~r=XD?r9pPSF*-W__E_92Rl*^iOkvbw%C%{`|iXsB=BkHIZkxHQpm+3*}t^lG2|RfBm&O$ z=-i$WjnqmMeWEg8-~Ky3)9w2FDrH+twC=-GC|k{5)6^g4PK8&>HX&-C80wz9PNd`6 z3G;=O(~gua0|kNdi$OytLaz76qbZu|bbo;aC#StXkDVf{q@3s8Hk>&A<4hrX!S0ts z7hjqfkD|DJ7dG!Wrf{ZQ+c^N`R!C5|-@aI7^Cw$zu!bcy^T8QWH&8t}>dSb;DAN>F zCwAA;6&;=I%aZRw)?~C8O>^j*Hy`Q?0z{(E(9v3w<}IeL!dm6RdJfnKP8|662O>6|l|ibaP| ze)9ne&khGj1O}h~)3GEUsq-fNw6;$|`w8>jVQwV30afi|s}{v%?6t*KQl58Wy+a^0 z4>jm!e7+oxB842kdd#WpBpA7(!tz$Jq0YxBGY8lEo`fqsiJWk$p=)HjrmxaICRd?b zXnMSZE){rdUv$Dlx)I2a4;!BnRihM?lIsd}{KH4FPAg%&QlfI4H19;`n2=R$n<$Ta zuHtmAd8*Inx6mg5$pCMV@xSk@dfb>q>elJye0N_k`8}EXCdS$F)o<@bJ?q7?NlUS3 z^rTIc5Z1?>JP*WZDEu^r$1K-}CU52I z<~&jLz!kbGSGZDGY0gixlK5t^sWmN>_9!vZ)-kP2NV^J=s zY!1k3cGmr^g*zzzS3DG~=){;B})yeWt9a?AJy6xef>}yHrR_y5_q7zViVf@D;I!sgJQ-%_4d{+4p zS}(Y$S%fiQ|DIgq=h2szgiLrKe@dN4q^2bgY~srZFZ&W_5Ks03+4>5s$$M~@VB@OIkP7M zHhIMzw&ve?#@@8L>JiY*O4#pl>f|CGwyD|~Q6RcK4fD8?lL=lKHGe5rX|k4J5G#uA zYL(R_F19oP4P0g0P$&ij=Y#E1ruWQTcI6(W46M*m(#g@EB`hWd@;xGZ9emzs;Lw%~ zn%qMf`?|k_y!r6gUFUmTab3?ej#6zzg|8#edL5R?;f3>W=a|>GTkWdoB$<1-J!Uq; z;)VZ7Kwdi31EI7jh5vcC4%pCm124)M+Ad#4z_>zrU70gH4#R=Uz+)V@QwB7@4S`kj z$=f#{{5q3W5(Vb{yvH-NQ-023t;dC)#x~t|PqV%NDAtYl>nbJ+LHQr~ z>Z+CGSh(0LvAtP$Oy<+^gadN5$K77ci3)Aq9u>WNxy-xiMy21WV|HT;}Xc$@F(B^3-y>PMmZHsrl zZF}D4Ci0T0rtB0%;{2V){T?w9pkli(%bPm*!?)aUR}c%SW@lezjIeg?F;{k%>L}uE z^gCW@Q4z1qxR@4$&t4AgIL6KMrvT*xN#5lp7q|Go`%Hd|aYCF@o{5BvTdAv_d~ia( zB+Op<2#U{wMcKj@4f31uDr{fyY?3ic<_jCwe@mL@HXfz>%bMGg4L0M*s{y6?&en;7 z8Efm-^k_zs{V|x7>ph$ey=9trmFjGKve~~e)^Yrwr$Uopf~^=SkrbQFq>>Ya0r0K? z&L|{jKeKXdfQzY9JaS+>5ARdt)79_FJ!jWE-U{-7`7%J$4-GDu6jym>2(eu*G9dC%{Jd-L3BPWU}8 z@{sSB>z0|yC?11{QZ4n*Z`;c9bBw{Mi3pHp73(Gkd7x^rfG@KVw z&!vK*rrJ(K4AW{i)jDzHE(PUn=^1sUc4>E3>NNNLIq9xRW&)NSp zjNCqZawp=6p>z=rjmUH?%Zk1r|Dw9J*v%8y&|q%#s*fib8aSl?kvt}*IQSjsCHq`B zD%df)Uz`1mY;*82&gfx8ae;c;rm}3zKRuqUV=t#n=M@EFQvnkRy_U$oMP4%mb1WpO zZ#6(^KsvV3OvPTMvfiwD2Ew*Gj-{XkViq#2eA+QKKMnpxb5e37V#^|Q%Op)zuhKc^ zm-L6M&#Z4!eQD1X_{y?{VY^tbH291jo0V}=+wfe(g3T9xA=%@<0O}50_D&z)ihD-4 znd93FVr?1NA*q&Ze^jt0u3qs`XO^e7m?2}jQ#5?lXSH39P%Ctd^F(P{|1C3q+ZZQh zx`MXov@6mMVI^r-a4X*-@o;P|oryH#m8ck;|4*Bgeg>gh>?S=+44A_RXViR)fe-~Z zRK}%v+BY97C}#h|(QIt5DKTL9<8wF@>Bosz;CoH{c3BHJv%Iic^W7uX5)%FBw`?}- zhqqHpB@aXx<8N{Uy#Q0;)BvXCz7oQx+aXD)m57K^@~?jB?#f@gA)n)+U2pJpapQ+Mxs zGBg#Ls$@9ItN9gnVHBrX-bqAJf+?apDZ-~XNjZXZ5mtT%{x**LqW0{pv<3Jg}e z;IMt4+*PJpw4cx+p)vz|%-1Z;NE@{2irD+)j190dmbX}YhH~BA_+{u164&^0#AJ*+o>|7iTjnpsB|J}C<0`~A<(ziL z_h|qrMk|3^f$_Vw&-^AF}S1avs z6dGH^{ofhiF5UgjmvU%=h!oYL6q<%fsmSi38#BxnCItvo{?zSuX4)@KlU3eq01{ucD`zzfJK_Ap%F-H?%) z^i6vEp*LQlslWV6#$%%{%q;p6P-p7+%z57ZBI{L!hsD>)=Hw;N+;f(wsdKiE)F|s( zo{Thj56L{bgPzaTi#zC7T+V>{f^j_gsXljYd{*?geV9JSJD!Z-^ktOU4Hp30W3qgN?5(H=lP$GB zdexVoD=rm|xmeqpQ_3u?)sING)Jyj7V(lF4+JE?ZhR2-Q#%IHSR_(pE5 z2#oPP%oBCvswL|=Ilx=zj!Lsn4Eh&=qsJ&us1&5rdJi;2LNRpDTE>6AT)c^QB z)f%XpVT4LK)uSqaP-klG)E&Ld_b#rX3hA2xDQSwJTI3eW)QYmbtxa0&LUw$ZX@_up z#+qZzAr$!=y7yEssmkY_-}Ohh|2bl=5Bnh8D;i-OSfGB3r0I8}HyZ{M^?p-=-QKNK@~we+Rd=g>65T}@c8x@Nfqwmj6ZXBo=jlcI8u%iE2i09qArsr> zI)0k`u;?;Z1?5I77iw|BKhQuX{rV=hq{g<`Ploil|CVH0=Ge&9vV&_Gx9IQOKcSat z;OXO3c}mjF4{8SNrvo+~_x_K_lC?Vg#NyaC_fYaTOjR{AUius*O6e4Um3ZQa7%G1= zjZ(Q}|MAHc;w!&k?Ri}!1F}W+n(2Iz*k|S6e_Ql?o~lZ9{%)dcZLUEa-QxT!b{J2a ztn*HRC@!zI&87aWu8GA?tPs{au-M&3>OoC52#g_$I3u#{amI!>|9!J5|4{y0NDpKAX>^`Sv=UjJrYH1F!WofyTc#lLV$aVq^jCRyyWLw>>rlDcx2wBY z8@MkTx%&hOLhyf!&MN5qidPYhGC|T`r@77~yt?mznO_nBU-N`ojd!_ zQ0obicwpz#2R_7k7|xM;5$;uQ5p%}|6eY*4i6gd>Fbsb{V(AjX_)%tW>8~Z-@eE}3 zxxk5FwL@GcJ5jqp*t@jnpVbO?esN|f+lE;i2!#KlJ1w6q@hv?G5?cy23tmVR?2`)= zk@=Psc_>Y0Gd|BFIFRs9`}pP-?`>N#w=tbUue4(YaLLV?+Mdax|AZ-1R;OlGK0M*b z$g=LNxK3q|BM>2$_qCd4oF)M|a#Myb&rd|skGxy7txoei zY>td-2%3+D?LAO(09Sloga=3UpLz1e-w3#3f^OvS`Bk2_G||*KJ5B1RaCCh{AY9@W zA0D%)juLR=ibedCkqVp^&5}xR% z>1Q7b*`)bmdag9R3olw+Yh7X_;*=8Wzc0cm_e>w#yl=UCQtqhJJ61EUP&0!sPEpA zdAt+o)zk*;qvzQuJ&_IW2&(?FBTn>lNNzP}w%ouaMFv1`TXRe|(wY+@II%VK+YlVP zcp`25x8hl{{F7gEf^4l!6yzKsd(WjSa4{hO+MNW#`&{n%xiSO&RX)8EM6m5n4j3(Y zQ%^VaHJY)_^SNyqUhp6obn;{t!MZ66y8q}koAl2f71qtA(!xJ~v6@q9EfWb5p|m#v z;z>K_;Wh1~kaY3Iz0GrMT^@Vv2ABJv5KxV>ChCb{DUK+BWJX$^1q}E&^L}mVzMSi- zo=V=Ogi_yc!VTpIXdwWnQ^Xda(1aB_l~Z3^ldB5+9Sqcz)i}utko%qxqtwS zstt7z58rmZ-@SKG;{Ig-m9=ee)Xm9-`|r37Ns%LEiW^>1kP9{$YJ%I<4upfvy;i02* z@-1^@BrkiKb$@kkqQe`_;d%KkH7=yXOW%a$N+F#g!wD-~( z#aN5SRnGgUzd|46a=3C0XXNZ&awC2({7dxA%XupJx(P`Wl8UT~u&H{v5H9zEKGmq` zOQZt3hHC%PTabqEX8LZ(8OOoU1oJm~^vo~ONi$J4s3P4$hYOWL%pU|-%}sH*$q{EW zQf9wB{DATp@5YiSju*Ch`Q(gorN@#&-3;$$e)Eb>88Wvna-tmsf{`3AET$x}Xg?nOm~>kKeeNuzi6o1zrY-QQAlBEcKRH}_JkRB0 z)i?v}gYI>&=fKnJGUrXhVb@y|;oOjRNNWic{ra5CGT{bm_AQdyZy{6@d6<*lQ_s>S zl~tPCkD4q?&sm%e;EZkamJbS~>sJ+~zk3L|AG;CGxDs4}r+t)Jj4hU2A|tXbu_d2} zTcsu@dN>x7BLZ7OTxyeVCjwLeyGtx$E2_IUhq0f3pWKgFmA_a*lq!@f>vje#8o#&% zRBc6?4enudnR9T00Xw69d4Wc}a8)UbRj#m0V)i>Z_BW$JM%guU9dWhv7rc!lpP&^S z@>wH7+9JKKW^5;bO7mIvucyx%%UroISQu6)mwltQ6=TU3vpVVJf)$^*I*|$f$4D9~ z(wOwJi!-HNmLN9-!8n*RUAk-_6W&gVqM=JVZosB!8O#sQC zb{3x3Ob6S9O@Suv=U%)Me__H?0wz^{53ch;8^L(B*|+?MDlwY+wwaZJ2jF(BnA8lv&o?X*#-n_R*aTcH ztndLYm%{%$SQ8~yZs$(^U}+bA;%2H%uA^t=WJVJQ=F4s8!m2)XdXGx)YO4h^uNKWi zA9v4yy87dMh~Z+vCULpOnfCeAV0fj*Vr#ZHU~p2YMXcP{8Tn}O8Hif@-&|4Yt+so+ zrndLoKV#A=rDhm~r@B$e2e{kRO_2cx-)){PxXQO1>DRT!do`A<1+OTIX#340+i zE>dwjSF!U+&i4xTH1d*^_=G6cz#LR!7%gYa+eS`-=!51%j}*j1l&C+t)ZJGeR0uov zC^p9lR==S@Cd=Tomf$^xXJp$G=)p+JJpygNVPxusvma)}3aI+PEf-&a8se1pnj!!1eR4r*_eG)B_ zF*IdlSYR>!=A#xF-HkoF)kgGxu>TI9$E7ABWT@^;yTAQ6@bIHPtG(!k3pVtMAXZv7=!d<^v z)76QXx1R3>rzk~-nZXK5{bDA3USN29z?wW^zPJ3r<0gm?VOgAi{qe%S|NiYG)i(P) zDN2lKGbsY-xQnFK3g|L1y3w7bF90FR;^1s`&6)|?G)gUZZp#{#nwTlO*k9u&UDhs% zRV|dkI9~(h>tgZ<>i}kq@II)|nhohiD`+L-5~3xOzG?(z^|z?V+jOo@uRFrEM zHL)t$U2g2MD`7N|Yh^A$_~og*Zu1Z-D3Ap69TD>X92T7N`srSE{COC0=XnzA`U{=+ zOUb35oDGS%@EUpvXcFf;Avm#Kio9iD1x^_I<7ZJ{L3V0Xa}M6iN*0pMBim}I#Q)zb z3$|#fZhmY>=TnC+a=zb-PxB1*Dgpijo_ij_1^o*wZQf{q6jQ5$T*dUSR^t{`ENfpJ zTzTUj)bV2vuQ@%~K0$XUgzo{OH%2%Z*aH=|)pP{*+TuxCl5lk^=J4-jCAO}F%Yi*a z#gQ3-3$cHl`t)`#C9TWl7!8? z$iQ;)9iCTSqv*H>4W}B%k2f25Qs)`a#eYz52 z9vrwvF=yU~X){Te#-~X-`3$7de4Q=!gWDtZO(N-~1i~oN_plr~=CP`V%8<2wbSpwo z%{hQadrLA2v>VY%46qVidoq({J2hp+75L1IyXU6R6nn|=JLUwK`w)Q>kng$I7?6R5 ze>CrphlqYtO3FSXQKSV_){TwES1hc|UKiE`qV&7(72(OpZ}d!0hoGzFKI~H7PaTR| ze+fIZ+5>5nVHOKROhos1C*9+OXRTsVFrMfjHVfjsqu4zArqt}$7}qpN(F~Kt#QtCH zwI70@gx6$JN02LhP``)T^jNupymB&HDe#+#yFV@wcQ%V6PuR;!4feP<;GXJ`!-^ZsAk>dHSAY-iac+ zg<(2&^lDgQ`T4akw68QA+hW9&NO61ifeTo7v(Z0?+vZ@@#)o5bck_?NC2wz%EAQc~ z)^Z|@hWd|LB4=iJmjX;D)BaqQR2`f^YF|pRcuOhpMedq)nt$EJvYOkb7y5K{hcC~T zwZ3dpO05cz_JO^?xs59y+z=@v!J25(zishFFx6lxc*?aGxowh5jMs#yHkc49Aj zmjI^cb_Uh2{wPrN#B%Yfo=887K)5#621JK(M+&5C)7F7+jiTDmNLp*$2CDFqvnl3v zPV8MY{jWJsQ7`s>E25~^zGqeZ%IjSrIrpRKDWoT}%r%N0TxKLE8s~&l;)GLLoM=59 z6v4=TQGOvCw`f3K#oSuuU@-wiQiB*DU=P+`{6w@*?zv3ekuW@_y5!=SCHWKu#EzYiMkyx0N>|cGsL^`^Fo0+s0L7%YKhMqs`73h(YFG;CKduqgA}Rvp)XuU%1LS zGPU_C`4P`1t#e6#1atJY%aB#$->-H7OD+y3#flx$OF!#OTU-=3tn|*2Q?}_s5qWVZY8N9PiAK48tkM?V4rx{qJ)~K0+MNe=nhU2Iv2b)1CO0fSnB+=H0fb_`Ph6M9=3IsfmAKU)+|5Ox9UBv+L4dyG4W$w=o%s z-UF?|R_p!wQkTTEv}sdCIY;5Y8)G?Gl|jh1xTOLnm7slOJrinabEAA`-Wh@d zU?=r+AL;!NvxcRj**5HWzUZz0;ZO<|ST=gcHoQ9WnE7+IsK2LMoGLWb%*Ijp5wcMX zD8a_a*pJB03@d5Q4BVh4_Woy_%+>YQB7zos7=G-9JxsqHJG_v7S|lN*dOLY0D29$Na(ZDf*rrWIJQ2n13> z3Uv}h$NBC)cawTBm=pP;$WFeRC(x z)MB;ND~f^^F<}En+J{}d7dXvJ8ZQ5mP?X~gEV`w;zItG8(v{4Pc+txQJNv zA6UY8(c1D>;vRdqLlFCRcG;GR4}V1Col6sAG9B;XIcQ^2Q%Wv~b7L~X2!M`tqR80$ zgW}wR0{L%emn6@5uah<{5kJCReBWmNgv>4Bi#zYN$U_Mq%DZxlBz3cYFp>h(xp8Z=A8Ht51dWu3aO{@_dLrzt(6hvYSW8qUie&fnx2T=d97}G|j`R zKDc2k^*=lr%TR`Kk}H#WGyabsBWl@k3^m`zX;j2RwzW_n5ZW`BJartX&9B?)rE?*| z?g%%wL-g6`12e!U_HPol%L1pB-B<)F#FIsbT#eRi z?)y*;RR~L2A|xbhN~+N!{3R3n?0t z8>Lx(QVwFhr%)(p(}?>!!hFerzt!(r% z;UDuD>d{wvjxj6~1vN7R>=NK=$SXWTYD$E2Y$9gMH z_Fc+6%+w^hqxD=q#|bsK@fM}zxY(l=7~=e>m;6@u$G`=OIy*sIw|3FzlOFdd5;4tO z%IBV4D_$}GObAOw9xVBRbx#S8?ZEaWx=9?aNHg#xiHBkCccS`_SUh?r&WQ*dqaW=G zBs&3-_XV0Q`dd#jX0dv5CJx3SCa4jV+I(xwvd-94PQG(%r9U+MQh`}&>RqG#xXiTM zmh}+sggh0^kmJT2nD|tL%i{u1-+!wuC3H^0KF(a+pP2LSQ78xDiMZ$T@s~3GaAD`6 ziJckC!1@_EanA!>uqPMJY=nCVkrftl_}>xY)9~LU-(K_1*>_}5XLt$Il^<05;px@Z zCw0o!|KT*YxP>fv-0teG6|e6E^V&J#lF?2HhRUaM5rOEsl472d3w0nHIh-z%j`XP; zeDfx!V`Nx60zyK!z5B$>7QO2X0yvGWnXHLC0;3VEgx+`RxEObCIev4s>%y(Md{KJ1 zyVGPUf8AoQdS(h%_=iwYM6|?8T=Jw$shx+K=L~|X9O=8`E0Qm^Q{TCaS9cLYDP2mv z=a~#kwKlVu8TpF4M6)M{snYAC6t|c^098{OD9HoN=;V%>M4~owpoPt=i)I0&>Mc|H z)g=uV6uBFklTNnh3{Pcc5hbESgeCIf>AdDGVuMy+gjVvDlLre+P`s6x(o4o~CNZsJ z)|sceZR|ouRFyc=90+bIDwn;x#i;0D(R+LvIw&OXT^V2&oRhyx0QBsw&uGCxRSaY` zJ=9GhR&APt2pR_NsQLAC$$0pYQ%p*^zW2#aVtoRCT&C)9S#nL6vN^0rz>)jWwHKwZtmi6g}52P`t-Xkz(ki*Z_1)^9Y}ef zYD_J+8%RCv<58)=W(1!) z29-`@JC+eBA5hI6kdYLknDe=zT+H@+t`w995uj8wVAJtAc z73G$>vBO4fPqVJWZtj@;Z!;-;t_t~VK6a_kV4WItOE0FT1og4JbOR(abTtHvYr>yx z*ch!FX{83AhCSRWPA~l0I%)Oz({H)sNScf~E|;ii0TtL|%KJi&i*d#0?~sCgp=cq? zC(s<*-?<0DM@(Zzc_Qm!HD6Ke>;ACE%9fexc?4NPr)hETK-3eO%V`$JSnS%0T>ALe zfHny3@G+)M%%b3n_8J98SQbM43I(raw4+hubwqNtN~%M+GkfL*gTS}i3~Av3gG!uX zJW|2hLcJH52J15*=Mc8m>AvZz?TJf!|Es6Zb>wnh;>2mX)O{h7yY9ZI`xCuSRX{S% zyz?nTK63o$v)n&Sk^Pe#IMPHpY_&au{6xQ3*%8AdZ|^hq+%x#F+pXc)^USfvH`P22 zgN0}Y35{espKkgFP3|Hl+lEtkYeDwZlrgBtSav=~wHO2nCe9Cr(Qx~r40ZlYN-%c| zY|<`iPA=r^LM;dOPP~g{Lfm?9r1K2CB8;sh>u(JXXYX|pk<_%lNIBkMK zKm0LXerv+Y2Q8k=M0{)TGG{mt?vW#V)SnkQVLX0hRtQfZsZ|Mu*Od6UD%^LtwHhFR zK5_Y^*1#l{Mf<4n)+0++gBZ+?4dB)wZVT_KQ-TkCGZ)dDYtlN zGV)O({dTeal9@osHa-$XEA9+r2;~F_a)jGB4jEf{&S@r`ofqmPBH5`^tx?20-;8*4 za^UQw45ZQGGP_|`>>F|@+T|UX?RQcA_%sY9I zBWAN^%oznZvfhOVV|SI{x!=bBa25i1?A}*puFjWGrQ`mWxmZDy!+iIoN&A@W1^#P6 z8k=oK@|4OtoK0LzHax-|dbB-Vdz@V|&L}IKy}2{84sl1RljMYxQ&%bZ`k|zs|KT&A=Xt+gnh+R6 zB0BK=Ix|JL;PfLolK;`?*dskKLRH3?kzMUoShQo8RQ-|>2kjio-LpS=;%tRue+f-< zy2R!*J5l)E$H)iC+C|@QUi&*=|MRrS0qu~5(jKl%8#J(k+IQkEto##O5>PNZJsZ}W zJQBC6FC^ujtBp{ddRn6}3iDodmRcEpYd5VJHi`j;Ax8=!B&9*dH;%eb!3wC2v*ItR zD%_dayIKlP`(9)xI-R#@imkXzM8S{fS_g_dZQCzG>C#^p=tu%NVofctzQlg|UGSeG z^0Y^kM5zBO)K|q%5}+64PL1Y}NHVXuV;r5;kaJ6k$Zwe|_n~jTseM?=*}Eb!0M3$e zMuE%=gig1X&iho0<^M=?73;&O1 zf#<1xr}GH&cVqKcn3@Xp8?3d?4danvh(xl-YXpnO*@E4uDu*fe{E=v>VO@M#S@O2; zV0Wv>3lpNmavRILW#cYamk$AT1ZAaxcLM~&^83~uS1VsWG}pQxNmNo2JfvyB>w8Xx zeXHO93r#Ob7M;iE*hPD3(JW|%dhxS0Fm8@eJ*2Xh>wZQ=K0~AC&i)i))b{NZ=+@d( zJIBGDM=P1ZKVcukISOMqJzhwBc%#pgS^vcFKkAisH>7@ar$T7|52dii1EG$!0{puj z|6oe+uV-z4?DZ#F+d>pR zObPQY(U%zh&%~!`@u_&5%opnf-?^8A351@{3V?f^*481%c64XsYTbPi%=RUxx)m@8 z$R5`AtVrgR9cyeybc$5D!M?{Fm{^*0%}B17Lf3uBLFQL<`cwEsRjt>?K_^bR@qm^> zWHF=k; zfkLg{!O^B+Z#loG@_!$|@g++)7g0qELcan7mkb8n8QUdji!Za_o>LhABJ!f+VN^Ih zF#cyCztL#wKbqGzyDbM&=gv)Tpq;dD#uVsK*qjE~`f-CiyY5Z~yT}A?+ydCvm(H)= z$>4Hu=?xa3e~`xoCNpiHW)+#$qKsz4BtHz&7qH_r=!yyTYTeApITM+izbos6e-}_* z!^xVbeg4~<5rDo=Te-G5i;rx?7Sn}9Du8%`OWBudeW^9uKNy(wp$Dq;CQj)e&A0Kq z(}*xY226uADl-qAK1vQU%G3<>cNa(4vBgH263u%flO;9~;8pfRh$w<~vVs&&b{uUk z+ViGDr%)Tl)nr%BzlH;TlHP)u|7f%WJ~#L;c}o-OW|OQgtq>BzafFDlUx3Lvo1P$) zj6xil`~G1}Wzu7-^C@lM#oOmws9Em%r1>TrX?;J_1?2QGqd&z9-ut)z{BiEK9l&Ek zwn<6~vghV+(32G*;k!a{9+{dm9*^==Wn6eRzss0dM!U! zq0SKsg9og^k3f_-?d$Ab{#emBcsWdH_L|u z7mykoHx1SLNlPtnkrym)Z%euUqNsi5DO{RtU1!`60zFf3<2P%q`U2!IdAa*eA^@rd zrgHuVA-QXRnr;dxrH2)W^!~4}?7&>|g>sA_rUkkFYB$E{*EPwE!C1x~rB#SFX)pht zcLty-M*t_o@%=7c#AU22w`FshnY)`rpg*L;q~tCxhpgc`I&J>ZP;)#PZk5!D{I#xB z#xyVQtFKOf1G5a~B_-ilHb-C-np?qdVRKGCEqY+I)wWL6RJ?XZ`p=R7tb#FLLm|wa zwqlL#KPs^yue7&yJ}M|=%{QW#%Wl7qMB6h17rj-_xaZZaNNYDu?tMi&zrIP~J z5A>t*`Y#pRwfq|L8;NAEYFfg8kH%e%1euw?cvTg}DV)Qdj=94t(sIh1POyPo+aNo2 zjw1}k_d(uJ^>TaeDSbw0huK@D6_R4hvjByT2dS})BD*IH1bc@us&{)3E5P8t3R%|Y zp_sqxxiZtIF-*^A9oyFgFiRYd!t@YiX$y3H0_s}Cfv)`~LA6=dRx_gUrzp-^EC6hO zZUl+F?Wgl7@ChNVb4$k^Ppr zvYQrjRu0xIAR*0)Ts&Y@*sQWWYmXaN&Otq(5yhs*dX=U>VXk~J4|+>7Bh5L7wuK5Ad2YSWK)c_%mGsHA9LNjR!-foxh|K%<6CLCdbo_1;=U0R66#NA&~`m5qnSRmMa!VmHE* zrXL{ur)<5fi1CpF=$ByjOcz8_tB_9P)=QQ&P?10!Z{{ACcPUH4Il;1Gs>tmn< zkJJyc)IR13yUvlkb$~tq7Um$|u6>g?to54rQ$PnSy2n;g~s=r6PKPw?vO# zo!d7jH#e?ST3->7V#*Rhzki-&2yF}tWcqO11N}O?W?f}vWVhAuj0{ekCr-(Sj^roq zY82XpM49BTGe3bxYpGz@i0qlBfvNkg*^v>Ax%C9oEY4EHRhl7evXt2B0|ecR<+{)b zKJZR4E?LUanU5kcxfLty66=J_5GtfweUSV9w}f)wjp`f_MZ@k$V7Xc1K9MQmcOJ0& zEkAMfP_3-F=|3W$smTO}ckhI4h4jB&yM=u_#*wsk`-5^BxR6yy1`$J>=J?g_@{#;=(SIzym-X~7w~wPb;^f=0=O;#HKW&7gZXCVfvu z?iDyD*;fO}G4&S=I{aNZw5^t=W?glos`5oVYWr?=4Y-N})~d=eBvQQwJd)9a$EKZC zwN>j`SoS~n7bM>^dsA{gcv_S1$2Xw2NOK8;;FipO-5DLjk@YzUTip8{HSktpv-m;w zxp?EE|B^-dYQJk{O+DfMEySw`S$+YapiLawkUj;MB>L=DTh*-y2n3PS8uIw2^~NiV z$DxA!iExA)qfx_1dBB6LhP7@GdKE_N|3|^;^%XIO*GpfhQiBZ;H~JU$H;5+pew-o) z<1&;2B4mIVLT$&l| za$GQ3L$`PO4FkipphqsdfE8~M|L6}Cvf!Ua>>icgkklXH6UlUQ%7^BVwTW8)uH%SC ztwC0*GtZa7L%fc!w5FFe1+`FhKaHlG4;S%BY}`s!3o5Qb{L&r>?xo9jDvJl9IY}2KhI=Irz17!v;epP9mTjZeovO! z-XubFbSfv8;r1H96pA}HWYi6Z5C9@j#tu0Ex@vB>9vQfGC9%yZNELdm_K!%xnQqRf z7$GsZkZCp-19PxUR~L&}gV<~tjdo6^`?reyP+osfNn?9D6?i5Uj>TPD{oCjADN;mc zm1*}=XeP^FK}N@0_dbMsWW zLX_4+t06y`X~DwxRs-*eidiVlBU+uZR1FY+8Up2Vzck&OG$fQfQCU7sLw4%&U15NA zTpNspx zi7x5=Y)AR0`3Vp^4_0UPLOA971Of_<{wmrPz#`v5lGv2Bi$}0$$DqrsHss((&L^sN z?IbK8W5yeOMp6&{+tY^#;kVEoH3K9_BxfF(>Y5=IZ|_QC+3`3KvJ52|nNS4#{i9%k zSrkV7%dfs@I~81{XkX-ktYx)}I|MX~F9bA3_j>JtJ>JD|mW5LF-Ld11<`VRl9ouQR zaVMqnF)j{cud%r}15|nAL+c*m!{9R+7sfzJ5P}D~4c6)YTb^AEG~Rfs8vT=FCPrcO z7$6FFKg_LJw+R^`+!az6_ai^#F&KcpEgdZ&3e-joaUYNspUL&H2}-x6zT_ReM2_&U zMw#sOHW9*FOK9IoZ$_S$eK56OFjr)Iy?xLm#-Mxgn3MK*5t#cBvtrnG$QQ=ES5)_K zw#QFC$^Z;yODg~x;;EjWg$xDkyp{HZbJ>UcoEml#eIGv3UTaQ#J4f!Q|CX*+OV3fx zek11 zS^ZDp%2N(oC7h~vRNsJxa&1I^_E1O10(suO7svngJYgnNo5!kErU*%-~6 zR>eTxIFvc3NSWMM?xt^&$U|=cM|ke7|HU!WZA;0p>qw0E+&d7z8Nu>QZ{|VI$ABeF zMcFP)*`(yGq@qfI?ANX{N(E+!HT6IeoZ}w`MdbA_tX&C4B zXna{J%OaV6T77ql6L`LsiI#1A$?w0=wYwyp7jq>cJ3zx5WTuiF7~BmAAIzXgFgD?zX|g+=kS(jpbBqVqz1#;ED{CxkaXPyc<kUxUsNI@Zbn)et!gW=y(*c)(1wDtyxBE_w}P$7<`CCb$;{DrV^ViR(}K zk;D|nGwqP=zrq=K+Zk#olu?&W9`B+e9T5=df^fG2bZy;v) z^^DMd`7-f?H*gjxRJ!Zg!rKXNf(;O(AoJr&*T^XI4?-P687jU$TNb4Dp9io;)_hbI zC3MK(yK=?^U_BCJ%gIb?y)A;ZwLj)`iJzqHXI_-(qXP-Ml|CaJXCoY|zi z=2%3Atw{G4^D%?~8nplz^vJ@I_z;uY@8YPl9M8GXN(=30nazd9*r<35=VK zo1&U&`%D9qfSsHAQWSviADiwS1)Ye|+=sZ$k*s@)WJljSh=?Qm3;A-*Q84G?ay?#) z)7e+S^bDmtp>QuMd%jIq89QtVX7`E7N_W&d<$s<`+$u{MRNq0PyNBSh2o}yh;7nXMXw8Ly zyGjwB4!3j8xe7FFYre-VWXac6iMk#(%V$CweRIM#D`sska-{j~UHvdA+I@`RiWn^j zE>hkjV#8v`XIJ!Qb!%3MqOB<1Ye_bRAC!49t;0DV?Z)a|9Y7%>%>z8SX%1cz+He07 zXil&(!y;9s`o9Z1MTnm3(H|vlIWAd(wf5w`{k3&1Suz%sFSEgIyewahQ6a)m5+Yhu z;f==!_Hjpo^EC06rdk0rj#`?b4C0O(nRNNlM|KF_siZkyY3j|V*vzcerDNr#YUI=u zA+RTdPJH?*K=AyLyK3d*P$-uJ8tOq+USzV$F)%X@6yF<&$$cl~1-YV>0;=wqRY!2i zKl~W*+cri-tF=52iD@tU6y}#$6g%OK8Z46k9}PlcfkyTsM&7%((gz$% zY*8PdaoPK%#O630urBx%;$n7o7SlIXI91Z2}o^Z6o0JK3-pK!2C4&*3GR-JYzG zCo`nlfeUCg@<==uGP{Z`dC}l^n&#PG38ihDvExNWviRh!A*g?aMwgD{d#{q6)gO&5 zCA$R%mov5axr&rynPS%CE2AE#(T(9*|59K997srE@P+;UkWS$H@DDhhhD_6mEuIcjXfC6Fp#5j36ODgNr0c{WJN zBEUMJ|A~FO#39P~iqL_?^#>_v$f69&rS)Fpbw1U_S0M4)s5~VB6S;($W8s&7>tmy^ z(dl$=Ov`t+GxM2oavEO<-14ITE%q>vPs2FI9R+C@9Pa}*byD}0#%+YM+fubF_f!nD zP%v|U?9|Lvwbh$D6}wR!I)z?RW8}N&d1>MHTpt*~>jX-50$x)^c*w`_vir3a_^T1Z z#bFnFOlEh~HcUk6kI7z6+>7jZVyJ3#Pvg^9!;ldirWuYc4CNEW#DIv1IAZ-=fO!mJ zQ}*~qxzsBvfZFjD#I`X=8q~cS72^VQ(CWnRSGG%l zxxKeXw4pTBL-lZ~va(rUHPqVyY*c^EekXU-?~Lrwt|tdlv?w!^gqrmi+7-Sqa+}Ik zgxt_Wshh!FH+xiOOGAtdiW9(S#W8Z${Vv*!;d4F|TeUS}T*a8VB}5*I zr|6sj2;W{^7;$bM2^D*kXRDl5HnMKuK{x#N%Gnd8I=$k!mVW)okMeIK3J5W3$h{tE zx9b{S5cwrYCb*i916R{t3S@nzU|-DhM=pvXi5`Gf06_XLRyAC z`%{%xq?+p^{I>~Z5E69Pxo=1AL&Od(+kHs3!HUM$cAL)#0i zLtg*k%HXK6(?ay;GTV|O>1M4cDfc@Wyo9Bw9S*q6kj?Gje>B^|pO_zCxrs-~oWBUT z6n3Nz$4jmN$cd?6sw&t&_4f%4zp6BU^<7jgP5g`@w zzB>eWu2G3z1I!=)SwEMCk4H?YE*-`}xE@Apmioy=|5k5}fp$}dXus=^Ty^dpSNf0r znE_^P;dqCkBVzujp1E@?utG>mx;F^papfP4;+@Qe)NVjCQid1jRpPV{?z;8VuO*1& z?{>^L71d&{Rk(NtGuyTZ&kipYGklQ^D;=ju<$2)xA_Nf{L$y#fY|#Y|cVRWEFy&=_ z?4eqQ3Z40UJOx#f)ap#H)eNUGv0>+3#$09Q z5n4AmeP!9N$jzCniMm9nL@kkNR+h=br(`E)X7o$d%GkMc{Os?vc9Du0LTvoZX`aS2 zp8?n)bSC=kSa=bi9eREB5F}ACZ~t0|b1Kx&e)YDm7282GNN#WYlB4_}t4c|g$K2%y z#qs0!I37niIXW667=(JYz4{-Ytg0li;ANcNtzaD_&NcDZOA$@hF zE6)R>b;vFtZzU0q^_LQJ(|;!$RijL_XZW=~mC{`9%y%Q`<+V>0l)S&MI1-U@e?ffO z86PN^9>6K8FtNDcN@=qrs_IdxUuAX#=hzXNJ1}N6S1Sj@Pj`MSKHTb+7YX5CQ3zPa z<_o4XmuUEv$RAM@ktzy1`+k_Bv+HW?F*`+%IeO87^(xi}G)Sv4L&m>zhN6@3g502V zX?4uH+bfFZ*W24?W^vufwNa8}F?5jscj{Tz;FgSa$|_(AloN&QF!M9IJBzP{e$~#s z0uwepgjH+kpvFdVJ4)DcETj6s|C4o>})6CY2+Ur_q8) zqe~g2mAy`tIXG}DnsD&kjT5U@nE1H&w$N|4w2;?n5}MBWo!X9*f6LL&pGAd2vvH%5a9uTPE4Kri;FEll5!k`_xsHhLUC} zyInb9;u*u+vn2)&y_23PIlt_qI82k$WIFN)?8 z4yq|ru38MjDE62=7Q9YJ}UT0njbQF>D-_9IKU$`}rRmJoCqF&gFyX~5M6#?J?BJwqX zd1wZ&f>d18nk7&aVZTc><5~S>5mf3RXdqP>r{qeO8@?NJ?(ZyFN~=Em<6NsN)ffO zN`(dcPH-?v6sGt*w_|r6N_g0!E%ECLLeHomGxctKsT$su`|>G?zKvk2_k0^gkAyd5 zB_Oqu$=r@brp5fd;tbbjUrt~$`MU!CdM^4BRU{8NC9zH4im4E>Ec=u$`Mc?DY{%-3 zf9qsnFxB#)@jG~s-3IA{PP)5K4D(%yI?O0#=YvW=sNane_{0TOfZoPE1i&lry?c7Z z9aDqAsBAjB;?0MnH*DiEY}{YZt?joT3%sWAMJ1zBxiA;o`E03CIMj+rHN{SNg@BlH zOBaGbTib>1M+Yp=gHW1!R;7m1Bg8mVyv&)ud|P<>i6Ag?FkU6;NqYP2pV z!8XIP1K(5SWA_V93^=ywYgp20p}Ni`U3N;3*pnWI=16;Fl-An)Y#@sy`vz(OAjde> zih4PJW2XLju*riV>$b=E=o41$__QzswA$Pb6P+fxF^X>=%~_7u9*^TPORCN(PCXF} z@i$IF6R}R0W2Nh&2=);ImfN*LYE;R1sRb2A9-9QlPeehu^-RaM2=sTkYOL9z{%xdf z6QYfUDwXR_e5EX4>FY6#pO+hoqXQvo`;W#>ICb=__?`%>b+(hlNk6&}mK*&?l6D_` z8bMPSc!NGLfEaK6oDHpOFD8?W^6Om!ILln#v)KMzWXZe&YW}jjxk2da%7!REJY1CgL3Km`hg#hcEw?`1W?^*=)a}k1uu& zH{LJK>YmV=+n-Z~ORngmJ)7hD9&5%^16%CeM~@htgr*<*IX6g-auj47guY z<_VokMI>2HgsCqZSA)ViqQ~;CjJOf|;#QQE&_e*3{l=RLW2OOlzG8$qVe*n$yN!E2}X zIo<2?`BGN(?4oi7nXWzROHMWMb+^H~P^WWwc8;ED=Q^jgrVIb&!2$4i5A>0W%fLD2 zh2-Z+F5VQ5)9(IL#X;1|<{obSY{M5JR1S1}=cAjggKy$ zVg6_S?lmV{ScF(DlHX0)bq&10xNCqDH`g=U&4t+-E%!4QP-J#a^Su60?K1Kx!r#{g z+LGZC@a5kqlRG!fgH-Lf%*TvRB`)^P8qEx2Ce`DV>GAk*q~0B$DdAYfT<_DMKB zq9bC}s9?^_8g(eZmxOoM(%)9RgVQRsihhRL|6>0Y9Py@%;U5iy!wu`RK(h}CM!2|P9?8EJ>W zw(5(8K+(z3q8LPd!D6Qcu={(iV}S2Z`wI3V4lMHXZZn)PC0`MhKSAgb+~6FQ-mo#+ z@1R5?g#Da7@%Lxjy)QJQtjmTL$K1}12?7t&<#3}g8@zD-#A0MNIlbpHQCwu&lIz|^ z0zJo|3?ODCg--~uTR+lUrzXh$!~1m5Cm+Vg*0o5M=R;|?5%PFMTJu@z80_wx%$U}U zPAHXTiz@cG09$&$kt+3%rsSH(t345e=uw>{Jbv1x&$ISI?m^zH4D5NwLJBMGDVb47 zLsvKV6CtFs6VI$9qC77c^|>@^&}&dZ{idw{$Ej(>kSa1et5}f~NtS~gx@4_9$h~2s z>}vRrW|AQ$bE@E)@H9tRBEARbBI~Do2O1jPKw_93Hy0kW*-TMeb>U>2UN<>lnl(~L zZn~fPK2N^beoW;=2wah^NUw`_ej%f~FoEr1y|-$`-bt191Yx=X+Z1N&@}w)*z6w$# zgAi&j0u{^fttiD{;U7HB2v*%jO70279!wf zsp+K^C83bQdwPGOkN;krZZS@-V;}dQZds&G%WJ0X4{K%*2`tW-a97e*jG!3!D!=$+({szt#Tz8^Q8Ryj91ucY&=mG{-x`F)4NMd1n zQKwcGMdb$^%6+_18vS?i=UL^bM2&2KU_$Cg$*817gVrPnmxkD%)RH2hj7@7@^bNx3 zKN?>zAM2_dwc1ucr7E8gG$jxjhCJwSXAm+Ddlzgak7yT#vl z!N6NuZN0j<7Vj&^Dwko`k}S(8t-N)}w^`3Iix)6B(O7gY8bor8WShH-1dLYxN2xj%Lo`t*1 zb4>yQFw^ilbf{^NTvK+!Cf;xsMARj)Xe7X0ULk~S4*ai1^=c7lFv+dtXLVJJ#kBy)#f_X#U)TIjOUI((hYkG(BOLu#UTb*9> z70|X;birg4Si{#G)JxkO23s@F>!>7{WX%?+PZigmJ2*&#*KoJ`Q5-$?R^|6;X`x77 z9yDMK0uDiKv6dlz2R3#8k?0aqcDSz3l2Nk-U{O5HkM8qh1G%=Ki$FF~y*Lk_rz_I3 z2lcxy(%CfcXEZd(Be108x=}IE{=XZQgJ_4(`Ckgn zREc7Z@fD(n+QcKy(n%WxWJa_Xg5WPSUVZd!9K8HGD5^aq=YXYdY?;$^Pm6cS@%av! z)~x|Kmwa>aCtUdx@goJ6(#2GSVW@0g?;neYG^t7B!Rie^Tv^lBt7q}7cOuA9m|%usIf z%TQDX)^?(0DSHL=8jmc76Kz?z3vbt=$Mnhlz>f{i3!ypVvx7-fMbi8oYL9OD%+=NE zH>+d@TnQ2vdYZ}cNUB4avh`yxd5^ z&Y#>Z)*97oN}L&$Mm?%Af~wrd)#VX9xPX%NaA4N-ao(p#%@n$J@IokGhybDcsjNE0 zAy#gYvjTi*^T7>mQG<4xP4fmNM7AOmd_=$+AAL~P@u}0hq|j>Ut6!PFy_h-Jjg+Vk@Qr3*M4d;$V(&iBP4htF=$z!x zjpm)l2io2!iptAha@wT~-;nF_^_368rtqeB=xYH_{XD_cIfd6mN;8Mv6pg|{QkPUg zp@-@TEv?(_Q1Di%7HdXrYYA1?$)BUi)cF0e@-Bzi?HG<3yZY&n5VkYzZ)tAjUvf;f zQ3xfTpEWhtEwk3)zp2PGpub<}AZcyR z(MwNGOIx#dmX1jpCHygBZ+<+;%8=WF+Mqi*xZnQm!}@uzWF*}$DJ(P>meEi|5>ne@ z*dKEuR9Zn#I{h>jZ(57T0Hh}4n^~uM4z4nGV+=Q*fIl4J=6$fKxxu)J=7uM>CQ*q< z*D+H-&SDri6S6Bd@?H6nA4_|B*t;G~MNh*=e3YxpNJP&j|g#ISiFr zKnq8Bl=9cJn)aBCoG9=mU)Bn)0wUrw_XU4vodcJ+q+g*09as>WGe%Q%AEm_EBBYIf zeZ`F#M6s?g{WxZPcHeL~1;mA1qSm@_z}#^2tT7hIOzNJlEcp=hA>hE>j&ehW6*Mm( z-qrMdJ9n~724gJb&Ki}5 z9|PG8z*(a{F&r97>o}@WfYaqqv!nSmo&HxQ+g^p9`73CP=(IFLds+aonfsZF!JP}k zYoVNmGBq74$laCLeNDbR#S$@?VvYDw~>-V+~lr*j$$5&jlYOzu0Ws85e_f@6|Y_(b7kw zrs>?Ik<)R>Kr1UH$PS2{W;uW052;ZFJc47M=}JDIBuYX9UZJE`OwC^ZnyEfwb}#xH zxuL94yi+QQz;=@TJ&zz&Hj;A>%@c4DmX!a&S>(~OneC^NG1)a^j^-3CeVd`sW5#A? z#f$xDp+^gL!rB=`f^Utq93zpJ%V!H@wFhi{Zeo3!f6s64;A+bGfd}FGgF-L!$ih`a z7d>Oy+y2fHJ2+|BwO7-qhmtH?mHttgw;lc-fmMO_i~E^2@&_y4M|&+GW5u$`EqFp4q16`I|6x z7R)p-Ia?Zp4HN6hR{6Q%q~fgaFQp3s47XG9&+x=Z4_}NH%%>nZ?;`*M4j7lq#g0K->!A|}}<4a!E z8q{HE7mzHIW~a=~FF@I&ja2)olh+wSVyS*Zy_{rQsQ|?))(e%$?1LMAmZ|mM1hdbI zF8iXtlCG=fW1|`bc*kG@>Oasj?TpqU=u}LTN|!xFY}cz*I`6Bq?j6*x@}+NCtTZE; zT6A9&1kVz)Pk&xW%ftQA6S4o8u@E1_!>7h5~OrbS*v0?Un3 zDxW&>{fPeKAIbf5J)J4wR(x5jOVm1pPZ43+LO-AaodOsw@5A#&c{3Kg8#muM;f)N` z=&8gPm~ZRK-z$Uy{OgcBLr{|FHP4p_iFM!eo9*JMtYlaz|VfQzl0Oye@8< zO0b{{4g!m)@JQxPD=AS^vVJH&^Q3>#xV)Y-N_LcThC!5cV#OZzD?7$uLu_vv^QjUf zU6=o40JrmoI0()AMMc~FVO`40rJxVNYY?^0Y59AibMNm!@KW#muVG-;U^`7-YY$x1 z?OlODx+z}=coCc9s4@RS5hh*I#-zA4x@+Iqf72L*tuW!J>m6*b8#8E~6A^?(`sW%B`RD{Rf`Z zBxfsKnH}?{?+b;m*8U&Or~pdCjy&BZ8w2kRfX%0V7c*vio4924$g`s5zr})=17pQD ztEMespFg9u$F}TB8YUbB?(X8OZW6w_oFZGOA}u)OzO*mB7YWSLEtyd{%)L z*Y~O%a5>LEnsVBgQ(b!$Df3eq&&6JuZLSDz6?#iW`*cs6`h?129J@CO#%iLCey>C$ zrFEL_bmKs63+PJfk5%K%WczD{8+lH>x_NoS7PXt*@5Y!v5_W{Ri{Vsp9NfU?+$6_= z#zVlj6BSqe26fP+YOcSl7%t`(g)eU_60p%X0~?$C}3o*5Yl90C-X%Q4ZYj6G793eGYKo>3!>@vY)V(|LlwDQ{gS zr+Q`(4kJ{BFfW3s=bch`*&p9dQ7e&4V&>-`2&1@LaSm3n0#OzQlaD<{u3*+72Dia9XNCWvJ_6OLHt_zo(jfS$a?&Juq+Ae&#Po6R4HdlVaRbzGDUxsyT*fFM#vW86NW(==!NJ~=Zv=QSy(dS_DT^ee z!aeWy@z7tzi27;Es)MPTaVT%rI4wW}zLY9R8dC0yu1xa#?ei&^Qr8`$b|^a3Q^b7; zdMio}>ea30qiG10MhX!0ZH$~$#Y6tlywc{ls`UDKhxrX3k~>k_a-2&tc47j&z?lOa zlxJZE+8oIVwUh26S0;4}z9P~`60y-^bGg>4%owZJ8p=g_*1|GTl)J7*Wq4n(eLu~w za%`(`$vJ|T_ra|d|7WfOtj}Dvh3hHXri<1j=%(R|!y~c2D8R4vsK3bxNchL3MV1iU zh{8ze7vj23JK9GIvn&{5qUzjR)0Z1hSjH=-?_mSohcPTJVn*|K+Y3HAV{r?0X2`?- zQkFW$fp;=TISCZC0k1$8pj+2NfS!-0SHL~amaA#q$-W~HqM<}jrofpCREvF1Eu~GJ zu4?1vb-T@Cy*sEdD--i)DcH>QRM(`7Ko7x2#GUABc%hBHpyisKlylo@ZtzNV3~w6> zPdn}vVE9gm0GDqd_^d>Q@F-(NdrFDG+(1=AF(oOJ;*PiADTDS%z9x72;Fy%+8 zR)13Eyd;{L*!Mi*V<6KSMD|Du6k5%QqdwNeo-kxd|2G%OyZ(o*WgBn5eEiJrjBqRAx_LXp9Lu$w1>o0Mlv*tdnd;XR?JBk6E0sg+k%Qlg@l{N*ITEhSO z3z(6ne3!!O1J|`p@+$M|(oF0cumRx^w{n1sPLSn`#f z!9BweWcIeopZ3u}PrjF*GQ#Tim*f|@p3kI6;7W6LsU3xPeW?4rrcidn_l^om!-qE{ zMb}h=5b@EgeIq#O2)S^UV8)*$pA!4C{O?OhPweok);RNwZVY2;1i9{q6zTcBr-nbr zBGW|*YV)(Kx^~R>x;UZ@UA}9oLil9=(L}F4sZE*}?s(T|1dgRTesCc4%C#Zqp_%V? zg4Y>07g$hVbK}7Fzw73dF9sZ;t8kf(9TnPG8U^VbuyfNO$}VIalXPhpz+=ouC@%hm z1V-7jR_Aw3S=I!=AgPy=vt%;hL1jgaiQpLSs!p*VlU^LN6ng?kc*!tXBM!%9U2~wQ zv^_2T0G0j2?sMPXSuTYAWr0qjUxQj8pJJ;Sk@?zU!<&!_s-vipWt*MNTj--GTXV&~ zt>!4}1T#K9kbIx>6w=g0OTiLC<7%pD5hY(O(Uzl)leeHSycI5ohWmSj^69ijz0hKR zbVO#)1cH4=sW5uvy$_cX^VKyc1>qsLNnVd7Ke$5f5s*`!YM1r)`QoKE0=A0anb^O&ovRKIDk`RJaX55 zMk9j^4fz`m?Jb<^ zxrN68D7y>9Bv-VUEXdzQg?ot+whYiR0-{S6>K3DnR^JSyCd406j%w8^?k}C_9bYf;Mu;Jaxr%CwPNxl?tG3RAxLR*0hc29k-RKCj(r+X(>i26xK$Ca()t##r1&Q4teBxg=$%tvHTNga z900$y%~*9l!nv7sV3q2gr_?86rNm?nZCI{{3a5lfNZP%_*TWjwfB@{)i*4}#))DBg9 zk0xeoCT3A;s~vjYoR863!csngW>oF62}vMrMBLN=;&gHBLBmdA0}NP7`2&_UF6etQ z6@QUjrC=^8EO1Tcv0Lu+>4j*Hy&nL$6)n^haF1p% z2 z3aQnbtE$knEjaLe_`O&~^_!@=15s-`Pvj3m#6|pos8#mt^-Q>*_7=!$qjqh@A@>$d}$Q@j1Y>?{+Ydc#G41PChcy)dI#*uRZl6j zG{FB^(TRp*rZ=Xkf|j>SWt;^;;kCNvkHxSLO;A%x$9Dv?DNOIpC8XnVL}ke4R3|`z z4Okz~f)TG8dQ{dfLGO(UXGjr5QKf>s&?{Bx0wo@Ni)shRPabtYyCNjsv` z=%PbX7Hp4R&eFsm$5y&8W~lNQ!EY zBVv%hOE`|4gmDu>^vKPdZ^PJtn!fwhqlcrA$EYWj2z!l5%AZx?vtj-`E((w-GD9M_ zY-&4~Ubmg{vZ)Hks)(AV)s5$n-`L`}nvO@f2coqur__8UpU2_@9VI>8SSpg2&^GUL zQ46fKHheaD6@GGHLw-I0dmg!vaqHx)^DaXl>8B&KUy&LOt2l4TxTHcRs{NB`iFSO$ z%(T5ky0`7H=aXFHfL$+!MtHm#Qo0#MS4rLJ9}MiaoNBQV^I@IVu@dEA} zFN1mf*$PvOq9|}X$1C-t))(^6 zL7{lC-yc7HZo5yRKO6%h1u`jg)h05^QD%QmbB$~XY6lW|xX(rnkLmZOsJePEZ-)m< z*0jFGwMgXT#&+vSo^U)eJCSgr5ALm1+lV?=x8{oJgPxG*$f= zX7^49*`{b)C|t9M5C?x0kzT`!{Mx0@FN3=CmGXclB>rHD2r7gZrk}sjW~$8Y@RCdy z#%|B!FyrPvcu`q5_2%bxQ=we?Os$fdyOy%hY#@Noop)Nw1ZUH(PG<9gduUDDMIj3F ziHFrew5&$Sq73QH`RogU$H4n=oI_5=ko71V{QJ9?mDX;U#5`FxaNkKeE3g{seqVy*IxE9KLF2GS}5ir z^+zOU24p+TR$5&kKSw6pH@X5r`tR5XYvuq*qH1N&kzgj|`?`9>b3s|rKzp%|fYFTc zZw)jTh%||*1Ep(Z-!4Gg(m4(FjL=C%+vZ&RkW|Na6cx?117iyjQAa73?8@)*ADZ-D z6a?|49Sz<>uGi6Vkhu z6joG}S#%8#N4sPyT_7}5Ud@2t5_(FT5Rpl!eG? zvXT?RMW~zSt%fw6eLTX-MS2@>)SzyXF?`S8`Q_aB`_jpAP&!#{!>OR#w}6}JxD~u; zbIek^=yv2nJL2v8rJ&L8@*y!ezNH!)iqcEIcwFE?n$8TQC-7bQi^fdj>#?dqh#g+2 zMb9m*h6488()AG2?_ghjEnCcvoN8sZAX;eS772$YjZ6A7#ZmP4Fcjk-nywn{g*)vLq zPgoR66E3uqkz#s`eBw_r@NUDnHcWVKMP32*2qKu(2jWf7A04UmQI+OozDNO!hJdTz zHZl+-De-wvEj8%Kh$AiM9YOlH-2QF%J+`?py5JM>v;gd9irY^ak zAECKV%R4Zg7V{`NQ0lxK00du^TNRaQ3?=OXA1dW9LQOys&=1Ia_2K_TW}b_1F)pWfFq zN5<0L15~NEOW{j~IU^EoU;>%8Hi1_2&bd46KS)?%RqU%qI_BtB711Lfe#E^>=G8~a zgmN5U-xsSji-#thAr{`ntZ)2^$o0jNe1q?@!p@VsGbN5ltJ_FKWhPK9HuN;!)l=u0 zV^|^X1tD{R-Ay!Q-GQlvle8Y`txJ!Z*QPWPeh0gsySN2r=x=6o_#}7iGFp|<`(-H- z7GVVtV`|p$_s`*>V&(C*L8{ic65Z|;wwky~81>IQ*5cYxZ4_$WcQw z%f%WkXkRd>#Ro8npK*GGrR4{+Vh`NaIb%HGM;yP;lT9sCpH;sYPz_ogQA(1mqes(B za9vZS@tTn|BI{xJWhH@hvf!h)HCPH~S*@2*h)4FiRrC8` zNsnd0`P(+GKk_E<34aEu^n`iZ=o(_2ssTqv`=u`^-b%+bnZg|vWC=4X>u&2iqj(#U zDhzw$cEm`3L|0=|t3&cEx=YY4m?`t1N3z1XZQ5=n z+8M2ToTzhz5PFFIgwb$&cl&waIKnUYbWG57_MKe3O}CHhHhK!o0{kdP_pm$eUKYel zZRLo3I@9IvB?6Q#8!Uic=3|#3(QhMi+z#P+2K7{ac9P4fsSCwP#GODYME)Bq)-BeG zn-G2^Lu{fs+}&PZ1GUTLAP+8skD$o5UQ9w9d6~&-c8cC4O`aO?2`Ja3m<%m^CHRntp~zECi%ygWnfFF`d@dh*&2s0!#FF4k=Cp6}Yvi#ho= z(PkkBI8p6@nPX9b_)0nzkloU>YZl7fm>ScCF3nPvS6rWL zhFGL;W?v1@2tm@RLJjO2rZViCDTEhTn@hCTp)nNdbytu0@EXEuIqL@ueX?ZQ`h+Ihw{#XV(pRu#RMyDo?=Dk!g@ZKmX=!u4!aH>!>%8Ed6| z#QaZ7!z58Q;;F0k=lT$+ohBDsa=i?`sW(nil%hDHkbxuQW-!?hdp>N16Fs5tu&+#d zV~)`p->?T$OAgX;J{8(PHL@R~yw*W9x(YQKwb3yZ&aDpGP21Y)iCfT7@Dwlqd-Hl% z@V#hhed)E_N*9uE%IAqCQZSnivoxgi{W9s5U@?D0u43%guId)sFTyXA>@5etk+W#^ z!3%Ngp%1OUYKWhL7LwSfL+%&L1>JNniCUw-0+rzEP0prkD7lNx#qhqN^#~Z-?Ixan zoz|Ppo#AUTs+eVT!SQ{gQJcB$ps74)e&y`mAzb2 zBNOfS*p2~~Q@IA5BYO^NO!vAIq?Djv!;za#PjE`!0fq7P_F9zRzuCLbRVZig=_HA= z7q9B_a zBHmHnzdW}s{~c|^mrt0n_Dbt-?qpw6GG;P)j*wG%W+@dbw)rbsAtrzq=8d%$Ni{`D zZ~6QuV>wcxqtNH?5pKAr8g%_UNz~mFfRss-9;hAaB~A$Wje!lU%WqTbUxE}Z=S11K zRC!);U?K9TNWIT-a7S0K@PWO|Q%_~-+J?aM@VRNY1X(ks0o zWl4T!2OQ`4bDLvbcDo{6)C9-4z!AJ&BQOA^mNshqPjqHXE)?Lp1B6JZ!s}MfDA%6i z*1Ao`$b4XzN-KcR+D{q!Ou>$Eqm%(e^HDC8OgH629v)qH00Y0Wzwk4 zUqqx+Z4kw2SdceW9EXTkVNEnAMD!3l3=`A)F&_E+ehY>mEv%fy z_4G1F!->ecQkpjok(+5;b*Gjzn*@hvM84tYt0ueAWxYD4p67sJ==9A;>Sc-LTrGI4ba1|0LAWqk z@dM5}rc6KsAF7PAjX014KeGTHik#CIDmoF~ffrz$6g2|pM=1~QkGno8_5g=aHkl^=i(3_BXfrL!Iv8+^`Sgvg8UD@z zEZT$FIxpDrVeE1Q{ZP?;KjO@hu=#_@zw%LeeLzj6@`P@283Ncc3$j(|N!>s+=_99Y z&x~R0e<4Fl2P&4klIM^X+BO+AF@;2>HggYQs#iPGL+!D2f9h1UzIfcIz1*Gsyq#`0 zaV$Bzh991tG>16VpgAu(9!9C?&#ECBN^DrLF+6TgfNrWyhTjkMZN~l0w2vVQj@#t- zjdxc?A33r?@go>k#(UFuMJsl4Ag^8}*xO`QkB3aq)x8X3?eGs!EWq-N1%oplFcqM@ zk@ofCEsfWDoKCel58nAo?Gl+DK&s3RIFLia>a!Gmm+@a9mbhR< z$g3yzyAs=lESQ2e)pz zuo$7lIMo+T!2QD(Ma5ONk`$3KGQvH2q!>R@#F4l#md`@sXLfH0#v&vMgl~5KXMk@C zQ#PY91rLQ?-FxJO>88R9_U-cjLlV2-h#y@Rcm^=c_|rD=mHKa7RqMdxDtB2bWc$<- zKu9LvS3pfc@^TU@T0RQf0yzRq{cg}R5}-8Ihqw)Z^MW_KzwtJzA1h#*D=%l09GQ+E z6D01!rhzFhFHC<=KJ+U=q0skcN#cDveIN!x4H|q2jPTe?f>*msOn$Vy!@hB9-CS+aZgg_#N(Y|&1BCEP@x)n_CiS8)fBu`T7 zNAgN~eVzz_pxf*22<(-P(!I?>%6tcQFA8ioE{l1dibUkrKKKKNS#~F<(AN3ILNlM+ z9uRt$zR$4=I`Md@&W_N`*aM_hNEyo+F`gQCu#)8o?9uf-f`I86w+N98Qvazo1BF)Ix@JG{s*PN{f;~K_s2==Ff|;ZoN2JRkez`x4*8hRg zVmLpRn=PM!`meLOVR}>e<`|j6Gl(U8Ff|l2gJzQ6k7YP+43`S)DEuqws`H>?(ju2o zyUfRou-65`>QE%zffVa3C-Rg1CzRbsuzzo^7;Hrr0yL}~5Z%AZWr5hXVV$P0MKPo9>Wgi6WD93IerfB+|CgU8=H)htkE zq}x!Ea-k-P=3`}r9=QZDp)E^>%cC?0DG_F@fu8Z%JMlnNFU$+p%6nhF! z0YL3sw=Jx=8U&Y?6K$E0%{nG*#nHLR%*l!>EJ^xXyVtZ7Qolethsr)6$w((ma!wjj z%tiMc$Y6+KkF|0|o7~?w-%`MMZKrF*+>}54B_ERg6(5I+(CsiTVC04!iF`7flxjNy zFb~T_P1h-<%cu6chO8PnhZbc_C9^@` z5M|wjQ5CZ&h`t`;x$p74XuUxcN2dZ-HN_!HlVh5czyv9tJ{85tJrkIQ7^bBL<~wv7 zC0K9Py48HwrK<+D#WSD>SlB1f&Ek{;n=gVXOzx8xWV5@nuVG1o84*wDLyYK&rqgjQ z%Vf-1ilMcESiw)7VPMj7Mw4N0>F*dJT0u%2hj(JK6*Nk_ycQ`{GWAvxC_HWZB+Zyw6pAN=MhGX>(l4FSK)A?$5B5S*Ul{O7G@NkfB`vndT8h;`6 zCxlY88P(<<`62ZlLt&n6-W=52)xmj~)A=c%6HNJUek=2o43IeQ@l+wBqoB`fxoWL2 zdf`x((v?shxrq>4g2f|nde`I5;F{!)W2qce`>ZNM#X^O`wFZwR&ShK7`i;U^1?_$f zA7=|Ukh0xdKGIFlWmADQ)vh~KB)tJl?r1y+$#XJ8zB_bVSa-*f`7^7ztz`2|>=Nw- z9SArW=(;&PD^&MR{{p8Y4*JxC>4v7|D^5s@QzUplzzJSLjb!FHvJ`T=0%tdm9+3?f z=&^p2_HKzN+{Rj_2z7wTu$z(GuMD0Qqt$DD%At59SdV}kM$#Q?G_3246zSZ#;-YB%-HsI5m&NfRE}NFXMt~j4*N`Wc9U4wTXuBGdozGXP6_=zN!enRsr1{ z^)7@#It$z|nU~&!ZncZpK=5sY>2u0~vtZU7Qr&3XV?z&x12Xl( zzWtCi{xg4X#d8<079S!PBK*aIbX;yP(2&id@Qr4-zoT<0T`;Le{X(Vd0cU})N39WV z6XWvKFZ~OJ{Dux88rxg)16J4-Ex^6ndBY=+o5ytC^d=$|Uc>`9zVi09EnxCZ;6)mvmBlC2Vw|6P7#ujCTqT@6Y(o(j;bB&EbtE8jb*dU*id!Rf z(_%);5Kz<%L1s<19>r@uGV9y~%`5qDFZD<)R|B8tptaUaZ^;F*eps(;j9U)FB(Czg z^Qm-J8g{1IFmb;w*^w^m3D2& z`JiH_SX)4r)O#eRj$hLKqiS$EJ=fN}hxq?1n9Y)M%V|I9C>fUJxp*9#+o ztl4Y*K@4&wN`Ja*gf=?(Lo-(;L zRpK)5YctZPChjE|k5YuGLNmEh_3si$KlwX&YM|_#Zt!}_d(XNN^@*2x@*Jt_HMq|V zaVhHpKQedj2vQ|oQ349Ap0Hvcq#s)3h~Bx#IxtS!3fcMxq>rJDC}3~LighgYf}#n(`0&wSM9& z>i(qkH4Jkk)$dBzNy#1c**dG7>FQ;aQn+s2c`h|AvGF$(eTX=Z05zrB#NnXC?$?^o zK82!VM#b|C1!pHfEf_w{y^&W8CY0$E;-bF~Vb9RZoYcO=(Z;o4p6RbaOzXU2)h z$t8I@@;?juRgCCeCNlCBwQaZ@FOhI-Wr>l?BF0+@QezeSL zm7oXJ0YyGb2+K#!P<>CjnLC0!&cYe$DjPnUFJe?r@o5@hOcAT}!;Qbu+$=p*bzVQ} zd3F5(QGhRc{3%GC<2PTa6S6i~MR_`Xi#t;+D4*}ZE@i&v_9EnZsP-d$RXVWH+jo}x zMDK{HN3%v%x+zrDEY9Dt{zO%k;S(360|6vr#q`=ljVsC=(c@X5BM7Gq^Y?k|vjT_k zUdy3EMrgX5A$C($=8Oey8!L@b#E{Jyqx?zL@?O4=Pm&jp>(Rk+*+3x;vUCx4wI28i zYN7s=FD7u|d*Sb0{^TDh^?bo%|DdTOx}`PQ4|6!?u!6;3lJ`kAO`?0U9`H#sh1|EG zOYA?OD8MpB88FB%@u&xG%Gh~V%~rc(8k`uXIm-<}jrL33rfFv?3cZ=^sJ;X3I-YPS zU{TuPZGhCRUf)o_<`EEOSPdh{KW3qD%}{Goyetj{@MTv>ov~v?*aby1I0hM-Hf#i9 z_&f&B2&*|>_91m*rC+w1cJr>l;Q3?N3f3OCzbksQ)^=pdNH9jRb`)4V6668(9#=>v zZetN{Ql|litug$%(X>#2_YAym4<#QwQTtrL-I{1|u<1NS@1($+e4{=z7>L&{r`fJ` z2OCyG_{xFeo3gZ`9h^r2N9@a)SiXz2BKMay#DVr;VrWRY@E1oAYmx_(0alL;cF+dP zrrUqAU63U%Ud8j#cy^;<_uj`$*Wdloh6*Q4?Wt~6GQg&)kx6*2BH}(`K3#WQj&0LX zpj4C`AfY`I1%NeO@0y~wcHPE7zvJnFa<{xndB?Rz3=7`&Cs;A9VfJ`ZpooW|v;OE0 z{eN1^*W*oJsDdb4Ujt(W;=Vj{4fJ^~ZTIOJkKavqk*YM!DT`*%gt z<26;r6u8YPSl}(Avi{bmqNUWb3FRpV)FuPYeHPa%S%rDv${CiL)Y=7)lI2sl%p7p( zOrN_b?V@W&8L{PGPjN&xo23OMN+$&UcAoJUc^8(uAcm<*Pu*;w62zlp0G zEF{CWTbaF|?kQN|v&;2Wus#!X3&BYl8`RgpX+fZY9sEScn-Pi2c-uFl^u(k(l%-hC zk=Q>;HD-)}VGgd~a(bB8GnxAsreRD?%>k!=!bmTOy*u7qJ2))!hzMus!la2nPK*BW zCo>f{i=JBGN!bNODVW(CWzB4Yj`&GGHJ1P zu_t-#QGUC(Uz+o9WNu-L6~M#fNOnXbq&TOCI$@y)Ce~eMR_H2UcRlnGX3JjrHh9;x z!Vi>)q)fU2OIkd}1t>TpgDJRkBpvi$e5oz+uqyrUxY8a_l+Zd>tA}wbneg@Z$vPo- zz}hsPW0|&5ALUBo4pceF9H7h~rS=+Opn?LV!rN9J z8|dtw%utu?yFVUS!OWpBZwiK7J1Hyz} z7sE<4yK`5liIu-i(M>HFubZHo{E>e0g>Z`NnMCr*F>&U`-qYtoG{Mq9q~l)S9f7R) z+3~~Bdy!BME(m2W>i%`EJJK@E5o84pHh&x+r91>n(bt0o+z~)MO`5hJ>R9J`h7x7p zR_t^eEU^^v?598V ztqrmgT!wXbxHj;p?;qYd0yKQr@UHzFEIT^REaZ@?&z3>!ad`=w+=E!}npO!`DcjFb zkDd!{$(3R0n_JM_t#Srkz`@d`-~@=;wJA){y`1M9Bg9M_03c`!MSC zMobIJcmr0|@ni!p-n2eDhr*AR{ez||csz_<@1mbzsEo+$E|HeW3flOHavxuB)o^d0 zrlp?xX%H%90}EiQHC(B?nx^Tr+=%Lb8p~SNpfl!GTf(6yhhHJ)uf6DXrUIDe7;IHT66Q zDz=!?yO%Hh@)^)m#elsY=}FeFXZ(PCA~Zps2^rpgtw*2i{dW#FU)BX~J729XA82Cp zn&>WUcFbCE?_6}L~z`x9vb@OU4oTc|RViZWPMmbota+y=_hYQ z-T`yFHaR$i4P!+=D&9o2>m6PaK+lG=YjT-S>&~I~cng}54)X4X>B)3sg+cL6Lhe2v z@zE5KDtSY<@^~%!31JpEZ~&5&d`2BA$?~v(4LY*RI3k15hfP1k$pwwKXFQ2V*&QgG zV|qf2S-bI8(A$w%3l@2~OZ!#^($RDYleBNQk+s@&oTYmu2Y)?%A`__lhHakY&}5X6 zWC9`=h+VK*ME)#8FH${df6AJog(hne9g|Wmbr~k9jR(86I(oaP!%-Q&FIQ(bMSP?q z(uu!Z@_wLZd-cn_AD?j~6 zD;Plojrwa1QuJI_*{z8-Pvs;j#L{IYS;Ky`SbYiZhE$pmi8>Zar7UNiLVUR+5U?Mg zu@oHWDdgR)6V56I-Kt(leE32ccXS`h@dQacC7=Hw#`!)RHQOPMdz_FOSaKi5gK*qT zDeumInH)mM7uJI4kcFwph=paWWdA+BEO38;P?<0$IhI5!?TQxGhP_ys0vM9i`-6hc z(=fc_uv8o8GyyRfV9%)=oC268kz@5R-e5Zt5$jC}y(4HX29qyBq5&fb#<2(~Mt2WR zUvH@gfen4{T!sq#-u%Z}Oot?lBaxmgg2rDDi{dk0(q?pd;S1+NtXVEJY9gJ!noZYJ z#%|6ePZ|L-tkT2XJEphL*D0BabWW|go?a{o1#DiRNP-rR=y3}A-(p-ZcDTSCW1A<; zp3sm8dpp1S<@9OMwF~hU#l16;?`z{X!#R%nV}a+7)kvouv}>L~EspQ;A*|^7jl71N zLLLB0c)P^_(`UzAroVvfK@bH{KzB^Vv54#=e%5El43%KitW$+0fp>(fa|S*^=a(VN zaCPi5{`kRvh(jUI2cCI$FM31;IXkc!z-5+dUyvb!_S7fK=Zl{HSBUO)l|CSy7hihB zsS5dK`YT^$LPjc$R0i>%4SSn-Cn`O=4c<;{Sh0H%AEgPT%WSf5iT75mDeRKb5SHNx zh|*;B22v~G*s>%>aSn%pJW3E%Tooqvs215_KbU1g7&RL{_tb?f7-dE4Iz5RccsOnI ztRhNim-M?EDyELsf|2izK#0OgrY>qIcM!%ND;;}k&LYg@YvSSUQR8C7c&zS`0td^i z@N0UjgbM}JW6b29RhdSlymA<7^ye$blg`T!jx&o;9hpja7IS1l^$l_(Frv7r1yyY<8f!tk`a!Zl(Z`?>PrtbxUA7$rb)p=# zQ{@frseTLTKn0~OOaz0t-uNUCSO~GjIX9xWB?UOZDpW`%Kz9f$!mw4lb$(U}3LZroYnN3S3ldilv5(`RiwWo}H}?26Z~zLB>o9%N z_$))&V$3QF^VJqPiqK7NR2OIwCT-%GqR`k?+zlF&m=+nfVv#GxcgKX&6kYRTuL(vhmpXC<478sCD;kWyUYqG=?q^WV;EGgByIQ z^*MgPtcR~$i8p0oXsrgyKXymy>zcASNjs)%2kEi0!`a|InROiZ8I4`p2Gp_;dvoafKYU@I-8yEd?#WP?D;UFrfICAJ!m;;B&Fz{H zsDKi!RjJxA(>Ae?COv3rlcY~(3rDyj^3{AZ%IOhoQ^=8Tdrbc~33K;=c$R6NIla#C zu>9i^-Tahe87dv)nVLbsJBu@-T5U=o*-MK9&v@ajyyDpyj!pzj@U3qE(s|sRPY&Zb z%+~SkSs%VZQYxsaKh9cp@JPT@e0o=Ai3SycVowkii$yU_B+W@9lS)uW79!ZNa&3sM zO|~Ki(S{mDM(u0Bby*cU-P~VOSWiHvPR_f9B>xq>C_y8Km9H|7B#mkbz5ylIT~U5-4Ha-dbsF| z&;;n$BK^|*jjSm=Hkd{S`aOnmFrfv~V)RDc)9MPUKORVROh3+7;YQIdk#vGpd?w?K zs={zMW9|rm^w!#5tPR5d1f6OKpNq0D2;Kc4pe80HAR-_pARwT-BhV;(OI?qr1^s-) z_{B3u=&7})(4Vp{zrLyE=>Z*|{zR;MvAaN+^A|EV@! z*G?Y%L6D8|#)^j0{h&ECnp^SC=P!G96$&JL{py0E(PrKfFB;VOong*%?Mv0E_ieq{ z)p!H-m%^bo>>a`I9$nj8@1x$MQ@zqoN~CZ0V_z5b5i%8mV{*){V(|G$E?P#gY_KhE~NSJ?b}&31a6`zE7;+@c(okv|UX zQJMU3CFF4^_A8%YW5IB&;L58Ue|oRMn!mzW!+G;2c~6g31pe;p>iXpS-$T;E*FYL?F@z~yD+;h={}T+tmt&DsoNP6c7~W8l`PQ2f`+fA=r_l=u6fJ$D5AM-S>= zbiGic4=ISHyNnvVXEZ(YLC&amvZ!701%EF2a@*+DEgiOh;O5x=_(ogu{ag1BqmoJA!Yjj&}su7&g;HzqqA0k5!@kEdmzoR>Kyje*JZ1 zx~>F2sjSjP{T@pF`rk*t*$r%eZF3&Jz5MW{Us$K~-rm~9>Xx3DVC{phT}JN81*cn4 zXxBb({_|HF$^f$qmkrz!)9sqdHB{>AK_w zKmpUSkl>@_D_qxOj>{9l;9YIIzet0YyDK9)_H`sg+ySDs0 z`sHo`gI%^uztC-cvRk5vh}pGC?A0cvPwcYfdcf(`a(AQd0>1PVJ2|D9pt9z-rnr9{ zw{df|HQV3J8@^oq<aUp(@qx7wnNk+ywUCHRM;i>~$2z1aWV z5qvETZ_=^!SFdl5{pDfbuXDOZ`SkTf{q5wN!{&_# zO@|w$&m3Yy$^ZY+4T;82%dxS&5$(%K%TK(x%L)?LuG-&ceTE;j>O}p$3Z*eGT=+Z}uGvsQ)p#EMe)%=D^U#NO@pMgzK%(PT@D|P8$PpA~Fjs7l z&(K8ewcN{TD!#}$c5*!}y^85i1hn`9R7?{|CQ zM+sB$uZE$&fY;*z8t&KR2n(`uYTO1;-~9++U{#R*IxkBs@mg# z>ay5Faek$O6{F^)Kf|quO2vyW9~kxj0|c0SkKXFPDkh4>Eem%%{8wea+?@yS{Bay0 z7_A!h#X#~a-Y4_WsNk(~<;tic;0^gpsTTRGPG9kYF1t`CqI;3Rj>bcY+OA$%gHGIsmjP>ikIn||O?@qY`muk# z8K_RC?-~X+FKyaYcRzZ88FZs@%d2G!wlQ&am=3s+8e9{gc8XbhIoS6}A{^TaKywjE z&3kT*1t_-eVdS}v>J3kQGLM_$iRw(YXnbO;7f*i_{e3uiN8o|CrS_fWjvsdfPJ`z~ zAE3lnakly6%QGiNPVEN_s?i%6JfY{EE{j)DaX_`z1Uq;CwT;8x$g}9qiyPpwYb1_C zuB_+H(j~sQWY`<(otJ3hSr>jNcwa(lIP&*-K0rs=zh}tmXKHAG>eN z*YA$#3PV|Z)9BTo$SbNlf|KO~Z%+Q3zmZ)!efvxjcLaR_s_V3iODARDk`q2th~Q}$ zvx8y$aU|vU_XplmNH7orkDt{8{YPZv9ezZ`FkjSKM<}hO{N5S7x)}eFb3K4(WS%*I zm~D;Lmabv}Z%N(@@-IuRzs*~(nETvq{=xRp+xzNuf*c;U-{$3TM^IJv^2)YgSjH#d zqmLiZmX1y{-&WV+s#xwps*a@|Fkpar$v^)A1-Epgj`?uKr_WG%Wm%yGI)qvwt4wJ70 z+5h|&QlFqZ_eDK}f6qZ0JLlWD%D?_lP~P468+Qus*~;*P+_FZLvNj!@Nq;c6N0YTfkY z3*Bw{3j)smc^J?s#`2RpjR(J6XwwBb26aXry%q{stK`soac%d#DDqlLHG%AopmFfj z|62#1^%E`+W4I&m9E?8s_Q0+Br^nx(OjeF*lZqG7bCIvM=2fHd4bnS;vjtVD(`upB zczmicc@-_^zZ|>s!5^L>?_1P)@AUQyp#GL=!GCe6?KK&f0A3Hr@Qo3E!D6F}if+tm zBAb8hf2f?<{d@bvz^)5F&higeCzao@!OxtVGLo75XG~mOS5;ChmkzRzSLtYG0MYUb zr>|X_l0=A#8K6d6Q;Z0()*XWJ_(;Mr!z%uPx zTGC;gF&!)KTPBB#2U4U=-dyIGUbmqK9P&*={w^;V_}zZaghTO1!9RNW?`=-xApYIU zh}s^h6{ZWIsP1TSwL1OjFI&gH%a3~>R%%bU>kmslu%hI<{#3oCJ^PVk@YCpY={afa z{IXnEf#&Tu@tttcHGx83#HopZ2a;i5G|AFu4%i87^5q1 zon`sFvTI$8YwW_Iu6sLPIQHz@+D!1{Fn7}`;KmcMy)5NZUD+ zrj+pd42m%-Vp@c{GqeRU&edffPkyUI|7uy(P7Fe80%FF@y)+nSj!1M zO?Iv~q%n}YZ=St&E2H-Uf7Q*X{#X9z?CRD4 z$%ffHp&h3q4;8%Xvrwk?WTaSwo+T093E%4dnVwONp=p&0;kN7i8^b#@{J#c89}xXc z$Y-|?F{{qVS7^IinF#fnios(7nwpfR^s&@p={rD55*Zt(+Tfg#h zaWvV?%D}?Og{&^{=C^Kaz@^tahl-u@LFV6qM_t0_gM)xT)@6biQPQgJ#f#?SPU6$S z!%*a|E^oBe@J(Me)Zrc>J_|`HSU&9U^1-`+LK0r@DcM+0zs1DNzX3x7_<`_k;f_l+ zE4O1G{)ekC0fc&c|0W98PS=usziwkMO9ojAQA+p95M>#2i?P<&O_nSr%g`WO3#nVe zOlD#*S+dP!3SkV!F8h{s(0lazz3=;f-(t)R^PKa2&U4Q5c|Ol`&KJGR{K-~z8pH2V z!T=rdD>-$^$&R=|+$Ze^&}@lKqOceHxB}}F&Wjz@w0*Q-z^35N-7jWdcwhATwJ|@- z&&<4Nm;(P^7P?2Ha7ms;+&G!*d%*a~<|MR)_PiAw`9!yNt^k()y}OW5)Uls!GdEcL z8NZGaX1K35ntkYTBNUf)c-~+$We74Ss&yf`X!Ztb8?;HS~_BTs#H;3u=mK@)zdw*9G zTmw&$G^;!0kaHqOY%2!KuN{1PiT+@0thqua`mz3;KR9rQRp*n4lHgD{O}qxO4IRzf zeq3TrNlO0t zrAsV!%|U&lyVZRlWm0>+-l) zYjdren-DM{67U8sy4Af&wr@S(^!mYUH!{C?+Pdbn>!u{?(#gKJt_zBY(EXI46s^W`@M6<1CwanpD{EZSt3mGC;@ozI6+qQ57Y++%mnXSd-dWh>?Dzw zCQb9dWi6K_tFcyP2sojqfxbI|-qR{3u9sQOINr0^CiCRJYO7x835vG7#5(1=o`{=IbCs87Yih$wt`CKRW$}PO1Kx;rt8|m4ciQE4d-?vB z&DyyW zgUFw3F-2EJKSQh6XLWBO&tf9Kd^O1;Fgk|=VaqX;zh=%2)Vd?xOf`*Nj#CZy2_hF0 zb~L&p=oh)jOjjkYCu7B2P3I193hU?k{D&vywrby>+0DKE{QP$+*{@-F$}uonIo{@P zL}7cpA7LIKi#AA=R^PsZUHIgDh44#O4VpOX_GG_};j4+P`~1dJKxbdup}{`pNo-xW z_kKdY%tF!3ZR^dBfd0WpsaFkg#1$n2T97Z*`#(ZoeF*@iJuQ4U@g|ewTT$T5r6UfN#Ah{GXU)m)_+pY)tLli%En&BaCG<9oh9L|0~i+b5TOE2mWq(u2)- z2QEd{ro#sA6M-`kclGQ2(ExyBU*)5cugFnRM~TzpsXi08!Af+koYHYSZFH#qeu|Ky!@N&H)DV?P-RurYWvuAwYzJ|3lJ??UHC6@le=mJcfzp zb#CliDW-oApob!VD7Qskz7RRUn(vI`U9I=ZnL`n6H`ll3(|tQ|%gpLpi$$;7X_4sP z*q@r+rak@|{t~;jvz+ZMXUKWoRgazJ*4i*>m=~`jTm;N09^WclmtAML={7mo}Sp_HO(i{=uc1U&oi|*ycy%4pA#>bEOn6U7y;e) zAj`5548HgF6mwF;Tji=9+uN5(a<@<1IvGP;qTs5@mF8aRD*tuA%CTDnr8DIVG2 zB2_+50?bnlJFSo+6J1;-`K)xLhqmzgac%hS^6PrUqi-|Hru}H!1H#ziGiSTyD48d* zG0Nzf#j^@7Oit$Ya;S{FbqR#{ufK*tJtOwz z^=H*s_-Rw-KWL~lBl3>c;(GtJrvZKsx6J+(bdN`{F7$ug3l@GxR_?V9j^&=i6ftH; zsBc)GMc0sp`}@m3*`%`}kRv0^tJ@Y0Qzhw!a`g=%zCs}l1%U4 zZ>2w5J~p)8MYOdWryAefr}51{*iNp z;vEqlI1UsdR)ii91Bv5icAHOJ*>fCgDnB6~-aCGkSWaHJ=YqdzQYk)gt}G{ZaDVu@ z$hoH&IA)2fo1wPxc@M7AQ`SEp!y*+f$&KGDf0xg?BVyLMcvs^tB>8&i;>f21ru)Id zaNz*|Yr-%vA$UCuLSR(w341LsfY>edy2;{x2+7Qf=o`im2)?_2qhBrHs{cq?gl!R6 zM@eK-wLdEZ^?6?FCtHu!CfyHvi&a7C-rBmMg}R3dxb>Vh^$0;KIR)xuT85jdQH&*4 z{Gc$J_1UwAe`(j<6@=g(z;W+mTnYvUnz45o7pKpksgl98Bd-ymCadTaA# zC?Q~LvZxO@-*tCWOLQ3nH15M1u+rOyhgC2KJ*efaO~w{#^9w@L^;@4t-iv*368xLk zt!QR#i1_E?fLgZ)y8(qj5V*Y|`VRl=(`%8B{PJDla>^HTezN@_xYgI_yUcpsmCKT( zdfponuzl}7f&4DG=vP1@l7fz?1*vT=f-q<^ve?`9;D=iI=Kzky)1@6~)qaMucdg)1 zfl~XeC#4~OOy?+^adM1sWi1nZ;4ycUu6)ECa9A-kfCcTM zI=o_t{+luWT(}tu4px~oUxGfEKNwCQ0kiTBkAhZ>%(5}?!$3D>``FHr1HFy%j67Xe zjbi^{Y-i3QY@-;{z?n5avt`?Gyf>lvfKKscl-Y7#_^R8tXLfp@e5#0cU=8BK_i+Kn zkq6)MtBHsG*c|@S?;6MK*tv7Z;dYVBHTe5m$H{fme{4F{Q zyw5=X;pPQ$V~|BOcx!RD)qvRYvgcaXV(OoE4Z|C&ozTZ3N`V>70E0+fAeqnr8ZZ?Grs$Yd>|>60p$TR^qIa!@SJ6(BlOJ<8| zIAjj*9W>b@06(_5N!-%4zKSFO%-y%VU2=?Zjo8=icz!Xo{$;d%zF+K#a)kbJ?dBfn z)cm?Fp~wBp9++e`W~{th=!fyw!I6IqZ}L(dh*SUJ865#gbXzxz6;SG77(;!ZEnLd@ zpm(Z`u_n-3{F80XCC>!Fq>k#H&>r$^?Zr_B%a-uCq@xI^uBIHD6=vGM2)ti7>>P5R z_pQK=?%pLNajTZNO5Cr;60B#xuUtGB+1XzY5mpz04&E|Q5c|p202UsXTL<}|>?eA; zI1HQvXR^8QLxUga()Y$8ygRYe41Unl&%KPFu_Y{TzKGT!CX@*OQy-TnPk4MQY6Qrz z-UJr3*yD=eOfPZ#^X(USey#&}17VQVD7Uq^y!f!?3^5I9N;M%JDaeOg1nBl z`IWOCK`XJD&#D?%zg`A;R&I9idov-1Px!I0k&dK9?d?oG2rj!+CpoFINp_nOlHue_ z^jsjld*>a-($g70Xl!-Js*&a;%sDN78&G-#pF%lipNBXnN~9<+MZ2$eJ5%?(&8 z1_eH=&x4Vc@DvH{7MQnC2!XoB*R^eFJKOu8HgbZqTYWO&SEW-B^3Uo}parWilHNzZ z5G-plU6gtMg5%?fo7TTkIv1wY=X^f!>4?}u&G8X=+iMgJ0`oXl5s}uHdaFXdSs0#S zPSK_4(R`Zh9)1<(gJ$ZPegN07Ask@bFq-u!C!EWu*?-%kO97sxrw1)5QVzD}lV9Z& z;QB|3BOzd_P2W(!f`Y`YSo$#(xYx?J449qah3LA*J3~@Tym_T~l@O1q7ky0ttq3-~B83zj@_GY_<4!jr7T^og1LJ8(EUXJUVUOUzF_0Ql7aV8E zqM0}f^P!%eDWpRMYZZn^R*6vlxo6VGdCAH`C*KdZospo_XQz?aC}G)RSAbLcgtZD8 z9Q@lSqE=M5T|Q0_h_0PEb0|9uf-5%5Gi^+CMH1*u*`-X=J@dG^xh-%K678X`Ej&{e z!tk@g4XX&}r8gYa;ci9ZDB~7FkNoMJ9$YEd5Ul+~8zgyVX@p(E;TX_1C*p}M1v-XV z`jM`WoO9(A7Pfq%f@Q$5Ft|EAxxS+0S+b)F78Xu1mBzRDAU=5yBsOjxO_RinYU_Q} zA9#o)jKHR!vG>z!g9PhA~ZHnO||!u zMOEiRh!FR^MmW|LGRqaaz(7tF{|>Yf$6K9nR}zRH`6XUXESwQ#@=N+y-d&54)6mx_UehFk&HnFTRivP?HbYUh9J4XgNp%Q#dJ;rmc{hr_v>xRq%O$q^hHgv4c$ICSRc4 z*UX}_*%~o?^pJUZd8-RF0Z#4Crsk#n4l~_=4|)RDH^&}p4>;QzV;TN^8A)6vVA_7( z(t{Vv!YKN%wM7DBT)Ro1K(uq@Pib-C`Yd5PF6`BvX%IgGbxSnQ* z9z3Icu{Xy?6Vh_lq{(zKW~oc;(PSE@52V%bN!v=%+51GHIHez8E+*5A1C#{6qZr7X zV*#?RL;0s3LU8S1N=1bzK-4_xiu_f=@JS!=j}b0)YLxD+dnVoPU*RKxk+}^`=akcB zx-JP`6~Ar=Y1K&$KO*+|8>g_`GbIf4d^jUq0&PiP_?1d&o*lZa2!>4v*HJ9pXMJBu zH3;TMg@sGz73Af+hBLwWp!Ib3gkK_dVEp z7Ddm?E0#mfAh31q+re7?uFXLa6Iw>z8sU0yO#8luNPBi^K}WPbO-WCJU6JDR=^=7# zv17>cqVig2VsqVtMtD~5%zb2#m&DqOpmuIDkJVQZs|c%EId87l#qpUWawX4=0jXom zj`V%49Vzt)vo&kh*;Ioc+IXMO`TBnJ|NbzPzozH+Mfyv~CiMU7QGk48?F6t;e3K-u z!~3*2xB;{}Le0^hx~5C@QT4#?kDMUTm6NzMw)8qghhNQlQ)eJ`akhG{B(4y;d|dbP z_pMd&tv#-#4{{{+rysZsmiH`g+-41543VoOj})_Fx~F-FQ`q_TG*^O57SYH z*VEHmnaV+hXQ!yChU*U`ZwY*0ZNDurei zskPMHj{8NmX{GV(#gZ*2xk zC%hK>rdct(vrE=qTcTx?dOI2hqB}kcX2_NU*AJDSbh*DT)<;(~)ZhGalJAcAX`>1k z^5+lFKk*I_**3}U4L+8Y!BntHHe+FkJZ?;26Cw+loD?{pPE2mBOAMd=NK!v_DzW*& zV3ypl7gN-%1{6M!gSAklxa(agR}GiR-=R}AotK&=M@8&KYZ7f$2X$IPRom3kt7kdI zr1ei2ptqL*ZgJfQ{$C!Q^qBYPjgP*dGUHX6&(l50AEayR3qooAp@1Eo6|?K54n;nh zo}RAR**~dDjn^D1DGEoV!QdI*&;(g|bK!A?UZG%|)deYpzr{RvutL5VTdtQiY3-?C zP;sDKV1&Vv+e-uF6g<1mVs53R##W^x)b8?_UdqeU<)@Vi<0$*002>95PZxtk(&-@0 zh$%s(d^r&PT9h>sqw8zD{p}|k$3gpF^-2e_%vSUt*Ghi)c;4Clw6PJnt~vgLP2eCm zev3cJuJ`Eoz~2tomiuz1SNXp?priK(;faMGe*4LGo*au4VEkboKPYpI@c_bR@-WE3 zYis@oHASrmHi3nCW7dSiVmYm2Kc0ybsF66P$WYB>gXC^#1z+mCV6XFHh@8tuKj=%Z zQN%s@aCjXxK0ijOxV5ySSeVzVA1*HI4Jkb#k+iNDm5`kTvvnaiDHGb*Mf{Se*5EDj z{LQ$)kDJ`&IiaibfAQ~y%I)6R45t((+smMeXb2W0J7U=@BqRhRKjw63@G|sG;REY8 zqDhsJCwepQ;2uaZJzQ5c{&EW;HB^vWH^6JY_reFV`9_fvF)=GRxiC&94dw0sMeyk<6V2k) zBMV$prs@0SO6r95&IM3cw;v}l{}h}-{FCi@%=*Ww5;e}m&FNSEf;aHHPG94F78wM; zjw~Pk6Q{rreR;m`GWGcn@*e~&?P(Ag;k$_}Gy@q;UrW#J=crv|IG=)Zx(n8@X~1i7z6jm;6JE)+EkJ zkzvcBtG}69FU*-SnXKYt_e|99aID5w%v5}k21SSHE5&u_twvCH_>nH4Kb0vYzs_Io zOM~QXM^5yq&`qNN4!}>a^sTJZU5T&cCzB_7Y2*Yw9XRmyNR3G_=8UMn^ShgTo!2De zcnt$uZ<`?OS*BZCCV2m<8`1ltF?EIdY9UT??b%p!m+XaIL5VNq1GP}A?UNYl|K>zGRkXttc|jmw0IK| z*~ucm8tXQ}DXUO-qOWePqc{mNYKfp7!iuPv@b@yV#OfE!A2{p$uu~u-Kz@l@qD1sPoRNKBlTI$%%5}eXe?4FnEyy zR~k%jTmkeFUaSd&XBh-I$^I#He^z`LS(hnHgWtU#ZCL{!T)z83JWj-x_Grio<`XXF z&N*Qv!r8X ze+X4F0#q4Y7+6&kVw7#AQFsCymdiLDY`Zd*WqJ#a4YpPeJH%ZYegk7OgzZ#)M#rG> zF^eZV3)gLxF}r!ncnxgx%|sdU8O(5;)-K>DN5a zIH^d&Y*m7gmArYAt`5*zpSEk~Nx;Vm`6>=E?4{UFWM`412QjCCLZ>w`y zbA-EJTOsWcJlTT%IH^@-D64fQx2rXpO5L7`4N5YLTnf_e#C93Nye*6h7{=s#sW`9W z^^Aa&73r$owlr5PV`8bV>(YTPbYu$VZJ7xyFP&7)lzpL-E|jD}pg>I~-Uv+!O#F_c zQ0i--+cc>xy=;;S)?6@d-Dn>xc=Zf)r4gQKvve0S@OJ)jp1-|k4hgwxDvH%>xxk2e z;uh34p+tQIL_a zK{gcvhu?1mPL@AdG>mkvOQA2ogk=o_gmY2KMN7iGY`(s z^oXEAq2&~0)ra1i%VUfnilOS;Q+SO$>Sky2y9A5Ao@53%pvOO=d3hx#gAB*>S4r!tHKRiv*QCO%YA5;3Km9F`D;Oo2q{$-)p#R7}j{+?1Aa zZckJFa7FbMYM~7YFROJsu*1)8_Gy9_vTm``T(Lt{{oB_$q4D`H-K{**u<}?>bC((7 zsOfU)MyIXLYWp@r#EqWWd?=6^Y`g2^sT5SB>zw|m$mT(mp7Ngrql$lxTOVs%oOlR= z{J8F6>0}ctZG`@L2E6xSJGYGk|A=OlI8$#P8%{Bz7`1PgcjSgbDW10F2pV##VG8TR zK%b{6$0VeuZ#BHz&nHL|=*#!?kKZ;r!d)7|TVA?c;yt%qyQBBY6*)jMVi({qf9s>D zMVgP$x&)g6vDu8m1X0y5dn>WJ*o26M|4(@n#89xL`HvjAcQx$nqjTNIZVBBLGL%`J zv(JK>yelkwoIcIx-#4UUpLSi}@jp@( z;{9-jZ;WK~As7eQcO@Oci=((^!S7a8zG^i71JW&#VeFLYaXY6yEu&&^4pkUU3AtmU=o-ldJ*wv*4^Z|J1L zE=9*Y(vy$l<_-QGA3^dvZ+mXD8W4 zBG-Y}PGgMIv5eL=)2ZIuMiOEAba)kN^P z&nX|)N!@z<__6llr(RM_2|bg37l^FWbD_4X+GQ+AFV-bdbt!KuBqTiIehD@G;zKcN z>0G&LS2WswOJW7e9~ZJ z{2S4CK{zgxZw4Omo^6J0@zM()BAa=7#L*!V1Zf#>CB@TnWquUrAJrWjdU`X2wX@EX zQ~Z;r6K%+(oA@L>ktmqQp%?G81rV(uQ~Vp?o>A9e{h@2OYlm;t&fcg6WhjoRMjLU` z)(`7yv|3mS6v0H8>4!4Ks$N~X_uFvC7Q^IFK+8p6BhJMUjzuGuGTxQ8imVhc$a$qE?QB|tYKX#h}$X^ue39}LFAdt@P zUMjS(#;A~@oaw8x;8D&aFdyR~_>X{;HuY<9d%D6^k&sd>jpH`- zwf*|=HE-aH+A^kZ{h8HGF`9c|t2}2w&Q|9cZ2jlEN|oN4zIRxraP$0QEFelh6`i-! zE5Or`iGtcfApkC<0oZMXXsfq$LJdZrPkSa~ahCUB2>tg?SaQ(a;cnpMIkf}g z2O|p|WS0H=IV6(AT~%pHUUuh~S0)V^AR0L|4hJWO-Z+&&>1{AH7~7iWlunQ{Wgzi# z2^4v{XTY1y@+7BA%86)Avw!zWvD`{n1n==uO&Ea@;KRFBzBsigEGL(1{i;jLS626q z%2hFJS#!p?|GC332qdTp^kOm441(NaK5E|nYZ!ks6@}n6q+W3sh;cC8!edOd4<8iCFKUYp2L1s<-*kvVP+I$IXpWD}!(o1N0&0+Kr zWa>HfOBxr!?OTDKEd;w0VQZP8Zr5!9(W46Xqm@N83br!QIjI+4-Q(HS_DL{WSsVGRE=4okXEHpqts6ldBMfhwRU7UmI~Jr)G_C?ow#e`Q z0WVe;UTVkXVh>MF1bJ$r+;vQs!7X119-1HqlNymgblnLqZLiHy>b|r9gJ7Ha^u=F_ z3S;Xe5p5DV#4Ml%3iO9%!vafH9IlrCq&P*<`Cm z?uaK3FUnX+8QH1Z0p?Q(=IzC&J?T!d%+WljXPBm6&ztB^o3LS)1()QT}e3HajL zGoX@(c=C0q`UR(=BZ>-%i=1L`hDoiB!)W63%d(mh`kIW^V8zXN&AL^}@*VLhXGju9 zFijetVL>s{?Eqm7CR}%_N~k!PtAfjF7u%l*11k^~Hu0;?fWrs?jt$#EK-Po;?*QD8 z60qjQLQ@|1ma5w&HP|E?}EUf(IrX+tKA_Eo4c zkDV`&Nro$AOo=QqFgAf>mYJgpl+U=!-HNTZP@%`A>cqg@bzS2c#=`v08)@S-3{mwv zQ<-uvJ`;hz(m`+$|Bys~`yXP*Uc=)b&IKjs8aSQT&k9PuXwje3aE)O9;5t6TPU&8= zRZnoKW(*Em+eG?>^w8jv(3~s}vF>USXXPg&H|8;X#-OtV;5w?~_+D z-JF7cvZ2h#d!?EJ9Tx(~x+*yj-%n{?s8&-i|5xFo=u#tuo+u^pNz=_C(e-1ZBr^7E z6!*0h`X2|H6+(Jcze1Y#oF`u}dj z{IChN-pG~TY;i)(%s(x~ijKEJ-{`|2kZp-Umlh*FKKTJhZksV%BjC7gq0t{u<4|iU z{~C(s(hm3rZUlIGU{AulFakAQkW~f9xG6sbmp5+D*bf)j+|q7&AOFezvz8qx#kLa< z&zg(Iv^Ul&%5t1Q?`myS4$^ykd8U0=`#*p))W@Di-Dqm;DKa=gvs@` zg9S8t$F2)yr`1dtz_iX!{EjqE6$^#)V;P=a5LvD&>^Vj_!wU~-=9E_S5`%j5OQ4i< zqb#zg#J^!-qdtmCIYwh_Rx#y87m014yU58j*_^xceEJO9z651=|3%kn^(v$)a-Nw-4>5+B3P8AW7Nc20Duu7H(HG zicO!RS2thn)k;SJ@pYM_Z3>Bua8MZ|fkssKn|59`^@hP8mn@-?38~Nj`eUxK7HX~_ zJq{csB<*XnwuKnuq@FlH5ASl5)>7)m%jHNY*NX1c{o=e9GnIAct!iRM? zuJgL*ZIe76s*tLGpLy58Xk=$BB2b_aUULgYnm`t32zfkOIM>}{TxF|*wE)mCm*W ztM}F56fMsoZ;WfYG|O{j7ET2x8YhoZYw=ov6QpC^hDA@~6qP=ugC+5> zq5t;_2Ei%KjL6g|i+xXCjSl?DR&Dk*=BoDjoleJs@GOI&F!{~}vqgs=H?pZ-;h>=_deNT<+cGtrM$d~xIh2V+sn+H6zZUN&30{$?@^2Qh zq#bR(!ZX-3Kq7dldwDbo>oJXygtbFj0!i3j1dY}GdN64@q}zZi0-T%UtDR?w65v_D zJGre%wB4eVE2w)A3iOZ;rbM12tZBA~gXRjT(-~vc`nR%pZCs^Fs4y#Azo3r+yxbQx zvm{m2J(P=shd{n}#L-sQHEcvG;Ma2TOMZteXnOtdGPg65F25X?@HkZN?!-^F2{J4}~>D2IWd4(1U(9uN;$Sxa8!!$t66ki!Ytd+3>27zbJ z5|&uwx*B=odOn~ckpNm2u)=hEix%vCU|#9TwObzY4E;8R#i=IWkg0Tz=g|`jwT2u! zqvpT5o2O!HYnj>p9eZ4tmP(*^%B2}Nc^e{$ZFY82vfK&W!Ag%oX+V}oF}3(R*%xHa zUGj7$IkkM}GvSj825}uY+i{@b$S`(Z!`pZNeBVwts5t%j+sf}iF9kUJl?zugj_}?f z`HWl!x?u$H)ag=`{U+^|2PIad1wicwHW+GtG=U}*@R~!Zkf3yruGWq-^k~O*Ue!C8 zoZ5FE@rCx=y|)$t!PlgM{s4+cnb1=R1UZ!l(n<7>XR7oAsd6%~z|%l)h(A=r9dmOZ z$9*RLrTwe9LywJ6Y9?|tSnC1Di_e(gY2w^Gj=NX?^lm>=zpgtHZ^U$ zZNWNm#Aux5G}5KunsgN})~9haS(1eStA^Pv3LITUFh2@ecsbGi%KT(nwT4Y@6<_N; ze=2Y4hu=X($wag%$9b=I!DEc+Wpox7`o*BFQPlCd$W?s?a#a@)S3rwNH>Z?qo$YQ; zL`c1J3YPz71@rqLGtc>4C@J~xp&D*;Y?E+uk_sXGC7H+m zm%4?$FTOYxIIj0CQ^uk>^C*LV7^!IP;e7OEg@1jp>G$22&=WYCa8ls~*S+?Gq_s)4 zjHwq8fT=hHa7z4K`h|3}BEwI}Mu~(=+pdjUki&u)poy-6Td3z-5h4(}(w9e>h`s z#$s=ISlY+s;ACN(=<4u(mxC&7TzhpR+r$o_)h`FvCvnzsl!<)gj=n=pTUxLAKtbLAyb$8Z01 zGWJ~eYziQCz#l8u2)otSUKLyH=osoS2bHLO zb0YGu|_k;J>GApr3=nT(D(a*DOe_&!rwbYf@W)ZHPr5J?K5? zjTwre!gX6su94Hni~fDy=A)YKwfz+2ak&M*nNHYjKD}{H^o!0FkVCcm$@Wrw9pd0{ z!u2N`IG$oIbh!zJB+`^|1Fr@8w+ok7K7yl3?(CW+zQ{fZHbLyKZe7@{hl1ith=KO5 z>&_kvxn`?&AZI670vBKYxHbolPf}lhQWM@pf3@YC$abW0HO6RoP1b z$ML*zf=R5Eb}{&%MRie~I=O4y7wt5Qq^qO?ILE!-Nbw|n%j}#GxERQ-_9{r+d7=4C zPA`sEAk;&+gQZtSdP5hy<>+3u6!hm+o#>r2R=S+r+ZvR*g|I)KSSr2WDHyQSgm>oikpw9>tdn7Ieycn^6aIr}u z=I`%jq9s{((uyYAU{xUFT!o8pTzVnC#p2sGS=!Eo`PUU#Tr8`)*z8S(WB~I>|!7b_~d^24DR% zcGbVnzgS}t7bT51e@vsa9DHI{EPr*}I6z$m8>~wcF_NrD=EI_*sDEpT7#Z7&`kB6v z=C;QHN7Ukht7OF%ghrp7b&FS>HO|&kQ;`*;&T>dkWta<1WdjdPSo=(9?*J1XM7vw5 zVxLARS|qvV-^dFQvtdZuKa9#G$Lu)N%m zDS8ko_oM#1(tfn!fhcdzpf>(aJ=gx0rs!Ea^Udu<8kcm7Qnm0iTEQ*nWZ`}D!l zyzfi%^L;T}l{ml6-4m=3=CTjR*P5DHIhTm#xsTHlGM_gq%A@aYa7mjy=~-|m?>5TI za|MPH7jG<&itpX!*fd^V8$4R<{9X13*bcSG7yBZq!awrHTUO;|_8~LOkD7||Hj|N8 zzoF&G+mR^~GTdCxqTieCc$_S}^?Y;w>mquJq17|r8p&dgwvRONZfycR5MQ0;+SXMd zVT#JTltIJ~LnNEG`8t)mq*@;W3i$nQuZ{{Rj-n_6$sq*kf>K&|Q6w}I)KLm2Q+ed$ zKK;WGn*2}TtTX{o4I|1tsc}}_wZPJ^;bY(rgYIax5K)nYShOw98ah6 zbOi*Tb$#AS@1tx#-jGZ^`9@X*ti*>r(Wv0PmbQY!=UK8BL1GqW?90R8xGN-|Y>%fQ zF!FJViU<@IXQ#g^gQTH)HMBv4E}zggs%6YMrdxo|1Q` z3$v*|TWAj?_gih+;d3lswU_*%aJC@H|E0@CeFpJ%FCU*{MuHJsvpi_Xajy3pgQzpQ zsCoTMp5%?!PE+aMQh^@i>C32Q`xgCbM*LDm?Gd-xBs+0*yO``=zaA|F#?>bjMaPmF=o@SY3qDb6?yYt zLPGtCLQq<#zvae@DG_zbzS8K>V<5axMb{68F7lnoen3OAu0*DWS zBvA4VzJft&>d@k`FyD{hfm7DluMdfbX6^!N^p|apF`}GoT42O5Z%KF&q?ymrGxT-V z6P3H}J!w?DLT}UEn}HsX8p!%0vHAVsa?uV31gH&whD3l>f0-)9&?^fh-Q`z*m9^Db~H%t@t`_F7ts zc6Z|>C+@B;0Tu;_%H;5Shh2o=F{JE0e(iQB^{I%Lw10V1A?kY+ivC& zMg$%XT5>y4Qbv80UMX>9P>G5%opdWiVR4R&TO1hv^By84<})u z$`mLt`jQ|Az-c}b*JY2NP`ne!hYjZV>rBDa$)2Q=CTQMaF%6)iO}+RD+u6E~k=yjV z$@Fxf#+gGqF>?TG=n?R0OsS0>)1~xVb9~`Eb|iqUOMcg;RQ`B zLuf``(MYN}e4`n3K*Y=rRQyk2K=Gi$QEb#SO!-3+1sklh!|*$oF}Z*<%$!eyJkUu3 z2ah%Ny|il1 zaST6eVu|W!K;*KDU&%)jn)zt=(%+x#W&f7&^3h%Ivob4Lc94C^ z;f#blO$)1@Sf0b7TuVuSo&!9q5h62b0vH?6ETB-C()closXmYwb3Mg-z{2N@TSv2A z<>&(A%}}KuOrpR}qX2CRkD8p(n^O+6`ddK7`(Ie2QnUXpxcTOz&mP~ zc}eRq?5)cLA79M``(V}+k zRH^@WqYyg>=aD17_6hxWqmZ_a`ITo?D;_~#S7S39&yM}tD0Jj-qmUBy_(bmx*w4@q zwmoY3N`5DfuK?w~Wx?=)^T$a;qws|UiSQ=whhRHP{DoWZ$?3XA0mY}Y!WjX%*)@o-Ky+D~Mo%~(t1;Y`ka**G`RdSP$QrO$ zf#^rqy&(meK_>FcXGGDIyotyyU`(9Qu%ON5!yc0 z5Y={b2AP~)zeam5WX`EluorwOUp?3gJePBhy%Wb1ov?AU1qTMWkrQL5Q98I?tSu}& zPNmWyD}!z%)RbNBSmBeJkh{0lZE)=iqZB1!b=ycMz|W6M@?*pCJmJ_IVo^=p@_63x zxk`7H*LE2BWYCK^Zha@o!C-KJ9s?Q2ql|SW@{N2N9{;cC)xppCP;+)eZEt&Dmu*`c zT$eG-dmOHQK`NXAb##TS`-rS=25K~DJJjTYA(U9Eq=Y$s>c7GyfH25iiUGb|NY=>zQi-;=*tI)t85j%csVse%NAvJU z_yjg0(ht|nNfiZRn16Xp(v7y<2Reo@XB$0k`r?Ng_!w(pUC&MJvj2@L+)jO-fQehI+*X*agjh{=jWdEmG@SXM=pA@Zj zv-Q#>h8xN@d9*ZN!W>1Q=ONnsR`>vSL+zCQZ6`$qT-LfRlpUZYoz(xu*PFmYy~c0D zDn(_lMD`_;ow6^5l890VlaLs5$_ya}gQ>_;veq!!Dn*54WW+F%-C#;t#u#IleV@TF zz4vtf&*$^L@AJOTIdd|aIrne7m+$xbUe|SZW|?_>+drZ>alFgv8>M4LECRCb2=Tt~ z>D$(XY+Sq-zX9Q64$TPHn!pf07Q?c~+Yd+IUj>myJ&&rVF1Mth^fp*RedKu!NhU6v z_a$y?C*CR)r3%eZBe@LF@7zOr1toVpj590y3*MfEX=Pkou9Q> zvJd4ZL9FmlAfyuu1YMHl4Rqnmcu;3w_8sNJk!qT?mz_q#@pSF%b0(hn&BQ~^+ z&#Vn6z?#PWa=Cjn7vrzJkD`72#ka3h@W+mZJ|Jj9-G!w>u^I*@tw$f>Egk&J@g|96gOZDH6z$!a!kkHpTaDzn8(MR43Q;QJgEH!Z-S} zWp5C^(aLr|pKx&~*Q>Z5l8HS=^!#O#OImwtaTiJO0zm3zajkO0U{3T`+b9RIF}#Cp z=xt@K7=#I%ui5k-n$ES@uiSJKS{~PQk!o@QW63={VAN>Y(3cpxTVG%cERM@iq{gOQ zmeb*mhI7xcUF+G}ynx06(*xe-gKp;-_(tW`h@#OfkQy5qOeXyoH5tE^* zbd!nfbvVwNMwf|uKHq~l^UAA~02QmdA&@W~ zk`5(N+@e8bh&y;xcT@=EP*hzV?S$w*T>R{LHsVnob-UqCGIh*r%YUQ}LI0fRuz=QQ zRc_W%>N?q-Y=4ITD!LqzvyRc}vC4o-%V4$#o@A27-O8LW; zfxn)xbH}u1cNFkHV;oQtv^7BJY zt`n&z<A|L#ZfLfvc#r3KDA^6r52K=dncW_K&&PVL({ z-L)0YR%X&WaOokkH)lW7Ov%YMbR&BGudT zt0Y4o`-#RiEk*@{lRT6+a{h~N_UeMPN#=x>#L}de%^!L(oM+0eM%4E6xNhjO^VB-7 zY!41DmKJF2?hBx zO3H35i0Z)C&CNRJ{K{zw10c^$_3%Y{Fl*{=qEd4+a7Z=zMnIl5Ppq?uavWnq51_b@q!?0%Ku^Q0Mo5f3pVuCa-8Exo~Ct?AGvB zn21cY*K!WjblG|$)vQQ${o5X)F*uH705b$Igph@(r1YdV7WSAl$_4tu1^?lTNq6Th z?=x9>(i;~|u%8j<~Q`HTd!e*6IV;ib)mdpJ?=02&Z?q6%a&uloKU8-fH zvv)nX*6bUEpERTYQVBWr`$zSHXAS|oYQ80Jjh~zfTg+*QDYpuDh@`{27+x|*m#5h; zz|7<-cPG04_;K&Hr{qTom% z5g7XsVh0E?fC34MipFZ?^>ak}K?YHBjsh4l09tMa_{n_`m?;H!jfRhVwTg9I84{bs zKoSjvTc(LmndW5fG#jNbUU?x|ARUgCK*VE-${4^0x(NgZuolGHH(sIv!_A4DAbnfe zY!+v4{4tYUl*#_pRW8v>$*QFBDO=kL8< zph#|ZGe-7dE4#8GlDt|Elpx9Rym-1bV9_KfuI$+H|2Vi$%?lPtp5x--nBth`(Tg@v6Kp2_Y72?$9Fp$NxG;+K8 z=Ywd+DlJ?t8nX#*Ip`B1LxCD?P#pPEo|QPUXEX2JmdJC;SFKe{&_rr-ARNFy zu_Q_hHDv&8vmNd?;pIdAr}aECAGS&fOMD$0W#iU{f_7RfI3V^1tk#Zt!SsW#=Qh^C zzQU?N7ylz(v8#X(?@$&6TQG~U0-;_qs(R0TSzMcrD`H86`mJgkz%E^4GrS7YXaBZZ zw z@xfPdKTxT1p6%day)n8Jx*t46#qw4akh|rY&k&0imX??{sm*Fq^?bPT3wL*m3as2d z<0)-@K4^DoP zfdARe>E(FRm)pCf0(D4$?S@SrVyKlrKjDe%3K^1~#wPlXae0oPTH=I{qulajWlB_E zJ1cMM{-e3f_V&J*Cu%FpW4nYAL?Ymsf~TzL>VLA?Bxg%)qqcPwV;xqUy^BYg3bwgg z&$Gy{vjMm>a6%C9wSmr~U9zokn!cPsbZoU2@V5NDL_Vk53H8K(p zYl7m3F5rid0!KfEt8Ju`)Ci+pXJp4&=*g(^-$57)X)ir$D=>0E9x5KrTr#$@GC9)< z$N0$Y78DKLaqjW{!=gJ zlF}@qCU=|Hj#KCbnUSU17y~@Jx?OYQwE#>+tdgNWLY6>kt&jxMuuC{}{qj`)B(G3Y zPvhTuwoo{m&0~`V$AN~Mwq$q|&vIK?bz=SHK|IUrikMs44M60!+-tRs;c}P&mgWZ* z{r;I`L4d+`62t1#y5|9XrcBacMZ4JR`lLtxe;y#{_72fZ@__2IhrUOMrDjQ*SkfKgGA- zFa;etMYf)stQ=yk+$JoY!8!XHHC%@ui7Gsk0HutpiYLOre0H4UmmvolY{L&s(7?a} zSOsC_?-970Vug7L#<6IJRrB*304$Re2%$i;**8@JnZwN>>B24#&QtY3yt~Zss94EG zM@gf^PQ^(B)10yge7dg1RiGJ&KDj8O>$OJP^gIBZ5H;oFr~&947VE9Mg~qb<>;J=r z+sUV=3EO9Fzja%+9O6D?W}N-1OxoB#8Mm|e49Qwr?e9cy3g0i>OW+t{^oIaXk$2wc3^$wT&kqP)KXOD_VJYCI5(&tn9=u-J47dPxqn2=AuyvEu6KY%FOWA7U}>HBn#Op=n6_V$R$J-dJXbn+ zuHs{b2dIY|IQ5@wm;#>`AV%Np06{HS)`6D}6Qxn*0|5ILF+}ALDpV!w{EQrLl0!u^ z+Jh1?eq|pQ6RA*n=-Wl9riaHLXq0gc=(c)3t73*}$pY7xILCYy5Uh}NqgcP`=lK>^y_|NBsV?xpB`e)9l22lXp!#IpjwSs@FBSh{Z_eLkVHdGoz9-mOhM zK8f^O%_`)6tIUP{fkL3Ez4liZth??T&K{o`Fk9-}=fbUtV6k z=Mk8Vk+>k1Qj(Mng1I34YV9}e#0V!B&$!EQxv_cRQ_?aI!eQXS0HVV%KF@n=7x4X_ z@fINOvCS@TRM7FjE`x|09E|z3fkR{b?_jQ*9#_$qbXP;n9j+3mhM##A;cjAZ`|(F>Tx>6fO9gj^8S+Vxu>(!lPOnPYj&gEhLvgssf#W zW^UAi`4+rDCFJi4@lpts+vE~awwU8=&%7bFU*E4`mx0D>{(D~U_4<74M>UkLFgM)L zwm52;@r=V_4o?nDI7dV9nLUZ3&VVo$Y_8)Cs(+&@0Nb*Az6`R6|F6T`^|s%A>*Co@ z&|)@viMYJoxH*b^I&A4#n|@GTGeq!e&!duprm&15TTc;eHH#{ii$UyS49EQ?z^?G=kU)PF44NUm zu^!@Qe$p>@XM+3w2srj>PBt88`X$L8ty0G;ANBVg_>RXeFj%(g#rWA+vy+z_47;3` z#KOdUJvFAGAeaG8OV}~Se-qP z5+GO>Sud;1&GjL#6D1b!ZkD3}@D5Y7vI^X#a?zKJShd4|n+^sw6`Ik91qd(o<|DaV zxWcQ+NdM4vR2`iy+Omn(!n?w$-12sM*C8anXI?O^amQ>WpAjQUE5^#;fShrdS=wC# z%JPdR`j1KfC4(Iil-dje$eCpyidm*`DkfWIv_M?D6IFL+9`yMvk}D|MjyB{B)Ly#w zS!N3G+5T{S`ii=^U+{@M2{>z_$|wH zs-#ic|8}gj8xyFz{~e6lPEv7&lZ!y`Z@h~n0S-2i*yJ1XSr8oRAp75DtYBym_d{IK zYtth8-G;()r6+F){);GiM1iJ9GzLOb+tv|y%V+5+^~2IUS2@@8lZD3Cl(%Q(k{_Sz zZfQGvW9$#}iOc#~`d5jHuW>R3f9GJ`FxYcV)4an^ zYD?3iZ?LHOWCTYIip7F{0hkqZF`%|j0}PfRFjQeragk%<{-X3DHXP?-f2j13s*`aw z$~tNrd!8g^IfODewIp@i#k;1-8K)rGn{gY9T?jt>rCp2WnKv8pcO}O8)tilJdmk}_bi~s`8 z{4iGkhxWyu_sOy(4UDe%n!!PJP;NDbci{e?M?9V7uNYcITWYoNzlD@3WefE#|Il&k zJ(qvfFph9gn*Y(Wt52?`PATGZuN66!G^8DV@A&q5MSW)flBeQ|vdF~Gs7!juc4s`e ze<=$L_vt(lO(Z`kIA5xaS>2SJCmM_4w!jh|2nyH*!fG`FR2Tbuwv=k#yBX4t@(KMS zrCb|YNr!Cb@E1)-Gel+UyId~lc(<0_YRbHy+327kYB1R`Ox7@N$@_he9{Be-&kR@v z5f^F)^(at605#OX9MA#A%ARNzVr-NFMPkbnDE}oBi(KrF;#}Yh2}31Aqr5`$fq zBMfkg@S2Waw&D0(EE~nY_4I7IPVILH9dgDgp}g(^hcw@@%b>s*qs9S8!T?{wYoAyQ zXxy~h2AV5V7Li{^-|iqGFz!yG>Yo9PNLUDTYZV|X1kXMfVrmERA!a8ZPA78;Ot+pt zsLvUvqkcs@=8msRM|pPKG-#Z<#B~l& zdy{K@XrCqEMyx_pffHOVpbc~a-V*r(Im?v;q}Vm==W+bes}o;aSv5-W;*9~A)7bgt z%mlddq0tW9swb*27F4ejVNt;2kkj=1_NzMD{kteDSATwk!SaYU4N!%Wo4{BBw-exj z2r>m-l39@%!jA*}=xSc=bYFaME3(m@`kFRqkGE2S2)E)|)stn<;Tl6HvfueD=<1M$ zd0va6->wkH_C!SDDGe5vssm`*^EK}S&ta}t08>blav+qQ0;7+kUmXRZ5$uWHxgw>d zYzUt|-tEohCgA%3fvHjbWna7A0s_O3uJb<7-0-!Xn?}57(fzpLA3)5AZdU>1JRog_|cSG5d2Mj<1iGZ0SKgi^*UXSz??4&f$8s% z=1Stk5Tx;aVY~Oshq`UlJW&S$G$;MtQ=dDIg=@8h^a`D~0n*`d&sec1;6Z}_4+7vr zV5ib$mEJ>V^JH6AUC4NTHIM+E3IbJ>)9NI8B?$l4UKlld6Ucz|1qY z26A@dKJUG2bH@|4mZ|r3cX@tIH%ZiL5a!H;e`iBoUCNwS;N|T7X7dh`qQrXuq;iTorJm zARq;Vz`pDJZ9eTr`U6)wH@A%Kadpo}IUAWvAO7hc>dWGx5hm#}7TRbv1p`hOw@q`tOd5(M^D6qb5qeNiM6~#?`59M3v6O zf@isWIvAzykuZ-8$T# z@A{I)xa0*&qy;cmmF}`2a%;a)BxS3H3+!DZEdTmQ-eV?Hv{jf#d-x?6R?V>H$3gaW zB$?PKW=;C%UCMI?L74}vwS0FvxKpQui+(z>{^7@E(itR-7bwUsoRYQv!h&IeobU zG>xEJLNP8bBgqPr5Ll*KDzC9hqNjHUCEG}Dp_ys^g}i{!Aj`&yh8(nZT0P%f>dgX~ zBgqhCIhZgeA+QQM@B6%4@}bKL4-)u$pYUgTV%#CXo5+?rBDFKBq^q{(XahW(Oum9K z8~fkUAYKjUAu!|Nef;tEm~pTDO8i63g&!r>ss{vD*~bMp(K`BmXL&nb^?224fBYnx{q{eggea$_4fOV#=WT1`^|Nn@LJkFD>|bJ>ut z{b0Ep;Guz8dkhnHsXVkKPMsR)$<*i?S5!E-U%*^f_j)g}aB$KTP2b4dNuD%aNMJV3 z%$qT9xrFlY`f9fS&mq&lL?6$NEyiH*fssq*y&KRx`Y>3Q$91|KVEp)>>6u9c1c5W5X)C9XOY4n$@8;9!Qq+1Xx#CHjq3;TXP2>eKTm=a`qA~ylwnbHr}2?_cFa}uKVUu3kKwnlwAul6yq+@}|KJgu&~&+0y;1Lg2H z;~jDb9^?u2CFn)fLOaTNU8!P6!i|YG}9M(8Jrf{yzl0dJql5>UkP_TI#^Qawi zJwKZ{5r4;Wu|fF0w!opxtH>V~(!BuOG8Dz6A2}UTVxyQ}f+tsXH1OBfj2QG&(~bOp zO2D>^qDq7*)eq?jOaO5Gew9tuE$$30gqfN0PWJEJp zfW0gj5Mfu^_W(c008wsyi&AKT8{S1phy*+EDzChsIK3I|{g`EGT1+%Kak%lyrQE)5 zn+1(ze}kkz1J6`>-wqq~E@SwVE}seNW#afxE4I^e5wELl?2gr*8#B7fH3>T5>yKBDsAdX2q${~ zE90@Pp0|nC>#z@2I2AWXd?@(F-1c|=)>$)!{*^61CD>INkyNpbH|b(&HV3JV-}D7D zjjAhg4nHLpWUy7nxuZ9Jh@```whl1!BRGFJG& z;vl6yIl+FPnTldFs9y;_n6IBIG#fk(u&mv|cLj5^yvf7nd$*nQn%1XoMCnC<@cR^i zc{&cHo)0gva1kOfb*f+{#*SRG@qU|7SWFsoX zR*>b&(#vDiANZ$mb=lz#i?qr_rlsAmNRVks@(`E|u!MiV?MVan<+bV?h zwj#@6?7UpN8P&k+55EyD_DTqg?5x`-8JkAZj^+m$M*KV9hNF9%>ME6;rgB&Fo|vf~ ze>xAx)9gAni)#``uvpu82wf=LRrGrCA^FR=HpPj|B*^NoH$%H6aY}wkd^oRTTSDA; z`XS(8(+_CQtNXn%|Ep~!U@>>{UaLChZWiM6hm5N$5$E}b9kB?!53Cb9vIyhrXuko| zul?B_YSGxMw_{{J5&3#^fA1nLcOz0=LHYq7mI{jkmeC@II(u${-|6w##jz*$jN)dUQ_F)s#%oEel8K z(yQ`>Y)rUfrO!(sR{55C=>U>^(`S+ec#j|~=3RZ72v|?&#gZ@FRw<3*aWKSp00-xr z%{RN$@xJw-7E3a-s<;D+!T%b3G7$49h-76Q{8uyYrTJUUp-nNKt=*Ax4--67UQ5?L z+L^y`K=pJ``G|D&>-}Jl zxcKeB0)b@0)oI3ttgac|D!_cszmM(wO@F&9xeE2NYUfp+kYcW^)(S|C1ks{lK4f!y zqkKAeDxc2&9{E}YZ&q>jSKzZQkkY7Gpb=u^tTOxyTA$ zKERa~E0`L-RkyM}FTVT5G=W~`OswACvvCuBpQmlJci^CM=^dU*%W?A9=2NX6e!f24 zf96_-+O>G@?zkO%!SXX)MD2dYCMIv2HsS0O_w;)N2(D4o&U?O|>C2}@_1()8l`2Jc zu~_2UwETB6?JaD6^|{}aKXX##B^urCVTy$H8f)dUyZ_j(}$nfs6=WaUbRB=1H3 zPBc>xYv#ZeS~`Gv9R`wl5Y%JWAfQqS_-^u&I-00M0$h}=D!w^3yYl+J#ZjK!iPmK@ z0cID}Xk2_;8+-c46GEhuURYk5ZW(ikc)BX%nuv-97KeyR+jGUQ4I!L1*De|(3i;QZ zA5bti%B6+Z&dUfVdWizu0z%+8!+^Yyq>k^{0*Rj$Nxd@l;HwU%wZxQFnc{WG{!;&h zx!S>uriWY8WUSZXKI41FpAKr5>)0r+61C1ud9|uEB?0%lmis?rA&7Dy_VSLoKj8#P z=4ZAx=#xQW&cP>0CfZ(&+Tabi)KPLlCnjvtHMPYN#XrKdNz*M^P!ozvGKvYj`d%v; zHKIGgA{|v`>XrG}D5hrz>K-tJhwU{D<&uCm`|rg#>fqNKs62sESvH!WvQ)-t0jqMU)MG5*ZEbKBB4uI7HxWW8vkc*TC@&Uj$qbEv zcsHvPJuAM9Wa+vBZ|)T#$;>jJjs&5%C14HW80fcp>xkn>)w3Kx37{^cot#?*Bzc?V zQScBj$3kL)AC}J`k*Hgfj%b{DC^63X@-3 zi=R9^&-1xA<;AB)MKG=C-Z)*K=zG1_%wP1jgEb7GIj(TPuuhOZ2~4Iq$vn7GAQA!& z@SHmKe_|nBesx!YJ#hb~wY0b^Nw3B|A3HzF($c9Uyux1~JCW~>S3<`KVo-b|cQZIQ zwQ@1e5AbST%d|}8yxV+$ZM=+@+p1f|6HLGnjORH`#$%1V_?N1V2C{HHn@;Cd+v{ zxsQs-{r@>gt-Z;fgNV#dJS=6cf-q9Azzqm}A&>)Fj`B^>vc zA;%l5@+5f^fE>gMTqEG=|0v?fHx{^?gR29Z`Q+4M`E$*@8C~4f+1$&^Evl%@+V;4M zceL+i_`UgTA#@f|Q~Z}?#2Jw_`h9>h1uSnU6M2V$1KkDyNB-ukMTiXVkwW=ce5!&j zLCnCN(MeFTiX27~>S%=cvB`ddP8p6{?R5sQ@djrH?kqT0Jl!o%5=hve!7vdZy#B*A zLNesA5KQq@&*%szN^s)`w?h}dVt&NEcf0yq!f9ZZ==Jn7u0I!AOW^ZS32I7&a9YBH ztL}qDSfm3Tj0s1o0q`@xSz3>*?94L<^b_zqu1gA}O94t0x3QkLk8gF)l}Xw&-0Ysy zob$^y`Bb= zmD6L>~wenh~WO5*nifZeFASARBWo7mz@1{++kLFQaLk^cTQ29x(>z zmbnduM_+Zt)I4~2K`Y@FDGWZ58jjJW4J~@!p7%SAqq1z3KVC=-)dAhQxg}j~Sw|92 zxBBl6amrUcMK?gQ2DF6WFm%vkKynS3$hN|YfOY_T5cfc2!T9F1o{}Sc%q?-DVf#PnpppU%bOC>mCAPuO28yq`aEE8 zG>q<7OatP*_`lude;Vfq^ANEzlF3Ih8udVtiG$Gmd~ee067Pv?y-7cpr3TVL-Ndj{ zw*5g~0!JN$0=34aqUE;_&Ro=!2iPBu1X$SdfEWyBQ=*U2LupX_2iOM{LDeJ49sI9n z0%tmz&nez!k4bU$0CEqA4aid~yNsMljv_9E0_SXc(e>XQ!mhTZO})l5BkZ(*A#o#ktU>q{ z9QhrSTUg}zuK-Nr9+9TGv!5Usc-GtbW4P8AYY^B+Adduki4|+L&2s7c0o7qXJ|xo! zT$ecPMJyO;+2zv}lhBk$Sig%`3TDoX?C+M)=$<(Wr%UBhz@H?uEZ0YmFcv~>wy~d*55zF|)n#q0uk1hg`&GG;xCu1V zaUwhQcPbK4VnqP??ysJ-^(^?=dX{7|j{#Um>Zn&6CkWY`zyQ>*+n~X;1N=sfK>DX1 zEVeegk)@U_%zHCigLzp*BuFEdkv8Q>7sG8lzEPfLDq?V%Vh`exG@AzC?(z@>4Jpx> zFiwsDHX)L}gy)zp00}2MYo8eC9iW^29u=K-x^NRIQouc+(%cAz7_60bpyVyJhu1mj07$fiIg2jYU*c$2}W!X44A;=n4N2 zM)GFARCeBByy`FA7;vfkJ_K7JRAJmmNWaP>W||tkFwyXC$ks<`^Dy3aa`$|9UlxzY zWcW4v1Bb+RyuZ(U39Mq2OgX+_UkVK$^DepGNgImP--6A)71fwq^9>RZp@2P5Wui)3 z<>gmVy1#eEft?SmbgZXb@B9|}-VY{X8nHCA-up|jL+?YK^b9)f-{6;ZZ)NtjsQR6M zUfvctG++=pI3d5$S1i7Vm=zG#>#$B0FkkBl*uIp$In6>&gcx_K{WQfRa%|WoJX5#V ze9g(h|1!R~va@&a`)SKVs-=bach2JzAC3grZ6B#lM)H3o=CV$`Di2GiGV_BEJ{B3j z+?(W@ly7zW{`jv73-gmxLy;p(PA18L1J!y&)lwhLAg9F)W0!)rDWC6{RUB({v|T~U0?T91b?g{lfnk&NJc&#A&+M_1Nz;$+h8?9d^UPwcdpn;!Rwh28V~A z*xbx?s#REvXhAH60xVNwrZ45+9qrnE!MTTmO%_(DX2(2`;U@R&Ysq2t zNsr$%Suw7)=KJsbqGJVIYxC8O!p_~hvlwXG=3krVbXW8JKy+%fDPHfA{a07>>ycGM z>@Vwm3r^kH+mF?uy0KuXPO05tLvv%b#Hu&pS8qHStar^n z3U*m_6TCTe_r&(13_-I)KhhR4sI;@FVSUee>({2k(X0xuy7B6F`uE_jYlEcvi* z$gap~W|fww6F0%EO#f%DiAgFi2(&Yee|{c$FplqO+dk`xrHvGLo;t1dpE=8=Pf;b` zT{i=3%jxF#)W_~L=~Ac2`gBtm|B2VNX1S*sw5n*TFd^5;NBI_6XZ_s89 z1tHyaezd~@UcE8}J7p2{si;vrFLI;o6sSuYn}@q1uTfh8dvlI>YG$*|zm!T_q#NZ7 zA-~Vg^DN|eA};)_{uqEv)T~2fFEVMB)e8qEoYK#V-#uv;r2W!r%Jk>GN#4hGzq5u| z$EGbm7a{*}8TgLmImko|Ub0iEja&%vun2#)FTdnOi||W_F{f^7<{&zxi2ke^A7xZ- z{slaSiG`2dHFXHr=AzlTQwxT+y|YESx8QOj^7Yj(_ZbTROIo%Z=7u3wnPPPtnr|8@@~h52=@!lB5zs_MU5C8x~+RG?gG>hCzrK`p5Cnd zxdvNJc^-@i-Q#M0yF2Ho`zi|?|8Hgk`X2+vL+6wWga%#YY>=0KVPeSOVEa^-t=p*| z*u~zR^LbTuAS8ZI=)F zcZ04xU7mf2Qub3OaRp9h**omu8tQkw*psNgNXRvs@9MYhA#YL2CGWfQM6*e2<|hSHFcx7JD!U_doEd+ zwTRK_&l!w#D|y%bx)=UFxh*|sFv_j>NNTF`7WYrfg)F5^;_3Dm)#1jG8 z$>jO*%7(JrA5~YiJnzKb0e*|ML&$2Xm+q{S_}BdF27zbeqHoV3t*xdOyRhTzXZd=@zev8$t02>^rU8?t2{v zaIS+@=e#n32P>&(Qh>J(O?AL?ZdX} zYVFo`vZ3@CWuJA_KkgROsw|!6q6nFf^A;0NZrDka_7V0KoC|W$z7e3{yUk4U1zYYk ze%!dK3wM-i9U3sTiFD_GoD9=r1;WD9UhL#7_o>)8tLle`xw=L~A%j|w_cBoC=2xp~ zL&~-yk^WyJov%uaW%yso{qd_=gZg1+A;eb&%mR)3*}o!97qr->1KsZhCQ(__AlZL$=CJmu}+u#K*&ZNR_R_D64R^3~N9EVkFQhh$xKcB6Or?&yslVN|dS@UZPmxFYa#yEYHxfZ zN9f$E-;8?kaB9CuMjpyH#)vnu;nC6~FL%dU>yN4*O5d@LE;fcwX@oMT)mdo!^hJ11 z)L5>Qml^vw!CheMle?V$de8uJK(@>MaWnd}dVt*51zzp3=(_taF7i4gw>CE2S}b)w z7!b+X{C2fY>b-L*qwn*o#{)0qCFdRUrbYaUl!fqu@%*ats{1f{c_Hh-3+MFB!~3@T zfH8VXPOKfQd(QXG)C{5Iu_4b>mWH{MzH=X&$^1SxgFOEtm=##JW3povJ{GxRfd?|s zPDWCALCp7cXeAw|Nsw_dCt2r*5XwHu&SjOy`ZRXE=( z+6h)Yo3QzhvM%s>9`20%-TA4p6TVvVf^V@G)6=!MK71|zr|&)UogruLlA-l(-(ei1 zYQcAC(9Q35aZ~}yVol6PlNnBT_*l?_4}5Eyi`m5TGuqC(#L^ekfRRjw@fnq;j^h5e z97E7(ZT6K^Ke zU4uWGzEqD&m}1l}EIFNUe!)dzNe&g6-oHewxOzl`J~|jksPEJ#;C1Xzj$+OT^Vtl_ z-ptLN6LVZuk$lK?-=V3TT{*vMlf<+~nmQZ9xVWE$tlygPpa|5D=!(xq?CAe4>G%^otC!w6zK7(QoZpw9Hc z>P)aQ*qRVFl%a!+&jrkj6>-<9JQCV$+yUHW7-*{y2KV@JA#9+ZC0Kc-%+%09RF57!%Z z*+EmkG5>s(#_vxpi_Z(an1(k$oJ2NzAJ;(=!rZRf_P{;*9-v&vcdK%kpP1q~!D!^% zZT8j|DRi$f9Xc@S@rUb*j&;%V_J*G>Iqc_;Lc$Ic;P9(UC8vXnI@TFa4;pZ;N3!2v zx9x>{$Bk>LXA?YT#gnvFuCVTIW)aGuGlPC}EC-nm^ipeF_7I`7Qa#UbIxG25x}BQ) z57i^6Ye5w!fBv)YXONr=>XnFTP<`yUkkUiR!uEi?xk~@8i%jFXhwNa&#RI=pmiI4& z70zsxE;cFO9t zGHWayxPdQ^D7alH9qF)+e!H-^)-+oAybNjIc{}UI6xSg7xvyPBcx7L0GrqwTJvg@& z48q0@4m)wq2B?NIjZ#D%)O5-G73tF=-55|r+)#?Q~GW8#3|41ys~CWU)B5E zV)Bq%6qre07)@8+jm)=i=tdp_yP3bgs!&aF0=3l-JIVdHY6*1M4JKl0>o#J!va_=I z*qfp~;d^$eSmD0McfM5Z-XFQUxK+{LQ?N&9`qOdR=u!SV>S@zowu&IXQ?>CYztuk! zx;(Mx^0R_Z1(tl17`Z?g-%rDfv`*cac45ogkGY z{TJK(soPEkFYPPW>*{Ln1#GQXQAN>NVadzL!7f%@mkd*iwJ=FoVXLS=BiQ@(&OFlP z2_ehfM&6M=$|^lAkkLWF(k3O)l~XIn7ug-OkuS3bc^_~<|8cgBRUlVna%ZD&TIOM@ znUG{DeD`PHLM<)*)k$HI6HbV%Vids={dn6T-j7&YnCs<&__;k)bolBt*rQ$NpGf!j zg|Bo;cb@VH9{p~_Yq);4$FF=0QMl@C=-`I-==-&$A6)AflI2lJkLmt}(h!378x>2h z>z4iUo8Et%WK25O#GAIM*t4GJG&3)qI_pw%`oQkI!1ipPp{HZG0t%06pqwIZ9e@G;WeRpZo}`F6n0@zJ+7 zd6eER^9?hvnh%*l9yg70Hzg{c*uK%HnmQ`4)zJyPmBFkmdU|cr6;`Ty0J~CkH1bHe zdFgby|I|9oEWOj{&hTF6QWytd1K)C zKvkgE9g;~W+_s4(dgf_`tDe%uZ+=VTv#R=^P``brnEuo)8tIhabvfFXjGVgW3*Uxj zHi|cFyDI5kh<$TBdHgSTJdBRn@H?q4-17WrEYhdwt|HUN8u&GcPxd2+w=l@ASnvFo zGZL56&i*e8LAX)R}@d;z#}eRXP+us^n}r>U$6B|q8qA3SRg%qRc8nL)2qc>s%w}97Jx_ZqT8|a!T78&gY2k$t$pqx|X?U;tKU~4fCnZN#c<09)#xZ zcNxPpI-#Q3?8)#}o^D~x`~6{-vn-t*Dz#fT|M=?yYBhIxc({fmS#rf?0TpZ<>N7~O z*MF}_6XiP=;sodSoZaRPZs(+P5TDKXhhg<{0khA2VnUVv29%VcC zXu~2DV4#|T6dy%SRd1P=s-txQjF^rog};27)jjzZ@qbZt7G6!bZxlzdK*6t|Agv%E zE!|8&x)h{K=^kBULqViLLAs=yk)xSPcXv#3z+j`t7@NQS{(zmGvvc;o&wD@jxz~kt zBKG@*xGXI6^O@mnaL?&t1MMH(Hk)xjz0qbRWs_W;_~67kdTriD6UiO+ zdv~i%6n%f!JNq@Mtx7S*k#)uCJfVK|y7uRjUHWRw^DL!9ptyuO<$KCRMTMEZ$s0HC zZ16vEw)n*GI4pxDL_|6^6P=)DZ%J`hI!%Pa#iU&_5u}~#&Bgc9-81L6rh_FyuC0u_ za3NL%55n6i>8FlDBw1nb{0sbfFnqtO)-mU^A;{E^^W1545h#TWtl`rPR?KWdBm>(X zeCoV9jY7g?A$Uj8;}=w|OC{qdkWZ9NM(ccMv(*TuIYRILiI^<+p#uT6(cQ*X&e(O_ z3R%lo4|21eGVA0Q(rh~*jxK}O(JtxMNLTIS(4)=A5+bK0O2%B0TD%ilmt%r_8$Mbw z=AUh>>y%(>=FcVc823Fa_s^%rd)}2kOd~I1A*9mj$+pDkvY!Uw1GWPrbANzICy(Z|L02Vrx%E z1Q32(sk^v!>QWu~)ilF{vVtvcotH2Kq1!6QFJ*p1WV)NGgwLd{P}+y*$UUL1X4&St zbSOj5z~u}wZN;PHq>SBhW^^OB`f3v~X(-Z|xBHlNHa~{H?@kSLqtJ{jhSp7-0$0-W ziJNmm;P6QSv(Y@w_4Le*jKn!!sh=7Z-&6Kz)U*7BA4_q1Zcm!_X`&gR zZef8gotshj9#uiI7Udug`LeH?=v`lb^zVW>*Q%sbzRQ+*J4L-ajd=D$?sJwz-0d@B z%x;@DvHT7#DK#hp%p-Yh#MO_V3ga-oCJHDM$(J>6s_mV zpGD0>D{j9QNo0GUJ*Z5L?4|z97q3_GC5s{N@@-fYhVa-<#^$}Xi*uAxb9_?j>w5za zd<)(v(b&n1a>e+TE3FFTi*{0xX=@y+uspYUmR#gl(p2>$&$Kwbfs;$4Q}J%?Jxa=v z*Z0l})HT=c=eQ`-O2rzcz4$DzrrA!m@LBuMfT$GpS^AiMEHe06k|}&GRW)V(P%Wy3 zrn#7&=9VP6ram-7evGH6_>|-*(9~Zcg;rRYFXVe(j81w{ z=F`DLjcwt|cn%788>=58-$i)ucT(Jv5xUY3qI^dtsj1{l_h)q1-uII(((G$=m16AS zK4BVieh*)4WTU}RG$oU&Q?9{ig9QA7rX`;%9B6+a`AqGsL8b%tZ%jBRE< zE@Rn=>SYuKzt0|Ke)$=%#n^0`#4%MXHbFj_|5W@tO*X?{de*a~SLjLsnXq7KX3@g8 z=!sIzKRNxU`aS*{&f44L`~yX4k8H4(6_X8r4lj#u?!?4vG-|(Tjw>&EQxmyUaL=em ztR?|T$uvi&Gzd9=ann2;r1AWo8T;A~>8QI8wcZcS#J`w~ub7gldA!bR<*##w=|BbP z=r#8O<~3Su|9-kAVFIb4@`9w6@1jX0HBz9GUIeg>=I_MFn+!i%mV=VxH|^RA3~qF>iQ|!*NnAK{w*cT7R&Jhtjcb#sP0c+8l2DRzbipS*s)O7 zdfM5+T%LGlKCh*uuZZDG*Bm6i1{$_q+uNmb0%hC{UP}Nz@MAN-M){C&T*#8EzLV;Z zvgmvoh{{LfKzN$YG}q4ku1x6A%v1||ry9@00G{6pw79!8u+ptpdM zM{Nj%zA}2Xnq*z;_s#>afr)*U*e7l0!sU>61d^w*1=zB_V78nTT)YNyX$Yu0)Mpv% z1LjDCe2lA!S_OwMr(UXBE)31q>~OSRMmd-eLagUX(u;>zRbqGFe|GMantik3vSR03ebGPt|z<}ilfhxa%UC?#I-=RCZV|R(K zWX)p&h5{Mvf)*^Z0N|>TBpnvM>ku)J`aw!&@P1(vnJ=T8D-E zT92-s>Zz4phB#dupZC8c$TK6bmDT^q0+Ct_t46k?XD>CB|FEymjq|w6CCwg39yveg z&lL!A1|S$Ltq$gvo|G1kGg_GWyP)>Qd)B{`qS8J*xx~1xtcdb;yB|K6#^~H8(X5Z& zj3+vSPqTz(Nt482o`2tt#GHqVcY#5cm1R>T&82TKCKjb!Q@PVDF217#Dc$capzYvml(5L;mJ_K2+>E_a1pyvy(coq1~u&< zs<$cA##<~+@6wV?GiOB3MvcJ_UQyKRp{f>sV$tyZ5p5xzTbfq9Jy8?0-PxDfXLVFLPS<`IW zK`i@=DmiiyrL;Nl6aF~-tV6n02G0N8(q0FPI~;))?s9L(W&o|>tmiBp9HAcLAh?e^ zriqX}c=VGMmnzz(C$>&8>E ze)-(uPq2&J*0;mW-$k=&dB5yG)BLSA&$+m-99+0x4cC3JS1k{I?XD*CuBK~lY+)_K z9O-kkci@I-+Z}61KD3n`DQ`+^^YLRCNX9pfb)c-VaU1y9#P7}u-wsDww*3JuiOHma zblGuXp90Oa2y9?m4K6yv!~3-Q{nZakwR2()Gw{u4_*)_iJTUGPc~7h#y>@VaHl+Z* zzUz4Lk+Z+Y-bG`$={n<>+pl|z4`%M(pmEY0I&&U}uVKc|HMtP6!vT;($l=xCMQka4 zFXOs&rI!Z-RH%m6R&H(`$}X`7(HFVuz5z%i20fmNWNN>T>VOT_tovQf54uO! z`w=AO2$rZc@ylh`d~U;zLTl9kP9KO@Y98ELKB(VEw3+*&25}1PVxAAa-gMq~DUpi) zs<4HXJ6?5wI_!Imm0HqYbEx~BYDqRzSQg)$?U-&o9;c`PXXddrm~ZnvDzyAZ7XFlU zf$X3sOioJMz-L&-+EUcn!I8a3BsZ+vkkDQj^W$=4VCGNGyVMmVoWL|x*$D?Xc(PyZ z_WJ3prDK~M4xy2+A{P$-szly$N4CE44nfGLo4CV|JDC=rr_!;JWY*z#g&$rzK8D}_ z2n<2xnIhV$@#g#>LAMz4`yyPP!B)~jq{F^q3mIR1?LaFETC__Xu5(Dk$RbWFfTr=Q zB_~ij3)icjAc@kAXazw6?1C_#hC)cCyDy7#A4!7r%z|bvaS0aKm6I7v$)i0%c98eA zG5IPgzzM*Okl%z=iQ;#SE6-=fFR+m3F&7;T>gd1pM;nCRj;K}94qa*hXmMIn=mpxg zHDD&g$DgQ%A8zY(#|4ZqKN`EKTzj`kmp#NT-s>nGJ_sCm5a zZ}%x8NPcOJ&^G93ZpMr=`9fWsR_sh>$8|iYVoOLN*<64vy2L@&$b}qJ;E)Ah$#Pzs z-x?bpCQ>(V>_Qs&TdjB{>Mx=(58TxWerNDQ>XW1vaQ>Y<6f0rdye_jYAoAtfZziE< z`>t2+l3s8_5x&6q#5mID5ZLAKqrvWY%ej`cG`N zt&2r0w2uhO-xjoJCRBf9xwFxKdR;u1IXj&4X6CoW0-ab-J4E7iHTT>2d_MqcXrSnV zT&5dt@~=3IqUHn!+%_j><(1Un^3YL3YeSk3e$_u`KHEy^);3kz^v}8e+2xWLQQ5N= zFpf#?KyL7s;jXv!JF91TyHKHpv0qKN%-?FkaSzsw+LQtM(|1QX)(F{1mbXVaRQFUd zCsfdeWx!=!Tk}nN(Ppm$-GO0zNoy6`kIi~G?l7!`DDRc|QMJIMc)XqZB*is=sBKmS zTqKm>5BjySn32<#>5HvtxjG&q{Q2QfQT2Thol30I9Q!9u1;Ufn+Y0cfLx%L_kf)eU zr|RF{1*=wo1K08X_zgy4muYayoL4QWCvXDS}BywVT6i>_;b z#VrTtsyUZXj*cNmV2-J~5D6atq*E~}3Q-=_Grwam} z57-^fqOqBOqHOKYPgsrHj&#cx5?``0lGe`LgAA5q`d341J7ZeChhvYUL!$cc^mSU{ zJs_oAK3!*BjtxQb#Oo%*<$C12w%^Ico=%cOeM^al%C#+R55bPT>2_s(Dow!fqz_L` z7Sd)HwZZ0ioaR=(1`tRzZ1=O|`*EI^kN_FxobhjMVWf3b4uvL{_rZHH_)>-8YJZ*6 z*jzxC#BHygBXKB4UlVl%k4%o$u<%g4q<40d+=`u0Gu zDkysc9HSMBEUY7a8|w8Kx*V2hX>=};dOF<#7e?r`XT-mBSWSG;;oXdB!jnt|*;OH; zt{0;XCgAO>@$ZQwn@A{VApvIl!t1}?e`J>bwN!;%_BgZjIUm(ANwfQovhLr^e%KF( zWf=sjd`zq_vwLO!v=*^F?=jQhGhMWaprjXf2;oHs>!}eu;x~g9FglBpzyne*(J~${ zgl&VmUP_{`)kzCtA-#J0eY3m!)J~J$H#OxO-?3A9QY9Mv$jfVzKV8|a5VvQr%maay zh)C2#9LP-Ai4)NzHx*e?KkQc6}dF#S;1E$7^hAJfQ9O-}C zuq^72UO)haa@vP3o_V#CoDW6klNf_MgxX|&+bLZ3(M-JjJP=M;u+JD)0~GCPTK`E% z1hyfyeA;YLR65^JNbmzA_}A)DcUX-}q`Z~zIAi+T-tjHEZcOKo3|H@I#w}y;Nk%`a z73MgoyjranwtXJyQ29F@oi8inm47+B+2-5ne>h}03UUFi{Q*fz0&fH@56^4#=jSC| zu9;!OJv!#$qnAD39Axy3WZphT@>wagDzVrI%nWX|1T1%2VC+C&eVXZWfz(|_5(&It zACACyC45igd@=#rQti~+%8=gI8a?}6(tGPPn}LL@y-AOMg zv6a&PqO~dI=0w-8UGhq~78lEqLIPHIU7#7Wdh!Y-beg+VBQbTK|OZWXsWc6H;jpe=f`q=($a5f`U(|U3Am-y(SSX3{QUr?5}RihdD=&_hYoD+ZT71jj&#Y`)g1F z6B}SAl@R%ljP=i1S!Ac8^u3x%>L5cw#05TN-jz<;cF$W|>ZF}Dcn}%bS)_qs+X>}@ zS`7d38jd}Rg>IZkkBHv2y%W1P$!xq$Xd&$ZUrQP#=!muk)L@R6o&S-I`&C|CN$)PN zS;>^TX(dXg?Rwz-@D~yNtB4n{!b6t49qMCa%*oA&&nQ6i1ifF2)k)U)t^KE^}X)V+BBQ zmaE;eX{eS;=M>AaRqNvtSK@_}8fl254PA5o9h`1F-Tv4!Q!{Sqy+P6f9*oz!{QKCa z@j;rw%3{WxcbET??i0RB7f8DETO4{xl9<<`c$U#gP?PAVvd@|9%c?0y%_JSj7%k2E zG#^kM3(jyDw3+uIp-bDwT!SgHC zGaftTY2Wk^-LALWFaME2<ct;;=O8SA?lt;8@G zS2HV`a9AJnKJOc3mcSP}+)-m6R$taWzwVRF5oq4KuSm zvV*>TW9&RFhDStdfJIPWHl*sg>F>sNxI7YCx=#fBz+}i1O3NDL329fCMh`?oj%c1D zgO&)6w?=V&Q}f>A=UL#Ab3OZg!`LqGkZ&?~G4om79mcZG!AwMZ$ne4H-h&Qw*SLzi z+njf4F1k01T$hjh&IWp=#E(_C3fFmR-^Yz9Q0~iS6O5BCQ-T=NHA5UJBKqZG=qg0$ zrn9nLXHJBWkuu2(f^W9XHp72haFgFxK!{fBF~cCWgZue=!I_BQN`wNSsP|BNm>+Wt z={pd61qF7*0|I4pae0l5&@PDja?Y;&TGZ?R=a^!}w>HHS0f*pdb>$b&9qkSg+^VyF`Kc;Kvi|qDWofrwg zTwO?;tYu)Xx`}{}Z9D?GH`xyd4}KeCQ<)HwO&bZAsV|0lNA$cE2b z63rug28YFu7Wito8pZzuKhHdM#hfDdQF*PfE1jA)F1kR07)OTl+M@yhXCi zs_i9U<{I0Dm)uao1VIZC_e?vS0}n)tQ=?oFtGlVEd%)Wf4znZ!u52L7=4?#y1vJQc zjx=~Mf1dwGMzFtymn_jwwoeEy?_iAPkhIq7*xghtI~v$3ri+#!kz^9qR13o~|E`XVO{8?a@)CLQ8o@2G*GV>Oyo5Hdml=4Hk$muq3$@_zZH zq~Ry?GEA^gWAh;x_Ug++<1Z`QDL)lQT;7@qG#6XHF#3A28?sN_p)fY{hj+7N7(BG1u z@M}c+e`I927G+Hy)~pS{J-L3&q}tG%VruUC*6tx(FxZ*J^U7SB) zuK2UO7Q;ouv^V5v3Qb-|5B6isk04eV7=lqnX-plpP6*#A&X(@@(h6~c(3s$@@70rn z^_TrgY#B05xvfn2=ABUEcYN~=dCfDZYCn+?&V3Mx=tzSz%XQjE^cK6-FB_=%bP{O` zd^~_y?Wen@xpmd3JA|pZrBQN&ztxB^p0)a5R@E$TAVzY>ufeF zKHfeKLfdIKr)S(^JO{9p8$P@9%u)+yz01_N`&IxdJfq#rXtCmszR+JYO`$ffwEpsA zhA9+ZRo)yc58XaBnvxyDRgYl`s{%w`KGf9v8-RF|pen5{YlT2R0YiY#x~?-6E&R$G zcN_z}

    GTvs@uiK9Xr}zV_}__Cp{gm?!Ir<>>MchlHGIvObUCTw^n;`=twZ68q!# zo6Y8K-M`$|vOdR3*3TVe9*i^fy`A4NE`9W|wfITyB{5X~kTb~WE)(h6(R1?2t3FCg zb|fC3PN;p^k-=JFM5jJn1X0{!f4HCcK9f66ZViZnx7sE`3|fe@a@Q}qv!1xhCvXH& z7knwLWqr9*3{TknYDHgfjXBnH*gDI3@T-qH(CyZvxXp?~*@pQ0yg!F_6iU8z)Xc~H zG31yn{jM9}>D_%e9hBtM}RV!w=uCdMR@`_*eCUUOdDpWJ~u5e>i$@aMLDn#H+ z;YQFfrUE~%ONwcKae`2dpzK*TWU_sW6=HI6VjVr5FeSU>0Yj;4gtIUch^b4tW8(_8 zPb3UYSSEUIm;I)G&EOyQ0la_nH!$jRLHdQ~3TB;2SHeJ7%xQ4R!f<&f>!ruq2WD65Zyym!8;G|=wvt%_`H*Q zi~WibIG*AK-2+%w)zmng@|c+h4bLWHtbaSoVL@pMFx7Qp^`?rS%M+0i-nxsowK}kc zO>)+YQBJ%`YrofIc?gbp>OOU|XEIPcruxv`4@psiCJ^E5d7^&vT-uPYaU-^1-CfyS zB9hL^L>hcJN2p7fumnuvs#tKaG@J&x3eA7sJwXwE39EmL+M;6uB;|=lePtik=GGH?^~q~L#?)kB}S%$6Rm#+jVe5dc09=S1Lk zqX#uTPM_Kh{7TDZ3KU3h{B&v6pyQq;a|K>F`R!xRK73!69L{uC3vSNP>DN)iD|fn# zv`xbBBo2FF|U~ARGy|T>uN9p|yFQ6lRw22}ez)67@kuiD2 z>Ux*$0N$-J)Q#i3LCC*_9Tl8!dhU#SF85lVV}JOX|NZ{L9XzH$C0Nsejo8)FxY5x= zEUM-_0P5)c&DKmbjyvPWH8+&+4Q{p=Tz zD6;*S`e3pr&+JcN|6TkmK=mAI>M93ir z|E+#Xkjslb>J=9DoT5B>j5Gt<+3MdfGya>%c9sES$!++$HU8{TrK-Plv?C}!D-y~W zm~Az_7|3;sW1O9Ui-IEfB1L{G)jnEIdw5Ei{zXV@Kd<=RX9U{M9w*Q@0^`wlS+DEy zlJQofR^S{J9qHBK+_=EF6;hnxiK{##(KUlh00v@(FUKT=QeqSY2O0acK@PxopqQMG zvT%+>SxlfwhnLHj6H z>?isR&E%155~KPggMvFvj(80z%6@?|uCwZ50fQcJthdFj=4vegWn#oEyKuMa-^iNh ze5siq{ZXggTJT^D5y*nzJ`7;{Iqyl8hjUXN4d~tWVg~yj3pv8Jql`dsCD_Vt%4j7W z`Lzt=u`AV8{L_8}>A}r#$W*U2BvNfY+fM);5J4T1jt$@0K$Fk^)ct1GATA;Vx36p@ z97^^5JUX+!w|(Xg617&_Xq^fXp&jxU7uY@K5)N|uMJJYYi2(62vdHigUH*zy%VnRP5GxZnI;F#IWB$JB!dP`CFSr(eEc29KZV z>$PutnWzykuuv{nt#w){-2g$A_wxg2$(H^Bq%pY6$m zp;_7A6Qf(?4KIp|&65dxT2Z=^$$tZ^AtsZi=Ij>Vi{Mcd`ZF@e&X$TQ$}^7EHhDp_ zJ+!qVw{8CD+MwxE*1ZBmS~7gB;^7V6 zT{Er~W+a0Iyih0hU>AIJVP95m7e0~lADN8V>n6Pi`Ky^IF730m4BwNW%^yU&0L#X6 z)73Wl69S_Fe&q;bVbmI-aEfA+B~_>8Y*4yS81<2IR(&#OlUm$lYYCyg3mLby8mUk> z|B{btkcTQ&{<=9ZzInapzApbI@4v!?i-KECavmGZPGNqM(kSvB+K5jl+b`qIeF9U9 zP;+!JI4@aFaAX7a@;0wMpf9_nZHo3nRw&TxnDCu`D9(XL51VJ*M3@(G zI@5?8{-QBRBJ~}btz#YC?I<5md|S;mkbMhCo5V}`alWv7$CW|c;m=9(&a}rmT`=j1 zZ)TNE1M=~~3cTPbaX$@`l3m=dc*C4IL3z9+XB6)Ci4gK~FMo?{;X6fLR>8awwY1=D zV;4>R_Ef7wfbeVRRZ8cOziMOS1;s0*iiLW-UD`;1Ky9PBCFbcX+vB?{>l?roRIg~< z9l@o07ZlyYd4IK3h%2UQZ?CxTm1H4StS-4bYhLL->DP0s4qeL~y+8``+Hfk|R63ZZ zMAZ=!4-Tz^LqH0+kGrIor-3#uMKZb#yjWbSVE|Rz4gcj4L;nC}1kja};Z*qf{$uE% z-@2i%>}F*=y1rFvaH%p8@a{+z&ZM~zG}}%#K+Q&olm2zi6mmjVG`+|CaNu#Kwwn70 z`{(b^JquFTKJv-r_l__IXn80QoU71zYP2le;<<2%bzziZTtGm z653`RO`=I^RYvllaT>-@w>N{q;bU{ZGZ&Xwsso&)m{je5N6V?28ULaDYo~F|Y}=&@ zuXD|3YSB(#?a&s32*%(7fw zxr5_6wHnNx*9qi`J>DQi|1x>+1!|srP?YSuHtx4@{vDby6@QE${r~o<`c{7tG z7*lG@F#1Knb2T^F<-b!0h{WXttHNa)Lv5F6!@V(Pr8VHT5Dq0XH8?R8t8Y7Xy6Azq zAG8XWABz15iOhQSeoh7tJ*8k3*RE5HjYUwunjbLq*AQDH#HH;4WfA<4j_wPwbMO_z7ti`ARNAWuI5 zbD>km5HILBEfiG~8j24#Z)O$$<5apZm;1}5VjIwhZDnVGHPfYF65CMxbvMPGK7_A* za72lZQO9-zUqpNlOXCb8h<5!W^G)oY`bo9tU{IEJ|Jh1kPFy$7sQ!>W`Po0RCnF&^ z4>VQL5AA3US>_LFx4*T9J!KS2;1fKe=!s8-brxnKygYi)lO^n5E5*~7bAP=v%hfA= z!17R(iM1c+yqlR(C|`g+ToZ0j%X+n1NuZyLvx$DCvCu!9S>I$xU#n_bUrbo)JPRvb zKVUTGJCjl~6y|2-1uV%vMx{B~CM4E+E6b-dLG|h;1=jp4nffiv^IA_FDv805_u!lM z-Q-W*;_YWvu1rEsrAH%*8*Y}4)tWa9CZ^{#-4>3r*9izcAKOk2^ZOYYpJ~@cZt=b^ zCh?mD^bq~b(c<2-XC0^Z(<+=XW)I8>~DJq5ylsIVNqIwqZ z7kn2FvTk=tCAvMMa&))Z9{q7zk?Gwvq&1`xBL0%0tjQVl7?+@~;gPt?D;rd2qUVk1 z=sK@L78Adz&CTj>39P17j(c&&H>}F~3Djel(d{H1G4y=mcF*iF(Tb#U$=dwKzfp){ zQ_Wt92}pei&P|7Xk-iH=C%>Mb)b4t9Kics}C-sS7gHY$JT6vXt&H|#Q-9EHyS=$|t zR&-mA8c$rJtZpy4IGH~Mn>VZ2RB7`a=LN3yiVI%QZ=!Sc3|w!oS!nJ~*yA#}$K>9P z%q_$K*jOg3SEh3N=UQ2>wLR1RZZ{NIxzOf8gjGpMYX#glu6I!VVDCEU=5T-O%q0cG zFHt?g-fy;?SIA0*;g6u`E5+9GuZ2DYUhB-7n!o_X#yu#DXPeujLzB zc`euDH37)(U5lAIEef}jox#OV9AY#-Db3L7ui0V(uG94WK{KV&%^J=}T_O{s z&Pdtt-K(Y4mk}8`7u2C2f;qdcl@&;ew7kmzx1(=5B29j0E#kJDPjx_+AW=2~b&t<< zOD1i#KKx={(suZ|0@SEh%$=R*$_2_@oh$fVabMiw2Z>}!tvoCd2(GU#ycg9E|pIn2toLbi@b%`Nf!2riNZTF#JYvq01;ImvH z1`8fz>uBA0B5Ec++&vN}Ecfs@%EGFg^~PYo>|x**jkuI^=tyMm$7^@8}47sVH81eJWviUCPL3qC-_%$aIQ_2_R(==|e}ww}i5mJ1; z;yt{+y<*VjK*iz4!liF-Ms1TB7++TR$^1#rZsLMhVk`y8fkL#e(R$Y+6|`WaLz`+A zjMI4AX4)!N$UxBE;88WU_SQ3O7DM{-i?&%%#v5=i`B599E4t(?BBp=c`pHxzTjmuV zJo?h^g6u_%zo!03<@3(hblgv~og6tWWm=t^o~#dlqVARvF2>m5cEv+)M5ar+!Xa!XuS)(Pv0r%^k2`TPWQdu;L4-Yv`&@tO_N>#1j|?8 zs9(M>H9`+MYZinoP47r8Oov9GcDG7zr{84vzat8{6-jsRz3|sQR)T)B`aiNVkRw(p z&md^H*3_3pd^Xm?`M|fF4u+`wJm1y&&}!OH$4@yq#4@1XUGXYqt~rd{$32@ZN#537 z=-%}k8&SAf{GQaWMapk$58H>GGF)T~0Iz5y%M|Jso)tKLH;zV0yQR%zw^1IGjhQ;% zfg;+-yo0p5*~U?VFiKN+5kPZ%mDPPtRZ|oWj%*!HN!P zqmQRN*52cnXWQeK#+K)6AOYjIvku0>1TyeCc)03JD4itkWa|i$8pWZP?RgwbrC9wl z5J9gGpKBku#QvR8g zGXN6Fd4K=o@gjc>&D)<;_vaSJc5{VNZpY|Y9Xd@2Y%4G2D&Orc`fSNQ-FjXpR2rIRU1KNru0sgLvfVe%5jgxfnW_D)phZ&h zu&RVbgMSmh6?n2K#ac8_?1ls`hWy!>@N3Ww7)>lzns5uvFY04&;;WM?0eCaZ#%FLK zueIs#ZJ|_^YU*k_?sIu{lr+!E6M0N2w*T%n8n^v`Vq0wDyLRjXofPTWm#nYIq1T)z zS}q-_=VdX?bEbQe-r<$<6xH9r?;a04%1jgX(!QH+vEFZ)Gx0=GF6=Vf~{QQpkjRwwBOBh)od`t=Z4y+IS*Q_hf~~0 z0@c(Chk~5g!PG&p#I-DuY4sBCz6eC$L-wWq&=ZOMhNLV|xRr77dA>G~GMk>2r+_^q zDQ@7pap2Lla@@_}{=;hCJN4fhUfV{|d_ybyP%oKa1bB>|$wnX>W*5zTaxWsb=PUSv zi!V9;k%`Pg1E8z(<9*Yt+EgDh&{Gur-bi2tisxFcp#CHuFH(3*;wI-F;^StFFOR7S zNKihZgvV9KFYWUiUGqqK0Xigp@VcsFsTpO(w(3;Ze+>7+q3#2j+Izs`=KJunkL}@}M~q`#hj)F^5&}17 zsa^&urk?2WGVab=cc^;NJs=rv7-;^ws2tOWwpY0kmgiad*o@^{Bg3*6w?C7!V#}E_ z1~s8V{d$dwB~dHxouYn!s7ou}%HJ-_9>T6~GO0s2SCqmgg-3mITz6uJ&njjnLzh_xbt+W&;b>~U;(u*tle9SaXmn-7M)81{(5mi@kYVM8zscf?5_0`g4 z&Cz8!Yc-$9pe-=-D08P@!I_)sWPNDY1L5`=)(72)P*hEs`wb^Sss z_TBw6$meLfvu|HMZ$92&=}4rl6Vu#UFD2ij+PFz(RV$Go-2FHz;voakE&BSBxm7H0 zU}!Il;TH_CHcY)&t$Jsgl-SHGd6{EcC83F0UuUmo_`&_+F<~!?>(Tc3p~w~{NX!WMu>D;G8l-&pZ1zr`$`HEHgE1gviPT)+Q#p`ZEj{uYyqrwx~* zh&;tuC=c4m@j614uHN6T10Rh!QP+k`l4d<>KJg`B)uVk<#d{^NU@SpevdO}~H$25* zq~1x}A+(>}i%d;XS;jlde%vT&h#o8dsNcDs{{{`sT} zJ9!*=4EX7KV+q@dLqXMR$Z_kq=htkB8__ev`JMwOKJa^e8J}Ox$@&NXp7(PYyB+1e zn4b?}i91;zwOw?T{x&2Wm=*nxEVbF{i|H#wyoHcGO`M3YayCPT+c&-GcNSFc_N$t2 z*vyob|2r1_NgbUA%eSqd-?nm*8Z~YszCd-N^k3xeN<@q6`AbEL&2 zrhgEQZ(Y9!bTb`i?-YIT?bGGgs6CE6LdR^&x8)`wq2=pBv)w|PNLmQAcS0fQr<8qo zV_tvCRo$XR`I2|s3s~3VuSLRbg}*yR!WlbKXH>6?T5N^Nb#8)YsA)&2GGA{$YAcH5 zqtaLMyH<+x76#-zdmqc|ZljDpom<0U-Ewe4UE6ESr=2N4?Nr{vfgP(Fqy^$bwP{bx zu5Fyofk=^@$9yN}jb1P8&SFO79W%Q8HrxMl#G#gD+Vn0k+0GRYyF&QoKq;R1Zc*E&ey$p549T^y{-#NVm$xfyA8~ z66R0CCX^v-=P+tqi}_k@5Gh|MI)`MKvS+Knn5`eODq; zT~{kVef*TQLl!F8{b$Jf&p1-@*F5gQg?*5(lZ52)E{EBkf#W(Q@2}^OYy4p+gMibwKb*4eB^631ADEG5el) zX(#;1;a4XaBLp7z2w6f5DV%xu$3yU&^P1RX)Y!Wd5tjys_x8-E6;EF`j<#D+*WJw3 z)n)xo_HHRw_QeV?XKI#mPIl|H2*~7*uI^Ae$xs6R+HevBPj6rmGbHvIe$Gq%Q?lVS zDf1%#zlWMo8=a+9TM2{aS~H;kUC78m8SR+evl?XkzELX>41WtNgC5(n?zR z_jO|k_(O*@%j6l+wK&s!51zMSkKSm<$r~NV&pA3WVIK^_;`Ymh`p2{uC7ZA59aky{ z(2s1lA{-v}Xn)HkJ}(?Jf0a4$MWg%1&e~i7)0a>iH6!dT&sv_)1ThBKEHgq9KWzIc z14Dz9{t4f!p43ItC$YY{hY&;qYSe;bz2}alyJQW8 zs(rNHr9*H)aaA+H-i!yK#9m1l>)h(2w{lIeU7d-hO=1yy8A;^mqoCzx(_yEH&Ecck zccJOgk`Xo__xf+}S0~N1`d1c7%W-*%;li5Ue4;2Q#pG+6iG_> zh>+d+&7rQX&n*dcLDe4&f6G07@*m4m~$8$>_xp7v?p2x0WFcFH=K09rAvUusXWXP;NBd@CybG#*1?Q%vV0hk_S z$W>0+s#K&t5cR%5iG}};yKCy5WMIrZt<~gpZj2xmPXs4ZdCGFl>aMiR)bW zWLLwKriJV~E3bT_A^JM495rPywmy`kkj`#nMv?R!4tIPqld|DU7h$ z(Y4(bg*@PYw${V+*#7;*)1nxh%1-*DXnHXn55_zODRtpQ=QijQR!g6pd|rif$?k5{ z`exn!m}U0;rz2M~BWc6MvL)Mcj5F>-Y#^p?f(jU;OPPZXd2IXSFGx`>=(P!6y<0m6 z*p{-_Vdq}l&h1>eW@|p=m)6HBPKsh_69L`>^5}O8gENM#ViJmFT?CUq^rgG9mPVo_ zu8it`%sIxJh(9Xue;ISYa*Q-euKZMbh`mvV31uk=P*{*)mPMT; zy;zUD$;En`iRYgDX_a!@n#(l)`EEg1NZ7qPoeV3Iv%o*bB?zXZ4~k5X{p9o#JN|6; z9NPD$!vg2euh0+InH9`6aSgG^VU?*b2y!TM3a3%`E(P9!C{(rLPgmflBZd$^&b5B^^=LC@_ggJcdkN z(+C>9;nKNmdwkve9G-DP&;H*l6WWmg04_%TewSp&*n*LE+3;*^g3ujpqKO?@TjhWH zhn2r3-^Qs6Pb__-)S<;!th)6s;PR*NPXDPpRao3FkJs=UIhV6{`bQ@CjjlQ1pv;!y zkJVKOo8A3I2Gw%;t5i;w}F)575E_wRn!8W1cTuQ==scpLJatQ-0|ox zj%Sd%k1+M~>yTQJ*ei17^LUecZ~jPp*KEF(Y)QupP@yyZ_}_Jes8r+UvzRvxObkaU z7rn+GTi+hV-tw9n6}`4Fl;QpKNmuDmvqlgI7J2^3Ri$KyLa*>KfbORJ%_LeXK*?K} zRrs}$V-+z1Y{<6J1Ri>zPBng7@V@|v5qIunDVv$ME{Zl#_`$`~*r_=^8cYV%@1(SG zxgjH}!kdz1Z=#~65D?|OAk&DpOLSCdNL@_bM8)ecD?oG7fWi6|4I&$qNSXS@BhmDw z>6@iMFofRO(}lC5*+aHQcA;Wjf>e}IXwmxd3cVM*Rml2@RNzy#bsgaA6_=CHs3;iN zDLB2GYU#`M-`7S!+XAj?P{%Q&vbq=Oqye*`aF^sto)Z}jL%b9jAEZy}rpos;OvVKT zNfilJIro&PYfQUPom;_u3YV(O2$?3CI95|G!9oMIphf*E(l?rK_JzWF zCO&B0m7zf*WejgiH^7$4E8)~xgVvVmA|9Yo2t75_6iAi4sGJ{+S}X(7YfdlrP4&n} zFX!OXV$6BuKops@iTq^aoo|#;nyT`GOB-FComLegNYrbT$ zSxkZ`-S=z4CrAl>#@NEaXR_ti*!We3K*w?+Kno3?t3V(qST|Ysq>iO2u|KMGP!j#p z(BU8*<6g?xJC*$m(Algk+Dck~U9qL;F*8>d>L_R`6I61Sti-=k?o%hHV&}{b?&mo> zvsDo?CJ}Qty;wUwTN&>TU`djfH zvd=r70QB3Qav{VLncB`S$7kF9*42jkpc<6z8rn0>j6mj7nBm(y0!z19&%FW!2@NGs z44a33t|8Ianpgxlh-nWGb9E|;evHQ;1Ts4-t+fE2Z)#{@bdN^qk^sIj3GTgHd3 zjh5*|IDK38hL}yxw7@U`bEd6ga767wIFewk=}6IWNNKRlQW?b-4Zi~)Jm*jtyVZ(h z0U(nP7Y3!zve-y)$}ms{%;Q71{Nbrl`+z#%Arwl^g)moL`cruRv74YerM0b~LBgtL z%q;$be-rUqcJ=Ou@)oE2D*#HqMS%_)S1GSMp6cRJF)a)pQHPMi7C&Tq@*D}+Wl)zy zh+&C53cl(pTz7sVzGe5_+`uQsZq?C)0k z8v66y4CVo;*MVFUQQgmB)-yAoo zJu-^)osM3$&5@GBKd_K!Q&lvX>E8@vjREM_HJ@wi`zYf4vnQ5;VFo_Wpz^7<*)(QG znL9(ximxUS+a=yseqr!gWaj5Cp@2%|z(|z_Xx#~3Ysl#)jTUm56OYmfdKs&|y@$WgL>KuT} zzX@KuQ{P0K1UJfBc9Ow3&8~Khd$x&~XGq(klf7Nn^4l>cZ)lfG@nRUh@l)iZw#H%U zGzYJBZ1`2@jMACCv02OFmogl254TbqX-tm#NyL;vAs_1YSg*BLdi>wMZLGD8v||lo z*F@$ypCo>8N1JmFb1c>%)67zscKczyw<2n0&r$xY?>YKn5BO>fFF**4-)E<+rfcXy zm}aprg{2pzM56#EhGJC*kui0?yf2C@@zPT==ZKC&W(fjO87Fx^pTpgl+Ad|+0`rtD$j^G&p z6CE{(8E<4szgfHn3Q>}(-0azHUnpdUJ=7oX&-thgb#u1=02L`qYifIE@wfB2&tWlBD(nmBwYo5!pD>e) z$YcA5rOEl*(X4Ym?Nz83lVj;cDbC`na4M9*f(h=?9@P&mrM!Oz@qpCe{{X;+rDA$q z^VBaUvFmg^mU&DnSL)fYY`KQ$p1rUT5f%b9iMrHRD~BJ982bz>9vj5#ta8UbO?YIq z&$ct_WLt^PNt;s6kk{D2{w70AvV`I-Xh8&Pw1dihYigvKK?%lmL5#bC%2fHHXJYtH z?{X3tX}-j$WAJ^DppPmvmb+Jlq>3t%LRDY3dNyIqJJdq54X`EqjYN}-28HRDN>I~` z?*9O@A+WV0#1Um^d)!Hz)xj`35u1G3Y@pL0eO+Ue6k-b87=wploAW*hXhQn!?QOuw zD;26$PwMhKTly2oELn|zL=&Fd)wG4D%KREFA88W-H$-|OWXHz=l~~s;VoLoL#DzLkvqp+9X^{#f>HyNHDe3R`I!$<7%jgtS~kfV5M?b^irZo+xW;4R z<`0>&9Xpn6X8vmVWeDJsdUg@zq>^4{wm(bd^_J?mnNxYldR(M)O%XH_9+v8_$Si8eY>YpOnQjEM?mH1~NM`_Df`5me5Oc;aK2&c(3XA}VUnB9>}FckwGJ zarAH&^=ku(KtROC$D8CUABbHgJ6uz4&&XbGQ;;s0`BK7JE%6*%+`b(+)8hmfJK~zR z*(milZOSY=#`^K<2&@EWyd5VvQgBj=(J9ekl$4gmo6ys_)&p;a)={S!qI(uZ(oGCy z_A62JXwPNhOx90HO&wZSkCfw#IeXW<0HLgU?x{mhj!w#Xokgs;v2v{hKZB$m^G~zA zF|?!TF*gnM&TJL;f+3+QDB-{r+jyOoj&nplG;*(MlkThJhK}iF|hgvaRf`au2?g6-)!V|<1sYQ8;dRiHC7^p zVqux1wr2H^Mf-1{cNJcXXd=Ozi&^dUhT|TP;nWVO4SOkpM?O2fsGU(>$kIsVHcS^Y z+#8E}nSiP*HocA!Q>HWgJGA12#-JU3cZPa;VCTDy$;mMFyscJ<4J^garg^Jg!M}1Q z5J!1RTbp%K+Pcr+fL-w}q8AArc3{tzGV?=&m&7*J+}--0tlaTGA9Tp=iZAJLbob{n zSl-XXjSR-8E^ZJlXIWGyVMs>Rs=`xQ;%&ri$~M0M6r9Q6ZPY~K=i8+3`b~Hfrnjw~ zjSe+)p*EiU(&N)~-@4c1iz+y=oO&wxmWsqDKqCj^UdZB@MV{x{2RRImvm`>_1GZqs+SRoTg%OXEFX7jXZyJZJI-E zv?x^I>^FPD;vM7fM4}y<-@)diGhs0o8BWJWp%7`VD333OZdlJmF0?hG_bECkezas0 z*dLP0?>vdSIjV2vyJC~>_m49X^0b>pifuCmO1qPqPC5m|gOhO1{{T7XXSEZQ*#v{m zH9mh5E8l%rM%ns#Y<<%=gjUEx5X3VzpTgb|QGr#C+w!Jee;w{Gi=ve#5DW(@CrX`Z z&8agerF41sfK5f33M~$DH;PLj48?4xqBdW~SO5L+s zY+gg1CnnL6AdEa2oes0U6$-Ac5L3Z;%sSbt53m0KI=kwnZTP=4b@=g*@0z7ompaq^ zTQ+dF+@zfN-U%8DkCs(W04G?b%rPEmC0yn;x&Hv#^t3KMq?T6?nT^cOPAXlahhG|mb#RqYXhP6^sU4j9R zm$~W3X`jlCBbDuPyA#ApA7C9jEce$!U*&V)#dw>aOju0Ty}ujOLbtxGVtvKkFSKaS44@<2TAT3d9 zFBs-dC+Ei0$?i{{X-Hetu6}G4r>3wf_JN@=RR3E2IAQ zE@SMo+ya?8sc`~#-P>9Z4x!Sc%@=#{OsV%&7qsDvG6|@Vbdc{hT)k>X#d%Aadk!j diff --git a/object_detection/g3doc/img/groupof_case_eval.png b/object_detection/g3doc/img/groupof_case_eval.png deleted file mode 100644 index 5abc9b6984fb5816ca4f2e6f40e38ec6e6ea9cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242500 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 pDvuR0c~Z)CG{$O>U~P2V;SLtQvV0tDj{F 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

    8m^u+ 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�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%0Dx%Y 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 diff --git a/object_detection/g3doc/img/nongroupof_case_eval.png b/object_detection/g3doc/img/nongroupof_case_eval.png deleted file mode 100644 index cbb76f493adfa725cd0b2ab323f89fdfc57a57ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265455 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�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

    qx0M$w$9 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 w7X7haO|(&TF@M`Qjx9H*d0D>z=;|ET%Ig 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

    7%+C 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

    C!MaG67K*ts+Dm8cEQy$PmHSvj*c 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 diff --git a/object_detection/g3doc/img/oid_monkey_3b4168c89cecbc5b.jpg b/object_detection/g3doc/img/oid_monkey_3b4168c89cecbc5b.jpg deleted file mode 100644 index 46b1fb282a428fe1169a7ff1d30e963bc085e733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281143 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

    8rW|*Bt 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%0Dc_u$+g$b=*Z>EDuQ&9cQRQfrS>R{lV!T>n+{B~ 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 -Ua|+z6UTJIdeuwN>X}WkCZ9lUg$ocEz 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 Y0Q%Mbh=G$*_{W8bSq27 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