From 0fd78c2ec66dda15e5acc2ae14c15347f6b86e40 Mon Sep 17 00:00:00 2001 From: kinaryml Date: Tue, 8 Nov 2022 10:28:24 -0800 Subject: [PATCH 01/21] Updated classifier python tasks to use the new classification_result dataclass --- .../tasks/python/components/containers/BUILD | 11 +- .../containers/classification_result.py | 31 ++++ .../components/containers/classifications.py | 168 ------------------ mediapipe/tasks/python/test/text/BUILD | 2 +- .../python/test/text/text_classifier_test.py | 136 +++++++------- mediapipe/tasks/python/test/vision/BUILD | 2 +- .../test/vision/image_classifier_test.py | 151 +++++++--------- mediapipe/tasks/python/text/BUILD | 2 +- .../tasks/python/text/text_classifier.py | 19 +- mediapipe/tasks/python/vision/BUILD | 2 +- .../tasks/python/vision/image_classifier.py | 47 ++--- 11 files changed, 191 insertions(+), 380 deletions(-) delete mode 100644 mediapipe/tasks/python/components/containers/classifications.py diff --git a/mediapipe/tasks/python/components/containers/BUILD b/mediapipe/tasks/python/components/containers/BUILD index 9e0a90911..b02021acd 100644 --- a/mediapipe/tasks/python/components/containers/BUILD +++ b/mediapipe/tasks/python/components/containers/BUILD @@ -85,21 +85,12 @@ py_library( ], ) -py_library( - name = "classifications", - srcs = ["classifications.py"], - deps = [ - ":category", - "//mediapipe/tasks/cc/components/containers/proto:classifications_py_pb2", - "//mediapipe/tasks/python/core:optional_dependencies", - ], -) - py_library( name = "classification_result", srcs = ["classification_result.py"], deps = [ ":category", + "//mediapipe/framework/formats:classification_py_pb2", "//mediapipe/tasks/cc/components/containers/proto:classifications_py_pb2", "//mediapipe/tasks/python/core:optional_dependencies", ], diff --git a/mediapipe/tasks/python/components/containers/classification_result.py b/mediapipe/tasks/python/components/containers/classification_result.py index cc25fc708..20dc6991a 100644 --- a/mediapipe/tasks/python/components/containers/classification_result.py +++ b/mediapipe/tasks/python/components/containers/classification_result.py @@ -16,10 +16,13 @@ import dataclasses from typing import List, Optional +from mediapipe.framework.formats import classification_pb2 from mediapipe.tasks.cc.components.containers.proto import classifications_pb2 from mediapipe.tasks.python.components.containers import category as category_module from mediapipe.tasks.python.core.optional_dependencies import doc_controls +_ClassificationProto = classification_pb2.Classification +_ClassificationListProto = classification_pb2.ClassificationList _ClassificationsProto = classifications_pb2.Classifications _ClassificationResultProto = classifications_pb2.ClassificationResult @@ -41,6 +44,24 @@ class Classifications: head_index: int head_name: Optional[str] = None + @doc_controls.do_not_generate_docs + def to_pb2(self) -> _ClassificationsProto: + """Generates a Classifications protobuf object.""" + classification_list_proto = _ClassificationListProto() + classification_list_proto.classification.extend([ + _ClassificationProto( + index=category.index, + score=category.score, + label=category.category_name, + display_name=category.display_name + ) + for category in self.categories + ]) + return _ClassificationsProto( + classification_list=classification_list_proto, + head_index=self.head_index, + head_name=self.head_name) + @classmethod @doc_controls.do_not_generate_docs def create_from_pb2(cls, pb2_obj: _ClassificationsProto) -> 'Classifications': @@ -78,6 +99,16 @@ class ClassificationResult: classifications: List[Classifications] timestamp_ms: Optional[int] = None + @doc_controls.do_not_generate_docs + def to_pb2(self) -> _ClassificationResultProto: + """Generates a ClassificationResult protobuf object.""" + return _ClassificationResultProto( + classifications=[ + classification.to_pb2() + for classification in self.classifications + ], + timestamp_ms=self.timestamp_ms) + @classmethod @doc_controls.do_not_generate_docs def create_from_pb2( diff --git a/mediapipe/tasks/python/components/containers/classifications.py b/mediapipe/tasks/python/components/containers/classifications.py deleted file mode 100644 index 90ab22614..000000000 --- a/mediapipe/tasks/python/components/containers/classifications.py +++ /dev/null @@ -1,168 +0,0 @@ -# Copyright 2022 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. -"""Classifications data class.""" - -import dataclasses -from typing import Any, List, Optional - -from mediapipe.tasks.cc.components.containers.proto import classifications_pb2 -from mediapipe.tasks.python.components.containers import category as category_module -from mediapipe.tasks.python.core.optional_dependencies import doc_controls - -_ClassificationEntryProto = classifications_pb2.ClassificationEntry -_ClassificationsProto = classifications_pb2.Classifications -_ClassificationResultProto = classifications_pb2.ClassificationResult - - -@dataclasses.dataclass -class ClassificationEntry: - """List of predicted classes (aka labels) for a given classifier head. - - Attributes: - categories: The array of predicted categories, usually sorted by descending - scores (e.g. from high to low probability). - timestamp_ms: The optional timestamp (in milliseconds) associated to the - classification entry. This is useful for time series use cases, e.g., - audio classification. - """ - - categories: List[category_module.Category] - timestamp_ms: Optional[int] = None - - @doc_controls.do_not_generate_docs - def to_pb2(self) -> _ClassificationEntryProto: - """Generates a ClassificationEntry protobuf object.""" - return _ClassificationEntryProto( - categories=[category.to_pb2() for category in self.categories], - timestamp_ms=self.timestamp_ms) - - @classmethod - @doc_controls.do_not_generate_docs - def create_from_pb2( - cls, pb2_obj: _ClassificationEntryProto) -> 'ClassificationEntry': - """Creates a `ClassificationEntry` object from the given protobuf object.""" - return ClassificationEntry( - categories=[ - category_module.Category.create_from_pb2(category) - for category in pb2_obj.categories - ], - timestamp_ms=pb2_obj.timestamp_ms) - - def __eq__(self, other: Any) -> bool: - """Checks if this object is equal to the given object. - - Args: - other: The object to be compared with. - - Returns: - True if the objects are equal. - """ - if not isinstance(other, ClassificationEntry): - return False - - return self.to_pb2().__eq__(other.to_pb2()) - - -@dataclasses.dataclass -class Classifications: - """Represents the classifications for a given classifier head. - - Attributes: - entries: A list of `ClassificationEntry` objects. - head_index: The index of the classifier head these categories refer to. This - is useful for multi-head models. - head_name: The name of the classifier head, which is the corresponding - tensor metadata name. - """ - - entries: List[ClassificationEntry] - head_index: int - head_name: str - - @doc_controls.do_not_generate_docs - def to_pb2(self) -> _ClassificationsProto: - """Generates a Classifications protobuf object.""" - return _ClassificationsProto( - entries=[entry.to_pb2() for entry in self.entries], - head_index=self.head_index, - head_name=self.head_name) - - @classmethod - @doc_controls.do_not_generate_docs - def create_from_pb2(cls, pb2_obj: _ClassificationsProto) -> 'Classifications': - """Creates a `Classifications` object from the given protobuf object.""" - return Classifications( - entries=[ - ClassificationEntry.create_from_pb2(entry) - for entry in pb2_obj.entries - ], - head_index=pb2_obj.head_index, - head_name=pb2_obj.head_name) - - def __eq__(self, other: Any) -> bool: - """Checks if this object is equal to the given object. - - Args: - other: The object to be compared with. - - Returns: - True if the objects are equal. - """ - if not isinstance(other, Classifications): - return False - - return self.to_pb2().__eq__(other.to_pb2()) - - -@dataclasses.dataclass -class ClassificationResult: - """Contains one set of results per classifier head. - - Attributes: - classifications: A list of `Classifications` objects. - """ - - classifications: List[Classifications] - - @doc_controls.do_not_generate_docs - def to_pb2(self) -> _ClassificationResultProto: - """Generates a ClassificationResult protobuf object.""" - return _ClassificationResultProto(classifications=[ - classification.to_pb2() for classification in self.classifications - ]) - - @classmethod - @doc_controls.do_not_generate_docs - def create_from_pb2( - cls, pb2_obj: _ClassificationResultProto) -> 'ClassificationResult': - """Creates a `ClassificationResult` object from the given protobuf object. - """ - return ClassificationResult(classifications=[ - Classifications.create_from_pb2(classification) - for classification in pb2_obj.classifications - ]) - - def __eq__(self, other: Any) -> bool: - """Checks if this object is equal to the given object. - - Args: - other: The object to be compared with. - - Returns: - True if the objects are equal. - """ - if not isinstance(other, ClassificationResult): - return False - - return self.to_pb2().__eq__(other.to_pb2()) diff --git a/mediapipe/tasks/python/test/text/BUILD b/mediapipe/tasks/python/test/text/BUILD index d7176b0a5..f12c20bc4 100644 --- a/mediapipe/tasks/python/test/text/BUILD +++ b/mediapipe/tasks/python/test/text/BUILD @@ -27,7 +27,7 @@ py_test( ], deps = [ "//mediapipe/tasks/python/components/containers:category", - "//mediapipe/tasks/python/components/containers:classifications", + "//mediapipe/tasks/python/components/containers:classification_result", "//mediapipe/tasks/python/components/processors:classifier_options", "//mediapipe/tasks/python/core:base_options", "//mediapipe/tasks/python/test:test_utils", diff --git a/mediapipe/tasks/python/test/text/text_classifier_test.py b/mediapipe/tasks/python/test/text/text_classifier_test.py index c93def48e..d9221e503 100644 --- a/mediapipe/tasks/python/test/text/text_classifier_test.py +++ b/mediapipe/tasks/python/test/text/text_classifier_test.py @@ -20,18 +20,17 @@ from absl.testing import absltest from absl.testing import parameterized from mediapipe.tasks.python.components.containers import category -from mediapipe.tasks.python.components.containers import classifications as classifications_module +from mediapipe.tasks.python.components.containers import classification_result as classification_result_module from mediapipe.tasks.python.components.processors import classifier_options from mediapipe.tasks.python.core import base_options as base_options_module from mediapipe.tasks.python.test import test_utils from mediapipe.tasks.python.text import text_classifier +TextClassifierResult = classification_result_module.ClassificationResult _BaseOptions = base_options_module.BaseOptions _ClassifierOptions = classifier_options.ClassifierOptions _Category = category.Category -_ClassificationEntry = classifications_module.ClassificationEntry -_Classifications = classifications_module.Classifications -_TextClassifierResult = classifications_module.ClassificationResult +_Classifications = classification_result_module.Classifications _TextClassifier = text_classifier.TextClassifier _TextClassifierOptions = text_classifier.TextClassifierOptions @@ -43,90 +42,75 @@ _NEGATIVE_TEXT = 'What a waste of my time.' _POSITIVE_TEXT = ('This is the best movie I’ve seen in recent years.' 'Strongly recommend it!') -_BERT_NEGATIVE_RESULTS = _TextClassifierResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry( - categories=[ - _Category( - index=0, - score=0.999479, - display_name='', - category_name='negative'), - _Category( - index=1, - score=0.00052154, - display_name='', - category_name='positive') - ], - timestamp_ms=0) + +_BERT_NEGATIVE_RESULTS = TextClassifierResult(classifications=[ + _Classifications(categories=[ + _Category( + index=0, + score=0.999479, + display_name='', + category_name='negative'), + _Category( + index=1, + score=0.00052154, + display_name='', + category_name='positive') ], head_index=0, head_name='probability') -]) -_BERT_POSITIVE_RESULTS = _TextClassifierResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry( - categories=[ - _Category( - index=1, - score=0.999466, - display_name='', - category_name='positive'), - _Category( - index=0, - score=0.000533596, - display_name='', - category_name='negative') - ], - timestamp_ms=0) + ], + timestamp_ms=0) +_BERT_POSITIVE_RESULTS = TextClassifierResult(classifications=[ + _Classifications(categories=[ + _Category( + index=1, + score=0.999466, + display_name='', + category_name='positive'), + _Category( + index=0, + score=0.000533596, + display_name='', + category_name='negative') ], head_index=0, head_name='probability') -]) -_REGEX_NEGATIVE_RESULTS = _TextClassifierResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry( - categories=[ - _Category( - index=0, - score=0.81313, - display_name='', - category_name='Negative'), - _Category( - index=1, - score=0.1868704, - display_name='', - category_name='Positive') - ], - timestamp_ms=0) + ], + timestamp_ms=0) +_REGEX_NEGATIVE_RESULTS = TextClassifierResult(classifications=[ + _Classifications(categories=[ + _Category( + index=0, + score=0.81313, + display_name='', + category_name='Negative'), + _Category( + index=1, + score=0.1868704, + display_name='', + category_name='Positive') ], head_index=0, head_name='probability') -]) -_REGEX_POSITIVE_RESULTS = _TextClassifierResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry( - categories=[ - _Category( - index=1, - score=0.5134273, - display_name='', - category_name='Positive'), - _Category( - index=0, - score=0.486573, - display_name='', - category_name='Negative') - ], - timestamp_ms=0) + ], + timestamp_ms=0) +_REGEX_POSITIVE_RESULTS = TextClassifierResult(classifications=[ + _Classifications(categories=[ + _Category( + index=1, + score=0.5134273, + display_name='', + category_name='Positive'), + _Category( + index=0, + score=0.486573, + display_name='', + category_name='Negative') ], head_index=0, head_name='probability') -]) + ], + timestamp_ms=0) class ModelFileType(enum.Enum): diff --git a/mediapipe/tasks/python/test/vision/BUILD b/mediapipe/tasks/python/test/vision/BUILD index c29648160..1ea5f5b7d 100644 --- a/mediapipe/tasks/python/test/vision/BUILD +++ b/mediapipe/tasks/python/test/vision/BUILD @@ -47,7 +47,7 @@ py_test( deps = [ "//mediapipe/python:_framework_bindings", "//mediapipe/tasks/python/components/containers:category", - "//mediapipe/tasks/python/components/containers:classifications", + "//mediapipe/tasks/python/components/containers:classification_result", "//mediapipe/tasks/python/components/containers:rect", "//mediapipe/tasks/python/components/processors:classifier_options", "//mediapipe/tasks/python/core:base_options", diff --git a/mediapipe/tasks/python/test/vision/image_classifier_test.py b/mediapipe/tasks/python/test/vision/image_classifier_test.py index 11941ce23..1f4d39ec7 100644 --- a/mediapipe/tasks/python/test/vision/image_classifier_test.py +++ b/mediapipe/tasks/python/test/vision/image_classifier_test.py @@ -23,8 +23,8 @@ from absl.testing import parameterized import numpy as np from mediapipe.python._framework_bindings import image -from mediapipe.tasks.python.components.containers import category -from mediapipe.tasks.python.components.containers import classifications as classifications_module +from mediapipe.tasks.python.components.containers import category as category_module +from mediapipe.tasks.python.components.containers import classification_result as classification_result_module from mediapipe.tasks.python.components.containers import rect from mediapipe.tasks.python.components.processors import classifier_options from mediapipe.tasks.python.core import base_options as base_options_module @@ -33,13 +33,12 @@ from mediapipe.tasks.python.vision import image_classifier from mediapipe.tasks.python.vision.core import image_processing_options as image_processing_options_module from mediapipe.tasks.python.vision.core import vision_task_running_mode +ImageClassifierResult = classification_result_module.ClassificationResult _Rect = rect.Rect _BaseOptions = base_options_module.BaseOptions _ClassifierOptions = classifier_options.ClassifierOptions -_Category = category.Category -_ClassificationEntry = classifications_module.ClassificationEntry -_Classifications = classifications_module.Classifications -_ClassificationResult = classifications_module.ClassificationResult +_Category = category_module.Category +_Classifications = classification_result_module.Classifications _Image = image.Image _ImageClassifier = image_classifier.ImageClassifier _ImageClassifierOptions = image_classifier.ImageClassifierOptions @@ -55,68 +54,56 @@ _MAX_RESULTS = 3 _TEST_DATA_DIR = 'mediapipe/tasks/testdata/vision' -def _generate_empty_results(timestamp_ms: int) -> _ClassificationResult: - return _ClassificationResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry(categories=[], timestamp_ms=timestamp_ms) +def _generate_empty_results() -> ImageClassifierResult: + return ImageClassifierResult(classifications=[ + _Classifications(categories=[], head_index=0, head_name='probability') + ], + timestamp_ms=0) + + +def _generate_burger_results() -> ImageClassifierResult: + return ImageClassifierResult(classifications=[ + _Classifications(categories=[ + _Category( + index=934, + score=0.793959, + display_name='', + category_name='cheeseburger'), + _Category( + index=932, + score=0.0273929, + display_name='', + category_name='bagel'), + _Category( + index=925, + score=0.0193408, + display_name='', + category_name='guacamole'), + _Category( + index=963, + score=0.00632786, + display_name='', + category_name='meat loaf') ], head_index=0, head_name='probability') - ]) + ], + timestamp_ms=0) -def _generate_burger_results(timestamp_ms: int) -> _ClassificationResult: - return _ClassificationResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry( - categories=[ - _Category( - index=934, - score=0.793959, - display_name='', - category_name='cheeseburger'), - _Category( - index=932, - score=0.0273929, - display_name='', - category_name='bagel'), - _Category( - index=925, - score=0.0193408, - display_name='', - category_name='guacamole'), - _Category( - index=963, - score=0.00632786, - display_name='', - category_name='meat loaf') - ], - timestamp_ms=timestamp_ms) +def _generate_soccer_ball_results() -> ImageClassifierResult: + return ImageClassifierResult(classifications=[ + _Classifications(categories=[ + _Category( + index=806, + score=0.996527, + display_name='', + category_name='soccer ball') ], head_index=0, head_name='probability') - ]) - - -def _generate_soccer_ball_results(timestamp_ms: int) -> _ClassificationResult: - return _ClassificationResult(classifications=[ - _Classifications( - entries=[ - _ClassificationEntry( - categories=[ - _Category( - index=806, - score=0.996527, - display_name='', - category_name='soccer ball') - ], - timestamp_ms=timestamp_ms) - ], - head_index=0, - head_name='probability') - ]) + ], + timestamp_ms=0) class ModelFileType(enum.Enum): @@ -165,8 +152,8 @@ class ImageClassifierTest(parameterized.TestCase): self.assertIsInstance(classifier, _ImageClassifier) @parameterized.parameters( - (ModelFileType.FILE_NAME, 4, _generate_burger_results(0)), - (ModelFileType.FILE_CONTENT, 4, _generate_burger_results(0))) + (ModelFileType.FILE_NAME, 4, _generate_burger_results()), + (ModelFileType.FILE_CONTENT, 4, _generate_burger_results())) def test_classify(self, model_file_type, max_results, expected_classification_result): # Creates classifier. @@ -195,8 +182,8 @@ class ImageClassifierTest(parameterized.TestCase): classifier.close() @parameterized.parameters( - (ModelFileType.FILE_NAME, 4, _generate_burger_results(0)), - (ModelFileType.FILE_CONTENT, 4, _generate_burger_results(0))) + (ModelFileType.FILE_NAME, 4, _generate_burger_results()), + (ModelFileType.FILE_CONTENT, 4, _generate_burger_results())) def test_classify_in_context(self, model_file_type, max_results, expected_classification_result): if model_file_type is ModelFileType.FILE_NAME: @@ -236,7 +223,7 @@ class ImageClassifierTest(parameterized.TestCase): image_result = classifier.classify(test_image, image_processing_options) # Comparing results. test_utils.assert_proto_equals(self, image_result.to_pb2(), - _generate_soccer_ball_results(0).to_pb2()) + _generate_soccer_ball_results().to_pb2()) def test_score_threshold_option(self): custom_classifier_options = _ClassifierOptions( @@ -250,8 +237,8 @@ class ImageClassifierTest(parameterized.TestCase): classifications = image_result.classifications for classification in classifications: - for entry in classification.entries: - score = entry.categories[0].score + for category in classification.categories: + score = category.score self.assertGreaterEqual( score, _SCORE_THRESHOLD, f'Classification with score lower than threshold found. ' @@ -266,7 +253,7 @@ class ImageClassifierTest(parameterized.TestCase): with _ImageClassifier.create_from_options(options) as classifier: # Performs image classification on the input. image_result = classifier.classify(self.test_image) - categories = image_result.classifications[0].entries[0].categories + categories = image_result.classifications[0].categories self.assertLessEqual( len(categories), _MAX_RESULTS, 'Too many results returned.') @@ -283,8 +270,8 @@ class ImageClassifierTest(parameterized.TestCase): classifications = image_result.classifications for classification in classifications: - for entry in classification.entries: - label = entry.categories[0].category_name + for category in classification.categories: + label = category.category_name self.assertIn(label, _ALLOW_LIST, f'Label {label} found but not in label allow list') @@ -299,8 +286,8 @@ class ImageClassifierTest(parameterized.TestCase): classifications = image_result.classifications for classification in classifications: - for entry in classification.entries: - label = entry.categories[0].category_name + for category in classification.categories: + label = category.category_name self.assertNotIn(label, _DENY_LIST, f'Label {label} found but in deny list.') @@ -326,7 +313,7 @@ class ImageClassifierTest(parameterized.TestCase): with _ImageClassifier.create_from_options(options) as classifier: # Performs image classification on the input. image_result = classifier.classify(self.test_image) - self.assertEmpty(image_result.classifications[0].entries[0].categories) + self.assertEmpty(image_result.classifications[0].categories) def test_missing_result_callback(self): options = _ImageClassifierOptions( @@ -406,7 +393,7 @@ class ImageClassifierTest(parameterized.TestCase): self.test_image, timestamp) test_utils.assert_proto_equals( self, classification_result.to_pb2(), - _generate_burger_results(timestamp).to_pb2()) + _generate_burger_results().to_pb2()) def test_classify_for_video_succeeds_with_region_of_interest(self): custom_classifier_options = _ClassifierOptions(max_results=1) @@ -427,7 +414,7 @@ class ImageClassifierTest(parameterized.TestCase): test_image, timestamp, image_processing_options) test_utils.assert_proto_equals( self, classification_result.to_pb2(), - _generate_soccer_ball_results(timestamp).to_pb2()) + _generate_soccer_ball_results().to_pb2()) def test_calling_classify_in_live_stream_mode(self): options = _ImageClassifierOptions( @@ -462,15 +449,15 @@ class ImageClassifierTest(parameterized.TestCase): ValueError, r'Input timestamp must be monotonically increasing'): classifier.classify_async(self.test_image, 0) - @parameterized.parameters((0, _generate_burger_results), - (1, _generate_empty_results)) - def test_classify_async_calls(self, threshold, expected_result_fn): + @parameterized.parameters((0, _generate_burger_results()), + (1, _generate_empty_results())) + def test_classify_async_calls(self, threshold, expected_result): observed_timestamp_ms = -1 - def check_result(result: _ClassificationResult, output_image: _Image, + def check_result(result: ImageClassifierResult, output_image: _Image, timestamp_ms: int): test_utils.assert_proto_equals(self, result.to_pb2(), - expected_result_fn(timestamp_ms).to_pb2()) + expected_result.to_pb2()) self.assertTrue( np.array_equal(output_image.numpy_view(), self.test_image.numpy_view())) @@ -498,11 +485,11 @@ class ImageClassifierTest(parameterized.TestCase): image_processing_options = _ImageProcessingOptions(roi) observed_timestamp_ms = -1 - def check_result(result: _ClassificationResult, output_image: _Image, + def check_result(result: ImageClassifierResult, output_image: _Image, timestamp_ms: int): test_utils.assert_proto_equals( self, result.to_pb2(), - _generate_soccer_ball_results(timestamp_ms).to_pb2()) + _generate_soccer_ball_results().to_pb2()) self.assertEqual(output_image.width, test_image.width) self.assertEqual(output_image.height, test_image.height) self.assertLess(observed_timestamp_ms, timestamp_ms) diff --git a/mediapipe/tasks/python/text/BUILD b/mediapipe/tasks/python/text/BUILD index fd5d701b4..c7278ecb8 100644 --- a/mediapipe/tasks/python/text/BUILD +++ b/mediapipe/tasks/python/text/BUILD @@ -28,7 +28,7 @@ py_library( "//mediapipe/python:packet_getter", "//mediapipe/tasks/cc/components/containers/proto:classifications_py_pb2", "//mediapipe/tasks/cc/text/text_classifier/proto:text_classifier_graph_options_py_pb2", - "//mediapipe/tasks/python/components/containers:classifications", + "//mediapipe/tasks/python/components/containers:classification_result", "//mediapipe/tasks/python/components/processors:classifier_options", "//mediapipe/tasks/python/core:base_options", "//mediapipe/tasks/python/core:optional_dependencies", diff --git a/mediapipe/tasks/python/text/text_classifier.py b/mediapipe/tasks/python/text/text_classifier.py index 1e230ee20..d4259d121 100644 --- a/mediapipe/tasks/python/text/text_classifier.py +++ b/mediapipe/tasks/python/text/text_classifier.py @@ -19,21 +19,21 @@ from mediapipe.python import packet_creator from mediapipe.python import packet_getter from mediapipe.tasks.cc.components.containers.proto import classifications_pb2 from mediapipe.tasks.cc.text.text_classifier.proto import text_classifier_graph_options_pb2 -from mediapipe.tasks.python.components.containers import classifications +from mediapipe.tasks.python.components.containers import classification_result as classification_result_module from mediapipe.tasks.python.components.processors import classifier_options from mediapipe.tasks.python.core import base_options as base_options_module from mediapipe.tasks.python.core import task_info as task_info_module from mediapipe.tasks.python.core.optional_dependencies import doc_controls from mediapipe.tasks.python.text.core import base_text_task_api -TextClassifierResult = classifications.ClassificationResult +TextClassifierResult = classification_result_module.ClassificationResult _BaseOptions = base_options_module.BaseOptions _TextClassifierGraphOptionsProto = text_classifier_graph_options_pb2.TextClassifierGraphOptions _ClassifierOptions = classifier_options.ClassifierOptions _TaskInfo = task_info_module.TaskInfo -_CLASSIFICATION_RESULT_OUT_STREAM_NAME = 'classification_result_out' -_CLASSIFICATION_RESULT_TAG = 'CLASSIFICATION_RESULT' +_CLASSIFICATIONS_STREAM_NAME = 'classifications_out' +_CLASSIFICATIONS_TAG = 'CLASSIFICATIONS' _TEXT_IN_STREAM_NAME = 'text_in' _TEXT_TAG = 'TEXT' _TASK_GRAPH_NAME = 'mediapipe.tasks.text.text_classifier.TextClassifierGraph' @@ -105,8 +105,8 @@ class TextClassifier(base_text_task_api.BaseTextTaskApi): input_streams=[':'.join([_TEXT_TAG, _TEXT_IN_STREAM_NAME])], output_streams=[ ':'.join([ - _CLASSIFICATION_RESULT_TAG, - _CLASSIFICATION_RESULT_OUT_STREAM_NAME + _CLASSIFICATIONS_TAG, + _CLASSIFICATIONS_STREAM_NAME ]) ], task_options=options) @@ -132,9 +132,6 @@ class TextClassifier(base_text_task_api.BaseTextTaskApi): classification_result_proto = classifications_pb2.ClassificationResult() classification_result_proto.CopyFrom( packet_getter.get_proto( - output_packets[_CLASSIFICATION_RESULT_OUT_STREAM_NAME])) + output_packets[_CLASSIFICATIONS_STREAM_NAME])) - return TextClassifierResult([ - classifications.Classifications.create_from_pb2(classification) - for classification in classification_result_proto.classifications - ]) + return TextClassifierResult.create_from_pb2(classification_result_proto) diff --git a/mediapipe/tasks/python/vision/BUILD b/mediapipe/tasks/python/vision/BUILD index 527c6d883..9b4e0ef1b 100644 --- a/mediapipe/tasks/python/vision/BUILD +++ b/mediapipe/tasks/python/vision/BUILD @@ -48,7 +48,7 @@ py_library( "//mediapipe/python:packet_getter", "//mediapipe/tasks/cc/components/containers/proto:classifications_py_pb2", "//mediapipe/tasks/cc/vision/image_classifier/proto:image_classifier_graph_options_py_pb2", - "//mediapipe/tasks/python/components/containers:classifications", + "//mediapipe/tasks/python/components/containers:classification_result", "//mediapipe/tasks/python/components/containers:rect", "//mediapipe/tasks/python/components/processors:classifier_options", "//mediapipe/tasks/python/core:base_options", diff --git a/mediapipe/tasks/python/vision/image_classifier.py b/mediapipe/tasks/python/vision/image_classifier.py index 02819ddf1..377d3fdcb 100644 --- a/mediapipe/tasks/python/vision/image_classifier.py +++ b/mediapipe/tasks/python/vision/image_classifier.py @@ -23,7 +23,7 @@ from mediapipe.python._framework_bindings import image as image_module from mediapipe.python._framework_bindings import packet from mediapipe.tasks.cc.components.containers.proto import classifications_pb2 from mediapipe.tasks.cc.vision.image_classifier.proto import image_classifier_graph_options_pb2 -from mediapipe.tasks.python.components.containers import classifications +from mediapipe.tasks.python.components.containers import classification_result as classification_result_module from mediapipe.tasks.python.components.containers import rect from mediapipe.tasks.python.components.processors import classifier_options from mediapipe.tasks.python.core import base_options as base_options_module @@ -33,6 +33,7 @@ from mediapipe.tasks.python.vision.core import base_vision_task_api from mediapipe.tasks.python.vision.core import image_processing_options as image_processing_options_module from mediapipe.tasks.python.vision.core import vision_task_running_mode +ImageClassifierResult = classification_result_module.ClassificationResult _NormalizedRect = rect.NormalizedRect _BaseOptions = base_options_module.BaseOptions _ImageClassifierGraphOptionsProto = image_classifier_graph_options_pb2.ImageClassifierGraphOptions @@ -41,8 +42,8 @@ _RunningMode = vision_task_running_mode.VisionTaskRunningMode _ImageProcessingOptions = image_processing_options_module.ImageProcessingOptions _TaskInfo = task_info_module.TaskInfo -_CLASSIFICATION_RESULT_OUT_STREAM_NAME = 'classification_result_out' -_CLASSIFICATION_RESULT_TAG = 'CLASSIFICATION_RESULT' +_CLASSIFICATIONS_STREAM_NAME = 'classifications_out' +_CLASSIFICATIONS_TAG = 'CLASSIFICATIONS' _IMAGE_IN_STREAM_NAME = 'image_in' _IMAGE_OUT_STREAM_NAME = 'image_out' _IMAGE_TAG = 'IMAGE' @@ -72,7 +73,7 @@ class ImageClassifierOptions: running_mode: _RunningMode = _RunningMode.IMAGE classifier_options: _ClassifierOptions = _ClassifierOptions() result_callback: Optional[ - Callable[[classifications.ClassificationResult, image_module.Image, int], + Callable[[ImageClassifierResult, image_module.Image, int], None]] = None @doc_controls.do_not_generate_docs @@ -137,17 +138,13 @@ class ImageClassifier(base_vision_task_api.BaseVisionTaskApi): classification_result_proto = classifications_pb2.ClassificationResult() classification_result_proto.CopyFrom( - packet_getter.get_proto( - output_packets[_CLASSIFICATION_RESULT_OUT_STREAM_NAME])) - - classification_result = classifications.ClassificationResult([ - classifications.Classifications.create_from_pb2(classification) - for classification in classification_result_proto.classifications - ]) + packet_getter.get_proto(output_packets[_CLASSIFICATIONS_STREAM_NAME])) image = packet_getter.get_image(output_packets[_IMAGE_OUT_STREAM_NAME]) timestamp = output_packets[_IMAGE_OUT_STREAM_NAME].timestamp - options.result_callback(classification_result, image, - timestamp.value // _MICRO_SECONDS_PER_MILLISECOND) + options.result_callback( + ImageClassifierResult.create_from_pb2(classification_result_proto), + image, + timestamp.value // _MICRO_SECONDS_PER_MILLISECOND) task_info = _TaskInfo( task_graph=_TASK_GRAPH_NAME, @@ -157,8 +154,8 @@ class ImageClassifier(base_vision_task_api.BaseVisionTaskApi): ], output_streams=[ ':'.join([ - _CLASSIFICATION_RESULT_TAG, - _CLASSIFICATION_RESULT_OUT_STREAM_NAME + _CLASSIFICATIONS_TAG, + _CLASSIFICATIONS_STREAM_NAME ]), ':'.join([_IMAGE_TAG, _IMAGE_OUT_STREAM_NAME]) ], task_options=options) @@ -172,7 +169,7 @@ class ImageClassifier(base_vision_task_api.BaseVisionTaskApi): self, image: image_module.Image, image_processing_options: Optional[_ImageProcessingOptions] = None - ) -> classifications.ClassificationResult: + ) -> ImageClassifierResult: """Performs image classification on the provided MediaPipe Image. Args: @@ -196,20 +193,16 @@ class ImageClassifier(base_vision_task_api.BaseVisionTaskApi): classification_result_proto = classifications_pb2.ClassificationResult() classification_result_proto.CopyFrom( - packet_getter.get_proto( - output_packets[_CLASSIFICATION_RESULT_OUT_STREAM_NAME])) + packet_getter.get_proto(output_packets[_CLASSIFICATIONS_STREAM_NAME])) - return classifications.ClassificationResult([ - classifications.Classifications.create_from_pb2(classification) - for classification in classification_result_proto.classifications - ]) + return ImageClassifierResult.create_from_pb2(classification_result_proto) def classify_for_video( self, image: image_module.Image, timestamp_ms: int, image_processing_options: Optional[_ImageProcessingOptions] = None - ) -> classifications.ClassificationResult: + ) -> ImageClassifierResult: """Performs image classification on the provided video frames. Only use this method when the ImageClassifier is created with the video @@ -241,13 +234,9 @@ class ImageClassifier(base_vision_task_api.BaseVisionTaskApi): classification_result_proto = classifications_pb2.ClassificationResult() classification_result_proto.CopyFrom( - packet_getter.get_proto( - output_packets[_CLASSIFICATION_RESULT_OUT_STREAM_NAME])) + packet_getter.get_proto(output_packets[_CLASSIFICATIONS_STREAM_NAME])) - return classifications.ClassificationResult([ - classifications.Classifications.create_from_pb2(classification) - for classification in classification_result_proto.classifications - ]) + return ImageClassifierResult.create_from_pb2(classification_result_proto) def classify_async( self, From 72f08c6878f5ada7573fbd802638f52019f14f4b Mon Sep 17 00:00:00 2001 From: kinaryml Date: Tue, 8 Nov 2022 10:57:12 -0800 Subject: [PATCH 02/21] Used loops instead of list comprehension --- .../containers/classification_result.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/mediapipe/tasks/python/components/containers/classification_result.py b/mediapipe/tasks/python/components/containers/classification_result.py index 20dc6991a..aee4f0655 100644 --- a/mediapipe/tasks/python/components/containers/classification_result.py +++ b/mediapipe/tasks/python/components/containers/classification_result.py @@ -48,15 +48,13 @@ class Classifications: def to_pb2(self) -> _ClassificationsProto: """Generates a Classifications protobuf object.""" classification_list_proto = _ClassificationListProto() - classification_list_proto.classification.extend([ - _ClassificationProto( - index=category.index, - score=category.score, - label=category.category_name, - display_name=category.display_name - ) - for category in self.categories - ]) + for category in self.categories: + classification_proto = _ClassificationProto( + index=category.index, + score=category.score, + label=category.category_name, + display_name=category.display_name) + classification_list_proto.classification.append(classification_proto) return _ClassificationsProto( classification_list=classification_list_proto, head_index=self.head_index, From 0b12aa943585a39ea8cc4a7edb5d84f78d4b2ded Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 01:30:55 -0800 Subject: [PATCH 03/21] Internal change PiperOrigin-RevId: 487466061 --- .../tasks/web/audio/audio_classifier/BUILD | 2 +- .../audio_classifier/audio_classifier.ts | 40 +++++++------- .../audio_classifier_result.ts | 2 +- .../tasks/web/components/containers/BUILD | 4 +- ...ations.d.ts => classification_result.d.ts} | 36 +++++++------ .../tasks/web/components/processors/BUILD | 3 +- .../processors/classifier_result.ts | 54 +++++++++---------- .../tasks/web/text/text_classifier/BUILD | 2 +- .../text/text_classifier/text_classifier.ts | 34 +++++------- .../text_classifier/text_classifier_result.ts | 2 +- .../tasks/web/vision/image_classifier/BUILD | 2 +- .../image_classifier/image_classifier.ts | 36 +++++-------- .../image_classifier_result.ts | 2 +- 13 files changed, 103 insertions(+), 116 deletions(-) rename mediapipe/tasks/web/components/containers/{classifications.d.ts => classification_result.d.ts} (61%) diff --git a/mediapipe/tasks/web/audio/audio_classifier/BUILD b/mediapipe/tasks/web/audio/audio_classifier/BUILD index bc3048df1..1bc4af309 100644 --- a/mediapipe/tasks/web/audio/audio_classifier/BUILD +++ b/mediapipe/tasks/web/audio/audio_classifier/BUILD @@ -21,7 +21,7 @@ mediapipe_ts_library( "//mediapipe/tasks/cc/audio/audio_classifier/proto:audio_classifier_graph_options_jspb_proto", "//mediapipe/tasks/cc/components/containers/proto:classifications_jspb_proto", "//mediapipe/tasks/web/components/containers:category", - "//mediapipe/tasks/web/components/containers:classifications", + "//mediapipe/tasks/web/components/containers:classification_result", "//mediapipe/tasks/web/components/processors:base_options", "//mediapipe/tasks/web/components/processors:classifier_options", "//mediapipe/tasks/web/components/processors:classifier_result", diff --git a/mediapipe/tasks/web/audio/audio_classifier/audio_classifier.ts b/mediapipe/tasks/web/audio/audio_classifier/audio_classifier.ts index 3d3ca5ae7..e3700cd7a 100644 --- a/mediapipe/tasks/web/audio/audio_classifier/audio_classifier.ts +++ b/mediapipe/tasks/web/audio/audio_classifier/audio_classifier.ts @@ -27,7 +27,7 @@ import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/wasm // Placeholder for internal dependency on trusted resource url import {AudioClassifierOptions} from './audio_classifier_options'; -import {Classifications} from './audio_classifier_result'; +import {AudioClassifierResult} from './audio_classifier_result'; const MEDIAPIPE_GRAPH = 'mediapipe.tasks.audio.audio_classifier.AudioClassifierGraph'; @@ -38,14 +38,14 @@ const MEDIAPIPE_GRAPH = // implementation const AUDIO_STREAM = 'input_audio'; const SAMPLE_RATE_STREAM = 'sample_rate'; -const CLASSIFICATION_RESULT_STREAM = 'classification_result'; +const TIMESTAMPED_CLASSIFICATIONS_STREAM = 'timestamped_classifications'; // The OSS JS API does not support the builder pattern. // tslint:disable:jspb-use-builder-pattern /** Performs audio classification. */ export class AudioClassifier extends TaskRunner { - private classifications: Classifications[] = []; + private classificationResults: AudioClassifierResult[] = []; private defaultSampleRate = 48000; private readonly options = new AudioClassifierGraphOptions(); @@ -150,7 +150,8 @@ export class AudioClassifier extends TaskRunner { * `48000` if no custom default was set. * @return The classification result of the audio datas */ - classify(audioData: Float32Array, sampleRate?: number): Classifications[] { + classify(audioData: Float32Array, sampleRate?: number): + AudioClassifierResult[] { sampleRate = sampleRate ?? this.defaultSampleRate; // Configures the number of samples in the WASM layer. We re-configure the @@ -164,20 +165,22 @@ export class AudioClassifier extends TaskRunner { this.addDoubleToStream(sampleRate, SAMPLE_RATE_STREAM, timestamp); this.addAudioToStream(audioData, timestamp); - this.classifications = []; + this.classificationResults = []; this.finishProcessing(); - return [...this.classifications]; + return [...this.classificationResults]; } /** - * Internal function for converting raw data into a classification, and - * adding it to our classfications list. + * Internal function for converting raw data into classification results, and + * adding them to our classfication results list. **/ - private addJsAudioClassification(binaryProto: Uint8Array): void { - const classificationResult = - ClassificationResult.deserializeBinary(binaryProto); - this.classifications.push( - ...convertFromClassificationResultProto(classificationResult)); + private addJsAudioClassificationResults(binaryProtos: Uint8Array[]): void { + binaryProtos.forEach(binaryProto => { + const classificationResult = + ClassificationResult.deserializeBinary(binaryProto); + this.classificationResults.push( + convertFromClassificationResultProto(classificationResult)); + }); } /** Updates the MediaPipe graph configuration. */ @@ -185,7 +188,7 @@ export class AudioClassifier extends TaskRunner { const graphConfig = new CalculatorGraphConfig(); graphConfig.addInputStream(AUDIO_STREAM); graphConfig.addInputStream(SAMPLE_RATE_STREAM); - graphConfig.addOutputStream(CLASSIFICATION_RESULT_STREAM); + graphConfig.addOutputStream(TIMESTAMPED_CLASSIFICATIONS_STREAM); const calculatorOptions = new CalculatorOptions(); calculatorOptions.setExtension( @@ -198,14 +201,15 @@ export class AudioClassifier extends TaskRunner { classifierNode.addInputStream('AUDIO:' + AUDIO_STREAM); classifierNode.addInputStream('SAMPLE_RATE:' + SAMPLE_RATE_STREAM); classifierNode.addOutputStream( - 'CLASSIFICATIONS:' + CLASSIFICATION_RESULT_STREAM); + 'TIMESTAMPED_CLASSIFICATIONS:' + TIMESTAMPED_CLASSIFICATIONS_STREAM); classifierNode.setOptions(calculatorOptions); graphConfig.addNode(classifierNode); - this.attachProtoListener(CLASSIFICATION_RESULT_STREAM, binaryProto => { - this.addJsAudioClassification(binaryProto); - }); + this.attachProtoVectorListener( + TIMESTAMPED_CLASSIFICATIONS_STREAM, binaryProtos => { + this.addJsAudioClassificationResults(binaryProtos); + }); const binaryGraph = graphConfig.serializeBinary(); this.setGraph(new Uint8Array(binaryGraph), /* isBinary= */ true); diff --git a/mediapipe/tasks/web/audio/audio_classifier/audio_classifier_result.ts b/mediapipe/tasks/web/audio/audio_classifier/audio_classifier_result.ts index 0a51dee04..0b616126a 100644 --- a/mediapipe/tasks/web/audio/audio_classifier/audio_classifier_result.ts +++ b/mediapipe/tasks/web/audio/audio_classifier/audio_classifier_result.ts @@ -15,4 +15,4 @@ */ export {Category} from '../../../../tasks/web/components/containers/category'; -export {ClassificationEntry, Classifications} from '../../../../tasks/web/components/containers/classifications'; +export {ClassificationResult as AudioClassifierResult, Classifications} from '../../../../tasks/web/components/containers/classification_result'; diff --git a/mediapipe/tasks/web/components/containers/BUILD b/mediapipe/tasks/web/components/containers/BUILD index 7d13fadcb..1b0e403ff 100644 --- a/mediapipe/tasks/web/components/containers/BUILD +++ b/mediapipe/tasks/web/components/containers/BUILD @@ -10,8 +10,8 @@ mediapipe_ts_library( ) mediapipe_ts_library( - name = "classifications", - srcs = ["classifications.d.ts"], + name = "classification_result", + srcs = ["classification_result.d.ts"], deps = [":category"], ) diff --git a/mediapipe/tasks/web/components/containers/classifications.d.ts b/mediapipe/tasks/web/components/containers/classification_result.d.ts similarity index 61% rename from mediapipe/tasks/web/components/containers/classifications.d.ts rename to mediapipe/tasks/web/components/containers/classification_result.d.ts index 67a259bbe..33632f925 100644 --- a/mediapipe/tasks/web/components/containers/classifications.d.ts +++ b/mediapipe/tasks/web/components/containers/classification_result.d.ts @@ -16,27 +16,14 @@ import {Category} from '../../../../tasks/web/components/containers/category'; -/** List of predicted categories with an optional timestamp. */ -export interface ClassificationEntry { +/** Classification results for a given classifier head. */ +export interface Classifications { /** * The array of predicted categories, usually sorted by descending scores, * e.g., from high to low probability. */ categories: Category[]; - /** - * The optional timestamp (in milliseconds) associated to the classification - * entry. This is useful for time series use cases, e.g., audio - * classification. - */ - timestampMs?: number; -} - -/** Classifications for a given classifier head. */ -export interface Classifications { - /** A list of classification entries. */ - entries: ClassificationEntry[]; - /** * The index of the classifier head these categories refer to. This is * useful for multi-head models. @@ -45,7 +32,24 @@ export interface Classifications { /** * The name of the classifier head, which is the corresponding tensor - * metadata name. + * metadata name. Defaults to an empty string if there is no such metadata. */ headName: string; } + +/** Classification results of a model. */ +export interface ClassificationResult { + /** The classification results for each head of the model. */ + classifications: Classifications[]; + + /** + * The optional timestamp (in milliseconds) of the start of the chunk of data + * corresponding to these results. + * + * This is only used for classification on time series (e.g. audio + * classification). In these use cases, the amount of data to process might + * exceed the maximum size that the model can process: to solve this, the + * input data is split into multiple chunks starting at different timestamps. + */ + timestampMs?: number; +} diff --git a/mediapipe/tasks/web/components/processors/BUILD b/mediapipe/tasks/web/components/processors/BUILD index cd7190dd9..e0d84b632 100644 --- a/mediapipe/tasks/web/components/processors/BUILD +++ b/mediapipe/tasks/web/components/processors/BUILD @@ -17,8 +17,9 @@ mediapipe_ts_library( name = "classifier_result", srcs = ["classifier_result.ts"], deps = [ + "//mediapipe/framework/formats:classification_jspb_proto", "//mediapipe/tasks/cc/components/containers/proto:classifications_jspb_proto", - "//mediapipe/tasks/web/components/containers:classifications", + "//mediapipe/tasks/web/components/containers:classification_result", ], ) diff --git a/mediapipe/tasks/web/components/processors/classifier_result.ts b/mediapipe/tasks/web/components/processors/classifier_result.ts index ade967932..90d10b84d 100644 --- a/mediapipe/tasks/web/components/processors/classifier_result.ts +++ b/mediapipe/tasks/web/components/processors/classifier_result.ts @@ -14,48 +14,46 @@ * limitations under the License. */ -import {ClassificationEntry as ClassificationEntryProto, ClassificationResult} from '../../../../tasks/cc/components/containers/proto/classifications_pb'; -import {ClassificationEntry, Classifications} from '../../../../tasks/web/components/containers/classifications'; +import {ClassificationResult as ClassificationResultProto, Classifications as ClassificationsProto} from '../../../../tasks/cc/components/containers/proto/classifications_pb'; +import {ClassificationResult, Classifications} from '../../../../tasks/web/components/containers/classification_result'; const DEFAULT_INDEX = -1; const DEFAULT_SCORE = 0.0; /** - * Converts a ClassificationEntry proto to the ClassificationEntry result - * type. + * Converts a Classifications proto to a Classifications object. */ -function convertFromClassificationEntryProto(source: ClassificationEntryProto): - ClassificationEntry { - const categories = source.getCategoriesList().map(category => { - return { - index: category.getIndex() ?? DEFAULT_INDEX, - score: category.getScore() ?? DEFAULT_SCORE, - displayName: category.getDisplayName() ?? '', - categoryName: category.getCategoryName() ?? '', - }; - }); - +function convertFromClassificationsProto(source: ClassificationsProto): + Classifications { + const categories = + source.getClassificationList()?.getClassificationList().map( + classification => { + return { + index: classification.getIndex() ?? DEFAULT_INDEX, + score: classification.getScore() ?? DEFAULT_SCORE, + categoryName: classification.getLabel() ?? '', + displayName: classification.getDisplayName() ?? '', + }; + }) ?? + []; return { categories, - timestampMs: source.getTimestampMs(), + headIndex: source.getHeadIndex() ?? DEFAULT_INDEX, + headName: source.getHeadName() ?? '', }; } /** - * Converts a ClassificationResult proto to a list of classifications. + * Converts a ClassificationResult proto to a ClassificationResult object. */ export function convertFromClassificationResultProto( - classificationResult: ClassificationResult) : Classifications[] { - const result: Classifications[] = []; - for (const classificationsProto of - classificationResult.getClassificationsList()) { - const classifications: Classifications = { - entries: classificationsProto.getEntriesList().map( - entry => convertFromClassificationEntryProto(entry)), - headIndex: classificationsProto.getHeadIndex() ?? DEFAULT_INDEX, - headName: classificationsProto.getHeadName() ?? '', - }; - result.push(classifications); + source: ClassificationResultProto): ClassificationResult { + const result: ClassificationResult = { + classifications: source.getClassificationsList().map( + classififications => convertFromClassificationsProto(classififications)) + }; + if (source.hasTimestampMs()) { + result.timestampMs = source.getTimestampMs(); } return result; } diff --git a/mediapipe/tasks/web/text/text_classifier/BUILD b/mediapipe/tasks/web/text/text_classifier/BUILD index 25a8817d4..4ebdce18a 100644 --- a/mediapipe/tasks/web/text/text_classifier/BUILD +++ b/mediapipe/tasks/web/text/text_classifier/BUILD @@ -22,7 +22,7 @@ mediapipe_ts_library( "//mediapipe/tasks/cc/components/containers/proto:classifications_jspb_proto", "//mediapipe/tasks/cc/text/text_classifier/proto:text_classifier_graph_options_jspb_proto", "//mediapipe/tasks/web/components/containers:category", - "//mediapipe/tasks/web/components/containers:classifications", + "//mediapipe/tasks/web/components/containers:classification_result", "//mediapipe/tasks/web/components/processors:base_options", "//mediapipe/tasks/web/components/processors:classifier_options", "//mediapipe/tasks/web/components/processors:classifier_result", diff --git a/mediapipe/tasks/web/text/text_classifier/text_classifier.ts b/mediapipe/tasks/web/text/text_classifier/text_classifier.ts index d92248b80..e1d0c9601 100644 --- a/mediapipe/tasks/web/text/text_classifier/text_classifier.ts +++ b/mediapipe/tasks/web/text/text_classifier/text_classifier.ts @@ -27,10 +27,10 @@ import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/wasm // Placeholder for internal dependency on trusted resource url import {TextClassifierOptions} from './text_classifier_options'; -import {Classifications} from './text_classifier_result'; +import {TextClassifierResult} from './text_classifier_result'; const INPUT_STREAM = 'text_in'; -const CLASSIFICATION_RESULT_STREAM = 'classification_result_out'; +const CLASSIFICATIONS_STREAM = 'classifications_out'; const TEXT_CLASSIFIER_GRAPH = 'mediapipe.tasks.text.text_classifier.TextClassifierGraph'; @@ -39,7 +39,7 @@ const TEXT_CLASSIFIER_GRAPH = /** Performs Natural Language classification. */ export class TextClassifier extends TaskRunner { - private classifications: Classifications[] = []; + private classificationResult: TextClassifierResult = {classifications: []}; private readonly options = new TextClassifierGraphOptions(); /** @@ -129,30 +129,20 @@ export class TextClassifier extends TaskRunner { * @param text The text to process. * @return The classification result of the text */ - classify(text: string): Classifications[] { - // Get classification classes by running our MediaPipe graph. - this.classifications = []; + classify(text: string): TextClassifierResult { + // Get classification result by running our MediaPipe graph. + this.classificationResult = {classifications: []}; this.addStringToStream( text, INPUT_STREAM, /* timestamp= */ performance.now()); this.finishProcessing(); - return [...this.classifications]; - } - - // Internal function for converting raw data into a classification, and - // adding it to our classifications list. - private addJsTextClassification(binaryProto: Uint8Array): void { - const classificationResult = - ClassificationResult.deserializeBinary(binaryProto); - console.log(classificationResult.toObject()); - this.classifications.push( - ...convertFromClassificationResultProto(classificationResult)); + return this.classificationResult; } /** Updates the MediaPipe graph configuration. */ private refreshGraph(): void { const graphConfig = new CalculatorGraphConfig(); graphConfig.addInputStream(INPUT_STREAM); - graphConfig.addOutputStream(CLASSIFICATION_RESULT_STREAM); + graphConfig.addOutputStream(CLASSIFICATIONS_STREAM); const calculatorOptions = new CalculatorOptions(); calculatorOptions.setExtension( @@ -161,14 +151,14 @@ export class TextClassifier extends TaskRunner { const classifierNode = new CalculatorGraphConfig.Node(); classifierNode.setCalculator(TEXT_CLASSIFIER_GRAPH); classifierNode.addInputStream('TEXT:' + INPUT_STREAM); - classifierNode.addOutputStream( - 'CLASSIFICATION_RESULT:' + CLASSIFICATION_RESULT_STREAM); + classifierNode.addOutputStream('CLASSIFICATIONS:' + CLASSIFICATIONS_STREAM); classifierNode.setOptions(calculatorOptions); graphConfig.addNode(classifierNode); - this.attachProtoListener(CLASSIFICATION_RESULT_STREAM, binaryProto => { - this.addJsTextClassification(binaryProto); + this.attachProtoListener(CLASSIFICATIONS_STREAM, binaryProto => { + this.classificationResult = convertFromClassificationResultProto( + ClassificationResult.deserializeBinary(binaryProto)); }); const binaryGraph = graphConfig.serializeBinary(); diff --git a/mediapipe/tasks/web/text/text_classifier/text_classifier_result.ts b/mediapipe/tasks/web/text/text_classifier/text_classifier_result.ts index 0a51dee04..707ba5da2 100644 --- a/mediapipe/tasks/web/text/text_classifier/text_classifier_result.ts +++ b/mediapipe/tasks/web/text/text_classifier/text_classifier_result.ts @@ -15,4 +15,4 @@ */ export {Category} from '../../../../tasks/web/components/containers/category'; -export {ClassificationEntry, Classifications} from '../../../../tasks/web/components/containers/classifications'; +export {ClassificationResult as TextClassifierResult, Classifications} from '../../../../tasks/web/components/containers/classification_result'; diff --git a/mediapipe/tasks/web/vision/image_classifier/BUILD b/mediapipe/tasks/web/vision/image_classifier/BUILD index 6937dc4f3..e96d6a8e3 100644 --- a/mediapipe/tasks/web/vision/image_classifier/BUILD +++ b/mediapipe/tasks/web/vision/image_classifier/BUILD @@ -21,7 +21,7 @@ mediapipe_ts_library( "//mediapipe/tasks/cc/components/containers/proto:classifications_jspb_proto", "//mediapipe/tasks/cc/vision/image_classifier/proto:image_classifier_graph_options_jspb_proto", "//mediapipe/tasks/web/components/containers:category", - "//mediapipe/tasks/web/components/containers:classifications", + "//mediapipe/tasks/web/components/containers:classification_result", "//mediapipe/tasks/web/components/processors:base_options", "//mediapipe/tasks/web/components/processors:classifier_options", "//mediapipe/tasks/web/components/processors:classifier_result", diff --git a/mediapipe/tasks/web/vision/image_classifier/image_classifier.ts b/mediapipe/tasks/web/vision/image_classifier/image_classifier.ts index cb63874c4..ba4b6c907 100644 --- a/mediapipe/tasks/web/vision/image_classifier/image_classifier.ts +++ b/mediapipe/tasks/web/vision/image_classifier/image_classifier.ts @@ -27,12 +27,12 @@ import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/grap // Placeholder for internal dependency on trusted resource url import {ImageClassifierOptions} from './image_classifier_options'; -import {Classifications} from './image_classifier_result'; +import {ImageClassifierResult} from './image_classifier_result'; const IMAGE_CLASSIFIER_GRAPH = 'mediapipe.tasks.vision.image_classifier.ImageClassifierGraph'; const INPUT_STREAM = 'input_image'; -const CLASSIFICATION_RESULT_STREAM = 'classification_result'; +const CLASSIFICATIONS_STREAM = 'classifications'; export {ImageSource}; // Used in the public API @@ -41,7 +41,7 @@ export {ImageSource}; // Used in the public API /** Performs classification on images. */ export class ImageClassifier extends TaskRunner { - private classifications: Classifications[] = []; + private classificationResult: ImageClassifierResult = {classifications: []}; private readonly options = new ImageClassifierGraphOptions(); /** @@ -133,31 +133,21 @@ export class ImageClassifier extends TaskRunner { * provided, defaults to `performance.now()`. * @return The classification result of the image */ - classify(imageSource: ImageSource, timestamp?: number): Classifications[] { - // Get classification classes by running our MediaPipe graph. - this.classifications = []; + classify(imageSource: ImageSource, timestamp?: number): + ImageClassifierResult { + // Get classification result by running our MediaPipe graph. + this.classificationResult = {classifications: []}; this.addGpuBufferAsImageToStream( imageSource, INPUT_STREAM, timestamp ?? performance.now()); this.finishProcessing(); - return [...this.classifications]; - } - - /** - * Internal function for converting raw data into a classification, and - * adding it to our classfications list. - **/ - private addJsImageClassification(binaryProto: Uint8Array): void { - const classificationResult = - ClassificationResult.deserializeBinary(binaryProto); - this.classifications.push( - ...convertFromClassificationResultProto(classificationResult)); + return this.classificationResult; } /** Updates the MediaPipe graph configuration. */ private refreshGraph(): void { const graphConfig = new CalculatorGraphConfig(); graphConfig.addInputStream(INPUT_STREAM); - graphConfig.addOutputStream(CLASSIFICATION_RESULT_STREAM); + graphConfig.addOutputStream(CLASSIFICATIONS_STREAM); const calculatorOptions = new CalculatorOptions(); calculatorOptions.setExtension( @@ -168,14 +158,14 @@ export class ImageClassifier extends TaskRunner { const classifierNode = new CalculatorGraphConfig.Node(); classifierNode.setCalculator(IMAGE_CLASSIFIER_GRAPH); classifierNode.addInputStream('IMAGE:' + INPUT_STREAM); - classifierNode.addOutputStream( - 'CLASSIFICATION_RESULT:' + CLASSIFICATION_RESULT_STREAM); + classifierNode.addOutputStream('CLASSIFICATIONS:' + CLASSIFICATIONS_STREAM); classifierNode.setOptions(calculatorOptions); graphConfig.addNode(classifierNode); - this.attachProtoListener(CLASSIFICATION_RESULT_STREAM, binaryProto => { - this.addJsImageClassification(binaryProto); + this.attachProtoListener(CLASSIFICATIONS_STREAM, binaryProto => { + this.classificationResult = convertFromClassificationResultProto( + ClassificationResult.deserializeBinary(binaryProto)); }); const binaryGraph = graphConfig.serializeBinary(); diff --git a/mediapipe/tasks/web/vision/image_classifier/image_classifier_result.ts b/mediapipe/tasks/web/vision/image_classifier/image_classifier_result.ts index 0a51dee04..44032234c 100644 --- a/mediapipe/tasks/web/vision/image_classifier/image_classifier_result.ts +++ b/mediapipe/tasks/web/vision/image_classifier/image_classifier_result.ts @@ -15,4 +15,4 @@ */ export {Category} from '../../../../tasks/web/components/containers/category'; -export {ClassificationEntry, Classifications} from '../../../../tasks/web/components/containers/classifications'; +export {ClassificationResult as ImageClassifierResult, Classifications} from '../../../../tasks/web/components/containers/classification_result'; From 2ce3a9719e773e3bbc6754cf1f41ae9789210944 Mon Sep 17 00:00:00 2001 From: Jiuqiang Tang Date: Thu, 10 Nov 2022 09:25:38 -0800 Subject: [PATCH 04/21] Remove the problematic packet release calls in OutputHandler::run. OutputHandler::run is installed as a MultiStreamCallback into the TaskRunner and it's invoked in the Graph::CallbackToJava() jni method. In CallbackToJava(), the packets are removed in RemovePacket() calls after the multi stream callback is invoked. The current logic lets the MultiStreamCallback release the packets first and leaves null pointers to RemovePacket() to remove, which may cause the app crash. The fix is to remove the packet release calls in the MultiStreamCallback and always leave the packet release work to RemovePacket(). PiperOrigin-RevId: 487558809 --- .../java/com/google/mediapipe/tasks/core/OutputHandler.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java index 6a83c7296..d18f0e41e 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java @@ -119,12 +119,6 @@ public class OutputHandler { } else { Log.e(TAG, "Error occurs when getting MediaPipe task result. " + e); } - } finally { - for (Packet packet : packets) { - if (packet != null) { - packet.release(); - } - } } } } From da4d455d0cb8acaf860abc40371456a498c448d0 Mon Sep 17 00:00:00 2001 From: Jiuqiang Tang Date: Thu, 10 Nov 2022 10:08:02 -0800 Subject: [PATCH 05/21] Implement MediaPipe Tasks AudioClassifier Java API. PiperOrigin-RevId: 487570148 --- .../audio_classifier_graph_options.proto | 3 + .../com/google/mediapipe/tasks/audio/BUILD | 76 ++++ .../audio/audioclassifier/AndroidManifest.xml | 8 + .../audioclassifier/AudioClassifier.java | 399 ++++++++++++++++++ .../AudioClassifierResult.java | 76 ++++ .../tasks/audio/core/BaseAudioTaskApi.java | 151 +++++++ .../tasks/audio/core/RunningMode.java | 29 ++ .../components/containers/AudioData.java | 334 +++++++++++++++ .../tasks/components/containers/BUILD | 9 + .../mediapipe/tasks/core/OutputHandler.java | 21 +- .../mediapipe/tasks/core/TaskRunner.java | 1 + 11 files changed, 1106 insertions(+), 1 deletion(-) create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AndroidManifest.xml create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifierResult.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/RunningMode.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/AudioData.java diff --git a/mediapipe/tasks/cc/audio/audio_classifier/proto/audio_classifier_graph_options.proto b/mediapipe/tasks/cc/audio/audio_classifier/proto/audio_classifier_graph_options.proto index 16aa86aeb..5d4ba3296 100644 --- a/mediapipe/tasks/cc/audio/audio_classifier/proto/audio_classifier_graph_options.proto +++ b/mediapipe/tasks/cc/audio/audio_classifier/proto/audio_classifier_graph_options.proto @@ -21,6 +21,9 @@ import "mediapipe/framework/calculator.proto"; import "mediapipe/tasks/cc/components/processors/proto/classifier_options.proto"; import "mediapipe/tasks/cc/core/proto/base_options.proto"; +option java_package = "com.google.mediapipe.tasks.audio.audioclassifier.proto"; +option java_outer_classname = "AudioClassifierGraphOptionsProto"; + message AudioClassifierGraphOptions { extend mediapipe.CalculatorOptions { optional AudioClassifierGraphOptions ext = 451755788; diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD new file mode 100644 index 000000000..c5cb6f8a3 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD @@ -0,0 +1,76 @@ +# Copyright 2022 The MediaPipe 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. + +licenses(["notice"]) + +package(default_visibility = ["//mediapipe/tasks:internal"]) + +android_library( + name = "core", + srcs = glob(["core/*.java"]), + javacopts = [ + "-Xep:AndroidJdkLibsChecker:OFF", + ], + deps = [ + ":libmediapipe_tasks_audio_jni_lib", + "//mediapipe/java/com/google/mediapipe/framework:android_framework_no_mff", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audio_data", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/core", + "@maven//:com_google_guava_guava", + ], +) + +# The native library of all MediaPipe audio tasks. +cc_binary( + name = "libmediapipe_tasks_audio_jni.so", + linkshared = 1, + linkstatic = 1, + deps = [ + "//mediapipe/java/com/google/mediapipe/framework/jni:mediapipe_framework_jni", + "//mediapipe/tasks/cc/audio/audio_classifier:audio_classifier_graph", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/core/jni:model_resources_cache_jni", + ], +) + +cc_library( + name = "libmediapipe_tasks_audio_jni_lib", + srcs = [":libmediapipe_tasks_audio_jni.so"], + alwayslink = 1, +) + +android_library( + name = "audioclassifier", + srcs = [ + "audioclassifier/AudioClassifier.java", + "audioclassifier/AudioClassifierResult.java", + ], + javacopts = [ + "-Xep:AndroidJdkLibsChecker:OFF", + ], + manifest = "audioclassifier/AndroidManifest.xml", + deps = [ + ":core", + "//mediapipe/framework:calculator_options_java_proto_lite", + "//mediapipe/java/com/google/mediapipe/framework:android_framework", + "//mediapipe/tasks/cc/audio/audio_classifier/proto:audio_classifier_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/components/containers/proto:classifications_java_proto_lite", + "//mediapipe/tasks/cc/core/proto:base_options_java_proto_lite", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audio_data", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:classificationresult", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors:classifieroptions", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/core", + "//third_party:autovalue", + "@maven//:com_google_guava_guava", + ], +) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AndroidManifest.xml b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AndroidManifest.xml new file mode 100644 index 000000000..1e9817efd --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java new file mode 100644 index 000000000..88b6daf0a --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java @@ -0,0 +1,399 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.audio.audioclassifier; + +import android.content.Context; +import android.os.ParcelFileDescriptor; +import com.google.auto.value.AutoValue; +import com.google.mediapipe.proto.CalculatorOptionsProto.CalculatorOptions; +import com.google.mediapipe.framework.MediaPipeException; +import com.google.mediapipe.framework.Packet; +import com.google.mediapipe.framework.PacketGetter; +import com.google.mediapipe.framework.ProtoUtil; +import com.google.mediapipe.tasks.audio.audioclassifier.proto.AudioClassifierGraphOptionsProto; +import com.google.mediapipe.tasks.audio.core.BaseAudioTaskApi; +import com.google.mediapipe.tasks.audio.core.RunningMode; +import com.google.mediapipe.tasks.components.containers.AudioData; +import com.google.mediapipe.tasks.components.containers.proto.ClassificationsProto; +import com.google.mediapipe.tasks.components.processors.ClassifierOptions; +import com.google.mediapipe.tasks.core.BaseOptions; +import com.google.mediapipe.tasks.core.ErrorListener; +import com.google.mediapipe.tasks.core.OutputHandler; +import com.google.mediapipe.tasks.core.OutputHandler.PureResultListener; +import com.google.mediapipe.tasks.core.OutputHandler.ResultListener; +import com.google.mediapipe.tasks.core.TaskInfo; +import com.google.mediapipe.tasks.core.TaskOptions; +import com.google.mediapipe.tasks.core.TaskRunner; +import com.google.mediapipe.tasks.core.proto.BaseOptionsProto; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +/** + * Performs audio classification on audio clips or audio stream. + * + *

This API expects a TFLite model with mandatory TFLite Model Metadata that contains the + * mandatory AudioProperties of the solo input audio tensor and the optional (but recommended) label + * items as AssociatedFiles with type TENSOR_AXIS_LABELS per output classification tensor. + * + *

Input tensor: (kTfLiteFloat32) + * + *

    + *
  • input audio buffer of size `[batch * samples]`. + *
  • batch inference is not supported (`batch` is required to be 1). + *
  • for multi-channel models, the channels need be interleaved. + *
+ * + *

At least one output tensor with: (kTfLiteFloat32) + * + *

    + *
  • `[1 x N]` array with `N` represents the number of categories. + *
  • optional (but recommended) label items as AssociatedFiles with type TENSOR_AXIS_LABELS, + * containing one label per line. The first such AssociatedFile (if any) is used to fill the + * `category_name` field of the results. The `display_name` field is filled from the + * AssociatedFile (if any) whose locale matches the `display_names_locale` field of the + * `AudioClassifierOptions` used at creation time ("en" by default, i.e. English). If none of + * these are available, only the `index` field of the results will be filled. + *
+ */ +public final class AudioClassifier extends BaseAudioTaskApi { + private static final String TAG = AudioClassifier.class.getSimpleName(); + private static final String AUDIO_IN_STREAM_NAME = "audio_in"; + private static final String SAMPLE_RATE_IN_STREAM_NAME = "sample_rate_in"; + private static final List INPUT_STREAMS = + Collections.unmodifiableList( + Arrays.asList( + "AUDIO:" + AUDIO_IN_STREAM_NAME, "SAMPLE_RATE:" + SAMPLE_RATE_IN_STREAM_NAME)); + private static final List OUTPUT_STREAMS = + Collections.unmodifiableList( + Arrays.asList( + "CLASSIFICATIONS:classifications_out", + "TIMESTAMPED_CLASSIFICATIONS:timestamped_classifications_out")); + private static final int CLASSIFICATIONS_OUT_STREAM_INDEX = 0; + private static final int TIMESTAMPED_CLASSIFICATIONS_OUT_STREAM_INDEX = 1; + private static final String TASK_GRAPH_NAME = + "mediapipe.tasks.audio.audio_classifier.AudioClassifierGraph"; + private static final long MICROSECONDS_PER_MILLISECOND = 1000; + + static { + ProtoUtil.registerTypeName( + ClassificationsProto.ClassificationResult.class, + "mediapipe.tasks.components.containers.proto.ClassificationResult"); + } + + /** + * Creates an {@link AudioClassifier} instance from a model file and default {@link + * AudioClassifierOptions}. + * + * @param context an Android {@link Context}. + * @param modelPath path to the classification model in the assets. + * @throws MediaPipeException if there is an error during {@link AudioClassifier} creation. + */ + public static AudioClassifier createFromFile(Context context, String modelPath) { + BaseOptions baseOptions = BaseOptions.builder().setModelAssetPath(modelPath).build(); + return createFromOptions( + context, AudioClassifierOptions.builder().setBaseOptions(baseOptions).build()); + } + + /** + * Creates an {@link AudioClassifier} instance from a model file and default {@link + * AudioClassifierOptions}. + * + * @param context an Android {@link Context}. + * @param modelFile the classification model {@link File} instance. + * @throws IOException if an I/O error occurs when opening the tflite model file. + * @throws MediaPipeException if there is an error during {@link AudioClassifier} creation. + */ + public static AudioClassifier createFromFile(Context context, File modelFile) throws IOException { + try (ParcelFileDescriptor descriptor = + ParcelFileDescriptor.open(modelFile, ParcelFileDescriptor.MODE_READ_ONLY)) { + BaseOptions baseOptions = + BaseOptions.builder().setModelAssetFileDescriptor(descriptor.getFd()).build(); + return createFromOptions( + context, AudioClassifierOptions.builder().setBaseOptions(baseOptions).build()); + } + } + + /** + * Creates an {@link AudioClassifier} instance from a model buffer and default {@link + * AudioClassifierOptions}. + * + * @param context an Android {@link Context}. + * @param modelBuffer a direct {@link ByteBuffer} or a {@link MappedByteBuffer} of the + * classification model. + * @throws MediaPipeException if there is an error during {@link AudioClassifier} creation. + */ + public static AudioClassifier createFromBuffer(Context context, final ByteBuffer modelBuffer) { + BaseOptions baseOptions = BaseOptions.builder().setModelAssetBuffer(modelBuffer).build(); + return createFromOptions( + context, AudioClassifierOptions.builder().setBaseOptions(baseOptions).build()); + } + + /** + * Creates an {@link AudioClassifier} instance from an {@link AudioClassifierOptions} instance. + * + * @param context an Android {@link Context}. + * @param options an {@link AudioClassifierOptions} instance. + * @throws MediaPipeException if there is an error during {@link AudioClassifier} creation. + */ + public static AudioClassifier createFromOptions(Context context, AudioClassifierOptions options) { + OutputHandler handler = new OutputHandler<>(); + handler.setOutputPacketConverter( + new OutputHandler.OutputPacketConverter() { + @Override + public AudioClassifierResult convertToTaskResult(List packets) { + try { + if (!packets.get(CLASSIFICATIONS_OUT_STREAM_INDEX).isEmpty()) { + // For audio stream mode. + return AudioClassifierResult.createFromProto( + PacketGetter.getProto( + packets.get(CLASSIFICATIONS_OUT_STREAM_INDEX), + ClassificationsProto.ClassificationResult.getDefaultInstance()), + packets.get(CLASSIFICATIONS_OUT_STREAM_INDEX).getTimestamp() + / MICROSECONDS_PER_MILLISECOND); + } else { + // For audio clips mode. + return AudioClassifierResult.createFromProtoList( + PacketGetter.getProtoVector( + packets.get(TIMESTAMPED_CLASSIFICATIONS_OUT_STREAM_INDEX), + ClassificationsProto.ClassificationResult.parser()), + -1); + } + } catch (IOException e) { + throw new MediaPipeException( + MediaPipeException.StatusCode.INTERNAL.ordinal(), e.getMessage()); + } + } + + @Override + public Void convertToTaskInput(List packets) { + return null; + } + }); + if (options.resultListener().isPresent()) { + ResultListener resultListener = + new ResultListener<>() { + @Override + public void run(AudioClassifierResult audioClassifierResult, Void input) { + options.resultListener().get().run(audioClassifierResult); + } + }; + handler.setResultListener(resultListener); + } + options.errorListener().ifPresent(handler::setErrorListener); + // Audio tasks should not drop input audio due to flow limiting, which may cause data + // inconsistency. + TaskRunner runner = + TaskRunner.create( + context, + TaskInfo.builder() + .setTaskGraphName(TASK_GRAPH_NAME) + .setInputStreams(INPUT_STREAMS) + .setOutputStreams(OUTPUT_STREAMS) + .setTaskOptions(options) + .setEnableFlowLimiting(false) + .build(), + handler); + return new AudioClassifier(runner, options.runningMode()); + } + + /** + * Constructor to initialize an {@link AudioClassifier} from a {@link TaskRunner} and {@link + * RunningMode}. + * + * @param taskRunner a {@link TaskRunner}. + * @param runningMode a mediapipe audio task {@link RunningMode}. + */ + private AudioClassifier(TaskRunner taskRunner, RunningMode runningMode) { + super(taskRunner, runningMode, AUDIO_IN_STREAM_NAME, SAMPLE_RATE_IN_STREAM_NAME); + } + + /* + * Performs audio classification on the provided audio clip. Only use this method when the + * AudioClassifier is created with the audio clips mode. + * + *

The audio clip is represented as a MediaPipe {@link AudioData} object The method accepts + * audio clips with various length and audio sample rate. It's required to provide the + * corresponding audio sample rate within the {@link AudioData} object. + * + *

The input audio clip may be longer than what the model is able to process in a single + * inference. When this occurs, the input audio clip is split into multiple chunks starting at + * different timestamps. For this reason, this function returns a vector of ClassificationResult + * objects, each associated with a timestamp corresponding to the start (in milliseconds) of the + * chunk data that was classified, e.g: + * + * ClassificationResult #0 (first chunk of data): + * timestamp_ms: 0 (starts at 0ms) + * classifications #0 (single head model): + * category #0: + * category_name: "Speech" + * score: 0.6 + * category #1: + * category_name: "Music" + * score: 0.2 + * ClassificationResult #1 (second chunk of data): + * timestamp_ms: 800 (starts at 800ms) + * classifications #0 (single head model): + * category #0: + * category_name: "Speech" + * score: 0.5 + * category #1: + * category_name: "Silence" + * score: 0.1 + * + * @param audioClip a MediaPipe {@link AudioData} object for processing. + * @throws MediaPipeException if there is an internal error. + */ + public AudioClassifierResult classify(AudioData audioClip) { + return (AudioClassifierResult) processAudioClip(audioClip); + } + + /* + * Sends audio data (a block in a continuous audio stream) to perform audio classification. Only + * use this method when the AudioClassifier is created with the audio stream mode. + * + *

The audio block is represented as a MediaPipe {@link AudioData} object. The audio data will + * be resampled, accumulated, and framed to the proper size for the underlying model to consume. + * It's required to provide the corresponding audio sample rate within {@link AudioData} object as + * well as a timestamp (in milliseconds) to indicate the start time of the input audio block. The + * timestamps must be monotonically increasing. This method will return immediately after + * the input audio data is accepted. The results will be available in the `resultListener` + * provided in the `AudioClassifierOptions`. The `classifyAsync` method is designed to process + * auido stream data such as microphone input. + * + *

The input audio block may be longer than what the model is able to process in a single + * inference. When this occurs, the input audio block is split into multiple chunks. For this + * reason, the callback may be called multiple times (once per chunk) for each call to this + * function. + * + * @param audioBlock a MediaPipe {@link AudioData} object for processing. + * @param timestampMs the input timestamp (in milliseconds). + * @throws MediaPipeException if there is an internal error. + */ + public void classifyAsync(AudioData audioBlock, long timestampMs) { + checkOrSetSampleRate(audioBlock.getFormat().getSampleRate()); + sendAudioStreamData(audioBlock, timestampMs); + } + + /** Options for setting up and {@link AudioClassifier}. */ + @AutoValue + public abstract static class AudioClassifierOptions extends TaskOptions { + + /** Builder for {@link AudioClassifierOptions}. */ + @AutoValue.Builder + public abstract static class Builder { + /** Sets the {@link BaseOptions} for the audio classifier task. */ + public abstract Builder setBaseOptions(BaseOptions baseOptions); + + /** + * Sets the {@link RunningMode} for the audio classifier task. Default to the audio clips + * mode. Image classifier has two modes: + * + *

    + *
  • AUDIO_CLIPS: The mode for running audio classification on audio clips. Users feed + * audio clips to the `classify` method, and will receive the classification results as + * the return value. + *
  • AUDIO_STREAM: The mode for running audio classification on the audio stream, such as + * from microphone. Users call `classifyAsync` to push the audio data into the + * AudioClassifier, the classification results will be available in the result callback + * when the audio classifier finishes the work. + *
+ */ + public abstract Builder setRunningMode(RunningMode runningMode); + + /** + * Sets the optional {@link ClassifierOptions} controling classification behavior, such as + * score threshold, number of results, etc. + */ + public abstract Builder setClassifierOptions(ClassifierOptions classifierOptions); + + /** + * Sets the {@link ResultListener} to receive the classification results asynchronously when + * the audio classifier is in the audio stream mode. + */ + public abstract Builder setResultListener( + PureResultListener resultListener); + + /** Sets an optional {@link ErrorListener}. */ + public abstract Builder setErrorListener(ErrorListener errorListener); + + abstract AudioClassifierOptions autoBuild(); + + /** + * Validates and builds the {@link AudioClassifierOptions} instance. + * + * @throws IllegalArgumentException if the result listener and the running mode are not + * properly configured. The result listener should only be set when the audio classifier + * is in the audio stream mode. + */ + public final AudioClassifierOptions build() { + AudioClassifierOptions options = autoBuild(); + if (options.runningMode() == RunningMode.AUDIO_STREAM) { + if (!options.resultListener().isPresent()) { + throw new IllegalArgumentException( + "The audio classifier is in the audio stream mode, a user-defined result listener" + + " must be provided in the AudioClassifierOptions."); + } + } else if (options.resultListener().isPresent()) { + throw new IllegalArgumentException( + "The audio classifier is in the audio clips mode, a user-defined result listener" + + " shouldn't be provided in AudioClassifierOptions."); + } + return options; + } + } + + abstract BaseOptions baseOptions(); + + abstract RunningMode runningMode(); + + abstract Optional classifierOptions(); + + abstract Optional> resultListener(); + + abstract Optional errorListener(); + + public static Builder builder() { + return new AutoValue_AudioClassifier_AudioClassifierOptions.Builder() + .setRunningMode(RunningMode.AUDIO_CLIPS); + } + + /** + * Converts a {@link AudioClassifierOptions} to a {@link CalculatorOptions} protobuf message. + */ + @Override + public CalculatorOptions convertToCalculatorOptionsProto() { + BaseOptionsProto.BaseOptions.Builder baseOptionsBuilder = + BaseOptionsProto.BaseOptions.newBuilder(); + baseOptionsBuilder.setUseStreamMode(runningMode() == RunningMode.AUDIO_STREAM); + baseOptionsBuilder.mergeFrom(convertBaseOptionsToProto(baseOptions())); + AudioClassifierGraphOptionsProto.AudioClassifierGraphOptions.Builder taskOptionsBuilder = + AudioClassifierGraphOptionsProto.AudioClassifierGraphOptions.newBuilder() + .setBaseOptions(baseOptionsBuilder); + if (classifierOptions().isPresent()) { + taskOptionsBuilder.setClassifierOptions(classifierOptions().get().convertToProto()); + } + return CalculatorOptions.newBuilder() + .setExtension( + AudioClassifierGraphOptionsProto.AudioClassifierGraphOptions.ext, + taskOptionsBuilder.build()) + .build(); + } + } +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifierResult.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifierResult.java new file mode 100644 index 000000000..fcc3c6e22 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifierResult.java @@ -0,0 +1,76 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.audio.audioclassifier; + +import com.google.auto.value.AutoValue; +import com.google.mediapipe.tasks.components.containers.ClassificationResult; +import com.google.mediapipe.tasks.components.containers.proto.ClassificationsProto; +import com.google.mediapipe.tasks.core.TaskResult; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** Represents the classification results generated by {@link AudioClassifier}. */ +@AutoValue +public abstract class AudioClassifierResult implements TaskResult { + + /** + * Creates an {@link AudioClassifierResult} instance from a list of {@link + * ClassificationsProto.ClassificationResult} protobuf messages. + * + * @param protoList a list of {@link ClassificationsProto.ClassificationResult} protobuf message + * to convert. + * @param timestampMs a timestamp for this result. + */ + static AudioClassifierResult createFromProtoList( + List protoList, long timestampMs) { + List classificationResultList = new ArrayList<>(); + for (ClassificationsProto.ClassificationResult proto : protoList) { + classificationResultList.add(ClassificationResult.createFromProto(proto)); + } + return new AutoValue_AudioClassifierResult( + Optional.of(classificationResultList), Optional.empty(), timestampMs); + } + + /** + * Creates an {@link AudioClassifierResult} instance from a {@link + * ClassificationsProto.ClassificationResult} protobuf message. + * + * @param proto the {@link ClassificationsProto.ClassificationResult} protobuf message to convert. + * @param timestampMs a timestamp for this result. + */ + static AudioClassifierResult createFromProto( + ClassificationsProto.ClassificationResult proto, long timestampMs) { + return new AutoValue_AudioClassifierResult( + Optional.empty(), Optional.of(ClassificationResult.createFromProto(proto)), timestampMs); + } + + /** + * A list of of timpstamed {@link ClassificationResult} objects, each contains one set of results + * per classifier head. The list represents the audio classification result of an audio clip, and + * is only available when running with the audio clips mode. + */ + public abstract Optional> classificationResultList(); + + /** + * Contains one set of results per classifier head. A {@link ClassificationResult} usually + * represents one audio classification result in an audio stream, and s only available when + * running with the audio stream mode. + */ + public abstract Optional classificationResult(); + + @Override + public abstract long timestampMs(); +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java new file mode 100644 index 000000000..affe43559 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/BaseAudioTaskApi.java @@ -0,0 +1,151 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.audio.core; + +import com.google.mediapipe.framework.MediaPipeException; +import com.google.mediapipe.framework.Packet; +import com.google.mediapipe.tasks.components.containers.AudioData; +import com.google.mediapipe.tasks.core.TaskResult; +import com.google.mediapipe.tasks.core.TaskRunner; +import java.util.HashMap; +import java.util.Map; + +/** The base class of MediaPipe audio tasks. */ +public class BaseAudioTaskApi implements AutoCloseable { + private static final long MICROSECONDS_PER_MILLISECOND = 1000; + private static final long PRESTREAM_TIMESTAMP = Long.MIN_VALUE + 2; + + private final TaskRunner runner; + private final RunningMode runningMode; + private final String audioStreamName; + private final String sampleRateStreamName; + private double defaultSampleRate; + + static { + System.loadLibrary("mediapipe_tasks_audio_jni"); + } + + /** + * Constructor to initialize a {@link BaseAudioTaskApi}. + * + * @param runner a {@link TaskRunner}. + * @param runningMode a mediapipe audio task {@link RunningMode}. + * @param audioStreamName the name of the input audio stream. + * @param sampleRateStreamName the name of the audio sample rate stream. + */ + public BaseAudioTaskApi( + TaskRunner runner, + RunningMode runningMode, + String audioStreamName, + String sampleRateStreamName) { + this.runner = runner; + this.runningMode = runningMode; + this.audioStreamName = audioStreamName; + this.sampleRateStreamName = sampleRateStreamName; + this.defaultSampleRate = -1.0; + } + + /** + * A synchronous method to process audio clips. The call blocks the current thread until a failure + * status or a successful result is returned. + * + * @param audioClip a MediaPipe {@link AudioDatra} object for processing. + * @throws MediaPipeException if the task is not in the audio clips mode. + */ + protected TaskResult processAudioClip(AudioData audioClip) { + if (runningMode != RunningMode.AUDIO_CLIPS) { + throw new MediaPipeException( + MediaPipeException.StatusCode.FAILED_PRECONDITION.ordinal(), + "Task is not initialized with the audio clips mode. Current running mode:" + + runningMode.name()); + } + Map inputPackets = new HashMap<>(); + inputPackets.put( + audioStreamName, + runner + .getPacketCreator() + .createMatrix( + audioClip.getFormat().getNumOfChannels(), + audioClip.getBufferLength(), + audioClip.getBuffer())); + inputPackets.put( + sampleRateStreamName, + runner.getPacketCreator().createFloat64(audioClip.getFormat().getSampleRate())); + return runner.process(inputPackets); + } + + /** + * Checks or sets the audio sample rate in the audio stream mode. + * + * @param sampleRate the audio sample rate. + * @throws MediaPipeException if the task is not in the audio stream mode or the provided sample + * rate is inconsisent with the previously recevied. + */ + protected void checkOrSetSampleRate(double sampleRate) { + if (runningMode != RunningMode.AUDIO_STREAM) { + throw new MediaPipeException( + MediaPipeException.StatusCode.FAILED_PRECONDITION.ordinal(), + "Task is not initialized with the audio stream mode. Current running mode:" + + runningMode.name()); + } + if (defaultSampleRate > 0) { + if (Double.compare(sampleRate, defaultSampleRate) != 0) { + throw new MediaPipeException( + MediaPipeException.StatusCode.INVALID_ARGUMENT.ordinal(), + "The input audio sample rate: " + + sampleRate + + " is inconsistent with the previously provided: " + + defaultSampleRate); + } + } else { + Map inputPackets = new HashMap<>(); + inputPackets.put(sampleRateStreamName, runner.getPacketCreator().createFloat64(sampleRate)); + runner.send(inputPackets, PRESTREAM_TIMESTAMP); + defaultSampleRate = sampleRate; + } + } + /** + * An asynchronous method to send audio stream data to the {@link TaskRunner}. The results will be + * available in the user-defined result listener. + * + * @param audioClip a MediaPipe {@link AudioDatra} object for processing. + * @param timestampMs the corresponding timestamp of the input image in milliseconds. + * @throws MediaPipeException if the task is not in the stream mode. + */ + protected void sendAudioStreamData(AudioData audioClip, long timestampMs) { + if (runningMode != RunningMode.AUDIO_STREAM) { + throw new MediaPipeException( + MediaPipeException.StatusCode.FAILED_PRECONDITION.ordinal(), + "Task is not initialized with the audio stream mode. Current running mode:" + + runningMode.name()); + } + Map inputPackets = new HashMap<>(); + inputPackets.put( + audioStreamName, + runner + .getPacketCreator() + .createMatrix( + audioClip.getFormat().getNumOfChannels(), + audioClip.getBufferLength(), + audioClip.getBuffer())); + runner.send(inputPackets, timestampMs * MICROSECONDS_PER_MILLISECOND); + } + + /** Closes and cleans up the MediaPipe audio task. */ + @Override + public void close() { + runner.close(); + } +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/RunningMode.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/RunningMode.java new file mode 100644 index 000000000..f0a123810 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/core/RunningMode.java @@ -0,0 +1,29 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.audio.core; + +/** + * MediaPipe audio task running mode. A MediaPipe audio task can be run with two different modes: + * + *
    + *
  • AUDIO_CLIPS: The mode for running a mediapipe audio task on independent audio clips. + *
  • AUDIO_STREAM: The mode for running a mediapipe audio task on an audio stream, such as from + * microphone. + *
+ */ +public enum RunningMode { + AUDIO_CLIPS, + AUDIO_STREAM, +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/AudioData.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/AudioData.java new file mode 100644 index 000000000..40a05b1e4 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/AudioData.java @@ -0,0 +1,334 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.components.containers; + +import static java.lang.System.arraycopy; + +import android.media.AudioFormat; +import android.media.AudioRecord; +import com.google.auto.value.AutoValue; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * Defines a ring buffer and some utility functions to prepare the input audio samples. + * + *

It maintains a Ring Buffer to hold + * input audio data. Clients could feed input audio data via `load` methods and access the + * aggregated audio samples via `getTensorBuffer` method. + * + *

Note that this class can only handle input audio in Float (in {@link + * android.media.AudioFormat#ENCODING_PCM_16BIT}) or Short (in {@link + * android.media.AudioFormat#ENCODING_PCM_FLOAT}). Internally it converts and stores all the audio + * samples in PCM Float encoding. + * + *

Typical usage in Kotlin + * + *

+ *   val audioData = AudioData.create(format, modelInputLength)
+ *   audioData.load(newData)
+ * 
+ * + *

Another sample usage with {@link android.media.AudioRecord} + * + *

+ *   val audioData = AudioData.create(format, modelInputLength)
+ *   Timer().scheduleAtFixedRate(delay, period) {
+ *     audioData.load(audioRecord)
+ *   }
+ * 
+ */ +public class AudioData { + + private static final String TAG = AudioData.class.getSimpleName(); + private final FloatRingBuffer buffer; + private final AudioDataFormat format; + + /** + * Creates a {@link android.media.AudioRecord} instance with a ring buffer whose size is {@code + * sampleCounts} * {@code format.getNumOfChannels()}. + * + * @param format the expected {@link AudioDataFormat} of audio data loaded into this class. + * @param sampleCounts the number of samples. + */ + public static AudioData create(AudioDataFormat format, int sampleCounts) { + return new AudioData(format, sampleCounts); + } + + /** + * Creates a {@link AudioData} instance with a ring buffer whose size is {@code sampleCounts} * + * {@code format.getChannelCount()}. + * + * @param format the {@link android.media.AudioFormat} required by the TFLite model. It defines + * the number of channels and sample rate. + * @param sampleCounts the number of samples to be fed into the model + */ + public static AudioData create(AudioFormat format, int sampleCounts) { + return new AudioData(AudioDataFormat.create(format), sampleCounts); + } + + /** + * Wraps a few constants describing the format of the incoming audio samples, namely number of + * channels and the sample rate. By default, num of channels is set to 1. + */ + @AutoValue + public abstract static class AudioDataFormat { + private static final int DEFAULT_NUM_OF_CHANNELS = 1; + + /** Creates a {@link AudioFormat} instance from Android AudioFormat class. */ + public static AudioDataFormat create(AudioFormat format) { + return AudioDataFormat.builder() + .setNumOfChannels(format.getChannelCount()) + .setSampleRate(format.getSampleRate()) + .build(); + } + + public abstract int getNumOfChannels(); + + public abstract float getSampleRate(); + + public static Builder builder() { + return new AutoValue_AudioData_AudioDataFormat.Builder() + .setNumOfChannels(DEFAULT_NUM_OF_CHANNELS); + } + + /** Builder for {@link AudioDataFormat} */ + @AutoValue.Builder + public abstract static class Builder { + + /* By default, it's set to have 1 channel. */ + public abstract Builder setNumOfChannels(int value); + + public abstract Builder setSampleRate(float value); + + abstract AudioDataFormat autoBuild(); + + public AudioDataFormat build() { + AudioDataFormat format = autoBuild(); + if (format.getNumOfChannels() <= 0) { + throw new IllegalArgumentException("Number of channels should be greater than 0"); + } + if (format.getSampleRate() <= 0) { + throw new IllegalArgumentException("Sample rate should be greater than 0"); + } + return format; + } + } + } + + /** + * Stores the input audio samples {@code src} in the ring buffer. + * + * @param src input audio samples in {@link android.media.AudioFormat#ENCODING_PCM_FLOAT}. For + * multi-channel input, the array is interleaved. + */ + public void load(float[] src) { + load(src, 0, src.length); + } + + /** + * Stores the input audio samples {@code src} in the ring buffer. + * + * @param src input audio samples in {@link android.media.AudioFormat#ENCODING_PCM_FLOAT}. For + * multi-channel input, the array is interleaved. + * @param offsetInFloat starting position in the {@code src} array + * @param sizeInFloat the number of float values to be copied + * @throws IllegalArgumentException for incompatible audio format or incorrect input size + */ + public void load(float[] src, int offsetInFloat, int sizeInFloat) { + if (sizeInFloat % format.getNumOfChannels() != 0) { + throw new IllegalArgumentException( + String.format( + "Size (%d) needs to be a multiplier of the number of channels (%d)", + sizeInFloat, format.getNumOfChannels())); + } + buffer.load(src, offsetInFloat, sizeInFloat); + } + + /** + * Converts the input audio samples {@code src} to ENCODING_PCM_FLOAT, then stores it in the ring + * buffer. + * + * @param src input audio samples in {@link android.media.AudioFormat#ENCODING_PCM_16BIT}. For + * multi-channel input, the array is interleaved. + */ + public void load(short[] src) { + load(src, 0, src.length); + } + + /** + * Converts the input audio samples {@code src} to ENCODING_PCM_FLOAT, then stores it in the ring + * buffer. + * + * @param src input audio samples in {@link android.media.AudioFormat#ENCODING_PCM_16BIT}. For + * multi-channel input, the array is interleaved. + * @param offsetInShort starting position in the src array + * @param sizeInShort the number of short values to be copied + * @throws IllegalArgumentException if the source array can't be copied + */ + public void load(short[] src, int offsetInShort, int sizeInShort) { + if (offsetInShort + sizeInShort > src.length) { + throw new IllegalArgumentException( + String.format( + "Index out of range. offset (%d) + size (%d) should <= newData.length (%d)", + offsetInShort, sizeInShort, src.length)); + } + float[] floatData = new float[sizeInShort]; + for (int i = 0; i < sizeInShort; i++) { + // Convert the data to PCM Float encoding i.e. values between -1 and 1 + floatData[i] = src[i + offsetInShort] * 1.f / Short.MAX_VALUE; + } + load(floatData); + } + + /** + * Loads latest data from the {@link android.media.AudioRecord} in a non-blocking way. Only + * supporting ENCODING_PCM_16BIT and ENCODING_PCM_FLOAT. + * + * @param record an instance of {@link android.media.AudioRecord} + * @return number of captured audio values whose size is {@code channelCount * sampleCount}. If + * there was no new data in the AudioRecord or an error occurred, this method will return 0. + * @throws IllegalArgumentException for unsupported audio encoding format + * @throws IllegalStateException if reading from AudioRecord failed + */ + public int load(AudioRecord record) { + if (!this.format.equals(AudioDataFormat.create(record.getFormat()))) { + throw new IllegalArgumentException("Incompatible audio format."); + } + int loadedValues = 0; + if (record.getAudioFormat() == AudioFormat.ENCODING_PCM_FLOAT) { + float[] newData = new float[record.getChannelCount() * record.getBufferSizeInFrames()]; + loadedValues = record.read(newData, 0, newData.length, AudioRecord.READ_NON_BLOCKING); + if (loadedValues > 0) { + load(newData, 0, loadedValues); + return loadedValues; + } + } else if (record.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) { + short[] newData = new short[record.getChannelCount() * record.getBufferSizeInFrames()]; + loadedValues = record.read(newData, 0, newData.length, AudioRecord.READ_NON_BLOCKING); + if (loadedValues > 0) { + load(newData, 0, loadedValues); + return loadedValues; + } + } else { + throw new IllegalArgumentException( + "Unsupported encoding. Requires ENCODING_PCM_16BIT or ENCODING_PCM_FLOAT."); + } + + switch (loadedValues) { + case AudioRecord.ERROR_INVALID_OPERATION: + throw new IllegalStateException("AudioRecord.ERROR_INVALID_OPERATION"); + + case AudioRecord.ERROR_BAD_VALUE: + throw new IllegalStateException("AudioRecord.ERROR_BAD_VALUE"); + + case AudioRecord.ERROR_DEAD_OBJECT: + throw new IllegalStateException("AudioRecord.ERROR_DEAD_OBJECT"); + + case AudioRecord.ERROR: + throw new IllegalStateException("AudioRecord.ERROR"); + + default: + return 0; + } + } + + /** + * Returns a float array holding all the available audio samples in {@link + * android.media.AudioFormat#ENCODING_PCM_FLOAT} i.e. values are in the range of [-1, 1]. + */ + public float[] getBuffer() { + float[] bufferData = new float[buffer.getCapacity()]; + ByteBuffer byteBuffer = buffer.getBuffer(); + byteBuffer.asFloatBuffer().get(bufferData); + return bufferData; + } + + /* Returns the {@link AudioDataFormat} associated with the tensor. */ + public AudioDataFormat getFormat() { + return format; + } + + /* Returns the audio buffer length. */ + public int getBufferLength() { + return buffer.getCapacity() / format.getNumOfChannels(); + } + + private AudioData(AudioDataFormat format, int sampleCounts) { + this.format = format; + this.buffer = new FloatRingBuffer(sampleCounts * format.getNumOfChannels()); + } + + /** Actual implementation of the ring buffer. */ + private static class FloatRingBuffer { + + private final float[] buffer; + private int nextIndex = 0; + + public FloatRingBuffer(int flatSize) { + buffer = new float[flatSize]; + } + + /** + * Loads a slice of the float array to the ring buffer. If the float array is longer than ring + * buffer's capacity, samples with lower indices in the array will be ignored. + */ + public void load(float[] newData, int offset, int size) { + if (offset + size > newData.length) { + throw new IllegalArgumentException( + String.format( + "Index out of range. offset (%d) + size (%d) should <= newData.length (%d)", + offset, size, newData.length)); + } + // If buffer can't hold all the data, only keep the most recent data of size buffer.length + if (size > buffer.length) { + offset += (size - buffer.length); + size = buffer.length; + } + if (nextIndex + size < buffer.length) { + // No need to wrap nextIndex, just copy newData[offset:offset + size] + // to buffer[nextIndex:nextIndex+size] + arraycopy(newData, offset, buffer, nextIndex, size); + } else { + // Need to wrap nextIndex, perform copy in two chunks. + int firstChunkSize = buffer.length - nextIndex; + // First copy newData[offset:offset+firstChunkSize] to buffer[nextIndex:buffer.length] + arraycopy(newData, offset, buffer, nextIndex, firstChunkSize); + // Then copy newData[offset+firstChunkSize:offset+size] to buffer[0:size-firstChunkSize] + arraycopy(newData, offset + firstChunkSize, buffer, 0, size - firstChunkSize); + } + + nextIndex = (nextIndex + size) % buffer.length; + } + + public ByteBuffer getBuffer() { + // Create non-direct buffers. On Pixel 4, creating direct buffer costs around 0.1 ms, which + // can be 5x ~ 10x longer compared to non-direct buffer backed by arrays (around 0.01ms), so + // generally we don't create direct buffer for every invocation. + ByteBuffer byteBuffer = ByteBuffer.allocate(Float.SIZE / 8 * buffer.length); + byteBuffer.order(ByteOrder.nativeOrder()); + FloatBuffer result = byteBuffer.asFloatBuffer(); + result.put(buffer, nextIndex, buffer.length - nextIndex); + result.put(buffer, 0, nextIndex); + byteBuffer.rewind(); + return byteBuffer; + } + + public int getCapacity() { + return buffer.length; + } + } +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD index 63697229f..5c41edbad 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD @@ -16,6 +16,15 @@ package(default_visibility = ["//mediapipe/tasks:internal"]) licenses(["notice"]) +android_library( + name = "audio_data", + srcs = ["AudioData.java"], + deps = [ + "//third_party:autovalue", + "@maven//:com_google_guava_guava", + ], +) + android_library( name = "category", srcs = ["Category.java"], diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java index d18f0e41e..49c459ef1 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/OutputHandler.java @@ -31,11 +31,22 @@ public class OutputHandler { InputT convertToTaskInput(List packets); } - /** Interface for the customizable MediaPipe task result listener. */ + /** + * Interface for the customizable MediaPipe task result listener that can reteive both task result + * objects and the correpsonding input data. + */ public interface ResultListener { void run(OutputT result, InputT input); } + /** + * Interface for the customizable MediaPipe task result listener that can only reteive task result + * objects. + */ + public interface PureResultListener { + void run(OutputT result); + } + private static final String TAG = "OutputHandler"; // A task-specific graph output packet converter that should be implemented per task. private OutputPacketConverter outputPacketConverter; @@ -45,6 +56,8 @@ public class OutputHandler { protected ErrorListener errorListener; // The cached task result for non latency sensitive use cases. protected OutputT cachedTaskResult; + // The latest output timestamp. + protected long latestOutputTimestamp = -1; // Whether the output handler should react to timestamp-bound changes by outputting empty packets. private boolean handleTimestampBoundChanges = false; @@ -98,6 +111,11 @@ public class OutputHandler { return taskResult; } + /* Returns the latest output timestamp. */ + public long getLatestOutputTimestamp() { + return latestOutputTimestamp; + } + /** * Handles a list of output {@link Packet}s. Invoked when a packet list become available. * @@ -109,6 +127,7 @@ public class OutputHandler { taskResult = outputPacketConverter.convertToTaskResult(packets); if (resultListener == null) { cachedTaskResult = taskResult; + latestOutputTimestamp = packets.get(0).getTimestamp(); } else { InputT taskInput = outputPacketConverter.convertToTaskInput(packets); resultListener.run(taskResult, taskInput); diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/TaskRunner.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/TaskRunner.java index 5739edebe..e6fc91cf6 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/TaskRunner.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/TaskRunner.java @@ -93,6 +93,7 @@ public class TaskRunner implements AutoCloseable { public synchronized TaskResult process(Map inputs) { addPackets(inputs, generateSyntheticTimestamp()); graph.waitUntilGraphIdle(); + lastSeenTimestamp = outputHandler.getLatestOutputTimestamp(); return outputHandler.retrieveCachedTaskResult(); } From d5552c4bd9c884bf82f73991e25ff0219d5de3c3 Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 11:19:43 -0800 Subject: [PATCH 06/21] Internal Changes PiperOrigin-RevId: 487591065 --- third_party/external_files.bzl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/third_party/external_files.bzl b/third_party/external_files.bzl index e55b88131..a89a192ee 100644 --- a/third_party/external_files.bzl +++ b/third_party/external_files.bzl @@ -286,6 +286,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/general_meta.json?generation=1665422822603848"], ) + http_file( + name = "com_google_mediapipe_gesture_recognizer_task", + sha256 = "a966b1d4e774e0423c19c8aa71f070e5a72fe7a03c2663dd2f3cb0b0095ee3e1", + urls = ["https://storage.googleapis.com/mediapipe-assets/gesture_recognizer.task?generation=1668100501451433"], + ) + http_file( name = "com_google_mediapipe_golden_json_json", sha256 = "55c0c88748d099aa379930504df62c6c8f1d8874ea52d2f8a925f352c4c7f09c", From bb5782ee2ff572473428f53d8c74cf74b8638c33 Mon Sep 17 00:00:00 2001 From: Jiuqiang Tang Date: Thu, 10 Nov 2022 11:44:51 -0800 Subject: [PATCH 07/21] Correct the timestamp in the vision tasks result objects. PiperOrigin-RevId: 487597999 --- .../tasks/vision/core/BaseVisionTaskApi.java | 14 ++++++++++++++ .../gesturerecognizer/GestureRecognizer.java | 3 ++- .../vision/handlandmarker/HandLandmarker.java | 3 ++- .../vision/imageclassifier/ImageClassifier.java | 3 ++- .../vision/objectdetector/ObjectDetector.java | 3 ++- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/core/BaseVisionTaskApi.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/core/BaseVisionTaskApi.java index 0774b69a2..04158abf1 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/core/BaseVisionTaskApi.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/core/BaseVisionTaskApi.java @@ -160,4 +160,18 @@ public class BaseVisionTaskApi implements AutoCloseable { .setRotation(-(float) Math.PI * imageProcessingOptions.rotationDegrees() / 180.0f) .build(); } + + /** + * Generates the timestamp of a vision task result object from the vision task running mode and + * the output packet. + * + * @param runningMode MediaPipe Vision Tasks {@link RunningMode}. + * @param packet the output {@link Packet}. + */ + public static long generateResultTimestampMs(RunningMode runningMode, Packet packet) { + if (runningMode == RunningMode.IMAGE) { + return -1; + } + return packet.getTimestamp() / MICROSECONDS_PER_MILLISECOND; + } } diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java index d6faf5986..d1ba94a1f 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java @@ -175,7 +175,8 @@ public final class GestureRecognizer extends BaseVisionTaskApi { packets.get(HANDEDNESS_OUT_STREAM_INDEX), ClassificationList.parser()), PacketGetter.getProtoVector( packets.get(HAND_GESTURES_OUT_STREAM_INDEX), ClassificationList.parser()), - packets.get(HAND_GESTURES_OUT_STREAM_INDEX).getTimestamp()); + BaseVisionTaskApi.generateResultTimestampMs( + recognizerOptions.runningMode(), packets.get(HAND_GESTURES_OUT_STREAM_INDEX))); } @Override diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java index 91ec07f07..089e1c6e7 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java @@ -165,7 +165,8 @@ public final class HandLandmarker extends BaseVisionTaskApi { packets.get(WORLD_LANDMARKS_OUT_STREAM_INDEX), LandmarkList.parser()), PacketGetter.getProtoVector( packets.get(HANDEDNESS_OUT_STREAM_INDEX), ClassificationList.parser()), - packets.get(LANDMARKS_OUT_STREAM_INDEX).getTimestamp()); + BaseVisionTaskApi.generateResultTimestampMs( + landmarkerOptions.runningMode(), packets.get(LANDMARKS_OUT_STREAM_INDEX))); } @Override diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/imageclassifier/ImageClassifier.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/imageclassifier/ImageClassifier.java index f01546ffc..5e278804b 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/imageclassifier/ImageClassifier.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/imageclassifier/ImageClassifier.java @@ -176,7 +176,8 @@ public final class ImageClassifier extends BaseVisionTaskApi { PacketGetter.getProto( packets.get(CLASSIFICATIONS_OUT_STREAM_INDEX), ClassificationsProto.ClassificationResult.getDefaultInstance())), - packets.get(CLASSIFICATIONS_OUT_STREAM_INDEX).getTimestamp()); + BaseVisionTaskApi.generateResultTimestampMs( + options.runningMode(), packets.get(CLASSIFICATIONS_OUT_STREAM_INDEX))); } catch (IOException e) { throw new MediaPipeException( MediaPipeException.StatusCode.INTERNAL.ordinal(), e.getMessage()); diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/objectdetector/ObjectDetector.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/objectdetector/ObjectDetector.java index 3f944eaee..769b9137f 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/objectdetector/ObjectDetector.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/objectdetector/ObjectDetector.java @@ -173,7 +173,8 @@ public final class ObjectDetector extends BaseVisionTaskApi { return ObjectDetectionResult.create( PacketGetter.getProtoVector( packets.get(DETECTIONS_OUT_STREAM_INDEX), Detection.parser()), - packets.get(DETECTIONS_OUT_STREAM_INDEX).getTimestamp()); + BaseVisionTaskApi.generateResultTimestampMs( + detectorOptions.runningMode(), packets.get(DETECTIONS_OUT_STREAM_INDEX))); } @Override From aeb24668446f741b804039f3153a455d8bab8834 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Thu, 10 Nov 2022 12:35:46 -0800 Subject: [PATCH 08/21] Pick TFLite delegate for Web CPU PiperOrigin-RevId: 487611446 --- .../web/components/processors/base_options.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/mediapipe/tasks/web/components/processors/base_options.ts b/mediapipe/tasks/web/components/processors/base_options.ts index a7f7bd280..ac24a8db6 100644 --- a/mediapipe/tasks/web/components/processors/base_options.ts +++ b/mediapipe/tasks/web/components/processors/base_options.ts @@ -70,17 +70,11 @@ async function configureExternalFile( /** Configues the `acceleration` option. */ function configureAcceleration(options: BaseOptions, proto: BaseOptionsProto) { - if ('delegate' in options) { - const acceleration = new Acceleration(); - if (options.delegate === 'cpu') { - acceleration.setXnnpack( - new InferenceCalculatorOptions.Delegate.Xnnpack()); - proto.setAcceleration(acceleration); - } else if (options.delegate === 'gpu') { - acceleration.setGpu(new InferenceCalculatorOptions.Delegate.Gpu()); - proto.setAcceleration(acceleration); - } else { - proto.clearAcceleration(); - } + const acceleration = proto.getAcceleration() ?? new Acceleration(); + if (options.delegate === 'gpu') { + acceleration.setGpu(new InferenceCalculatorOptions.Delegate.Gpu()); + } else { + acceleration.setTflite(new InferenceCalculatorOptions.Delegate.TfLite()); } + proto.setAcceleration(acceleration); } From 8ec4427bd75b8d2b2ec2105a55ac5cfbce42da2b Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 12:51:34 -0800 Subject: [PATCH 09/21] Add option, result types and utils for Java embedders. PiperOrigin-RevId: 487615327 --- .../tasks/components/containers/BUILD | 27 ++++ .../components/containers/Embedding.java | 88 +++++++++++++ .../containers/EmbeddingResult.java | 69 +++++++++++ .../tasks/components/processors/BUILD | 13 ++ .../processors/EmbedderOptions.java | 68 ++++++++++ .../mediapipe/tasks/components/utils/BUILD | 26 ++++ .../components/utils/CosineSimilarity.java | 88 +++++++++++++ .../components/utils/AndroidManifest.xml | 24 ++++ .../mediapipe/tasks/components/utils/BUILD | 19 +++ .../utils/CosineSimilarityTest.java | 116 ++++++++++++++++++ 10 files changed, 538 insertions(+) create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/Embedding.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/EmbeddingResult.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/EmbedderOptions.java create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD create mode 100644 mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/CosineSimilarity.java create mode 100644 mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/AndroidManifest.xml create mode 100644 mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/BUILD create mode 100644 mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/CosineSimilarityTest.java diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD index 5c41edbad..aa835894e 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD @@ -89,3 +89,30 @@ filegroup( srcs = glob(["*.java"]), visibility = ["//mediapipe/tasks/java/com/google/mediapipe/tasks/core:__subpackages__"], ) + +android_library( + name = "embedding", + srcs = ["Embedding.java"], + javacopts = [ + "-Xep:AndroidJdkLibsChecker:OFF", + ], + deps = [ + "//mediapipe/tasks/cc/components/containers/proto:embeddings_java_proto_lite", + "//third_party:autovalue", + "@maven//:com_google_guava_guava", + ], +) + +android_library( + name = "embeddingresult", + srcs = ["EmbeddingResult.java"], + javacopts = [ + "-Xep:AndroidJdkLibsChecker:OFF", + ], + deps = [ + ":embedding", + "//mediapipe/tasks/cc/components/containers/proto:embeddings_java_proto_lite", + "//third_party:autovalue", + "@maven//:com_google_guava_guava", + ], +) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/Embedding.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/Embedding.java new file mode 100644 index 000000000..6cb0e325b --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/Embedding.java @@ -0,0 +1,88 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.components.containers; + +import com.google.auto.value.AutoValue; +import com.google.mediapipe.tasks.components.containers.proto.EmbeddingsProto; +import java.util.Optional; + +/** + * Represents the embedding for a given embedder head. Typically used in embedding tasks. + * + *

One and only one of the two 'floatEmbedding' and 'quantizedEmbedding' will contain data, based + * on whether or not the embedder was configured to perform scala quantization. + */ +@AutoValue +public abstract class Embedding { + + /** + * Creates an {@link Embedding} instance. + * + * @param floatEmbedding the floating-point embedding + * @param quantizedEmbedding the quantized embedding. + * @param headIndex the index of the embedder head. + * @param headName the optional name of the embedder head. + */ + public static Embedding create( + float[] floatEmbedding, byte[] quantizedEmbedding, int headIndex, Optional headName) { + return new AutoValue_Embedding(floatEmbedding, quantizedEmbedding, headIndex, headName); + } + + /** + * Creates an {@link Embedding} object from an {@link EmbeddingsProto.Embedding} protobuf message. + * + * @param proto the {@link EmbeddingsProto.Embedding} protobuf message to convert. + */ + public static Embedding createFromProto(EmbeddingsProto.Embedding proto) { + float[] floatEmbedding; + if (proto.hasFloatEmbedding()) { + floatEmbedding = new float[proto.getFloatEmbedding().getValuesCount()]; + for (int i = 0; i < floatEmbedding.length; i++) { + floatEmbedding[i] = proto.getFloatEmbedding().getValues(i); + } + } else { + floatEmbedding = new float[0]; + } + return Embedding.create( + floatEmbedding, + proto.hasQuantizedEmbedding() + ? proto.getQuantizedEmbedding().getValues().toByteArray() + : new byte[0], + proto.getHeadIndex(), + proto.hasHeadName() ? Optional.of(proto.getHeadName()) : Optional.empty()); + } + + /** + * Floating-point embedding. + * + *

Empty if the embedder was configured to perform scalar quantization. + */ + public abstract float[] floatEmbedding(); + + /** + * Quantized embedding. + * + *

Empty if the embedder was not configured to perform scalar quantization. + */ + public abstract byte[] quantizedEmbedding(); + + /** + * The index of the embedder head these entries refer to. This is useful for multi-head models. + */ + public abstract int headIndex(); + + /** The optional name of the embedder head, which is the corresponding tensor metadata name. */ + public abstract Optional headName(); +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/EmbeddingResult.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/EmbeddingResult.java new file mode 100644 index 000000000..32fa7b47d --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/EmbeddingResult.java @@ -0,0 +1,69 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.components.containers; + +import com.google.auto.value.AutoValue; +import com.google.mediapipe.tasks.components.containers.proto.EmbeddingsProto; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +/** Represents the embedding results of a model. Typically used as a result for embedding tasks. */ +@AutoValue +public abstract class EmbeddingResult { + + /** + * Creates a {@link EmbeddingResult} instance. + * + * @param embeddings the list of {@link Embedding} objects containing the embedding for each head + * of the model. + * @param timestampMs the optional timestamp (in milliseconds) of the start of the chunk of data + * corresponding to these results. + */ + public static EmbeddingResult create(List embeddings, Optional timestampMs) { + return new AutoValue_EmbeddingResult(Collections.unmodifiableList(embeddings), timestampMs); + } + + /** + * Creates a {@link EmbeddingResult} object from a {@link EmbeddingsProto.EmbeddingResult} + * protobuf message. + * + * @param proto the {@link EmbeddingsProto.EmbeddingResult} protobuf message to convert. + */ + public static EmbeddingResult createFromProto(EmbeddingsProto.EmbeddingResult proto) { + List embeddings = new ArrayList<>(); + for (EmbeddingsProto.Embedding embeddingProto : proto.getEmbeddingsList()) { + embeddings.add(Embedding.createFromProto(embeddingProto)); + } + Optional timestampMs = + proto.hasTimestampMs() ? Optional.of(proto.getTimestampMs()) : Optional.empty(); + return create(embeddings, timestampMs); + } + + /** The embedding results for each head of the model. */ + public abstract List embeddings(); + + /** + * The optional timestamp (in milliseconds) of the start of the chunk of data corresponding to + * these results. + * + *

This is only used for embedding extraction on time series (e.g. audio embedder). In these + * use cases, the amount of data to process might exceed the maximum size that the model can + * process: to solve this, the input data is split into multiple chunks starting at different + * timestamps. + */ + public abstract Optional timestampMs(); +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/BUILD index 1f99f1612..e61e59390 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/BUILD @@ -29,6 +29,19 @@ android_library( ], ) +android_library( + name = "embedderoptions", + srcs = ["EmbedderOptions.java"], + javacopts = [ + "-Xep:AndroidJdkLibsChecker:OFF", + ], + deps = [ + "//mediapipe/tasks/cc/components/processors/proto:embedder_options_java_proto_lite", + "//third_party:autovalue", + "@maven//:com_google_guava_guava", + ], +) + # Expose the java source files for building mediapipe tasks core AAR. filegroup( name = "java_src", diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/EmbedderOptions.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/EmbedderOptions.java new file mode 100644 index 000000000..3cd197234 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors/EmbedderOptions.java @@ -0,0 +1,68 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.components.processors; + +import com.google.auto.value.AutoValue; +import com.google.mediapipe.tasks.components.processors.proto.EmbedderOptionsProto; + +/** Embedder options shared across MediaPipe Java embedding tasks. */ +@AutoValue +public abstract class EmbedderOptions { + + /** Builder for {@link EmbedderOptions} */ + @AutoValue.Builder + public abstract static class Builder { + /** + * Sets whether L2 normalization should be performed on the returned embeddings. Use this option + * only if the model does not already contain a native L2_NORMALIZATION TF Lite Op. + * In most cases, this is already the case and L2 norm is thus achieved through TF Lite + * inference. + * + *

False by default. + */ + public abstract Builder setL2Normalize(boolean l2Normalize); + + /** + * Sets whether the returned embedding should be quantized to bytes via scalar quantization. + * Embeddings are implicitly assumed to be unit-norm and therefore any dimensions is guaranteed + * to have value in [-1.0, 1.0]. Use {@link #setL2Normalize(boolean)} if this is + * not the case. + * + *

False by default. + */ + public abstract Builder setQuantize(boolean quantize); + + public abstract EmbedderOptions build(); + } + + public abstract boolean l2Normalize(); + + public abstract boolean quantize(); + + public static Builder builder() { + return new AutoValue_EmbedderOptions.Builder().setL2Normalize(false).setQuantize(false); + } + + /** + * Converts an {@link EmbedderOptions} object to an {@link EmbedderOptionsProto.EmbedderOptions} + * protobuf message. + */ + public EmbedderOptionsProto.EmbedderOptions convertToProto() { + return EmbedderOptionsProto.EmbedderOptions.newBuilder() + .setL2Normalize(l2Normalize()) + .setQuantize(quantize()) + .build(); + } +} diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD new file mode 100644 index 000000000..cd2bbafc8 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD @@ -0,0 +1,26 @@ +# Copyright 2022 The MediaPipe 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. + +package(default_visibility = ["//mediapipe/tasks:internal"]) + +licenses(["notice"]) + +android_library( + name = "cosinesimilarity", + srcs = ["CosineSimilarity.java"], + deps = [ + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:embedding", + "@maven//:com_google_guava_guava", + ], +) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/CosineSimilarity.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/CosineSimilarity.java new file mode 100644 index 000000000..6b995731f --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/CosineSimilarity.java @@ -0,0 +1,88 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.components.utils; + +import com.google.mediapipe.tasks.components.containers.Embedding; + +/** Utility class for computing cosine similarity between {@link Embedding} objects. */ +public class CosineSimilarity { + + // Non-instantiable class. + private CosineSimilarity() {} + + /** + * Computes cosine similarity + * between two {@link Embedding} objects. + * + * @throws IllegalArgumentException if the embeddings are of different types (float vs. + * quantized), have different sizes, or have an L2-norm of 0. + */ + public static double compute(Embedding u, Embedding v) { + if (u.floatEmbedding().length > 0 && v.floatEmbedding().length > 0) { + return computeFloat(u.floatEmbedding(), v.floatEmbedding()); + } + if (u.quantizedEmbedding().length > 0 && v.quantizedEmbedding().length > 0) { + return computeQuantized(u.quantizedEmbedding(), v.quantizedEmbedding()); + } + throw new IllegalArgumentException( + "Cannot compute cosine similarity between quantized and float embeddings."); + } + + private static double computeFloat(float[] u, float[] v) { + if (u.length != v.length) { + throw new IllegalArgumentException( + String.format( + "Cannot compute cosine similarity between embeddings of different sizes (%d vs." + + " %d).", + u.length, v.length)); + } + double dotProduct = 0.0; + double normU = 0.0; + double normV = 0.0; + for (int i = 0; i < u.length; i++) { + dotProduct += u[i] * v[i]; + normU += u[i] * u[i]; + normV += v[i] * v[i]; + } + if (normU <= 0 || normV <= 0) { + throw new IllegalArgumentException( + "Cannot compute cosine similarity on embedding with 0 norm."); + } + return dotProduct / Math.sqrt(normU * normV); + } + + private static double computeQuantized(byte[] u, byte[] v) { + if (u.length != v.length) { + throw new IllegalArgumentException( + String.format( + "Cannot compute cosine similarity between embeddings of different sizes (%d vs." + + " %d).", + u.length, v.length)); + } + double dotProduct = 0.0; + double normU = 0.0; + double normV = 0.0; + for (int i = 0; i < u.length; i++) { + dotProduct += u[i] * v[i]; + normU += u[i] * u[i]; + normV += v[i] * v[i]; + } + if (normU <= 0 || normV <= 0) { + throw new IllegalArgumentException( + "Cannot compute cosine similarity on embedding with 0 norm."); + } + return dotProduct / Math.sqrt(normU * normV); + } +} diff --git a/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/AndroidManifest.xml b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/AndroidManifest.xml new file mode 100644 index 000000000..d0c1ff91f --- /dev/null +++ b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/BUILD b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/BUILD new file mode 100644 index 000000000..a7f804c64 --- /dev/null +++ b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/BUILD @@ -0,0 +1,19 @@ +# Copyright 2022 The MediaPipe 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. + +package(default_visibility = ["//mediapipe/tasks:internal"]) + +licenses(["notice"]) + +# TODO: Enable this in OSS diff --git a/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/CosineSimilarityTest.java b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/CosineSimilarityTest.java new file mode 100644 index 000000000..f7a1ae002 --- /dev/null +++ b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/components/utils/CosineSimilarityTest.java @@ -0,0 +1,116 @@ +// Copyright 2022 The MediaPipe 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. + +package com.google.mediapipe.tasks.components.utils; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.mediapipe.tasks.components.containers.Embedding; +import java.util.Optional; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Tests for {@link CosineSimilarity}. */ +@RunWith(AndroidJUnit4.class) +public final class CosineSimilarityTest { + + @Test + public void failsWithQuantizedAndFloatEmbeddings() { + Embedding u = + Embedding.create( + new float[] {1.0f}, new byte[0], /*headIndex=*/ 0, /*headName=*/ Optional.empty()); + Embedding v = + Embedding.create( + new float[0], new byte[] {1}, /*headIndex=*/ 0, /*headName=*/ Optional.empty()); + + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> CosineSimilarity.compute(u, v)); + assertThat(exception) + .hasMessageThat() + .contains("Cannot compute cosine similarity between quantized and float embeddings"); + } + + @Test + public void failsWithZeroNorm() { + Embedding u = + Embedding.create( + new float[] {0.0f}, new byte[0], /*headIndex=*/ 0, /*headName=*/ Optional.empty()); + + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> CosineSimilarity.compute(u, u)); + assertThat(exception) + .hasMessageThat() + .contains("Cannot compute cosine similarity on embedding with 0 norm"); + } + + @Test + public void failsWithDifferentSizes() { + Embedding u = + Embedding.create( + new float[] {1.0f, 2.0f}, + new byte[0], + /*headIndex=*/ 0, + /*headName=*/ Optional.empty()); + Embedding v = + Embedding.create( + new float[] {1.0f, 2.0f, 3.0f}, + new byte[0], + /*headIndex=*/ 0, + /*headName=*/ Optional.empty()); + + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> CosineSimilarity.compute(u, v)); + assertThat(exception) + .hasMessageThat() + .contains("Cannot compute cosine similarity between embeddings of different sizes"); + } + + @Test + public void succeedsWithFloatEmbeddings() { + Embedding u = + Embedding.create( + new float[] {1.0f, 0.0f, 0.0f, 0.0f}, + new byte[0], + /*headIndex=*/ 0, + /*headName=*/ Optional.empty()); + Embedding v = + Embedding.create( + new float[] {0.5f, 0.5f, 0.5f, 0.5f}, + new byte[0], + /*headIndex=*/ 0, + /*headName=*/ Optional.empty()); + + assertThat(CosineSimilarity.compute(u, v)).isEqualTo(0.5); + } + + @Test + public void succeedsWithQuantizedEmbeddings() { + Embedding u = + Embedding.create( + new float[0], + new byte[] {127, 0, 0, 0}, + /*headIndex=*/ 0, + /*headName=*/ Optional.empty()); + Embedding v = + Embedding.create( + new float[0], + new byte[] {-128, 0, 0, 0}, + /*headIndex=*/ 0, + /*headName=*/ Optional.empty()); + + assertThat(CosineSimilarity.compute(u, v)).isEqualTo(-1.0); + } +} From d93caf00defb91b0b553264d0dacca08f0748b82 Mon Sep 17 00:00:00 2001 From: Hadon Nash Date: Thu, 10 Nov 2022 14:03:49 -0800 Subject: [PATCH 10/21] Fixing a bug in the BypassCalculator "passthrough" output stream ids. PiperOrigin-RevId: 487633708 --- mediapipe/calculators/core/bypass_calculator.cc | 2 +- mediapipe/calculators/core/bypass_calculator_test.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mediapipe/calculators/core/bypass_calculator.cc b/mediapipe/calculators/core/bypass_calculator.cc index 86dcfc0e1..efc0612ec 100644 --- a/mediapipe/calculators/core/bypass_calculator.cc +++ b/mediapipe/calculators/core/bypass_calculator.cc @@ -130,7 +130,7 @@ class BypassCalculator : public Node { pass_out.insert(entry.second); auto& packet = cc->Inputs().Get(entry.first).Value(); if (packet.Timestamp() == cc->InputTimestamp()) { - cc->Outputs().Get(entry.first).AddPacket(packet); + cc->Outputs().Get(entry.second).AddPacket(packet); } } Timestamp bound = cc->InputTimestamp().NextAllowedInStream(); diff --git a/mediapipe/calculators/core/bypass_calculator_test.cc b/mediapipe/calculators/core/bypass_calculator_test.cc index 224742a13..ccad510c6 100644 --- a/mediapipe/calculators/core/bypass_calculator_test.cc +++ b/mediapipe/calculators/core/bypass_calculator_test.cc @@ -42,10 +42,10 @@ constexpr char kTestGraphConfig1[] = R"pb( node { calculator: "BypassCalculator" input_stream: "PASS:appearances" - input_stream: "TRUNCATE:0:video_frame" - input_stream: "TRUNCATE:1:feature_config" + input_stream: "IGNORE:0:video_frame" + input_stream: "IGNORE:1:feature_config" output_stream: "PASS:passthrough_appearances" - output_stream: "TRUNCATE:passthrough_federated_gaze_output" + output_stream: "IGNORE:passthrough_federated_gaze_output" node_options: { [type.googleapis.com/mediapipe.BypassCalculatorOptions] { pass_input_stream: "PASS" From d6ba5e4bbe822cf33fe9020284e7c9d71dd489c5 Mon Sep 17 00:00:00 2001 From: Jiuqiang Tang Date: Thu, 10 Nov 2022 15:10:37 -0800 Subject: [PATCH 11/21] Map the "com_github_glog_glog" dependency of "com_google_audio_tools" to mediapipe's "com_github_glog_glog_no_gflags". PiperOrigin-RevId: 487651038 --- WORKSPACE | 1 + mediapipe/calculators/audio/BUILD | 3 +++ mediapipe/calculators/tensor/BUILD | 1 + 3 files changed, 5 insertions(+) diff --git a/WORKSPACE b/WORKSPACE index f5594a524..046da997b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -155,6 +155,7 @@ http_archive( name = "com_google_audio_tools", strip_prefix = "multichannel-audio-tools-master", urls = ["https://github.com/google/multichannel-audio-tools/archive/master.zip"], + repo_mapping = {"@com_github_glog_glog" : "@com_github_glog_glog_no_gflags"}, ) http_archive( diff --git a/mediapipe/calculators/audio/BUILD b/mediapipe/calculators/audio/BUILD index 3f7957552..ba461e4a7 100644 --- a/mediapipe/calculators/audio/BUILD +++ b/mediapipe/calculators/audio/BUILD @@ -277,6 +277,7 @@ cc_test( "//mediapipe/framework/port:gtest_main", "//mediapipe/framework/port:status", "//mediapipe/util:time_series_test_util", + "@com_google_audio_tools//audio/dsp/mfcc", "@eigen_archive//:eigen3", ], ) @@ -352,6 +353,8 @@ cc_test( "//mediapipe/framework/port:status", "//mediapipe/framework/tool:validate_type", "//mediapipe/util:time_series_test_util", + "@com_google_audio_tools//audio/dsp:resampler", + "@com_google_audio_tools//audio/dsp:resampler_q", "@com_google_audio_tools//audio/dsp:signal_vector_util", "@eigen_archive//:eigen3", ], diff --git a/mediapipe/calculators/tensor/BUILD b/mediapipe/calculators/tensor/BUILD index 1a2a6b342..3385bcf47 100644 --- a/mediapipe/calculators/tensor/BUILD +++ b/mediapipe/calculators/tensor/BUILD @@ -156,6 +156,7 @@ cc_test( "//mediapipe/framework/port:parse_text_proto", "@com_google_absl//absl/status", "@com_google_absl//absl/strings", + "@com_google_audio_tools//audio/dsp:window_functions", ], ) From b3ac1c138747fa6f4bcf86892fbf7f48af8d8229 Mon Sep 17 00:00:00 2001 From: Jiuqiang Tang Date: Thu, 10 Nov 2022 15:53:34 -0800 Subject: [PATCH 12/21] Changes to create MediaPipe Tasks Audio AAR. PiperOrigin-RevId: 487661296 --- .../com/google/mediapipe/tasks/audio/BUILD | 12 ++++- .../audioclassifier/AudioClassifier.java | 2 +- .../tasks/components/containers/BUILD | 2 +- .../mediapipe/tasks/components/utils/BUILD | 7 +++ .../com/google/mediapipe/tasks/core/BUILD | 1 + .../mediapipe/tasks/mediapipe_tasks_aar.bzl | 48 ++++++++++++++++++- 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD index c5cb6f8a3..b162d7dac 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/BUILD @@ -25,7 +25,7 @@ android_library( deps = [ ":libmediapipe_tasks_audio_jni_lib", "//mediapipe/java/com/google/mediapipe/framework:android_framework_no_mff", - "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audio_data", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audiodata", "//mediapipe/tasks/java/com/google/mediapipe/tasks/core", "@maven//:com_google_guava_guava", ], @@ -66,7 +66,7 @@ android_library( "//mediapipe/tasks/cc/audio/audio_classifier/proto:audio_classifier_graph_options_java_proto_lite", "//mediapipe/tasks/cc/components/containers/proto:classifications_java_proto_lite", "//mediapipe/tasks/cc/core/proto:base_options_java_proto_lite", - "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audio_data", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audiodata", "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:classificationresult", "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors:classifieroptions", "//mediapipe/tasks/java/com/google/mediapipe/tasks/core", @@ -74,3 +74,11 @@ android_library( "@maven//:com_google_guava_guava", ], ) + +load("//mediapipe/tasks/java/com/google/mediapipe/tasks:mediapipe_tasks_aar.bzl", "mediapipe_tasks_audio_aar") + +mediapipe_tasks_audio_aar( + name = "tasks_audio", + srcs = glob(["**/*.java"]), + native_library = ":libmediapipe_tasks_audio_jni_lib", +) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java index 88b6daf0a..5a82eecaa 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/audio/audioclassifier/AudioClassifier.java @@ -188,7 +188,7 @@ public final class AudioClassifier extends BaseAudioTaskApi { }); if (options.resultListener().isPresent()) { ResultListener resultListener = - new ResultListener<>() { + new ResultListener() { @Override public void run(AudioClassifierResult audioClassifierResult, Void input) { options.resultListener().get().run(audioClassifierResult); diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD index aa835894e..d6e6ac740 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers/BUILD @@ -17,7 +17,7 @@ package(default_visibility = ["//mediapipe/tasks:internal"]) licenses(["notice"]) android_library( - name = "audio_data", + name = "audiodata", srcs = ["AudioData.java"], deps = [ "//third_party:autovalue", diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD index cd2bbafc8..b2d27bfa7 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils/BUILD @@ -24,3 +24,10 @@ android_library( "@maven//:com_google_guava_guava", ], ) + +# Expose the java source files for building mediapipe tasks core AAR. +filegroup( + name = "java_src", + srcs = glob(["*.java"]), + visibility = ["//mediapipe/tasks/java/com/google/mediapipe/tasks/core:__subpackages__"], +) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD index cb9d67424..01b1f653a 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD @@ -44,6 +44,7 @@ mediapipe_tasks_core_aar( srcs = glob(["*.java"]) + [ "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:java_src", "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors:java_src", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/utils:java_src", "//mediapipe/java/com/google/mediapipe/framework/image:java_src", ], manifest = "AndroidManifest.xml", diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl b/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl index 62c424f66..f0c9f81c6 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl @@ -30,6 +30,10 @@ _CORE_TASKS_JAVA_PROTO_LITE_TARGETS = [ "//mediapipe/tasks/cc/core/proto:external_file_java_proto_lite", ] +_AUDIO_TASKS_JAVA_PROTO_LITE_TARGETS = [ + "//mediapipe/tasks/cc/audio/audio_classifier/proto:audio_classifier_graph_options_java_proto_lite", +] + _VISION_TASKS_JAVA_PROTO_LITE_TARGETS = [ "//mediapipe/tasks/cc/vision/object_detector/proto:object_detector_options_java_proto_lite", "//mediapipe/tasks/cc/vision/image_classifier/proto:image_classifier_graph_options_java_proto_lite", @@ -62,6 +66,11 @@ def mediapipe_tasks_core_aar(name, srcs, manifest): _mediapipe_tasks_java_proto_src_extractor(target = target), ) + for target in _AUDIO_TASKS_JAVA_PROTO_LITE_TARGETS: + mediapipe_tasks_java_proto_srcs.append( + _mediapipe_tasks_java_proto_src_extractor(target = target), + ) + for target in _VISION_TASKS_JAVA_PROTO_LITE_TARGETS: mediapipe_tasks_java_proto_srcs.append( _mediapipe_tasks_java_proto_src_extractor(target = target), @@ -119,9 +128,43 @@ def mediapipe_tasks_core_aar(name, srcs, manifest): "@maven//:com_google_flogger_flogger_system_backend", "@maven//:com_google_code_findbugs_jsr305", ] + + _AUDIO_TASKS_JAVA_PROTO_LITE_TARGETS + _CORE_TASKS_JAVA_PROTO_LITE_TARGETS + - _VISION_TASKS_JAVA_PROTO_LITE_TARGETS + - _TEXT_TASKS_JAVA_PROTO_LITE_TARGETS, + _TEXT_TASKS_JAVA_PROTO_LITE_TARGETS + + _VISION_TASKS_JAVA_PROTO_LITE_TARGETS, + ) + +def mediapipe_tasks_audio_aar(name, srcs, native_library): + """Builds medaipipe tasks audio AAR. + + Args: + name: The bazel target name. + srcs: MediaPipe Audio Tasks' source files. + native_library: The native library that contains audio tasks' graph and calculators. + """ + + native.genrule( + name = name + "tasks_manifest_generator", + outs = ["AndroidManifest.xml"], + cmd = """ +cat > $(OUTS) < + + + +EOF +""", + ) + + _mediapipe_tasks_aar( + name = name, + srcs = srcs, + manifest = "AndroidManifest.xml", + java_proto_lite_targets = _CORE_TASKS_JAVA_PROTO_LITE_TARGETS + _AUDIO_TASKS_JAVA_PROTO_LITE_TARGETS, + native_library = native_library, ) def mediapipe_tasks_vision_aar(name, srcs, native_library): @@ -232,6 +275,7 @@ def _mediapipe_tasks_aar(name, srcs, manifest, java_proto_lite_targets, native_l "//mediapipe/framework/formats:landmark_java_proto_lite", "//mediapipe/framework/formats:location_data_java_proto_lite", "//mediapipe/framework/formats:rect_java_proto_lite", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:audiodata", "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:detection", "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:category", "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:classificationresult", From 1a59f0a217261a643c2b654ccf9db59f8bd9b831 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Thu, 10 Nov 2022 15:54:50 -0800 Subject: [PATCH 13/21] Prevent renaming of properties used in API PiperOrigin-RevId: 487661625 --- mediapipe/tasks/web/components/containers/category.d.ts | 2 +- .../web/components/containers/classification_result.d.ts | 2 +- mediapipe/tasks/web/components/containers/landmark.d.ts | 2 +- mediapipe/tasks/web/core/base_options.d.ts | 2 +- mediapipe/tasks/web/core/classifier_options.d.ts | 2 +- mediapipe/tasks/web/core/wasm_loader_options.d.ts | 2 +- .../vision/gesture_recognizer/gesture_recognizer_options.ts | 2 +- .../vision/gesture_recognizer/gesture_recognizer_result.ts | 2 +- .../web/vision/object_detector/object_detector_result.ts | 4 ++-- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mediapipe/tasks/web/components/containers/category.d.ts b/mediapipe/tasks/web/components/containers/category.d.ts index 0da8a061f..8ab8e6b84 100644 --- a/mediapipe/tasks/web/components/containers/category.d.ts +++ b/mediapipe/tasks/web/components/containers/category.d.ts @@ -15,7 +15,7 @@ */ /** A classification category. */ -export interface Category { +export declare interface Category { /** The probability score of this label category. */ score: number; diff --git a/mediapipe/tasks/web/components/containers/classification_result.d.ts b/mediapipe/tasks/web/components/containers/classification_result.d.ts index 33632f925..30590ab43 100644 --- a/mediapipe/tasks/web/components/containers/classification_result.d.ts +++ b/mediapipe/tasks/web/components/containers/classification_result.d.ts @@ -17,7 +17,7 @@ import {Category} from '../../../../tasks/web/components/containers/category'; /** Classification results for a given classifier head. */ -export interface Classifications { +export declare interface Classifications { /** * The array of predicted categories, usually sorted by descending scores, * e.g., from high to low probability. diff --git a/mediapipe/tasks/web/components/containers/landmark.d.ts b/mediapipe/tasks/web/components/containers/landmark.d.ts index 9a1badbba..f790d8a0b 100644 --- a/mediapipe/tasks/web/components/containers/landmark.d.ts +++ b/mediapipe/tasks/web/components/containers/landmark.d.ts @@ -20,7 +20,7 @@ * dimension of image, and the coordinates values are in the range of [0,1]. * Otherwise, it represenet a point in world coordinates. */ -export class Landmark { +export declare class Landmark { /** The x coordinates of the landmark. */ x: number; diff --git a/mediapipe/tasks/web/core/base_options.d.ts b/mediapipe/tasks/web/core/base_options.d.ts index 54a59a21b..86635b8c7 100644 --- a/mediapipe/tasks/web/core/base_options.d.ts +++ b/mediapipe/tasks/web/core/base_options.d.ts @@ -17,7 +17,7 @@ // Placeholder for internal dependency on trusted resource url /** Options to configure MediaPipe Tasks in general. */ -export interface BaseOptions { +export declare interface BaseOptions { /** * The model path to the model asset file. Only one of `modelAssetPath` or * `modelAssetBuffer` can be set. diff --git a/mediapipe/tasks/web/core/classifier_options.d.ts b/mediapipe/tasks/web/core/classifier_options.d.ts index 356643c55..3dec8d27e 100644 --- a/mediapipe/tasks/web/core/classifier_options.d.ts +++ b/mediapipe/tasks/web/core/classifier_options.d.ts @@ -17,7 +17,7 @@ import {BaseOptions} from '../../../tasks/web/core/base_options'; /** Options to configure the Mediapipe Classifier Task. */ -export interface ClassifierOptions { +export declare interface ClassifierOptions { /** Options to configure the loading of the model assets. */ baseOptions?: BaseOptions; diff --git a/mediapipe/tasks/web/core/wasm_loader_options.d.ts b/mediapipe/tasks/web/core/wasm_loader_options.d.ts index 1925aaf06..74436583d 100644 --- a/mediapipe/tasks/web/core/wasm_loader_options.d.ts +++ b/mediapipe/tasks/web/core/wasm_loader_options.d.ts @@ -17,7 +17,7 @@ // Placeholder for internal dependency on trusted resource url /** An object containing the locations of all Wasm assets */ -export interface WasmLoaderOptions { +export declare interface WasmLoaderOptions { /** The path to the Wasm loader script. */ wasmLoaderPath: string; /** The path to the Wasm binary. */ diff --git a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_options.ts b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_options.ts index 16169a93f..45601a74c 100644 --- a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_options.ts +++ b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_options.ts @@ -18,7 +18,7 @@ import {BaseOptions} from '../../../../tasks/web/core/base_options'; import {ClassifierOptions} from '../../../../tasks/web/core/classifier_options'; /** Options to configure the MediaPipe Gesture Recognizer Task */ -export interface GestureRecognizerOptions { +export declare interface GestureRecognizerOptions { /** Options to configure the loading of the model assets. */ baseOptions?: BaseOptions; diff --git a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts index cccdfaf68..08c8c2931 100644 --- a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts +++ b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts @@ -20,7 +20,7 @@ import {Landmark} from '../../../../tasks/web/components/containers/landmark'; /** * Represents the gesture recognition results generated by `GestureRecognizer`. */ -export interface GestureRecognitionResult { +export declare interface GestureRecognitionResult { /** Hand landmarks of detected hands. */ landmarks: Landmark[][]; diff --git a/mediapipe/tasks/web/vision/object_detector/object_detector_result.ts b/mediapipe/tasks/web/vision/object_detector/object_detector_result.ts index 7b2621134..e9e3843bc 100644 --- a/mediapipe/tasks/web/vision/object_detector/object_detector_result.ts +++ b/mediapipe/tasks/web/vision/object_detector/object_detector_result.ts @@ -17,7 +17,7 @@ import {Category} from '../../../../tasks/web/components/containers/category'; /** An integer bounding box, axis aligned. */ -export interface BoundingBox { +export declare interface BoundingBox { /** The X coordinate of the top-left corner, in pixels. */ originX: number; /** The Y coordinate of the top-left corner, in pixels. */ @@ -29,7 +29,7 @@ export interface BoundingBox { } /** Represents one object detected by the `ObjectDetector`. */ -export interface Detection { +export declare interface Detection { /** A list of `Category` objects. */ categories: Category[]; From 2ea5184c51918bbf4617d682423dcd0e78afa457 Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 16:02:04 -0800 Subject: [PATCH 14/21] Internal change PiperOrigin-RevId: 487663454 --- .../hand_landmarker/hand_landmarker_graph.cc | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/mediapipe/tasks/cc/vision/hand_landmarker/hand_landmarker_graph.cc b/mediapipe/tasks/cc/vision/hand_landmarker/hand_landmarker_graph.cc index e610a412e..2c4133eb1 100644 --- a/mediapipe/tasks/cc/vision/hand_landmarker/hand_landmarker_graph.cc +++ b/mediapipe/tasks/cc/vision/hand_landmarker/hand_landmarker_graph.cc @@ -276,33 +276,44 @@ class HandLandmarkerGraph : public core::ModelTaskGraph { .set_min_size(max_num_hands); auto has_enough_hands = min_size_node.Out("").Cast(); - auto image_for_hand_detector = - DisallowIf(image_in, has_enough_hands, graph); - auto norm_rect_in_for_hand_detector = - DisallowIf(norm_rect_in, has_enough_hands, graph); - auto& hand_detector = graph.AddNode("mediapipe.tasks.vision.hand_detector.HandDetectorGraph"); hand_detector.GetOptions().CopyFrom( tasks_options.hand_detector_graph_options()); - image_for_hand_detector >> hand_detector.In("IMAGE"); - norm_rect_in_for_hand_detector >> hand_detector.In("NORM_RECT"); - auto hand_rects_from_hand_detector = hand_detector.Out("HAND_RECTS"); - - auto& hand_association = graph.AddNode("HandAssociationCalculator"); - hand_association.GetOptions() - .set_min_similarity_threshold(tasks_options.min_tracking_confidence()); - prev_hand_rects_from_landmarks >> - hand_association[Input>::Multiple("")][0]; - hand_rects_from_hand_detector >> - hand_association[Input>::Multiple("")][1]; - auto hand_rects = hand_association.Out(""); - auto& clip_hand_rects = graph.AddNode("ClipNormalizedRectVectorSizeCalculator"); clip_hand_rects.GetOptions() .set_max_vec_size(max_num_hands); - hand_rects >> clip_hand_rects.In(""); + + if (tasks_options.base_options().use_stream_mode()) { + // While in stream mode, skip hand detector graph when we successfully + // track the hands from the last frame. + auto image_for_hand_detector = + DisallowIf(image_in, has_enough_hands, graph); + auto norm_rect_in_for_hand_detector = + DisallowIf(norm_rect_in, has_enough_hands, graph); + image_for_hand_detector >> hand_detector.In("IMAGE"); + norm_rect_in_for_hand_detector >> hand_detector.In("NORM_RECT"); + auto hand_rects_from_hand_detector = hand_detector.Out("HAND_RECTS"); + auto& hand_association = graph.AddNode("HandAssociationCalculator"); + hand_association.GetOptions() + .set_min_similarity_threshold( + tasks_options.min_tracking_confidence()); + prev_hand_rects_from_landmarks >> + hand_association[Input>::Multiple("")][0]; + hand_rects_from_hand_detector >> + hand_association[Input>::Multiple("")][1]; + auto hand_rects = hand_association.Out(""); + hand_rects >> clip_hand_rects.In(""); + } else { + // While not in stream mode, the input images are not guaranteed to be in + // series, and we don't want to enable the tracking and hand associations + // between input images. Always use the hand detector graph. + image_in >> hand_detector.In("IMAGE"); + norm_rect_in >> hand_detector.In("NORM_RECT"); + auto hand_rects_from_hand_detector = hand_detector.Out("HAND_RECTS"); + hand_rects_from_hand_detector >> clip_hand_rects.In(""); + } auto clipped_hand_rects = clip_hand_rects.Out(""); auto& hand_landmarks_detector_graph = graph.AddNode( From ec327cedcbf1df64bcff6a10252506b7840715e5 Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 16:46:12 -0800 Subject: [PATCH 15/21] Internal Changes PiperOrigin-RevId: 487673720 --- mediapipe/gpu/BUILD | 9 +- .../models/gesture_recognizer/BUILD | 51 ++++ .../python/vision/gesture_recognizer/BUILD | 165 ++++++++++++ .../vision/gesture_recognizer/__init__.py | 27 ++ .../vision/gesture_recognizer/constants.py | 20 ++ .../vision/gesture_recognizer/dataset.py | 238 +++++++++++++++++ .../vision/gesture_recognizer/dataset_test.py | 161 ++++++++++++ .../gesture_recognizer/gesture_recognizer.py | 239 ++++++++++++++++++ .../gesture_recognizer_demo.py | 78 ++++++ .../gesture_recognizer_options.py | 32 +++ .../gesture_recognizer_test.py | 132 ++++++++++ .../gesture_recognizer/hyperparameters.py | 40 +++ .../gesture_recognizer/metadata_writer.py | 193 ++++++++++++++ .../metadata_writer_test.py | 90 +++++++ .../gesture_recognizer/model_options.py | 27 ++ .../metadata/custom_gesture_classifier.tflite | Bin 0 -> 6872 bytes .../custom_gesture_classifier_meta.json | 56 ++++ .../0413d5c5-f5ba-476f-a921-ea5e967692a9.jpg | Bin 0 -> 28379 bytes .../044768ad-1709-44ba-b041-c2f8cbe4c166.jpg | Bin 0 -> 27793 bytes .../0e022ee9-74fd-44fe-adad-60c11835e44f.jpg | Bin 0 -> 41322 bytes .../143f8b21-1dc3-4383-bf36-0a54244dfbc0.jpg | Bin 0 -> 15411 bytes .../172ba7f6-c6ba-4398-89a2-25375dccfefa.jpg | Bin 0 -> 21653 bytes .../17b3aa02-dc4d-448d-8601-e2b67193d436.jpg | Bin 0 -> 18798 bytes .../17d804b5-7118-462d-8191-58d764f591b8.jpg | Bin 0 -> 17372 bytes .../1d65a858-623a-4984-9420-958c7e870c3e.jpg | Bin 0 -> 19150 bytes .../1f5fb137-c7a9-435b-85dd-6d7b63ea233a.jpg | Bin 0 -> 22592 bytes .../21de0cfe-af9f-42c2-95d4-aa3d852e7dad.jpg | Bin 0 -> 32558 bytes .../06aa70cc-a12a-4b1e-85cf-e54d44c19a3a.jpg | Bin 0 -> 22147 bytes .../077fa4bf-a99e-496b-b895-709afc614eec.jpg | Bin 0 -> 11722 bytes .../07a5a144-c635-4441-aedb-5c8e9da79aac.jpg | Bin 0 -> 39256 bytes .../07fdea90-1102-4419-a3af-b394cb29531b.jpg | Bin 0 -> 28077 bytes .../0c960166-75b0-4c1b-a3cc-2ddbd5a21703.jpg | Bin 0 -> 22918 bytes .../105f8f8e-ccd6-45a0-b22a-e314930bc13e.jpg | Bin 0 -> 34976 bytes .../116292ef-5947-4d6c-a479-630ebb8a1050.jpg | Bin 0 -> 43737 bytes .../15a73593-b13e-4a1b-99bb-51775cfdfc42.jpg | Bin 0 -> 36068 bytes .../249c5023-6106-447a-84ac-17eb4713731b.jpg | Bin 0 -> 19894 bytes .../25bb4c45-e40b-482c-b588-04db60b7e450.jpg | Bin 0 -> 30511 bytes .../00af1db1-7c86-4e9b-9383-1fbd06c3492d.jpg | Bin 0 -> 17366 bytes .../00b85ea4-8c5d-4302-b847-0a5de1d7dab2.jpg | Bin 0 -> 34354 bytes .../00c84257-800d-4032-9e64-e47eb97005f5.jpg | Bin 0 -> 21645 bytes .../0a038096-c14f-46ac-9155-980161ebc440.jpg | Bin 0 -> 20101 bytes .../0a0ef3d2-2560-4a93-904d-437189fffbf2.jpg | Bin 0 -> 17630 bytes .../0a272153-56c7-42d5-a17d-cd307a1cd6d4.jpg | Bin 0 -> 24644 bytes .../0a4a8907-1950-4e43-9a03-1740e78224ef.jpg | Bin 0 -> 40961 bytes .../0a4bc2da-f5b3-48cd-8f0d-c61dbd08ba53.jpg | Bin 0 -> 24951 bytes .../0a71a6e8-bb06-4ed0-a60b-c2a602fce261.jpg | Bin 0 -> 30422 bytes .../0a787971-9377-4888-803f-aef21863ef7d.jpg | Bin 0 -> 21139 bytes .../026fd791-8f64-4fae-8cb0-0e01dc4362ce.jpg | Bin 0 -> 18088 bytes .../055f8be9-f7fd-4c7f-ad3f-7b404b6489c3.jpg | Bin 0 -> 19723 bytes .../09a619ab-cdf7-4a66-911f-347113f050f1.jpg | Bin 0 -> 14671 bytes .../0c6628ea-4a8c-49c9-b7cf-c30aef18dc3d.jpg | Bin 0 -> 17386 bytes .../0cc7ad09-ae5f-45a8-b264-4216176369b6.jpg | Bin 0 -> 27458 bytes .../10eacf4b-8aaf-46d9-be21-7fb8d8353005.jpg | Bin 0 -> 43644 bytes .../15cb4e8b-ba1d-46f1-8456-247016a599a4.jpg | Bin 0 -> 15717 bytes .../18e20af8-8fe1-48d4-bd0e-83fa9e2db88e.jpg | Bin 0 -> 31928 bytes .../1bed937b-7ae4-4070-891c-daf69415da41.jpg | Bin 0 -> 24870 bytes .../20e2164d-3473-4d42-8755-22cdbd4417ba.jpg | Bin 0 -> 17442 bytes mediapipe/python/BUILD | 49 ++++ mediapipe/python/solution_base.py | 1 - mediapipe/python/solutions/BUILD | 105 ++++++++ third_party/external_files.bzl | 38 ++- 61 files changed, 1741 insertions(+), 10 deletions(-) create mode 100644 mediapipe/model_maker/models/gesture_recognizer/BUILD create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/BUILD create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/__init__.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/constants.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/dataset.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/dataset_test.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_demo.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_options.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_test.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/hyperparameters.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer_test.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/model_options.py create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier.tflite create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier_meta.json create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/0413d5c5-f5ba-476f-a921-ea5e967692a9.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/044768ad-1709-44ba-b041-c2f8cbe4c166.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/0e022ee9-74fd-44fe-adad-60c11835e44f.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/143f8b21-1dc3-4383-bf36-0a54244dfbc0.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/172ba7f6-c6ba-4398-89a2-25375dccfefa.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/17b3aa02-dc4d-448d-8601-e2b67193d436.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/17d804b5-7118-462d-8191-58d764f591b8.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/1d65a858-623a-4984-9420-958c7e870c3e.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/1f5fb137-c7a9-435b-85dd-6d7b63ea233a.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/21de0cfe-af9f-42c2-95d4-aa3d852e7dad.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/06aa70cc-a12a-4b1e-85cf-e54d44c19a3a.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/077fa4bf-a99e-496b-b895-709afc614eec.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/07a5a144-c635-4441-aedb-5c8e9da79aac.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/07fdea90-1102-4419-a3af-b394cb29531b.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/0c960166-75b0-4c1b-a3cc-2ddbd5a21703.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/105f8f8e-ccd6-45a0-b22a-e314930bc13e.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/116292ef-5947-4d6c-a479-630ebb8a1050.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/15a73593-b13e-4a1b-99bb-51775cfdfc42.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/249c5023-6106-447a-84ac-17eb4713731b.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/25bb4c45-e40b-482c-b588-04db60b7e450.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00af1db1-7c86-4e9b-9383-1fbd06c3492d.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00b85ea4-8c5d-4302-b847-0a5de1d7dab2.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00c84257-800d-4032-9e64-e47eb97005f5.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a038096-c14f-46ac-9155-980161ebc440.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a0ef3d2-2560-4a93-904d-437189fffbf2.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a272153-56c7-42d5-a17d-cd307a1cd6d4.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a4a8907-1950-4e43-9a03-1740e78224ef.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a4bc2da-f5b3-48cd-8f0d-c61dbd08ba53.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a71a6e8-bb06-4ed0-a60b-c2a602fce261.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a787971-9377-4888-803f-aef21863ef7d.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/026fd791-8f64-4fae-8cb0-0e01dc4362ce.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/055f8be9-f7fd-4c7f-ad3f-7b404b6489c3.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/09a619ab-cdf7-4a66-911f-347113f050f1.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/0c6628ea-4a8c-49c9-b7cf-c30aef18dc3d.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/0cc7ad09-ae5f-45a8-b264-4216176369b6.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/10eacf4b-8aaf-46d9-be21-7fb8d8353005.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/15cb4e8b-ba1d-46f1-8456-247016a599a4.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/18e20af8-8fe1-48d4-bd0e-83fa9e2db88e.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/1bed937b-7ae4-4070-891c-daf69415da41.jpg create mode 100644 mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/20e2164d-3473-4d42-8755-22cdbd4417ba.jpg create mode 100644 mediapipe/python/solutions/BUILD diff --git a/mediapipe/gpu/BUILD b/mediapipe/gpu/BUILD index aec2445b9..9c2f47469 100644 --- a/mediapipe/gpu/BUILD +++ b/mediapipe/gpu/BUILD @@ -750,19 +750,12 @@ objc_library( ], ) -proto_library( +mediapipe_proto_library( name = "scale_mode_proto", srcs = ["scale_mode.proto"], visibility = ["//visibility:public"], ) -mediapipe_cc_proto_library( - name = "scale_mode_cc_proto", - srcs = ["scale_mode.proto"], - visibility = ["//visibility:public"], - deps = [":scale_mode_proto"], -) - cc_library( name = "gl_quad_renderer", srcs = ["gl_quad_renderer.cc"], diff --git a/mediapipe/model_maker/models/gesture_recognizer/BUILD b/mediapipe/model_maker/models/gesture_recognizer/BUILD new file mode 100644 index 000000000..f8e5cdd21 --- /dev/null +++ b/mediapipe/model_maker/models/gesture_recognizer/BUILD @@ -0,0 +1,51 @@ +# Copyright 2022 The MediaPipe 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. + +load( + "//mediapipe/framework/tool:mediapipe_files.bzl", + "mediapipe_files", +) + +licenses(["notice"]) + +package( + default_visibility = ["//mediapipe/model_maker/python/vision/gesture_recognizer:__subpackages__"], +) + +mediapipe_files( + srcs = [ + "canned_gesture_classifier.tflite", + "gesture_embedder.tflite", + "gesture_embedder/keras_metadata.pb", + "gesture_embedder/saved_model.pb", + "gesture_embedder/variables/variables.data-00000-of-00001", + "gesture_embedder/variables/variables.index", + "hand_landmark_full.tflite", + "palm_detection_full.tflite", + ], +) + +filegroup( + name = "models", + srcs = [ + "canned_gesture_classifier.tflite", + "gesture_embedder.tflite", + "gesture_embedder/keras_metadata.pb", + "gesture_embedder/saved_model.pb", + "gesture_embedder/variables/variables.data-00000-of-00001", + "gesture_embedder/variables/variables.index", + "hand_landmark_full.tflite", + "palm_detection_full.tflite", + ], +) diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/BUILD b/mediapipe/model_maker/python/vision/gesture_recognizer/BUILD new file mode 100644 index 000000000..b7d334d9c --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/BUILD @@ -0,0 +1,165 @@ +# Copyright 2022 The MediaPipe 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. + +# Placeholder for internal Python strict test compatibility macro. +# Placeholder for internal Python strict library and test compatibility macro. + +licenses(["notice"]) + +package( + default_visibility = ["//mediapipe:__subpackages__"], +) + +# TODO: Remove the unncessary test data once the demo data are moved to an open-sourced +# directory. +filegroup( + name = "test_data", + srcs = glob([ + "test_data/**", + ]), +) + +py_library( + name = "constants", + srcs = ["constants.py"], +) + +# TODO: Change to py_library after migrating the MediaPipe hand solution +# library to MediaPipe hand task library. +py_library( + name = "dataset", + srcs = ["dataset.py"], + deps = [ + ":constants", + "//mediapipe/model_maker/python/core/data:classification_dataset", + "//mediapipe/model_maker/python/core/data:data_util", + "//mediapipe/model_maker/python/core/utils:model_util", + "//mediapipe/python/solutions:hands", + ], +) + +py_test( + name = "dataset_test", + srcs = ["dataset_test.py"], + data = [ + ":test_data", + "//mediapipe/model_maker/models/gesture_recognizer:models", + ], + deps = [ + ":dataset", + "//mediapipe/python/solutions:hands", + "//mediapipe/tasks/python/test:test_utils", + ], +) + +py_library( + name = "hyperparameters", + srcs = ["hyperparameters.py"], + deps = [ + "//mediapipe/model_maker/python/core:hyperparameters", + ], +) + +py_library( + name = "model_options", + srcs = ["model_options.py"], +) + +py_library( + name = "gesture_recognizer_options", + srcs = ["gesture_recognizer_options.py"], + deps = [ + ":hyperparameters", + ":model_options", + ], +) + +py_library( + name = "gesture_recognizer", + srcs = ["gesture_recognizer.py"], + data = ["//mediapipe/model_maker/models/gesture_recognizer:models"], + deps = [ + ":constants", + ":gesture_recognizer_options", + ":hyperparameters", + ":metadata_writer", + ":model_options", + "//mediapipe/model_maker/python/core/data:classification_dataset", + "//mediapipe/model_maker/python/core/tasks:classifier", + "//mediapipe/model_maker/python/core/utils:loss_functions", + "//mediapipe/model_maker/python/core/utils:model_util", + "//mediapipe/tasks/python/metadata/metadata_writers:metadata_writer", + ], +) + +py_library( + name = "gesture_recognizer_import", + srcs = ["__init__.py"], + deps = [ + ":dataset", + ":gesture_recognizer", + ":gesture_recognizer_options", + ":hyperparameters", + ":model_options", + ], +) + +py_library( + name = "metadata_writer", + srcs = ["metadata_writer.py"], + deps = [ + "//mediapipe/tasks/python/metadata/metadata_writers:metadata_writer", + "//mediapipe/tasks/python/metadata/metadata_writers:writer_utils", + ], +) + +py_test( + name = "gesture_recognizer_test", + size = "large", + srcs = ["gesture_recognizer_test.py"], + data = [ + ":test_data", + "//mediapipe/model_maker/models/gesture_recognizer:models", + ], + shard_count = 2, + deps = [ + ":gesture_recognizer_import", + "//mediapipe/model_maker/python/core/utils:test_util", + "//mediapipe/tasks/python/test:test_utils", + ], +) + +py_test( + name = "metadata_writer_test", + srcs = ["metadata_writer_test.py"], + data = [ + ":test_data", + ], + deps = [ + ":metadata_writer", + "//mediapipe/tasks/python/metadata/metadata_writers:metadata_writer", + "//mediapipe/tasks/python/test:test_utils", + ], +) + +py_binary( + name = "gesture_recognizer_demo", + srcs = ["gesture_recognizer_demo.py"], + data = [ + ":test_data", + "//mediapipe/model_maker/models/gesture_recognizer:models", + ], + python_version = "PY3", + deps = [":gesture_recognizer_import"], +) diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/__init__.py b/mediapipe/model_maker/python/vision/gesture_recognizer/__init__.py new file mode 100644 index 000000000..dc6923fac --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2022 The MediaPipe 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. +"""MediaPipe Model Maker Python Public API For Gesture Recognizer.""" + +from mediapipe.model_maker.python.vision.gesture_recognizer import dataset +from mediapipe.model_maker.python.vision.gesture_recognizer import gesture_recognizer +from mediapipe.model_maker.python.vision.gesture_recognizer import gesture_recognizer_options +from mediapipe.model_maker.python.vision.gesture_recognizer import hyperparameters +from mediapipe.model_maker.python.vision.gesture_recognizer import model_options + +GestureRecognizer = gesture_recognizer.GestureRecognizer +ModelOptions = model_options.GestureRecognizerModelOptions +HParams = hyperparameters.HParams +Dataset = dataset.Dataset +HandDataPreprocessingParams = dataset.HandDataPreprocessingParams +GestureRecognizerOptions = gesture_recognizer_options.GestureRecognizerOptions diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/constants.py b/mediapipe/model_maker/python/vision/gesture_recognizer/constants.py new file mode 100644 index 000000000..ac9bba12a --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/constants.py @@ -0,0 +1,20 @@ +# Copyright 2022 The MediaPipe 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. +"""Gesture recognition constants.""" + +GESTURE_EMBEDDER_KERAS_MODEL_PATH = 'mediapipe/model_maker/models/gesture_recognizer/gesture_embedder' +GESTURE_EMBEDDER_TFLITE_MODEL_FILE = 'mediapipe/model_maker/models/gesture_recognizer/gesture_embedder.tflite' +HAND_DETECTOR_TFLITE_MODEL_FILE = 'mediapipe/model_maker/models/gesture_recognizer/palm_detection_full.tflite' +HAND_LANDMARKS_DETECTOR_TFLITE_MODEL_FILE = 'mediapipe/model_maker/models/gesture_recognizer/hand_landmark_full.tflite' +CANNED_GESTURE_CLASSIFIER_TFLITE_MODEL_FILE = 'mediapipe/model_maker/models/gesture_recognizer/canned_gesture_classifier.tflite' diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/dataset.py b/mediapipe/model_maker/python/vision/gesture_recognizer/dataset.py new file mode 100644 index 000000000..256f26fd6 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/dataset.py @@ -0,0 +1,238 @@ +# Copyright 2022 The MediaPipe 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. +"""Gesture recognition dataset library.""" + +import dataclasses +import os +import random +from typing import List, NamedTuple, Optional + +import cv2 +import tensorflow as tf + +from mediapipe.model_maker.python.core.data import classification_dataset +from mediapipe.model_maker.python.core.data import data_util +from mediapipe.model_maker.python.core.utils import model_util +from mediapipe.model_maker.python.vision.gesture_recognizer import constants +from mediapipe.python.solutions import hands as mp_hands + + +@dataclasses.dataclass +class HandDataPreprocessingParams: + """A dataclass wraps the hand data preprocessing hyperparameters. + + Attributes: + shuffle: A boolean controlling if shuffle the dataset. Default to true. + min_detection_confidence: confidence threshold for hand detection. + """ + shuffle: bool = True + min_detection_confidence: float = 0.7 + + +@dataclasses.dataclass +class HandData: + """A dataclass represents hand data for training gesture recognizer model. + + See https://google.github.io/mediapipe/solutions/hands#mediapipe-hands for + more details of the hand gesture data API. + + Attributes: + hand: normalized hand landmarks of shape 21x3 from the screen based + hand-landmark model. + world_hand: hand landmarks of shape 21x3 in world coordinates. + handedness: Collection of handedness confidence of the detected hands (i.e. + is it a left or right hand). + """ + hand: List[List[float]] + world_hand: List[List[float]] + handedness: List[float] + + +def _validate_data_sample(data: NamedTuple) -> bool: + """Validates the input hand data sample. + + Args: + data: input hand data sample. + + Returns: + False if the input data namedtuple does not contain the fields including + 'multi_hand_landmarks' or 'multi_hand_world_landmarks' or 'multi_handedness' + or any of these attributes' values are none. Otherwise, True. + """ + if (not hasattr(data, 'multi_hand_landmarks') or + data.multi_hand_landmarks is None): + return False + if (not hasattr(data, 'multi_hand_world_landmarks') or + data.multi_hand_world_landmarks is None): + return False + if not hasattr(data, 'multi_handedness') or data.multi_handedness is None: + return False + return True + + +def _get_hand_data(all_image_paths: List[str], + min_detection_confidence: float) -> Optional[HandData]: + """Computes hand data (landmarks and handedness) in the input image. + + Args: + all_image_paths: all input image paths. + min_detection_confidence: hand detection confidence threshold + + Returns: + A HandData object. Returns None if no hand is detected. + """ + hand_data_result = [] + with mp_hands.Hands( + static_image_mode=True, + max_num_hands=1, + min_detection_confidence=min_detection_confidence) as hands: + for path in all_image_paths: + tf.compat.v1.logging.info('Loading image %s', path) + image = data_util.load_image(path) + # Flip image around y-axis for correct handedness output + image = cv2.flip(image, 1) + data = hands.process(image) + if not _validate_data_sample(data): + hand_data_result.append(None) + continue + hand_landmarks = [[ + hand_landmark.x, hand_landmark.y, hand_landmark.z + ] for hand_landmark in data.multi_hand_landmarks[0].landmark] + hand_world_landmarks = [[ + hand_landmark.x, hand_landmark.y, hand_landmark.z + ] for hand_landmark in data.multi_hand_world_landmarks[0].landmark] + handedness_scores = [ + handedness.score + for handedness in data.multi_handedness[0].classification + ] + hand_data_result.append( + HandData( + hand=hand_landmarks, + world_hand=hand_world_landmarks, + handedness=handedness_scores)) + return hand_data_result + + +class Dataset(classification_dataset.ClassificationDataset): + """Dataset library for hand gesture recognizer.""" + + @classmethod + def from_folder( + cls, + dirname: str, + hparams: Optional[HandDataPreprocessingParams] = None + ) -> classification_dataset.ClassificationDataset: + """Loads images and labels from the given directory. + + Directory contents are expected to be in the format: + //*.jpg". One of the `gesture_name` must be `none` + (case insensitive). The `none` sub-directory is expected to contain images + of hands that don't belong to other gesture classes in . Assumes + the image data of the same label are in the same subdirectory. + + Args: + dirname: Name of the directory containing the data files. + hparams: Optional hyperparameters for processing input hand gesture + images. + + Returns: + Dataset containing landmarks, labels, and other related info. + + Raises: + ValueError: if the input data directory is empty or the label set does not + contain label 'none' (case insensitive). + """ + data_root = os.path.abspath(dirname) + + # Assumes the image data of the same label are in the same subdirectory, + # gets image path and label names. + all_image_paths = list(tf.io.gfile.glob(data_root + r'/*/*')) + if not all_image_paths: + raise ValueError('Image dataset directory is empty.') + + if not hparams: + hparams = HandDataPreprocessingParams() + + if hparams.shuffle: + # Random shuffle data. + random.shuffle(all_image_paths) + + label_names = sorted( + name for name in os.listdir(data_root) + if os.path.isdir(os.path.join(data_root, name))) + if 'none' not in [v.lower() for v in label_names]: + raise ValueError('Label set does not contain label "None".') + # Move label 'none' to the front of label list. + none_idx = [v.lower() for v in label_names].index('none') + none_value = label_names.pop(none_idx) + label_names.insert(0, none_value) + + index_by_label = dict( + (name, index) for index, name in enumerate(label_names)) + all_gesture_indices = [ + index_by_label[os.path.basename(os.path.dirname(path))] + for path in all_image_paths + ] + + # Compute hand data (including local hand landmark, world hand landmark, and + # handedness) for all the input images. + hand_data = _get_hand_data( + all_image_paths=all_image_paths, + min_detection_confidence=hparams.min_detection_confidence) + + # Get a list of the valid hand landmark sample in the hand data list. + valid_indices = [ + i for i in range(len(hand_data)) if hand_data[i] is not None + ] + # Remove 'None' element from the hand data and label list. + valid_hand_data = [dataclasses.asdict(hand_data[i]) for i in valid_indices] + if not valid_hand_data: + raise ValueError('No valid hand is detected.') + + valid_label = [all_gesture_indices[i] for i in valid_indices] + + # Convert list of dictionaries to dictionary of lists. + hand_data_dict = { + k: [lm[k] for lm in valid_hand_data] for k in valid_hand_data[0] + } + hand_ds = tf.data.Dataset.from_tensor_slices(hand_data_dict) + + embedder_model = model_util.load_keras_model( + constants.GESTURE_EMBEDDER_KERAS_MODEL_PATH) + + hand_ds = hand_ds.batch(batch_size=1) + hand_embedding_ds = hand_ds.map( + map_func=lambda feature: embedder_model(dict(feature)), + num_parallel_calls=tf.data.experimental.AUTOTUNE) + hand_embedding_ds = hand_embedding_ds.unbatch() + + # Create label dataset + label_ds = tf.data.Dataset.from_tensor_slices( + tf.cast(valid_label, tf.int64)) + + label_one_hot_ds = label_ds.map( + map_func=lambda index: tf.one_hot(index, len(label_names)), + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + # Create a dataset with (hand_embedding, one_hot_label) pairs + hand_embedding_label_ds = tf.data.Dataset.zip( + (hand_embedding_ds, label_one_hot_ds)) + + tf.compat.v1.logging.info( + 'Load valid hands with size: {}, num_label: {}, labels: {}.'.format( + len(valid_hand_data), len(label_names), ','.join(label_names))) + return Dataset( + dataset=hand_embedding_label_ds, + size=len(valid_hand_data), + label_names=label_names) diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/dataset_test.py b/mediapipe/model_maker/python/vision/gesture_recognizer/dataset_test.py new file mode 100644 index 000000000..76e70a58d --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/dataset_test.py @@ -0,0 +1,161 @@ +# Copyright 2022 The MediaPipe Authors. All Rights Reserved.s +# +# 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. + +import collections +import os +import shutil +from typing import NamedTuple +import unittest + +from absl import flags +from absl.testing import parameterized +import tensorflow as tf + +from mediapipe.model_maker.python.vision.gesture_recognizer import dataset +from mediapipe.python.solutions import hands as mp_hands +from mediapipe.tasks.python.test import test_utils + +FLAGS = flags.FLAGS + +_TEST_DATA_DIRNAME = 'raw_data' + + +class DatasetTest(tf.test.TestCase, parameterized.TestCase): + + def test_split(self): + input_data_dir = test_utils.get_test_data_path(_TEST_DATA_DIRNAME) + data = dataset.Dataset.from_folder( + dirname=input_data_dir, hparams=dataset.HandDataPreprocessingParams()) + train_data, test_data = data.split(0.5) + + self.assertLen(train_data, 17) + for _, elem in enumerate(train_data.gen_tf_dataset(is_training=True)): + self.assertEqual(elem[0].shape, (1, 128)) + self.assertEqual(elem[1].shape, ([1, 4])) + self.assertEqual(train_data.num_classes, 4) + self.assertEqual(train_data.label_names, ['none', 'call', 'four', 'rock']) + + self.assertLen(test_data, 18) + for _, elem in enumerate(test_data.gen_tf_dataset(is_training=True)): + self.assertEqual(elem[0].shape, (1, 128)) + self.assertEqual(elem[1].shape, ([1, 4])) + self.assertEqual(test_data.num_classes, 4) + self.assertEqual(test_data.label_names, ['none', 'call', 'four', 'rock']) + + def test_from_folder(self): + input_data_dir = test_utils.get_test_data_path(_TEST_DATA_DIRNAME) + data = dataset.Dataset.from_folder( + dirname=input_data_dir, hparams=dataset.HandDataPreprocessingParams()) + for _, elem in enumerate(data.gen_tf_dataset(is_training=True)): + self.assertEqual(elem[0].shape, (1, 128)) + self.assertEqual(elem[1].shape, ([1, 4])) + self.assertLen(data, 35) + self.assertEqual(data.num_classes, 4) + self.assertEqual(data.label_names, ['none', 'call', 'four', 'rock']) + + def test_create_dataset_from_empty_folder_raise_value_error(self): + with self.assertRaisesRegex(ValueError, 'Image dataset directory is empty'): + dataset.Dataset.from_folder( + dirname=self.get_temp_dir(), + hparams=dataset.HandDataPreprocessingParams()) + + def test_create_dataset_from_folder_without_none_raise_value_error(self): + input_data_dir = test_utils.get_test_data_path(_TEST_DATA_DIRNAME) + tmp_dir = self.create_tempdir() + # Copy input dataset to a temporary directory and skip 'None' directory. + for name in os.listdir(input_data_dir): + if name == 'none': + continue + src_dir = os.path.join(input_data_dir, name) + dst_dir = os.path.join(tmp_dir, name) + shutil.copytree(src_dir, dst_dir) + + with self.assertRaisesRegex(ValueError, + 'Label set does not contain label "None"'): + dataset.Dataset.from_folder( + dirname=tmp_dir, hparams=dataset.HandDataPreprocessingParams()) + + def test_create_dataset_from_folder_with_capital_letter_in_folder_name(self): + input_data_dir = test_utils.get_test_data_path(_TEST_DATA_DIRNAME) + tmp_dir = self.create_tempdir() + # Copy input dataset to a temporary directory and change the base folder + # name to upper case letter, e.g. 'none' -> 'NONE' + for name in os.listdir(input_data_dir): + src_dir = os.path.join(input_data_dir, name) + dst_dir = os.path.join(tmp_dir, name.upper()) + shutil.copytree(src_dir, dst_dir) + + upper_base_folder_name = list(os.listdir(tmp_dir)) + self.assertCountEqual(upper_base_folder_name, + ['CALL', 'FOUR', 'NONE', 'ROCK']) + + data = dataset.Dataset.from_folder( + dirname=tmp_dir, hparams=dataset.HandDataPreprocessingParams()) + for _, elem in enumerate(data.gen_tf_dataset(is_training=True)): + self.assertEqual(elem[0].shape, (1, 128)) + self.assertEqual(elem[1].shape, ([1, 4])) + self.assertLen(data, 35) + self.assertEqual(data.num_classes, 4) + self.assertEqual(data.label_names, ['NONE', 'CALL', 'FOUR', 'ROCK']) + + @parameterized.named_parameters( + dict( + testcase_name='invalid_field_name_multi_hand_landmark', + hand=collections.namedtuple('Hand', [ + 'multi_hand_landmark', 'multi_hand_world_landmarks', + 'multi_handedness' + ])(1, 2, 3)), + dict( + testcase_name='invalid_field_name_multi_hand_world_landmarks', + hand=collections.namedtuple('Hand', [ + 'multi_hand_landmarks', 'multi_hand_world_landmark', + 'multi_handedness' + ])(1, 2, 3)), + dict( + testcase_name='invalid_field_name_multi_handed', + hand=collections.namedtuple('Hand', [ + 'multi_hand_landmarks', 'multi_hand_world_landmarks', + 'multi_handed' + ])(1, 2, 3)), + dict( + testcase_name='multi_hand_landmarks_is_none', + hand=collections.namedtuple('Hand', [ + 'multi_hand_landmarks', 'multi_hand_world_landmarks', + 'multi_handedness' + ])(None, 2, 3)), + dict( + testcase_name='multi_hand_world_landmarks_is_none', + hand=collections.namedtuple('Hand', [ + 'multi_hand_landmarks', 'multi_hand_world_landmarks', + 'multi_handedness' + ])(1, None, 3)), + dict( + testcase_name='multi_handedness_is_none', + hand=collections.namedtuple('Hand', [ + 'multi_hand_landmarks', 'multi_hand_world_landmarks', + 'multi_handedness' + ])(1, 2, None)), + ) + def test_create_dataset_from_invalid_hand_data(self, hand: NamedTuple): + with unittest.mock.patch.object( + mp_hands.Hands, 'process', return_value=hand): + input_data_dir = test_utils.get_test_data_path(_TEST_DATA_DIRNAME) + with self.assertRaisesRegex(ValueError, 'No valid hand is detected'): + dataset.Dataset.from_folder( + dirname=input_data_dir, + hparams=dataset.HandDataPreprocessingParams()) + + +if __name__ == '__main__': + tf.test.main() diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer.py b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer.py new file mode 100644 index 000000000..f297d8640 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer.py @@ -0,0 +1,239 @@ +# Copyright 2022 The MediaPipe 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. +"""APIs to train gesture recognizer model.""" + +import os +from typing import List + +import tensorflow as tf + +from mediapipe.model_maker.python.core.data import classification_dataset as classification_ds +from mediapipe.model_maker.python.core.tasks import classifier +from mediapipe.model_maker.python.core.utils import loss_functions +from mediapipe.model_maker.python.core.utils import model_util +from mediapipe.model_maker.python.vision.gesture_recognizer import constants +from mediapipe.model_maker.python.vision.gesture_recognizer import gesture_recognizer_options +from mediapipe.model_maker.python.vision.gesture_recognizer import hyperparameters as hp +from mediapipe.model_maker.python.vision.gesture_recognizer import metadata_writer +from mediapipe.model_maker.python.vision.gesture_recognizer import model_options as model_opt +from mediapipe.tasks.python.metadata.metadata_writers import metadata_writer as base_metadata_writer + +_EMBEDDING_SIZE = 128 + + +class GestureRecognizer(classifier.Classifier): + """GestureRecognizer for building hand gesture recognizer model. + + Attributes: + embedding_size: Size of the input gesture embedding vector. + """ + + def __init__(self, label_names: List[str], + model_options: model_opt.GestureRecognizerModelOptions, + hparams: hp.HParams): + """Initializes GestureRecognizer class. + + Args: + label_names: A list of label names for the classes. + model_options: options to create gesture recognizer model. + hparams: The hyperparameters for training hand gesture recognizer model. + """ + super().__init__( + model_spec=None, label_names=label_names, shuffle=hparams.shuffle) + self._model_options = model_options + self._hparams = hparams + self._history = None + self.embedding_size = _EMBEDDING_SIZE + + @classmethod + def create( + cls, + train_data: classification_ds.ClassificationDataset, + validation_data: classification_ds.ClassificationDataset, + options: gesture_recognizer_options.GestureRecognizerOptions, + ) -> 'GestureRecognizer': + """Creates and trains a hand gesture recognizer with input datasets. + + If a checkpoint file exists in the {options.hparams.export_dir}/checkpoint/ + directory, the training process will load the weight from the checkpoint + file for continual training. + + Args: + train_data: Training data. + validation_data: Validation data. If None, skips validation process. + options: options for creating and training gesture recognizer model. + + Returns: + An instance of GestureRecognizer. + """ + if options.model_options is None: + options.model_options = model_opt.GestureRecognizerModelOptions() + + if options.hparams is None: + options.hparams = hp.HParams() + + gesture_recognizer = cls( + label_names=train_data.label_names, + model_options=options.model_options, + hparams=options.hparams) + + gesture_recognizer._create_model() + + train_dataset = train_data.gen_tf_dataset( + batch_size=options.hparams.batch_size, + is_training=True, + shuffle=options.hparams.shuffle) + options.hparams.steps_per_epoch = model_util.get_steps_per_epoch( + steps_per_epoch=options.hparams.steps_per_epoch, + batch_size=options.hparams.batch_size, + train_data=train_data) + train_dataset = train_dataset.take(count=options.hparams.steps_per_epoch) + + validation_dataset = validation_data.gen_tf_dataset( + batch_size=options.hparams.batch_size, is_training=False) + + tf.compat.v1.logging.info('Training the gesture recognizer model...') + gesture_recognizer._train( + train_data=train_dataset, validation_data=validation_dataset) + + return gesture_recognizer + + def _train(self, train_data: tf.data.Dataset, + validation_data: tf.data.Dataset): + """Trains the model with input train_data. + + The training results are recorded by a self.History object returned by + tf.keras.Model.fit(). + + Args: + train_data: Training data. + validation_data: Validation data. + """ + hparams = self._hparams + + scheduler = lambda epoch: hparams.learning_rate * (hparams.lr_decay**epoch) + scheduler_callback = tf.keras.callbacks.LearningRateScheduler(scheduler) + + job_dir = hparams.export_dir + checkpoint_path = os.path.join(job_dir, 'epoch_models') + checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( + os.path.join(checkpoint_path, 'model-{epoch:04d}'), + save_weights_only=True) + + best_model_path = os.path.join(job_dir, 'best_model_weights') + best_model_callback = tf.keras.callbacks.ModelCheckpoint( + best_model_path, + monitor='val_loss', + mode='min', + save_best_only=True, + save_weights_only=True) + + tensorboard_callback = tf.keras.callbacks.TensorBoard( + log_dir=os.path.join(job_dir, 'logs')) + + self._model.compile( + optimizer='adam', + loss=loss_functions.FocalLoss(gamma=self._hparams.gamma), + metrics=['categorical_accuracy']) + + latest_checkpoint = tf.train.latest_checkpoint(checkpoint_path) + if latest_checkpoint: + print(f'Resuming from {latest_checkpoint}') + self._model.load_weights(latest_checkpoint) + + self._history = self._model.fit( + x=train_data, + epochs=hparams.epochs, + validation_data=validation_data, + validation_freq=1, + callbacks=[ + checkpoint_callback, best_model_callback, scheduler_callback, + tensorboard_callback + ], + ) + + def _create_model(self): + """Creates the hand gesture recognizer model. + + The gesture embedding model is pretrained and loaded from a tf.saved_model. + """ + inputs = tf.keras.Input( + shape=[self.embedding_size], + batch_size=None, + dtype=tf.float32, + name='hand_embedding') + + x = tf.keras.layers.BatchNormalization()(inputs) + x = tf.keras.layers.ReLU()(x) + dropout_rate = self._model_options.dropout_rate + x = tf.keras.layers.Dropout(rate=dropout_rate, name='dropout')(x) + outputs = tf.keras.layers.Dense( + self._num_classes, + activation='softmax', + name='custom_gesture_recognizer')( + x) + + self._model = tf.keras.Model(inputs=inputs, outputs=outputs) + + print(self._model.summary()) + + def export_model(self, model_name: str = 'gesture_recognizer.task'): + """Converts the model to TFLite and exports as a model bundle file. + + Saves a model bundle file and metadata json file to hparams.export_dir. The + resulting model bundle file will contain necessary models for hand + detection, canned gesture classification, and customized gesture + classification. Only the model bundle file is needed for the downstream + gesture recognition task. The metadata.json file is saved only to + interpret the contents of the model bundle file. + + The customized gesture model is in float without quantization. The model is + lightweight and there is no need to balance performance and efficiency by + quantization. The default score_thresholding is set to 0.5 as it can be + adjusted during inference. + + Args: + model_name: File name to save model bundle file. The full export path is + {export_dir}/{model_name}. + """ + # TODO: Convert keras embedder model instead of using tflite + gesture_embedding_model_buffer = model_util.load_tflite_model_buffer( + constants.GESTURE_EMBEDDER_TFLITE_MODEL_FILE) + hand_detector_model_buffer = model_util.load_tflite_model_buffer( + constants.HAND_DETECTOR_TFLITE_MODEL_FILE) + hand_landmarks_detector_model_buffer = model_util.load_tflite_model_buffer( + constants.HAND_LANDMARKS_DETECTOR_TFLITE_MODEL_FILE) + canned_gesture_model_buffer = model_util.load_tflite_model_buffer( + constants.CANNED_GESTURE_CLASSIFIER_TFLITE_MODEL_FILE) + + if not tf.io.gfile.exists(self._hparams.export_dir): + tf.io.gfile.makedirs(self._hparams.export_dir) + model_bundle_file = os.path.join(self._hparams.export_dir, model_name) + metadata_file = os.path.join(self._hparams.export_dir, 'metadata.json') + + gesture_classifier_options = metadata_writer.GestureClassifierOptions( + model_buffer=model_util.convert_to_tflite(self._model), + labels=base_metadata_writer.Labels().add(list(self._label_names)), + score_thresholding=base_metadata_writer.ScoreThresholding( + global_score_threshold=0.5)) + + writer = metadata_writer.MetadataWriter.create( + hand_detector_model_buffer, hand_landmarks_detector_model_buffer, + gesture_embedding_model_buffer, canned_gesture_model_buffer, + gesture_classifier_options) + model_bundle_content, metadata_json = writer.populate() + with open(model_bundle_file, 'wb') as f: + f.write(model_bundle_content) + with open(metadata_file, 'w') as f: + f.write(metadata_json) diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_demo.py b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_demo.py new file mode 100644 index 000000000..06075fbc6 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_demo.py @@ -0,0 +1,78 @@ +# Copyright 2022 The MediaPipe 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. +"""Demo for making an gesture recognizer model by Mediapipe Model Maker.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +# Dependency imports + +from absl import app +from absl import flags +from absl import logging + +from mediapipe.model_maker.python.vision import gesture_recognizer + +FLAGS = flags.FLAGS + +# TODO: Move hand gesture recognizer demo dataset to an +# open-sourced directory. +TEST_DATA_DIR = 'mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data' + + +def define_flags(): + flags.DEFINE_string('export_dir', None, + 'The directory to save exported files.') + flags.DEFINE_string('input_data_dir', None, + 'The directory with input training data.') + flags.mark_flag_as_required('export_dir') + + +def run(data_dir: str, export_dir: str): + """Runs demo.""" + data = gesture_recognizer.Dataset.from_folder(dirname=data_dir) + train_data, rest_data = data.split(0.8) + validation_data, test_data = rest_data.split(0.5) + + model = gesture_recognizer.GestureRecognizer.create( + train_data=train_data, + validation_data=validation_data, + options=gesture_recognizer.GestureRecognizerOptions( + hparams=gesture_recognizer.HParams(export_dir=export_dir))) + + metric = model.evaluate(test_data, batch_size=2) + print('Evaluation metric') + print(metric) + + model.export_model() + + +def main(_): + logging.set_verbosity(logging.INFO) + + if FLAGS.input_data_dir is None: + data_dir = os.path.join(FLAGS.test_srcdir, TEST_DATA_DIR) + else: + data_dir = FLAGS.input_data_dir + + export_dir = os.path.expanduser(FLAGS.export_dir) + run(data_dir=data_dir, export_dir=export_dir) + + +if __name__ == '__main__': + define_flags() + app.run(main) diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_options.py b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_options.py new file mode 100644 index 000000000..da9e2d647 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_options.py @@ -0,0 +1,32 @@ +# Copyright 2022 The MediaPipe 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. +"""Options for building gesture recognizer.""" + +import dataclasses +from typing import Optional + +from mediapipe.model_maker.python.vision.gesture_recognizer import hyperparameters +from mediapipe.model_maker.python.vision.gesture_recognizer import model_options as model_opt + + +@dataclasses.dataclass +class GestureRecognizerOptions: + """Configurable options for building gesture recognizer. + + Attributes: + model_options: A set of options for configuring the selected model. + hparams: A set of hyperparameters used to train the gesture recognizer. + """ + model_options: Optional[model_opt.GestureRecognizerModelOptions] = None + hparams: Optional[hyperparameters.HParams] = None diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_test.py b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_test.py new file mode 100644 index 000000000..eb2b1d171 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/gesture_recognizer_test.py @@ -0,0 +1,132 @@ +# Copyright 2022 The MediaPipe 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. + +import io +import os +from unittest import mock as unittest_mock +import zipfile + +import mock +import tensorflow as tf + +from mediapipe.model_maker.python.core.utils import test_util +from mediapipe.model_maker.python.vision import gesture_recognizer +from mediapipe.tasks.python.test import test_utils + +_TEST_DATA_DIR = 'mediapipe/model_maker/python/vision/gesture_recognizer/test_data' + + +class GestureRecognizerTest(tf.test.TestCase): + + def _load_data(self): + input_data_dir = test_utils.get_test_data_path( + os.path.join(_TEST_DATA_DIR, 'raw_data')) + + data = gesture_recognizer.Dataset.from_folder( + dirname=input_data_dir, + hparams=gesture_recognizer.HandDataPreprocessingParams(shuffle=True)) + return data + + def setUp(self): + super().setUp() + self._model_options = gesture_recognizer.ModelOptions() + self._hparams = gesture_recognizer.HParams(epochs=2) + self._gesture_recognizer_options = ( + gesture_recognizer.GestureRecognizerOptions( + model_options=self._model_options, hparams=self._hparams)) + all_data = self._load_data() + # Splits data, 90% data for training, 10% for testing + self._train_data, self._test_data = all_data.split(0.9) + + def test_gesture_recognizer_model(self): + model = gesture_recognizer.GestureRecognizer.create( + train_data=self._train_data, + validation_data=self._test_data, + options=self._gesture_recognizer_options) + + self._test_accuracy(model) + + def test_export_gesture_recognizer_model(self): + model = gesture_recognizer.GestureRecognizer.create( + train_data=self._train_data, + validation_data=self._test_data, + options=self._gesture_recognizer_options) + model.export_model() + model_bundle_file = os.path.join(self._hparams.export_dir, + 'gesture_recognizer.task') + with zipfile.ZipFile(model_bundle_file) as zf: + self.assertEqual( + set(zf.namelist()), + set(['hand_landmarker.task', 'hand_gesture_recognizer.task'])) + zf.extractall(self.get_temp_dir()) + hand_gesture_recognizer_bundle_file = os.path.join( + self.get_temp_dir(), 'hand_gesture_recognizer.task') + with zipfile.ZipFile(hand_gesture_recognizer_bundle_file) as zf: + self.assertEqual( + set(zf.namelist()), + set([ + 'canned_gesture_classifier.tflite', + 'custom_gesture_classifier.tflite', 'gesture_embedder.tflite' + ])) + zf.extractall(self.get_temp_dir()) + gesture_classifier_tflite_file = os.path.join( + self.get_temp_dir(), 'custom_gesture_classifier.tflite') + test_util.test_tflite_file( + keras_model=model._model, + tflite_file=gesture_classifier_tflite_file, + size=[1, model.embedding_size]) + + def _test_accuracy(self, model, threshold=0.5): + _, accuracy = model.evaluate(self._test_data) + tf.compat.v1.logging.info(f'accuracy: {accuracy}') + self.assertGreaterEqual(accuracy, threshold) + + @unittest_mock.patch.object( + gesture_recognizer.hyperparameters, + 'HParams', + autospec=True, + return_value=gesture_recognizer.HParams(epochs=1)) + @unittest_mock.patch.object( + gesture_recognizer.model_options, + 'GestureRecognizerModelOptions', + autospec=True, + return_value=gesture_recognizer.ModelOptions()) + def test_create_hparams_and_model_options_if_none_in_image_classifier_options( + self, mock_hparams, mock_model_options): + options = gesture_recognizer.GestureRecognizerOptions() + gesture_recognizer.GestureRecognizer.create( + train_data=self._train_data, + validation_data=self._test_data, + options=options) + mock_hparams.assert_called_once() + mock_model_options.assert_called_once() + + def test_continual_training_by_loading_checkpoint(self): + mock_stdout = io.StringIO() + with mock.patch('sys.stdout', mock_stdout): + model = gesture_recognizer.GestureRecognizer.create( + train_data=self._train_data, + validation_data=self._test_data, + options=self._gesture_recognizer_options) + model = gesture_recognizer.GestureRecognizer.create( + train_data=self._train_data, + validation_data=self._test_data, + options=self._gesture_recognizer_options) + self._test_accuracy(model) + + self.assertRegex(mock_stdout.getvalue(), 'Resuming from') + + +if __name__ == '__main__': + tf.test.main() diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/hyperparameters.py b/mediapipe/model_maker/python/vision/gesture_recognizer/hyperparameters.py new file mode 100644 index 000000000..fed62453b --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/hyperparameters.py @@ -0,0 +1,40 @@ +# Copyright 2022 The MediaPipe 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. +"""Hyperparameters for training customized gesture recognizer models.""" + +import dataclasses + +from mediapipe.model_maker.python.core import hyperparameters as hp + + +@dataclasses.dataclass +class HParams(hp.BaseHParams): + """The hyperparameters for training gesture recognizer. + + Attributes: + learning_rate: Learning rate to use for gradient descent training. + batch_size: Batch size for training. + epochs: Number of training iterations over the dataset. + lr_decay: Learning rate decay to use for gradient descent training. + gamma: Gamma parameter for focal loss. + """ + # Parameters from BaseHParams class. + learning_rate: float = 0.001 + batch_size: int = 2 + epochs: int = 10 + + # Parameters about training configuration + # TODO: Move lr_decay to hp.baseHParams. + lr_decay: float = 0.99 + gamma: int = 2 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer.py b/mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer.py new file mode 100644 index 000000000..58b67e072 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer.py @@ -0,0 +1,193 @@ +# Copyright 2022 The MediaPipe 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. +# ============================================================================== +"""Writes metadata and creates model asset bundle for gesture recognizer.""" + +import dataclasses +import os +import tempfile +from typing import Union + +import tensorflow as tf +from mediapipe.tasks.python.metadata.metadata_writers import metadata_writer +from mediapipe.tasks.python.metadata.metadata_writers import writer_utils + +_HAND_DETECTOR_TFLITE_NAME = "hand_detector.tflite" +_HAND_LANDMARKS_DETECTOR_TFLITE_NAME = "hand_landmarks_detector.tflite" +_HAND_LANDMARKER_BUNDLE_NAME = "hand_landmarker.task" +_HAND_GESTURE_RECOGNIZER_BUNDLE_NAME = "hand_gesture_recognizer.task" +_GESTURE_EMBEDDER_TFLITE_NAME = "gesture_embedder.tflite" +_CANNED_GESTURE_CLASSIFIER_TFLITE_NAME = "canned_gesture_classifier.tflite" +_CUSTOM_GESTURE_CLASSIFIER_TFLITE_NAME = "custom_gesture_classifier.tflite" + +_MODEL_NAME = "HandGestureRecognition" +_MODEL_DESCRIPTION = "Recognize the hand gesture in the image." + +_INPUT_NAME = "embedding" +_INPUT_DESCRIPTION = "Embedding feature vector from gesture embedder." +_OUTPUT_NAME = "scores" +_OUTPUT_DESCRIPTION = "Hand gesture category scores." + + +@dataclasses.dataclass +class GestureClassifierOptions: + """Options to write metadata for gesture classifier. + + Attributes: + model_buffer: Gesture classifier TFLite model buffer. + labels: Labels for the gesture classifier. + score_thresholding: Parameters to performs thresholding on output tensor + values [1]. + [1]: + https://github.com/google/mediapipe/blob/f8af41b1eb49ff4bdad756ff19d1d36f486be614/mediapipe/tasks/metadata/metadata_schema.fbs#L468 + """ + model_buffer: bytearray + labels: metadata_writer.Labels + score_thresholding: metadata_writer.ScoreThresholding + + +def read_file(file_path: str, mode: str = "rb") -> Union[str, bytes]: + with tf.io.gfile.GFile(file_path, mode) as f: + return f.read() + + +class MetadataWriter: + """MetadataWriter to write the metadata and the model asset bundle.""" + + def __init__( + self, hand_detector_model_buffer: bytearray, + hand_landmarks_detector_model_buffer: bytearray, + gesture_embedder_model_buffer: bytearray, + canned_gesture_classifier_model_buffer: bytearray, + custom_gesture_classifier_metadata_writer: metadata_writer.MetadataWriter + ) -> None: + """Initialize MetadataWriter to write the metadata and model asset bundle. + + Args: + hand_detector_model_buffer: A valid flatbuffer *with* metadata loaded from + the TFLite hand detector model file. + hand_landmarks_detector_model_buffer: A valid flatbuffer *with* metadata + loaded from the TFLite hand landmarks detector model file. + gesture_embedder_model_buffer: A valid flatbuffer *with* metadata loaded + from the TFLite gesture embedder model file. + canned_gesture_classifier_model_buffer: A valid flatbuffer *with* metadata + loaded from the TFLite canned gesture classifier model file. + custom_gesture_classifier_metadata_writer: Metadata writer to write custom + gesture classifier metadata into the TFLite file. + """ + self._hand_detector_model_buffer = hand_detector_model_buffer + self._hand_landmarks_detector_model_buffer = hand_landmarks_detector_model_buffer + self._gesture_embedder_model_buffer = gesture_embedder_model_buffer + self._canned_gesture_classifier_model_buffer = canned_gesture_classifier_model_buffer + self._custom_gesture_classifier_metadata_writer = custom_gesture_classifier_metadata_writer + self._temp_folder = tempfile.TemporaryDirectory() + + def __del__(self): + if os.path.exists(self._temp_folder.name): + self._temp_folder.cleanup() + + @classmethod + def create( + cls, + hand_detector_model_buffer: bytearray, + hand_landmarks_detector_model_buffer: bytearray, + gesture_embedder_model_buffer: bytearray, + canned_gesture_classifier_model_buffer: bytearray, + custom_gesture_classifier_options: GestureClassifierOptions, + ) -> "MetadataWriter": + """Creates MetadataWriter to write the metadata for gesture recognizer. + + Args: + hand_detector_model_buffer: A valid flatbuffer *with* metadata loaded from + the TFLite hand detector model file. + hand_landmarks_detector_model_buffer: A valid flatbuffer *with* metadata + loaded from the TFLite hand landmarks detector model file. + gesture_embedder_model_buffer: A valid flatbuffer *with* metadata loaded + from the TFLite gesture embedder model file. + canned_gesture_classifier_model_buffer: A valid flatbuffer *with* metadata + loaded from the TFLite canned gesture classifier model file. + custom_gesture_classifier_options: Custom gesture classifier options to + write custom gesture classifier metadata into the TFLite file. + + Returns: + An MetadataWrite object. + """ + writer = metadata_writer.MetadataWriter.create( + custom_gesture_classifier_options.model_buffer) + writer.add_general_info(_MODEL_NAME, _MODEL_DESCRIPTION) + writer.add_feature_input(name=_INPUT_NAME, description=_INPUT_DESCRIPTION) + writer.add_classification_output( + labels=custom_gesture_classifier_options.labels, + score_thresholding=custom_gesture_classifier_options.score_thresholding, + name=_OUTPUT_NAME, + description=_OUTPUT_DESCRIPTION) + return cls(hand_detector_model_buffer, hand_landmarks_detector_model_buffer, + gesture_embedder_model_buffer, + canned_gesture_classifier_model_buffer, writer) + + def populate(self): + """Populates the metadata and creates model asset bundle. + + Note that only the output model asset bundle is used for deployment. + The output JSON content is used to interpret the custom gesture classifier + metadata content. + + Returns: + A tuple of (model_asset_bundle_in_bytes, metadata_json_content) + """ + # Creates the model asset bundle for hand landmarker task. + landmark_models = { + _HAND_DETECTOR_TFLITE_NAME: + self._hand_detector_model_buffer, + _HAND_LANDMARKS_DETECTOR_TFLITE_NAME: + self._hand_landmarks_detector_model_buffer + } + output_hand_landmarker_path = os.path.join(self._temp_folder.name, + _HAND_LANDMARKER_BUNDLE_NAME) + writer_utils.create_model_asset_bundle(landmark_models, + output_hand_landmarker_path) + + # Write metadata into custom gesture classifier model. + self._custom_gesture_classifier_model_buffer, custom_gesture_classifier_metadata_json = self._custom_gesture_classifier_metadata_writer.populate( + ) + # Creates the model asset bundle for hand gesture recognizer sub graph. + hand_gesture_recognizer_models = { + _GESTURE_EMBEDDER_TFLITE_NAME: + self._gesture_embedder_model_buffer, + _CANNED_GESTURE_CLASSIFIER_TFLITE_NAME: + self._canned_gesture_classifier_model_buffer, + _CUSTOM_GESTURE_CLASSIFIER_TFLITE_NAME: + self._custom_gesture_classifier_model_buffer + } + output_hand_gesture_recognizer_path = os.path.join( + self._temp_folder.name, _HAND_GESTURE_RECOGNIZER_BUNDLE_NAME) + writer_utils.create_model_asset_bundle(hand_gesture_recognizer_models, + output_hand_gesture_recognizer_path) + + # Creates the model asset bundle for end-to-end hand gesture recognizer + # graph. + gesture_recognizer_models = { + _HAND_LANDMARKER_BUNDLE_NAME: + read_file(output_hand_landmarker_path), + _HAND_GESTURE_RECOGNIZER_BUNDLE_NAME: + read_file(output_hand_gesture_recognizer_path), + } + + output_file_path = os.path.join(self._temp_folder.name, + "gesture_recognizer.task") + writer_utils.create_model_asset_bundle(gesture_recognizer_models, + output_file_path) + with open(output_file_path, "rb") as f: + gesture_recognizer_model_buffer = f.read() + return gesture_recognizer_model_buffer, custom_gesture_classifier_metadata_json diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer_test.py b/mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer_test.py new file mode 100644 index 000000000..e1101e066 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/metadata_writer_test.py @@ -0,0 +1,90 @@ +# Copyright 2022 The MediaPipe 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 metadata_writer.""" + +import os +import zipfile + +import tensorflow as tf + +from mediapipe.model_maker.python.vision.gesture_recognizer import metadata_writer +from mediapipe.tasks.python.metadata.metadata_writers import metadata_writer as base_metadata_writer +from mediapipe.tasks.python.test import test_utils + +_TEST_DATA_DIR = "mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata" + +_EXPECTED_JSON = test_utils.get_test_data_path( + os.path.join(_TEST_DATA_DIR, "custom_gesture_classifier_meta.json")) +_CUSTOM_GESTURE_CLASSIFIER_PATH = test_utils.get_test_data_path( + os.path.join(_TEST_DATA_DIR, "custom_gesture_classifier.tflite")) + + +class MetadataWriterTest(tf.test.TestCase): + + def test_write_metadata_and_create_model_asset_bundle_successful(self): + # Use dummy model buffer for unit test only. + hand_detector_model_buffer = b"\x11\x12" + hand_landmarks_detector_model_buffer = b"\x22" + gesture_embedder_model_buffer = b"\x33" + canned_gesture_classifier_model_buffer = b"\x44" + custom_gesture_classifier_metadata_writer = metadata_writer.GestureClassifierOptions( + model_buffer=metadata_writer.read_file(_CUSTOM_GESTURE_CLASSIFIER_PATH), + labels=base_metadata_writer.Labels().add( + ["None", "Paper", "Rock", "Scissors"]), + score_thresholding=base_metadata_writer.ScoreThresholding( + global_score_threshold=0.5)) + writer = metadata_writer.MetadataWriter.create( + hand_detector_model_buffer, hand_landmarks_detector_model_buffer, + gesture_embedder_model_buffer, canned_gesture_classifier_model_buffer, + custom_gesture_classifier_metadata_writer) + model_bundle_content, metadata_json = writer.populate() + with open(_EXPECTED_JSON, "r") as f: + expected_json = f.read() + self.assertEqual(metadata_json, expected_json) + + # Checks the top-level model bundle can be extracted successfully. + model_bundle_filepath = os.path.join(self.get_temp_dir(), + "gesture_recognition.task") + + with open(model_bundle_filepath, "wb") as f: + f.write(model_bundle_content) + + with zipfile.ZipFile(model_bundle_filepath) as zf: + self.assertEqual( + set(zf.namelist()), + set(["hand_landmarker.task", "hand_gesture_recognizer.task"])) + zf.extractall(self.get_temp_dir()) + + # Checks the model bundles for sub-task can be extracted successfully. + hand_landmarker_bundle_filepath = os.path.join(self.get_temp_dir(), + "hand_landmarker.task") + with zipfile.ZipFile(hand_landmarker_bundle_filepath) as zf: + self.assertEqual( + set(zf.namelist()), + set(["hand_landmarks_detector.tflite", "hand_detector.tflite"])) + + hand_gesture_recognizer_bundle_filepath = os.path.join( + self.get_temp_dir(), "hand_gesture_recognizer.task") + with zipfile.ZipFile(hand_gesture_recognizer_bundle_filepath) as zf: + self.assertEqual( + set(zf.namelist()), + set([ + "canned_gesture_classifier.tflite", + "custom_gesture_classifier.tflite", "gesture_embedder.tflite" + ])) + + +if __name__ == "__main__": + tf.test.main() diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/model_options.py b/mediapipe/model_maker/python/vision/gesture_recognizer/model_options.py new file mode 100644 index 000000000..79a84c792 --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/model_options.py @@ -0,0 +1,27 @@ +# Copyright 2022 The MediaPipe 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. +"""Configurable model options for gesture recognizer models.""" + +import dataclasses + + +@dataclasses.dataclass +class GestureRecognizerModelOptions: + """Configurable options for gesture recognizer model. + + Attributes: + dropout_rate: The fraction of the input units to drop, used in dropout + layer. + """ + dropout_rate: float = 0.05 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier.tflite b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier.tflite new file mode 100644 index 0000000000000000000000000000000000000000..553f9b402ac87a4c25e491216a24998ec59735db GIT binary patch literal 6872 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier_meta.json b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier_meta.json new file mode 100644 index 000000000..58739061d --- /dev/null +++ b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/metadata/custom_gesture_classifier_meta.json @@ -0,0 +1,56 @@ +{ + "name": "HandGestureRecognition", + "description": "Recognize the hand gesture in the image.", + "subgraph_metadata": [ + { + "input_tensor_metadata": [ + { + "name": "embedding", + "description": "Embedding feature vector from gesture embedder.", + "content": { + "content_properties_type": "FeatureProperties", + "content_properties": { + } + }, + "stats": { + } + } + ], + "output_tensor_metadata": [ + { + "name": "scores", + "description": "Hand gesture category scores.", + "content": { + "content_properties_type": "FeatureProperties", + "content_properties": { + } + }, + "process_units": [ + { + "options_type": "ScoreThresholdingOptions", + "options": { + "global_score_threshold": 0.5 + } + } + ], + "stats": { + "max": [ + 1.0 + ], + "min": [ + 0.0 + ] + }, + "associated_files": [ + { + "name": "labels.txt", + "description": "Labels for categories that the model can recognize.", + "type": "TENSOR_AXIS_LABELS" + } + ] + } + ] + } + ], + "min_parser_version": "1.0.0" +} diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/0413d5c5-f5ba-476f-a921-ea5e967692a9.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/0413d5c5-f5ba-476f-a921-ea5e967692a9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad3eafea04e797a06c1af3269bc37ba68194a280 GIT binary patch literal 28379 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 H6bS#>Sy%sR literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/0e022ee9-74fd-44fe-adad-60c11835e44f.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/0e022ee9-74fd-44fe-adad-60c11835e44f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18fd8128fd6fc9996d11680d506131e58172609a GIT binary patch literal 41322 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 S>aG~$1abLQ^UGm!qyO0?FBDz? literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/143f8b21-1dc3-4383-bf36-0a54244dfbc0.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/143f8b21-1dc3-4383-bf36-0a54244dfbc0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d36347e43295e81e036ddef4c6f51f0898b961e2 GIT binary patch literal 15411 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/172ba7f6-c6ba-4398-89a2-25375dccfefa.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/172ba7f6-c6ba-4398-89a2-25375dccfefa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26866e4ad330aef38737400cae4362b4840dfed9 GIT binary patch literal 21653 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/21de0cfe-af9f-42c2-95d4-aa3d852e7dad.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/call/21de0cfe-af9f-42c2-95d4-aa3d852e7dad.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e7af1d7e19f7034e1a05e524491ca2a7f4d46a6 GIT binary patch literal 32558 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 F`ScaBsN0JR z=yYug-)oi26dZxmb2q8=H4}%lmHH#56+MJ4)tu#xw3bM1s_6;iD_Y` zjYCol?4U>@&H(ft=Ckee+dVr}#;0K&1zQDn@$m!zqW^XMlA{2sP-Uyo2GT%PzNYxXL=`=yP7axbI%w zCwQI>b?=n*+d+Hb?MBxb^DW!~?~ISuzHE_jNbg@!ugo@)ka#uoMz3mY^?S=~f2*0- z@+PswtrIrFz0pBIsQ?4(NCh~3D}?SIqKpwr2%?w_Y>IAa?rJ`jB_Rp)rz3MsImH8| zCQ)D@#WmB4RBxB91m`pX2wb>dQU!W7zOHOuX<)fF@uCDSj(%`Dbn9MpMh-_>>byL$ zT@{j5-Lz#?^as}-wY4_Z$0jB>S7uhdb8~wsouYJ%oPzyZ+|)L@l*3PZK_OM^$9mQA zB-`dT(ERWGWOlA~;xJ3Mo<~|z+;ptsZFp+^Ep>Q}zz&)ICEPRaJJ+gBuh>VSJTTap zz{>=HVRCxl9+l&oRoB?{NM&J=t~ zx#pwt5k`5dpJuo=sd8bELj5G$@{`}1t1;T0Yl)_}J!I3^jrdtqm({ z=^6-Ag>M6C`D?=2MPaJEp5aT6}AIMj(+EKaUG~Aj;Nfw%i!x0-u zViPPPNY#*SEso>9YlHCr0EsUoH|Z)xD3*QgxD_}90A+Es+UWtuC)MJD6=@X93PnKt86q=O@gPGmCt!vq!}`=DDmv{g{H%+RfAkNP%tq z@siw+!m{n|b=?O;n!?iR04E_ZkOM1j<7jMWy>4sTduUTz&8W!`^9~Useavy~QfWF( zuClGE>d!ruj1mte3hjBEcN}yabf{`q)Y27YZzGDh@V&;JCzE{2k^nbF8*VG?NZ=o8 z-qUTwb|N^`C><$vAq2Pb{gtI?GxD^cZa-X9QfemAe29@tg~?_-EoAg}CR3e9VurD( zrJdcPc1AAv^~Xx=g~ay13w3+Tq%j-j0tnlvR>F_Z1lN^nm%nPeK%kXQ0XfUcTNSmtL1@kqwHrk37t^8{_V zJE+_+e;$7-#tt@y2RRw8gTy`?yOYK->bil6>?OL6G(#uMLEsE}aag*{BGXp7fkqW% zI3CB5{OgAm2X`ad!p(B1qPsCaO60ZEol*Y)-2?Qln7?Y}wWFO${(`tp^iUM_Aa z4ry~tqIGPVap2TZo@xCmY%|b)8jtv#%l`me>)6+&6j!lB;XF)F#7edE?~Q;SG}S;D z9(#XED5=DJ1H*hq0P9X)yG0e}o`|EZICr9oU^MimAG<{rB_ThCfzpa9Swg2;lu<=7 z5uX15O6dG3P7gikqO^g9e}$U*>`|m6Vk+mJ1}lxd{{UK_Lq!!#%86bd`1@MwAY!i* z0znsjaKiq(%S(5Yg2o;%S+XpcUR!f$vHkK6Ap@_d3+ zn6vVe>yDMn`0f~>@m17t#*v`fLZW~=dI~75tA7a_(Eckqxc>O7GXDUmG*Mhg?Pt-x z9|QgoognubY&_RJW{W4qJHqN1q#&VTou^>w=|vUl%iu?jz9w^iC*#By-}ThgpAHH0 zbq;^!u>Mq0SjYIN!|XG$c%z%*EwPp~a~_(^g_IqqapZa$#_>bD>qS}Eg@|Ai)2$R$ zOJ*msIY0SsezlLPpY&Uk+{ytoQCyNVqwyT1hZAI0g{dy;%u6xklgTtuN;@;w=#IAY z{cs(&kL6R?f$2pROLM}W?CCr_N>6&qNMUTm5!6+z)582lIqO``vHt)c=jbS+yu;K* U0n|`vqNrq%)Tf}Lijt52*;=g=lK=n! literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/06aa70cc-a12a-4b1e-85cf-e54d44c19a3a.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/06aa70cc-a12a-4b1e-85cf-e54d44c19a3a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66b41462b157376c6f44f1d4a535ae37b4c469de GIT binary patch literal 22147 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 BF3JD^ literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/07a5a144-c635-4441-aedb-5c8e9da79aac.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/07a5a144-c635-4441-aedb-5c8e9da79aac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2eee14bd0ebc1e24ce2b3b7332cc0e350d79b52b GIT binary patch literal 39256 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/07fdea90-1102-4419-a3af-b394cb29531b.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/07fdea90-1102-4419-a3af-b394cb29531b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b8259e4f584d530d7b20ac6145ed8f6bb3b3584 GIT binary patch literal 28077 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 V{{S3gy++=(A*MfLUV-H^|Ji(^(JlZ0 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/0c960166-75b0-4c1b-a3cc-2ddbd5a21703.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/0c960166-75b0-4c1b-a3cc-2ddbd5a21703.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46db0a2f6d64debdca58390a9a0c08d27ff8e6fc GIT binary patch literal 22918 zcmbUIbyQnV)IN#_mm;MFiU-%?F2Nyaai_)I-HMk|DDI>bx8UwjTAbp+wIx{4BEjYI zdEf8){nomF-FqkNoHZ-6Cucu7d-m-8%*@l`(;vV~6-8x50165Kfb#qSJgora0N9wA zSeO{tSXfv%IM}#&#Q1nGUf_|xdQC`7O#!5#rl6vtW#nR^rGLvnMa3%2_LhfNKtKS< zA_@}Wli=bP;QQ}KP_S`u@Lu4N;p3C>(NWRy{l6|xy#OL?Q~*jC8VWrCl?Vlm2<53C z0DRUH1Lc1T;Qtg9R5Wx9Oe}01+!xOR%`X9{C}?P?=x7)i=;+VV!O!ggbRvvbbi6W{ zueB_&=sk$}!jlWI8D#5!l4wu=W8}B=jKIMqeM3f0!NknM%Em4rC?qT*Dkdkdpa@n{ zR?*Sb(>E|QGPbg|v9+^zaP;!_@%8f$2#ov`^*Q=WOl(SOT6#uiRyL%tsJNuGtQ=a= z(Ad=6(%RPE@vE*v%81bKRr9YKwe&5-`xI(3k87o zzp$R~{|oH@hKuMK7b-eB8amd0xKL32o-Z^abPPIP%vUm6SQZ|y>G{I3iDi=u>VM)e z@N54gvGknAC1n)&%XIo5wEsc&{|s2f|0iVsKVbiVT+0AFG?eF;heiaD0$lA!Y!asv zJOMgH2Q-upx^Zu3(1ww1AG>8`vHf#W;yB0~KE)mia#DCOCLb{iyNrVW35BM63151y zC~3=lrulvVDSlU>GczFTkF4Myw954R*DB~HvI#-#DC#1QOb-!i6=mo_ux|;WVu`I1 zMDw`>+dr$e;$M@qZ@HdK&3Qkpu5|iTG9>9fu#=h@k7s&L$VhmC9464{Xu2I)>#P_$ z@@DcDW5){;@Z0qgwRu9CkSwk9`52K$)CB5krH%GYgWjt>@yQngc<@!7tdD&giTiAl z>72ybR0Ul~j_J=Df3*n=h2mJ;qb&Jgfwjdqq|P2nmzr_3|Op%U9xOBx&g1epL!_;`CsxK<~DE%w%YMzUh* zK6oH}TV;orMnZ~VL=n8kYLYq!dP|rm`ikpW}*i$c~jlp)6kVhl#SB%DemwbCzm zRgRlXU}7^NcV!U(fm7Y|M`|y>mY_42KN4StHY`pMCa@B=P6pg`1`Oz!;j*ctSV2=$ z__mLxVfe4z*~^+I0QjFzbAi#x=;}LBockBoe)moxGouUd!sJ|D$w$_mAVK>fCW{6o zs`zA%NIMKQ`I5qE6mf%Xa!^>Q5VrUvS_)gKcH;ICV{%fk6V^b-EQC3Vv)}*R_g^s1 z$+hp*fX|^9=R3kpzgYbKjm3=WyC%^b=ziaIDB*6N%DE|(Ud+-?_D*`kvFAH4Eq5%I zYWMMW{*Iggy)X4Su?`2?rwbtav!%ytPZqk7LH(oyfH1XZm5`_Vw{-mp^fxZU$| z4>n$Fj8stX#OR# z|3R`zj%-=_@w9x~#*1W$e^4w|p0dEKlpU@BBcT`yQxu1Y%4K~e8xRxtW$wFKa`yNk z4H*~TmwHZ-t94F7?m+qA72;!2bf9%KwiSdcYUqU<>rnHf8(xEjti%qp%{sW-49OeK zWW9-2?27$va8(hUcu`u4$u3V^`3 z6JQT~i+i{kE5cy7sUWWvR>6beH}k7|$78PlA||oG-*QqRhLC?Xd~8B=vhK)4{x-x% z|LpOF%-!JcOND*Ms+Xqw!Zh*!5yrnarcuucyX7#m0`}9MoL(~h}h8-#aY|QG0vp> zqE1M$ayCJ}XE;7j2xE!S=K>3F=o4-%N7O?F6i5Gjo?IbWIxuv}vrH`+Ya= z(YSh1XMl3yu%BJd^@(aD=?A@zEaNebPvN=&DL-%t$q_5--%1SeB?qiL@s1)n&^BQI zpgu;qaD%sAF;-7YE?q2~9J>@pR_m`o3gU`dKQt z!qyk1q?g6os3S*e;$oIbtx~?J?vF=kAnoU|Aisq>^5cu(8LFg#@qC4!62&Hs=q~0b zETT_|k;%%2I(oeVBjd56&6ZuW9qVfO z=n$1%+%B19(_|ADk3nMKg_n&vA?c~z!%ykvhN0UpKTg6m5fnjkW4YE?`K1p9fiATg zcc82%KnBqhU;{NLX&Duq4tzLc6Jxk6%d8q{Js(^ZyN%bUZC)f2N5;EP$rlDO0JORzHOSpq>Vn68JDW4*}UyL49JcC`viFDAK~(I zyd=rh)_W^af%;%pARe_(;Y)BX2xdhnes*+yS&f~I&aoZ#lAAh=;s5{F9^yKe6D18c>$Es_x>&1 zlPU2<_kR4~kj+cDkU+QfEdt_~$C4+cg0}H}u!A6y_)F{;5@}pa0C8~`4okSPg5h{Q zc?8tb9Ya39{+!C{u4pFwZic!|>k5plS~)0fPg|B=)Ou`r*Bhvp0`_wE!HMIoC*2G2 z1r7#dm|}AlQtDh~{VLxp+PIxjpjehIW*L**3=GOUA23b;KF}W0KjumDe?Ipi?dMv@qk+6?JobWd&PH zF*N0rAl-gKV+ShG#R89VjXBks<}+ak*;X4Kndm>cP=|ehW{jHTqOAWtVy%G}!1vUKk;a z+0A`_`|~F6Us+8zOOQzDN$q2^Mc5+rwV>pTLXd!4O^1ew$PcNPoORO(RA|((DUPVj&>eCbRRHq^8|RFf!Ls^Ia)`IR9{vpW<$?+-|RjC z=1T`^iwfN8WhE^ouL_1rtjy=^J?RHSV}4|p95K?2Q?o8;hW<`7yIObx80QG~AKAQl zKt6Y?al_Lvn@@8C4yY~P&qt*ZFIB_%isLlep2r|NI1cM*`YbpGnmRV|7-X{Q;N9cyxgX6Bm z{8ceuYr#F@?mszspWz?76Wn(PPk?Iag`y*e|MNuW(e<;1uiP`?YrSi&EF7l0)jxqcjP$b7DRSo|yEEl$rl8f&%d7X@)I(=wYo=Xi!H|u; zF>yV0*~bmJ#^qx2m3(S1Z%m zK@)j@RdF`Sxz?w_ySiJJPZN;`rE>5UDylj^Vd$BD0_+R^7Cq;;AMC4|{pmmz5{sd} zLy<^ERxG75HWiR|OA$95j8Ao|>z1sIgKI6&$1)F5z9^-dVGYP!hS*$|z6^Hw1T;nu z!XVcA5I#oiTNn!%o`3mSA1#6x@*5(tD7CP2@!$-ORH7D#in`Vf$mvK8G_XS-LrRyEl-=99`d0$?-RL zO<_WbS~t^;4+S@~oeEq7g}t&mYYrt+Yxny<^-9xBeFO}-^p_^xCgOi+Oq8)=RST3~ z75?<3E?YS-=6HU#C1%jfOSW)=X~gYR1wRZ~mg8Lvu-3#Z>EdL}*o#$dG6#sCzt8wy zRuV_n%U5@^a;qmrXw;vdxAw#COy%0z zkd<3^JBS3VFPYw+_4{D1F-Gr=cWuADc;3GXU;Su85BHU&c3-LfV60}LiKSzvpvt0= zyP-PZ8gRa8Q_**Q5hpPjY@sGQ7`OW|-H zV`YFJ=2wUIFAghV;;AZ^D6N@Edo5W&P#*zcU)_B{Tf@&2HnEa(Ir-vHYOv=08mPbe zZFPs@NiK09;c3OUN{DBBl_f7x111Jn{z~&=!Q^izS4{qUa4oV@pOvX2MroLHa;C8$ z^GJB16%6dk3JZ?1bu{7fnui$fRtw~nFaXPTwFmLG{2m;ct@65+b{BQ!?{Je7-mW+O z8h_ZARTLfCRUaNuAH-PnfXMFN&CYl%5U=i@UKKMe+ZV=OOlUr*C8#epu92Z7+UXvS zuMZ4rGQH6WweI(Gigp;5Aw=V&If7o9@K;2!`;2Dk@m|JR{hu4M-EDP%j&8a6QTrNd zdg6l}4l31MJ<@2q*dcC@&H4~CE`T5Pn55Qf(7faK-#%|$1bVc0)VRlVQ6}lX;;7Fp zMJQs2Mx#aE%=5HC?DcGY>Aq1;ZQZ6GJIPKM=6iV>_N@IhVA*!|85B8KZq}Wlo3&FC zxX|Pq)0i)QFGf$uB}Gy1!l*$kV#Ac?EjlvjxTuKbs9cidl+azI*A-{bM z?@zbbK#?f-LxO4LmjZf0-(o*qmfff$Oy8Hq9AA8!ubcb(ThX_%mgV3WbkNw)+43XY zwk6$KZY@ZkKuGZ2X4c9K#L7*jwN9JFOhunuX>emr;Iq)<(fh@ov?y?XVXr2ya6$3e z%GBKEa|BC56Y&*eRQ)yK-vUd~EsEwwP?TBIjP*A{+QmF*MI5DdyW!piZ#+G)pz=`Z zPcYm_m0@v(G+eHNi-IpOd^Kop(N$ZOsXggPyEDdhZZSQ1Z1H9%b_O#;@mE4w`?DjS zSL0O;b$6{H82Au*7daIKlT)r(ixyR4*p_)DdVn7X1?m^dr_i(G$+oeBLYif%l3jh^ z&JMq7c&}#-{M0)S|9R2vga5&5j$?t$MA;@66`5~d+PB0DjCWXFr#OHBs+E<&uf|5` z#>S_77#Cjq_<)d0ZEaG*|7x!s77TiO@fxVo(dWhEZDZn4-yk0MxAkLidGAaO^kmkEql{ zE^!nZb2!QuT}37&lst4<;8*1AY<;QxRP9GyTM{JHkWfdfAyG%kkIo-lEjx89XuRBW zL2Pym`9`oU#kiZQL6lE5dl)PA35FXMNFm#PsQVn<*zss75CfJlHDgPpHmo9NYH1vs z+Az93)L(hk{Gh9G(v>xf-Txly8w!RBFAd5Y}KSH?ZNP31Dv@nonaCl}~oAE`!ire#xMfG$-B?)`^30Uqr{BTQFw6 zY#X^0MGUCA`8atN;Wo71aXzqL$SB#}y@)7caLj?s3D`j~zLz#Ty|om#^N9bM7GK1X zI2Nd%J~!C$CHH+~N|`8{Xz%T8l7c&;L&OZ^dpsy5mLhI))t9gN>0=&(OaewE>rlH! ztJ-ORhD*Tbo5CB3tXLqFXjP-a-$P-np``9<+a*rvDRkR#>H2~`tjZ>W5`1^NpwEQn zsZnk+ObJMd_P9WgHMcNVwLfe6_89=6%I)4WVpg)mVIjkcOd+hjxu}UgB8}W~YaHWG z>I9pOHu_Ym6HE`RLtm{lIh_gUkXTLl;|A<}jr-eW^a@PUnMOAuo9BxB{ zRh4#Kf&xq2bL0?3u~YI;8~B+i-36|hjFT6HvajK(E?0<9uXLn&W@ZB4j;+B^;Ugj2A1H7h@pvD({bVBBi(x4E_rb=wVuMO^gJOpyP?aaEW&E#-}=w6gZ0*!Zaj-AL7v|`D$ z-6Wg7bszA{lsFXN2$W0&!v10^lVIu7>V^{(3U3&i5F`!SSR4oH-n|o>GYAzo?#=?H z8_NHXX183w0BnK~aXlBGU?%7@WbUj4Bd)j!4BA$xU7ZU3^}aNArO1c->Z6nIc~d_*ly^|Ck9-FhZO@sC^v|s zB01E1)qof3KKGhkJZmKYq5W2-jYBy%Xm&csS8&2vr)`>(E0gdg{!(Uy6vfv&iU-~; z$4p!-JMp0dlbAR^=)!4*ddl=TzWDpEOkA{CyDXk?LEPo*Twx|omxj8S|qa#&4x0+c8n3Y%Y)u<{OotWpe?^HYK` z>`f3WAr1-fhxK1j#ZAw8#TP7DyJTiM#+u7uz>UGqFAWL{`SU?g#%;KmV;MWMdX%}cGVV?45H$Rt<8o-XBHB9J%4;I zNkHShEm~A^-qll~#>zG(O8p*T)*wLn3vk)5E5COyl5-#pG7wI_wc{F7a-|XGwg=hU zV3n;AS~`>);>)Yj{lNIaGEZyUe)Id72X)<5cw3Fp#4UrrbP^_Y6qm`AE+!ZW{7$(t ztFM^BeA5jr25M=!xjDX|kg>Q%I@a4XGxMePt5{2gRVaL0&f{+~2EilGm0L(|Qa@A7MzO^xq8u+2e`V( z;hbqB!A??R;A2`1>097c^sc&jXcs%`_`$7?s&F-JJ;R%$*e}N{R600;^<|2TorG); zV=6XDxmmz1T$J2C1!99z&nRLoX_QiU>br5eJ$s@Uk(Cz)+)$sImcQUMr<6I~jrGzX zlGjuZ$ITL<#*t`##`UD@963vG7!dPiS|^%xWC;D2wIw`Enjl9#;+VR*D4bXTanNim zrr1omN)mc0AAeY!*K)}&`2b$!b}L$mI!0Av(o1tct0^5N^<-2H$4)m3#++dx?tRCj z?l?_zxYrZFAI9A*9z;U7;{822@W1?6fo8{5?K^z}x(JG{4|6?|`{jUZiOaCn!}(M& z$SH45LV*)TtbY?k|1kY1`1!1BynTeZRFAU|`)9Y2=eZ7KU(w}I`H|r{Q?54JvQAxv z^@@Uenif(>oXLwOOaB_SEHx;9lF_U^me#d zQMKZGFT?rU-5tJtS^bT#p;Pkc>~%yiN1(f^4*5vKcy%L-TsGNu*13UovP-I^7u^Fp zw&i+tc|MakbWwJ$ zRaKwTcCw`LdMsRvQ%ytHse|YgFiQuDhjQrVdQ?h82e&6JPScl6cE*#CTN)_*?M=@q%6 z2naD$P#7s4SDE}p-Q%_nalK&YE9L2wFz1z<&c9fm<$qH#%b^MI^R9GfWArej%%qoT za%caQKdEA^iJ77dViy(^>7YZ`Wj;{Vl)oWW$G!>zSoYU8q4}{BdDH`o4vkkmf!x zfP+kAT;Q|q{vz*FSB{vb|0${m#{ay9%Kr%B@Kt99ii=}Tv3Kvpqu0NT zwhEj*&m4~DL>n4lww^=ru@q7Y!vlso?j4`xKK`-(9xjI=*}T;%3Vh4mSD|0H1E;1^_a zihzAI5~0w9Plp?;42p6!cCgPE*x-FUacrhc*|v_ws&zcp8`9qmCP#ZJ+XZ~{s<)Co6D^k+S1N-Hbbe!0 z!FS!G28>SH4id?pR`3fD^s9?|UZ6ov9M?|2h6;m`VOh-U!;`y@R!C zljh3_Ju|~`fsg>n*-v-cNaF28qAPC4M|mcojl|NZ(g%c2H?upk6!qFadgeEL8nm}8}6wnC!Lu!25pd;vf>pGSrB zs-k=kP*Bgv$eSijpbW)Ddxy0gcc+`iQ+6}XQwrLbo&DvtoZf3YDw}qmD5nlzf3Ei- z^qr>}{5sM?_Se+nPZA=}D-MISH`)?LU+{!DOn&FSD>_c>pQ48xd!8$4WOKX;g%&S@ z5dGo3#Vq%m;WV)SCS$K>eoh*LSTj%)Gx%&fBxix6JUsIK``uN+v9*;EaSJf@ICD5Z zx$YZ;i9SWp?}$FjJETBH2Jf#WDgHpnjMMO2_y$M#o;XAWH0mkHX|D7dyA3JXtfPI3 zQJPaChr>i2{wG-7v!gb4J55072|(}t=PabOJ;s$WyOsa7ijJxU>*~Us&t13j1Oi)Y ziU4qnJIt6HbXEE}KNtDwo9&39Y%m*tvdjZp`+$u7yU)3Vfexl~<<&yvL78Vs7i2fz z_E^d8SRn!F#IIAAyV)r{T-@B;;xIIokb>jajxX)b>Azar<1n5L(LC-_gAS^_tprSI z3~ieu_*1zR$l~3_k%h|IyqP{`(6V{gGV~BF%WTQw`AI9rn$gz78XR=0E6n!JoXi#d z7ejdA`rxm5o1!}UT+T)oMk3;!u>;?~%CXC1@E;j@nZJg#`}x*YKIdrA>SONJu9=R3 zyp9|^T><;Ap2@lS3!qIAUPl%x7jt~47nI(BN-?6T&sEP0J`o*~F<`v zEdd6d4fQ@5eCbtfetwMuMvNaf^d4H02@JX@SGf&kx8kl=dX<57J+!UP`8ZWBv^7Hl z7eL_+y^InLc>Gtfg?Bq0zMk~PMdwJEjZ|9Ob7+d7v_eB_`GmQBkLoX0AprmyeJlB$ zA%U@7QYDC6Uusy_L{D04N)P+%vkBXx)sL%(A3ReQTGBKt{}UJfk0~;sf{B}G(onvY z+gQ9MR2k-~NEnlTrq7XRSy{d{9L62qKJo8R$V(TKnU0&1Q0XOZ7eHRYg0NR(0axW) zBaEq#FLCJ8SO!~vH{nbtu1zfnjwJh zkG9rfXLXh;|Z`(ajDPk$1FyBH;#A@s$&0AuP8JqW!yHnHLBS1?UjtfwxUo1)&c~<@YB?) zlq09rrH0sNv(?39$J~T5EL3H2B%|_8zbf~o_c&4CCnkcmB{w+}JvpshrkE791h(#I z{7JUYCbOtUAx4IOi^!Mz_Cgw zTj`P^kvo21)EH!MJGfw}K=>IQe-VyZy>9r>GG{K;KdSM^@hT-U9ia0U<(SA*aei{X zAY~joiBT!vLf0HOR7H%`kBC;8It%>eWlZN=0 zApmXn({1Nvc{$uOn;3dDwj1Gs!}6do!u6c5Hw z><4O$CXsxhN&7^olHHQ{1kmH>m`VB)TU#O~(zT$gH^Kr4g0-@q=+mXURPS`{TfVPP zG>{-X&BtAsVOYOW3iWaB(Z0*ul=^P)=c+u_GarkkU9vQ-{YVsDNwRGPp)Ct(#3o`Err=nP^2 z>^=b3Ab*fOu1|nJf@|xc6@otxLQgNH)(T}_(?a6T-&v_usVAisK|X4BE%l;+*R6Vi zI@;uxt(z}tG;a3#!Y_c&B;FU!bYf+3Vx3{LO}G3~Rd@~>1* zpMcdSs|=I|wP&UL&XhW}fz_bV74FL1h~{Z}VeanHm0HW|Ve-nBg#jPMR9{_rzV?&w zXOphcXK~A{F{64}}=cx{!aunFnGVir*UYg>_(%L=71tUYZAd+lhov zDOBFYO*gwDhiqJu`Vz1zGAyqn&9N^J~3J&j_J0@!jx{}Ly%H15#O zp~75ZI?Bd!bS!xtQeqZX4?h#DReYZS$!g-#n_(c;KE}`OANtuIEjw_B{@v4YTBic} zh4>FSEW35${!4Y_zW2>Ui^!>}hql=hWd?f2X_UBkj64BUp8#R8$8I5T1Hvk1ZZt`K zP|?nyebRKouu+(%G6?#p=I$lB`UE&1*Ek1N7__0N^a>Fi-Gfgn`fVF*%bx=~cLEYD z`452dM3n%QxKmBdtV+_1Gt*HbEb7S;(o4@(q9*e|$es%)DfTZ~cso*HrtKTh$uT)U z9+TKdvf1H_OmpCrlHPK+ zXNnF$(#b!6wSo5J1w6oKx+xd)4O4Hx;$Fxz-^@rk+-!XU%01?ClM;WZT zEBh0xs4eB-1_t3T*r*1a@4wdlA2>I(9-Y}T~U zX4M_S%L>k>wsOWarRStX%uFzNpI2s(6;(qZkitm`#MTw0O{640(A&TQJYalrO`tAq zgLds`q&WMTPmCFkw1Rxv49A8M9>XZiMOI|cN_c7oK4aQUu01%E+6=8d=g7FW8zle+ z6+){Um|D?8?ZjuTZY2; z)X?aevOUk}30Md0-ooT2T(flSOtTo5H-b}OJ}DCT;Y59$rz2+4NEr9e0YEv zr69g|Be>tMFhuD+HZ5+}9D2Q>a1>o5T3-KNk+-t{*(fvl=yTxEfqDQAgD~+B4yxR(m_wJav>FDYOcBemZ@L_8& z;PwZ^&(50Y7*#SFHn*M)v3Su`KS-uKCl#SpGj#-1?C`b8WLQn%LVbMez-=E7`?gUl zt+@2(2D-XUlpd^IBkFSX(|@=BrYX(Y-cIWLYzuma&l>gR37|jpi0Z^9G)|vFMp32k z>v&K@nk@qB36QJt1o#MPrtZqsq|wdEd4SCnj&&9u6&{`|nKqQK9IN}>`ZNw%v`3#X z|7qb(G}|_vi>exAEjnA3h*K8XB0Ps29c|Jtlb9QIWG*XXoJdPER$Ueifhr*AFo+z#HWI8G`teSWvC%q+A2vKn)1< z`H9eK&-v2Obdsi5P_$k*++s->Xm%KMa&zT2lK@_v{7(F6Y?e7w{RFTwvwH-soD-iM zI-T5Hx{Ya#aQ&Q!H6*SGUu2z79(eya*fVq=)Vjm2B=D_2P28mA4NLjKa-tpAFE0h0 zY~uhzmqnn=fV}T*NOL{}bgK2uck*NMqX0GO)noAFj?`d+vhN!)erz)p2fb?ULzBZN zz)<`B(Dn2~bV%s-vo&tW-P>P!9#ZX%n6tGR&$$ph0rFcX@3BMU`R~xQSRO$p=Ri2P zG1GikQR~HlMsiehT!Q5N(5PA2DG*@{?z_zpX=XVE!nM}y7tYk`OF9o@WXs`sI*DHY z(+Moqc5!i46!0H^uq1|A^aPNsy@|z&M!pRls>~ZLTl!sZdU|YS{ooKcwB9li2~Ch3 zUAkwBmYofx1V8*A^?9x+9Gss3w+G&P6q)xoKM;?Cl=c+KPk>C}2iE^l{?hT8)_R@v zpRZ?2d5NVG%qP{Q&`rfa~2MSm* zoIWpu!mJV!c0~oO>3Oe6td!$=Djl&LP^6*-ZI4k}bkWkBV+EL=05OHFS6Yb(Bh&So zD~^ppsTQ(?UBR#7O|Y=ysGpP7uJ3d913=@p^e?yLY!Ychyh(Jd%|21O;WxfMAE!G? zz1#zCf?RRVz8DY0!9 zvgI0pBZ?HM9K6M7acl3!R1_6-r1PqQoiyE5E|!IzFyLWZ65d?aG#m1L)=5&7sbz$@ z#Stv{I(6Fd%S&F}?Mr3d2RjwQx-@m1>+2w>lGc+N9@^7j9|g_2`L{kK<6ZlvKCVB$gR#be*meX`-|J|G-e)dG6VoMC%1>AT3?yWw*0|)8d+jbkBeF9H>-&?zZPMlQR z5<8}*w!71hdm6Cv2dAM$n4f{R$a>i{1vrM&M{3<(Pq@~hgdB@zR=A_R+jCG1~mRdEi_pi}t2%ziTDb;gjUeZlON z1&>fMd}X@(2m29jnzy)bIflQb^z)>`)d(ogjVM>s;Vy|0*N z?AQ2!FN2<|pGlmxZApE%nQF=LT@%xnNJLj61AhO!iIc?lMY34^vQ~O*LvFvmK#!;B zXrn9oXEX_TZqLo_E|pIu#Id8eV8aU&w;#_MF8bhL`a);Co{8Nz#htLAsxrtnL-p%r z+l{*rhmdc0uGfmxOzGTeAs!WBcH+bHhO>o=WxXY(vQuzb#QS78i#`-skg|`G79~>$a*-~HG$gDU>Rpa_s zV>7MI7bLu&q+M2=A5Am$`&fo}hs86|*hy&V&7M6P%Hj=P zS$Vm4_Q!5F2MMvG2mS{RRm~WSP#*5ldy3s{P8aCgA_fP%vRQ3G$d9hCt$ic28!X#a zGpS%1ngZd%!HqG!c-OaM4Yj9ub0$LeYUg!yYC&H6j^s56;u^}}8>u7R+mA9Oadl*- z?e_$Z;i*2ulGVl;pA>A*@;1qcV^i9{RjKc&1ndfWsWt0|+hv6u0scGzh%Tzi;%f!5 z|LUBp(wdcq-Y!++`)QMEezgajO})gHnq05JJ&Zjb9efkxGq2kB3aQC!8nu0q$=#mV zY&5r4(qYFU3fTQu)sx-@&e5WjY3Y20fvK(yPG}24JHR-sL$^ zD!(R3`;-70h&%3S754=AE%N#2t!JoMrRVsosI_yV5h~pA>?<#gbe!=zE^!^Izg`Dw zSS-Y9Yi!A$uU4la4g%Sm;e_J=n3tkG5qrBL-ZK{!Ax?4m1K{7@d_Z`3x5Qs=T;un8 zY~ziwvvpEd_LB%U7S4zNv-0qHlqR=*? z)nSHNT3f(Y)GZ!OsD$>3wWrmK_?xXiiH_>BYg-lq)}Qr$!E?QasPAUIOsaZ2)8e10 zk)zQZtA*Gm`t4$+T3YFX7v}8$K%qm4r{#h;kmb$CzltjIaagsZj!sJC(l%`dKgpK) z#8C2TFbrnN$G1mm8Jl=7ZtDutsVSU))paH)6?brv-W2~K`uKw z-ei14k23s27Fyd7Ts}#?OrjC&I@6Vpv5d2V914V%ti1nSyF4k_RbHr;!75FLbyf}% z^G0;exhYKTXTT@?DKS3&4!&k6V@RAY)vs7kZ`5ji0ywe&um1@OQ{o`2iMEByQ$F-( z19@-pW_dUIS3bLYtrz>maXbF(wt2mcj~~8ItfheVyg4B3WrEB_x$Sc(@k35$E+FwF z`mTwNXLFM|K5Q6aBy8-KE6ckQc~w7C6BFkZxkyD3eE$tMaWGY&^p^bgQ~7`u)e#wa z)k-^VVL2j}+gj50kK-F7S7{=}W9dUN-S2FSQ4wprJ8fi#Y?(T(Nrvv-0OF-%?05?* z-aoNW=sQWJG;`M718rlLf7kfX?!H{QxVqb1EM(OQ$>B}eFgTVSAo24i~~+Yw|0qHSFDLA7mnx$*m% zqv163rh+8lkJOopXwl75?glmJBq(hbj__EoSlG}79(WEjb_J@QIyh&UC#8{6ixJi>E)zp`WE*27pt!#4&rZ{)q@4!xKOv1&#qrQQUS$D|S#C z(ZS1cuD*xMGNM$7v0bj>%Y=lD?{v@PZe9((Qa~vTC7&-beKgUW{WU2Un=lpf#rZjx7 z?qBUvAJe-2OJQOTjGlgRFz(=wQIIO<{6~d3xbO6Ng`r)6SdaMG#sPHZ*d!mU?oO`p zHSX0y(m&|jU0!ObZcKA2W4b@ZcNZnj@R>_-;2beH{>-D>8AoC|GM6595p#K!hBIvRzvPkRoZ z58R3UrJ~--(Aj_;yjN>M1X-RtFTHivi+1J6Nskr%u!bPcjt>aQ@a#{;Q(%=6*)O)b zs1VDE2(riRXhRPh^=Ckzdw93LzR%71liIiS$|(&Z+>`|79;XS6TyBk>LKJ1IL~c3m zAwCMN`^5JL`!*zN%$l>xpjCUVQ?KD4ZC3Iu0X2gU-ks=tPe(iQq4MN;cKy^B{DG$H zx2>CY?{M2dQ8cc)UK5UNCx6&S|E4!0Nzgry(JL{j`Pd0vGw9RJ{*Lf%O(`%2#W{7( z;!%vH%+^VoW?j0SR`aYB4t=zRV)pTrcsiNy>0NKym=3+QBIqK3Lnc`S+uh%J>Dt5! zW3i(ksVGc`V$4{~&JYjVjN6GIHs(}X)+24f&KfmmGMb@CJw|2SbIM25JU)roEU}CA zdXC}MS<&CRpUJaMDMJJWgz$#=gr@gI1tt2*B5Jh|q;j3H-oEEbH!qrlO=5c(5{S-d zC!t#~IqF?O0&p#uHFm!8M}f(q7B|<}&>0E+TZbzv&0vSg0YOD|^-29)nslkpY_IG* z|IAtw&6HTy*C?YxM*=APR)fnMsa0kXwIRx{R6Hw!5&N<=$^hIlrcD7W$DCaeLA0^6 zysT4%y8JoEj&6SUxRIwxEzeQh-{4^NV1~aB(vCeq*hyom0Pc9=i4_(Sv&T|rJSg#3 zu#)MuwyNw>kn)npE&>9d~4D!UIRt-8QV2W4cbN2dS) zu2nxMGATq3-oQ=|6y zD)g{<#DUiYNVvwK@z%ZnF8)`&zRob5Do@QIILIx?;8S2av6jB(e|s{mQgyeU0A?(I4cOCi#-DfBzh+&9ycd%3 zC{cgo&4S#?_V$;O)9Vs<$JnZ)NoWT~;n|l+STjE^4LDxAGNJCjyNd|Per)=E=h8C6 z#oJ;wHDjN8!|4V5_?aXbChWh*To*EEbJq5Xx<6=v($AwUb#+0x_Wg+^;UA~?j!g8a zRtn!3#p6E(aBA@dP!RLkJ9T?A)s%p$pwH+A+Qw8aYY+;QHKrAU9&PCDPU(-2T+b}R zBgGTIBslSyONw9r*a9dn#ZtqTV(~kZ5guEVl9Ezf+g8~)k_7J7vWiqLgtJiVa53E@ z<|5&VS=zxpJn#PL<~}Isul1I*h-f8`%f%q3$9V-Vb~?@ltdp(PM|%^k^r+@g`|(HJ z!5&JjRX+|ePZtyLtv3T_y#l>v3hSL)*rH;vATeB)URRfSasx_5qM%BlME&oEx(1Q$ zLy&s%j?)q@AB_ldlN4s8zX^3*J7+Y*7m_`5OEuv?=HxmiZC2_>U?_7DXu6P`V3wH zZos5yzHIWi4Etf%7vRlSACkn}r@ZF6vsJPn8u8x=Acm&GSoYZeViHt$_D|X8jPPzV z1_qLxrQg=Osm~spYXy5~TDdCtl{sXL9Ax6Q!=Zh@xvum0v&M00^h5u_oGH;Yg%#MZ zT>1kkyI7p?MU4d$&+6;x4x)qipLVb07pN-%jBi0+hK>HtT64wXo&i{8&7N0oXZ*e- z&0g*>I{htz&vhqQw-S-$Z~=I`=VEV1>i-p|7g*?%S#vj9w>yGQHJ>X3n(4X6V@tz# z0zFxxW5m&wA5qWv*2VgOU31#F*yebyqLL%?tAf8=*Jr6P4!OY3S_o$|INIi_$-zFA zcJGo-Duk!jn9!LuUUtbDsdr!zRi$jyvW7EZNUE%ANf^`&)de9Kia_kYb=gO;q$i4L zIHhD-lUk-eMv;a$u^#55TmecOwKUOSa&LAG%|_iR+3ihg2_q(q^FgG|Ar2;*Pf95d z-Jk|B8~E)`Q&0kPQYrPNa3%()h>$@C2eI_3>&XCfU6+Ks88)k_+KokC3rBI4=GNKd^#$xnaIk10Jr zS}X)aijB`B>s57$&5Th>nF?QPep#sDyEhRW9(x*B8GJb01yR4gw|P)QaT~NwRl+c0 zhiU7Ml=xNr_`qzgc_zFv;jUoSCosIJKbYCrNI3-O_03GBVxb;m>iQ_6wGdH76aZFi zo&NwD(yXZ(niDg14sGWD0C3koWSj4xQQk!#t#9AA?j=9$)-IA&wVPEPkFP!fPK4GeZ;%+X{N!&GXgCw7gV-i zFtYi8kVmIAt*FUyaVXmmR9=LdsE@Z&g^%}-@-=3AfJr&6;O>q(sVQh@%@gc79Q|t| zVTlN>dFBU!Sr=K|o|&sNAa(%NSASZ2wsTe8xTMNM8LA>_&T2DKP=xVKG-rxJdr|=l zVvW><@kmVoDIn7r(~dL8NxcyBUd;F?BtD?1UlyhA3lRF_!EfZ;)Ery&!L2kZa{{WVc^Ec*t zeihSbtXEgGB=P2o#)-K0ts56*x`mK{;nxK8&TBZ!T}>vEj)$dDn#GpsA%81;pvsyUDvw3V9gaVnz4sG=|*GxpTt%JI z!8uHF4iECI<)bMb&A3vh>5B1h5GY?6YRWkM^tk*+Yt1Re%n3O3;MM!H`?sS)$M&Lq5AvimbrX!j-%8{)Mdhoolx8;iS0}2j z39RIAOyw?zCbDiTV(Wry8sn`&xs`I;TOycWa%5AkhI3V5ljdY6+*J}*x_>T3e&MrG z%P}PLNvQCo)nt=&O5UQifz4NO%_-?rF6A!y&021iLVl*SF(6}5IjI=-sGg9~6I5i= znABwFibVkFkParAO&O-DGV@oYax> z!lE3Sl@8J~P|91I_AS7!hSjnLO>*{9kC!I5?BvLP9-^|X&lRg? zyQhsn{vlYlT=q9P%_uB8aZ9wCa0anF`v@7k=8?bPL+EMvrN(JoELLdG@XEvLYBT31 zdPqMbR@r|lg~r}N#VdgXSCd5Bk=TLNPb7XF>fNTXFuHd0OQ`|2_Q$nTlq+G5Rfk7j z2&xl1*-!SMxnJYJ;|Hn5RBB2)F<9>{^(bdhLty$E^DFy=i&?sOTYN%xDo3VsTK8Ax z3wODQmK+2L{9e_7s&920iLPvCRdn2^V}1Vs!`8hjRbf$k=55M59S)zWL*yuV6;Gix z$#}BpU3iW*jWUtK6MBs9;GVyZE2FT{B6RaiWqlGs%`E;MG22ZynqEalWQ`X9kTL*2 zrD-YA+nAWnY2L@V(M1(Tp+TaNjs-GU$2=dUVaRzktnvUGo$3ZT!VH^#1782xc(Mk}p+YN8wP$k3nITBDsB8KJ|34%C`_CsB*5Mg<u7+H_U5A2ks=#VOet=l50Z(0(dmT>r0+ZH1wck4^b1(T9wCIfc2y?O)#El%^~KH zz?{=bqd2DKkP1yD1k-bXXaRG^D5mG0w7KGt0LJQMjzL;>a6zPTl6@&LqfW(`0h;M7 zSnw;J(s3+he~l06T^*toBOuo;L%Np6-Kowiq0-|fV%XtDVA>{dKRW8P*u1+%Y;ykq zF|KK_tt|_|X+Y+MTMR z1pzghA(qWs?20z$agC1$>FGckr~o_;Pc*7n@ zBJ#r4R*vFWu#yJHJ#q9n$KzEE$dT-{QAK+N37U#m3b{QgcV)3ry8_(y=BR?6;>C+_ z0Po(j9kSJ>KPu0h99CO(pk*u5h>zB?%X3;9gJDOZHImKgS+bGRczaq%kJzpo3Qz9X z_CA%jdV=OA{_yQyaL?AZw67JVuv>jW{!zkAdwVyxy-A|bt*ToxvvFL_%w!YAdOiKT z7q-IU23AHH%AAVhZ|!!msW*!`d6xj1$YNIK%sqv47poi#nVn-Dw;sPr!Jc$2m>otB z1obsZ3QogC+0!lF`{Zkxa}+8@N^#fg-|+XW8#oxsWMh(YNj>Uon}d6*M;U$LM#Vm+ zuB1UBWdpTu6=RN0?2QNd9Ii(lD-vVZ`d32n`Fdsu`^-&qw+H7m$t&lYIi{0}T+$g7 zwOOj%gE^{?-hquL){N$wO&h94A*2-J(wWTwDW)2C^QM|WG@1ia8cG0p>5)$yu6?Q; z@lr;5k6J)k)2I7A{7z00j@J4b?ycj+dEZ9Gce)+V+cfyxoVxsv^%c)mbvmd^q0#B^ z`Ld*I{6`;!b?AXq0nl`;T@Ki!M&*>?{Hw?3TZ@D3TvB?GQdeTAr;ca?(9`gJDhz}I zo%m9B=ZcU4K!)`m^q9>^7v7vB&+!TXiy0J*K&iZ!1LX=&pfz4pbU!kY_)r5!IUVX3 zkGQD;?hQDAz>&eA3KLpII38djheuwbsLQ5H5Ia~fVS>Yqiq~}`kSJ0{cKpNpv?)?2m(WZ7tjX3523YBCiV2DPMN&%JZ{tcO40LMW|msA_i7Y}4;&w++kr zZ-9Reluvc8&JUTZOvAs;kLgg@5M_U*TXt0?TOf|cw~9t?OvO4@qje!7R+0LaXXo=Z z9Qt+EofAztImQrYJoi6^be7vqy!cYvhT2Q}1$d#f;5kAF-^os;r<%#~@;v7csSE5!-}3agLS8+#i_NU*ZSr&2iJ8 zoYER0ewJwQn@da`1gMxo5%ui?g}yP+Ev1RF45v04hzG>a^q-JoTwJ5ymUd zXf8w}jQdl>TSo?*4>%wib{E_lECL9ajDig(mc#geDv?7jFnBcZ#C778gjd==l;D`@ zQ<4bDsQ6)#z&*tO!CVNsR!#xjBfjRht8f`e|dUS zUfI{?LLGg&(_TCu?zJMj#CYlL(vS__bB^P&6vj|__aGzj#% zj&cMJdu=r)c&e9j;@$q0?I9FH0h}DvP4j24?@_CDrQPz=0y)kQW2IAL%~`lVyZmaI zH7pFhO#bwJD<#coYKQmB{_SN*YZhpTC2lL5)uj3GD}Giy*E6fW7|@Dh*hWpH>mp2^ zXd4|6o`$x~+z$ey$01-jCIWN%Q*22Zb-zErDpJ|{(sN*Oc)aQXT7Wsj+@ns;jE z6Wm=>OG&1AqQ>HLk4k=zJBN5&5szQWpFFO1N}QG9hqXa9<3gpQ0I?l=)`n(Azc@Ef zAE7-fnV5prt$MGynX{5>8hq~jYFTJNa=5DUaNkOq4?NUUj2!dLA%Yx?Q)T2*M0xtt zq`(vmrrqh4BaUh#)}&*BrOtbjed(E_IG_bSl+#F0=SWW!fNdc>Qqp6Z00F0Gy*CuN zqy(|P(hqL+uc6%wFA!=xWJ3hdoDnV@4bQ0If>FbJAoxQnPO# z_YGGroGK4E&JRKw9^|$L1cg8 zUvJO+vmeT(El}F=WdO%W$MUDQ(zAP)(6pP93wI|1NmzYGG5$3|?gJIur(x6Hu1r~U z>rzGlV#+;vrfLXXVU!R_OgGlM;qar1Tbc4OiCB(7?Nvxt83T@SM6zeA9Q#yRDufQ5 zMNuUy_?6<59F#nL2+01m%iIpW+}B@r13@t9xmWZCxhZh@$9k4hD}#^@X_AuEqlLzL z98g9@BFNK%D07oTQwh&{Kr%to)}e2`Q@*$&<~@b1t5(v z_fc2!0;FDYKS~cQPaK@mj-Z~Ez|kN;?tYYPJ$uxEdhTyp{X$ULO(y$S*&q|8~A9|gEJ+o02 zIqn4(5W}2gjMGRt>x!7K98)$E)KOubt<2&;ykL$9_pHm;{n+}|ha@gZ)YZxJWAxiu zB=OB;*|bO{;2Pz1i7@9KPXqjGp}n{fq35?X%iZRA2|fP+K|*ENu^zo~6i9+7@TvgL zdww*H;v1v?04(DCkNDPGz}d)rel-!dfBEWvI?*H@4@8P*z3|?jaOf49Gt;LGMreTj zqTEO6(ACQeaK0DP;p)N#U{9}8{OdP&+3rC87Cd6QU6HiyKYNvo|J%c9mE1@lXV!R&eNJ4?i7YZb4F=c8f739 zk?YMNpqdQ;CV8aI1m=@80N{D24rzj%4lzhXpx^*2w)kVEokPYDPEI4TLvY;nKXpgu ze@fyLlU?V++pn|u&fNjR&kT_sdhxgq{C2XQ!e_XFxBmduPuiq^g+Fl5Ow!;mJ#yRKkr#KZ06<$f=mB3bI1mJT`X%r0OBBN;rNT}LO zaYexD=Wd@$&AXEuN3C7EeXsadP16w~>D{nr}@Q~C@O*SjjIs7W{f=qT47-Yw#T9E8@ zmgjDbrzklqZlkSdUpB_`agm>!*wxEo%cNQ>5x7J@4^Pt-ov2I|at~3?I@hBek1}b- zO*1NON*9=;@DB$bmCek-W^kPW;QLkU(6X^RaD9$HTF#jX`@H>lG|3+{`G98x)eP=a z>q_oe732}v)N7xh?@5%3vVHSTjN^()$L|dy90O7^8=k#txNd62!41t*JQ|UbzapXx zLH4Hy=LVYNoc5$J-JU6pMsR3jkw6KWLVf8oM`{3CLB$<=Q9uitaHeLC^n^^U&MUb1 zVGy6kRsp&q$siu#4nLi6syNR|?S2_uM{VP~11yOey2%(W*c+J$11GsPoYsP8(CC9; zKGeH$?@d-bj=r>pP(O?Et};dE&{B`P&Q3U}_h+Vlw5oX{oX`MV4uYd%$GE8q`qK^v z-J}CT@yR))%_!^1q-Obm82ZuyrzbezP_4loaX|%!4@!?4NF%iaBX&IGjQUh3By`BD zL>!!Bnu(X?>&+pRxa1DB!f-IvB!_P~=jl!PSQbKQ=jEqUM6f^!OvLu1ozEj;T1sn3GQnqbiz6hH=Fe3pnZ7hSr>D8g!9E3oNn5Lj!6p4N{>!!I$NS8D%cq6MS81a$*m_Ul5e?Q zVaWp+&tF=jCUe&&u1etY&6PRiRT-T|Fk69+Xfs85TO$Ml2dzW6bBv7ooYSOlZYr}d zsbwK$+ReL)g@_r(DI9_^P`?eF)Ut;^KA)XebpxEzu_B`^+zHzqhcyea`cs2t z6qArwtudeE=bRq&z>V|Xq*56{&pqiR#@>ghsMO*@4*>K2e@a6hO0QE;w45D^FnXF& zJ0Hf4xXO-3C;=789QWiJiNku-oi^ZbC}GqC^q>l@80typqrmA?xEumA+|*8h`g2GR F|Ji@uq;miO literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/105f8f8e-ccd6-45a0-b22a-e314930bc13e.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/105f8f8e-ccd6-45a0-b22a-e314930bc13e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c294e1bff477a22b3c9a42cd1f976adb75f88b0 GIT binary patch literal 34976 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/116292ef-5947-4d6c-a479-630ebb8a1050.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/116292ef-5947-4d6c-a479-630ebb8a1050.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afe6b91e5c39724fa43314ebb24f7022200e0a4d GIT binary patch literal 43737 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/249c5023-6106-447a-84ac-17eb4713731b.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/249c5023-6106-447a-84ac-17eb4713731b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16df26ac0956807e56b202eb2c9747b582cb5616 GIT binary patch literal 19894 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/25bb4c45-e40b-482c-b588-04db60b7e450.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/four/25bb4c45-e40b-482c-b588-04db60b7e450.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d19f69c43daa90c548da71e5c9a27d65742ceb9 GIT binary patch literal 30511 zcmbSyWl$YK*XFZyetBe05TF17zq&>3LEL zHaK_?0wNL^83pytYlnun06ZKB1djkhL_|P%?d|jW9zeiC#HQj9N5WAz0aH8SLIUD* zk!d7qe&cEUJ*DL|bq+*9#U~&nBBpys&%nsU#m&RZ$1fl$B`qT>C$FHXr47~5)zddK zx3ILbwy||_b#wRd^nwL_4Gswn3y(-hOiE5kO-s+n%P%M_DlRE4tF5bVXl!b3Y5mjH z-P7CGKQK5kIW;{qJ2$_uw!X2swY{^uw|{niad~xpb9;CHA6#$%=)YmTKK~oo|A7nZ z6&E}L0tf;8A6#(o9MtKXX^YH6`z)C zjqdC}(EbbA{~fTv|1V_!3)uh0wE&=j;9iXf!U9Br^|KTVEgqQpbs?u*M<)_fQMxOe z@j2o18Isz4MB~@&q!_!j1GCiOWW`m751Cq~dV1BEB7Z8FacL&vwO9w6A1d#O0W;UYTc6 znr1Ol@%f+E4l?3;wE{6Pt8CDIY&Kjq1j$=F&;&Ba|@SY2EAh)z*cj(2LDD1TRbwX8(I}_5HTTUc;04eJlx5D;NbDTJmduZ3BNZg| zjX|XSUt@1tW4E-%D@ZFFH=efn%b~L_L+lF?xhnFPIZ(=4%Q$-=6K%T+z2Buikg0Bn zwXnOoCs=Ks)LDGfPoOb=xt56j+fWo*0&ER-!IKHCdem~ zZuIHfva}_Hyz<@jp7x=bx7bRwZISk?Ekapu@!H~~Aq z5jIIopKzBe;q_S`!P-k&b>-v3eu8qA`X^r$M%xDnGt%wUt@{8 zU=uMET00l|bT`)=jIbcSaz}X^)UY)cXCHwnF=-|wCJgVXnE_n;MOpfGc!or5qtQ{K zu;l6-@2La!xHT$MpE8cOsp^>=e=5G#3;V0NO~^iD2hOH?2Dg1w})rmki7gN%_bed27|(I6nx+1AdT zLxJ&3e`sqgaC-?q1rlJGeKaq;(88c4*wycujl zy2n(-FUxuVCL*v)v{@BT_!IXJLaG*hN&@kdWA>0iD@8Fpa@u-{l*Si|sAYyfhJUJ} zUtk~t;*N4{=Nn_k(`tbCmFQ@d*Bb=yW4gsdfoVH0p1P&?DHidO@W+6f>P2y+Yx2#~ z2O8cS{vzsb1i4st<+z*;Vcn@}`tJ^vkCH(r${D))%f=B>Z?e305k*j_f_XxhZ;8!g zBPb_=?PF|i#0DUegb%-xyh?^E@WRO>yb6Y}=g@w}$b%A&2UXAf`3~>Q$mU1vv<1K z*0<$B>BhgRfpw8OX5n0j!R{P-uOs={*{X>ErHMX-JULcK!aCyl!_)}RRmCx?{0-q+ zUvayHhrkvI$q>r~DN~?t(jA;c$w;c%xI6Byp6SZ6CJ+& zUhszJkqATBMbnUq&+VbB5>7--&tFs@L1dq0F&sCuc<}LxEcUYGs8XuTXf7C!MKkOh zhIU+Z1?Sw9CT}WHlRVPWW>d+L7z%0ph JUiybiJaI4ngig}>tj=$_GymYk~PY; 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00b85ea4-8c5d-4302-b847-0a5de1d7dab2.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00b85ea4-8c5d-4302-b847-0a5de1d7dab2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a35d80cc70e2e3d4695c95d6d5d0f53c83fd86b8 GIT binary patch literal 34354 zcmbT7Wl$Z#*XA$o&P6X0+})iJ+}#Nh1dX`#Dda{=4#b3xKU4BQFDhfdK$u{vCk7YXB(#G9n@pA_6iJ5)uju zGAcSg209uVIx#LD7CspX1vwcB2t-N4Mo&q_LJa~j@H4V-aPsi*P|ypC3UGa8AcmzZwWE51ie+`XWpLtem`prk1vjuAaVu z#TQE}Ya6hwo4bdnm$#2^Xjpi}x5)2NNy#axY3Uh1AO(d*#U-U>nth( z4bL|1)ql|bi|qdnEad--?0`()>s!&F?{6ux&0G#XZQ))0T&Hkb(&gnmY*A^B^uc2vQaf{}!bL zQC|2_>|DF!BB%U8pad@`1%{HEr)a@~=Y$RJ24XbNohais10Qq{bEO_SDa?}z^Xri3 z%RweY4UBFyV>p)y`54IL1@mhc|3^s@Bg{bp)-;q3+;))8lZl3j7y|AREZUISCF_82 zM>$H<`OUx{B+QYBHHHl7_26%LUn(JG%?IC>6K#j8YCdVXZ>^jwp$H6;FU{tTK){9c_=W&r|O3g{#j?*J*$|TL2l>b5gsEXt0)IDhE~j-bgE1U7h}-wT;>|S zRl>qL60EGR(epf`o5~KE4EV=E%>AXpmI%Ly#zBVATxhbK#b}`*{>0ot>X5L=oK-@W zdaeOHn_HC1ue@1^7XZKQq2v&X4>)_^K~;L^@yJ6cDw^i;D%i#HMWTulvWgB)!V;M; zk1JMY5Wo-e7A=-+5CEsjd7OWvQbV165M7xSPDVrfNS4vXlE=tqB+>?~#60pev2g#mb zH;4tHCs<08k>71D0aqhb2}3~{@SlDsL-B*um(n0&jg13rHV;L`Qv!Ji_=Qj&jkrd1 z6E{VPXN}!1O5AjO3y8^M9^y`@%B2hgOrsmbz{n~HFRyrzXpr5&l>byd?si9@7&eG> zM#Ca1fYAlQg2)D8aoHRu;c^DH~!cK;kWSN0evH z6DBT}QUGCe+YF+aBrch|k{)7X7-GOjPnHNtiBj+Y@Mo#VF>ZhvU>MyX$UNpjm?@h@ z^V7DDTsDAn1uPzf*At1bzW|i!xeN?4u!|~oo4E74)|C_e0|w=XV?|9;uM5V$jmRn4 zLkZwt0IE1@J*(k@RTj(WJNsN}PX!{Qw6P(@edcvJLdai0^S^(dSn5;-SkSEaHYBd8 zN&wzK+F7U$npkzYRBSwG9BfovkbRoV*is)KKw$eqz%_D^@_{rylytUvtwy2U>mzq?-ZG4U?i8#h(9;bEl|*-2DPN`g zm_EFvzbwzw@R&XU<%3f%xNp#(=8Y+gqO6B9ez*_D$ zW!7D(!8#9aRfXK}XBU-@=zR^rbG4yP1UN{>Nt9paMQ?3?{y_pclR#>W0-`sNYUnTq zv^0P!Sc(N@2!5Ggg4+mswQ0qGzb{3f?+g-;48Y%y@rAH`5YJ`+GQ|49sjPJ8Lh1T7 zKpML%2gR%;ar#KR3YM`xY@FwcKQIT(=05=a$|4s?1mgZ=j^P@i*H7Uc-9%8~wV~IJ4_) zj%K3c=Q$omqH!RFrkMo;hT%(bB@gRno+qVqX*U=uJ?1`V{Hsq4Z2qdu$?L!` z@bXDK+@gQm$^%iC<^g^&cTnG()~eg1CY}0X8gNJl znKkM`9A?XVDC@w~vLSP&TGQC5S3#6J)s!!nCkd(ja5s9a-|H}7ZkmVpdR%8PN=auW z?3M*5y>b?dQ>ncF6cbr_sr`8XkFf82*paC@pC&*uR+V{0$7;vWn+UF~WO&S7-8R`M zbbm5LC`1ql5=t3dn`|?S-yUKX8r!Bczu@fXvK7HzmoZ{PL%$#cBP8O_Z=_GS$*J9b zDBsyC5;L0G9~mVct(Y+$bZX~Nq SS6}1@v?N{aGO?8Vi7}NA%6GIZXqdUoo^j^ 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00c84257-800d-4032-9e64-e47eb97005f5.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/00c84257-800d-4032-9e64-e47eb97005f5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9369aa3c4a233b041766c18a5acb12146a9cab0 GIT binary patch literal 21645 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 Maz44G%ob<=*$ghg(EtDd literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a038096-c14f-46ac-9155-980161ebc440.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a038096-c14f-46ac-9155-980161ebc440.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1353372b4c04a34b262ec291ff973a45216b517 GIT binary patch literal 20101 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 T^94MbDk&Fn85yFJOb`Fr#^-`* literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a0ef3d2-2560-4a93-904d-437189fffbf2.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a0ef3d2-2560-4a93-904d-437189fffbf2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9d12aa6417583795af5b2373ba1ab98b22f353e GIT binary patch literal 17630 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a272153-56c7-42d5-a17d-cd307a1cd6d4.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a272153-56c7-42d5-a17d-cd307a1cd6d4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..890cde282cbe47cddbd3990780b18d04f98911f4 GIT binary patch literal 24644 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 XAQWIy86GoE2zyhu;8T#|fIt7)n62cx literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a4a8907-1950-4e43-9a03-1740e78224ef.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a4a8907-1950-4e43-9a03-1740e78224ef.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89caba678a18db415eb98c4dd67b3a712e4b3a77 GIT binary patch literal 40961 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 aMd8D7T@3MV7$AKsK3jYo0Y_4kKmXaqK{)0B literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a4bc2da-f5b3-48cd-8f0d-c61dbd08ba53.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a4bc2da-f5b3-48cd-8f0d-c61dbd08ba53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9a98c9880ce8c31929c9e3488ce2589c4bedae9 GIT binary patch literal 24951 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 RLJ-q)=|l9U14YJv|Jf-=l7|2Q literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a71a6e8-bb06-4ed0-a60b-c2a602fce261.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/none/0a71a6e8-bb06-4ed0-a60b-c2a602fce261.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae297e6eb71bc1cb4c386c3808a0d3161c6b48dc GIT binary patch literal 30422 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 Ur7lM~9YsgG1DXSVREClN*}*&8d;kCd literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/026fd791-8f64-4fae-8cb0-0e01dc4362ce.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/026fd791-8f64-4fae-8cb0-0e01dc4362ce.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17e7b9d4c0b0378ffc1510425325121e41e28afe GIT binary patch literal 18088 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/055f8be9-f7fd-4c7f-ad3f-7b404b6489c3.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/055f8be9-f7fd-4c7f-ad3f-7b404b6489c3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2e4133f8dede4c9f1015cbad96f2910d00fa845 GIT binary patch literal 19723 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/10eacf4b-8aaf-46d9-be21-7fb8d8353005.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/10eacf4b-8aaf-46d9-be21-7fb8d8353005.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55a470cec4db6e172bb7b468b61898b8324391fd GIT binary patch literal 43644 zcmbTdbx>SS6ec>jL$Czb2?R@U3oy6_hr!+5B@jGlU~mZT&ftR+Ah_Eg!GgO5cb4Do z)^64N>%G^v?!8sFySnyM^#0rE!Bm_DDB0d5VKEg{cfckZu zCb* zCRj^bN7u~U!qUpx#@5Z+k>l2kn0%`+o;4`2QEO{{!s*;#ve?BO$yB4+$Rt0_^sxIv5+rBtx`` zDAF50x)N&}xlZ%b;A|=zbU&&>tttFA0FMyy= zw^{;8uqG?Fh7TiTMW{`L7eM-5%tcK|N-k z(sSKouKTX$Vr=bEJ+(zG^H=!x^e`}2*e(s6HW&#N?&s&9t2ueMQdfzzkp^xSmDJ*ttid6QqP$MIISnE#GE&=pTNm1s`Cj4Hnc zyiF0a%#7Gz)2g1C(AF4z(crT+D+}G$`<}qf=!W84P%3;T_(saz!4Al~s)s0Q)DgY4 zncmkV9l5JL#ESWff1PVGAp7dDUrU#gSt|xo{N`K4#k_TSdU;MQ$0Z$fiC`|CqhB6r zKt4oWe?jh6D@)O$jWhWP!r$mDVWnm=1F0-2Kw7meb+VkeYZmRs|j31V@ z2G`0!BpcI^9dZBgl6AF#3IiQ|AeW>9X9|wJTby84N&2ktM@0xM59b9iUp~Erl+AxB z6jfxifzEj6RT$okhAomim*nOA#kq>lhYAOg>wOJc@|}NXR0%5{$q=dPvX-<8S>$nu zc{*S>zsW|_@yFqz7JaCSGqY)%cWF^JzqC$ZkxPPx>oQPc$0SGTN?h;Sk)B+p+Nbo~ zRZb{JcWk0oj=+}h26a)wQM`r}`56|Ak_YGBYPPg&P6csY8s$Q{X_t^)PSpd6URB*4 zF>ltoFk+gfw!G={SE3VmaYC&_ZRD4DET%HiLX%LCyvuTm>q$GP$V8UQi?R5^04ut} zF97ORM|~No{9tuAUwXsE<6fDu2RNYc*IdC5ePjuq!po>wlF78_Eb_Wt%*E{?4mJEP zJJDiji>#iV>}l_~lSU9qdR0l9s`lB&aED-e>1PE0Vh>cKBmJ`uQ8~_^p-W;QSs!!+ z8Bx-05 zhk>Vzc1+{W;0CsWgs;S+#y(q+m|g=tNJf;MxiO#1; zK0D)oZ)(Nl+#)LM3X;&bXKR4C7!>v}cN*>4MeG~4|6&kZ@RpWJ)wIBwNLi-Zj5?9v z>_G=FW&b=i{JIvub6Cu~XX5XBT`g^m-FTKS`>uq>7tG}o;nDB{u#Qe>Gf*OR%hV98 z+_xziabaAJHhyTKQ!5wS!_%#o zwPE6^(H?R52x3;*tLGBg2D)}iNY(gyUvpS){i7YCxE!;=*KRG0q1+wp{TAF>CI|N< zn@Q^b{{AXU)lc`SudjJ- ze=c4(h={}$@yKw%w->-E^{#=$(?qWp>+;~h@_Z57=$H`>&f-&bE#oE69-BUOsFvWR z$nd~r)!nVS{;U^Qe2&1#jKrItW3nSHdraqZ?>IU0ryLvB#$1q`giw)aFeMBlH1MOr z9&_O~?p_Y(OHYu?1NEe=sXg(0`O%GN1;*i#^y$Vr1qDw4f^fNS4CUp+;7`6Z zLMyb%+2Su{MZ~~#v&_VWd=!3uCAqFbdScxT)3Wamvq@&2^sUp|I;?bCR!(1Lhc6Vy zJRcN7lv3tQF6hI+`oUr^fWz4eP{awk-r<{`w%-d+c(?PeA+mi?rN>!HeaC6Xfl9^4 z^2W3czfW4GDHrTB9j@_qO~}P6PxD#4(m?NrmrA9q2yCs1WeA!mC}5WN5kqBxpFTvz zpvvJr^$}UKr7ZV$+PS7yre*+4XLV_4o1f9}DZBOuF4xR-y{7xu~V0NM~A=*K*!0e>r9^HWkZ zu6kH@g69K%^nqqn?GU9R?{@<9IEALsMLvi999!L?6KgrN`-$I`_$vRYR|P}Mfg}0= zoQJVCGeM&tFi4kWQ@OMf2Vj;P;6bg$Pq18UF)l!xS*>?p@G_zgr=Z{$eiDJrm5Hk; zW_+m9%TlfK)wVZC+zW0c)IX^ooAJ6su?oG7*6B5Bbh4PJ0?8kIW8?^z`DHTiJ+Q40 z+t|5ReV%pCeuv_II4c}sa_3%E#*(ivcix`38Gjn}=b)wXfgdq$fVMTx*RnxbLWiA` zuOdM+h_qkoL#c5XKm8xl;jNtB^h~g_o49X4=dEV6#@iRbwMn zy!#(dC?x=*Vy6ZaE!`ywk09Omr}{Hqmg>xy(iCa}y-5Y>#H;}txho)vHH~E^BEHR{7+)Uelmld@&{J(oF48^aI2|4wWVZg`I*`IC+r+?P?lBD zc~p3dAGVF$vdk9>&9C&!%*z##Mo*hxuyl@eEx~Q}$7aRM5M4Q9nJwGenRWPf6qfZI zOC(qLLq*pbb@c_5njqS`@goLy6YlFQ3k-Q;CZ0KEd^>-A_NJeQ6JdtF0NZ^Rl;&N!X;fryMA#I8p%atem+(=>K>T|Ef zQ82=KbH-gN)T>s>F1?DU;zN}TA1jqHJr~zFif}v}7yKvN)cDRNP2D;ULYj(pQMFe> z^5-XCnc>8f$*Z_u0L%;2?tUzEqy7(Ppkdg+3blM_4JTHpek5at-~-BjUzB@OKw-l;5XC^W`)Z=zMbI9c^$G-)pd%_i;D9DV&knmOUU% zd?=aDikg4RK1O1SZnjJY{g_5~L5_C4XQ$_Zm7Mzm&;jE}P^d|L1d6wNmBqMeEEj4t zHxP0dJNKH_tleTY<~-KFP6=KYEg+7x)6HSgB<>+gChlguKI|}{WL)NE%>9{I?cQMq(YdZl>|RT6 zA>q6%;B)>k-ZM8AU}fz09qu8-EG?Lhqb7<9p#HR{Ed93se^k`xB~@mG{O7_Gcn6 z3p!b@=G&|C2!8?5YKg0hhO7Gk>gv98jt{p1cfY)ORCB0|+ zoK7UHUIEM}s&y^n$~LpVLhj~LSOiD?PJ8a=Qf=S<_KlaD^>0YXc4nosbufT|*cEi8 zV1Op3tfn~Uif2D(8r{!g`OiyFRyf8?YLu=hd2%?@)a!mmw9FChUgF7C2yBt|4158^ z5!YU}g6tuwaUuqt(2)t^|FH-GH zc94X;;7*Ic%6eO>9Wm{M1msFcuwz*pr6=|})cUM$g@e-e;@z&!q9$yaP#-I4F{UAp zz>)HnDyu?7nfQIi0LAr@L_f7Fwf?J*VF>&8G1aZB8Nc?Jk(dICK0c2RzOCon3f9Ev z-)sm(+i}xrBurALfar8n;JW0LINF{@Bpz#_|6>PzFn1XoJWlTkEqaHazcgIuxXH+z zU8s3UCfKHYduuds2W|*BnBQZeoB5GUbyZ7!Uvv-VSRln2!opz8EjO7BN7fvfdX9Pl z$oG%4Fvqn~D8MyoS*pctnVjS^>$ZH!hSV+C6mJ9IQ2se0Du$W7q{S7bn!#pzFTf6L zqa}D@bqQHJdNn|EX4C#@Q0Nzk(7YuWK? z|Ev6bSJl)#NG|&eIbcKzR0M{%lltur@w5#v*Rn;g%~gl7I{hTd@t&e-0A4Vs^=aa;|*7B4z-2iyqm^)^=9J-X`nc ze`h@3sq7wQwiTB0vbmw3V|dnRRBRpRI>>zvZdD9zCJlN{4oAC>*SiQPcPcU#3nHZo zD>~s;X`$Z7Q#I=>l5?XI9vuwl1R5HX94_5WSK_g%p5Afh2yS+mFY2X8+e^0<{$1$d zER2^UPce38$9R@*(fP(xR?q+a{X)c%h{9IYXR~Uk&)ZlB;+9P5<_lu4oKv%)d(A;s zw&UWjCgPPxIxTCN_)j+FQ}VxScYKJUVw?EKeWP;fm%Wf$Bk*o9+fgI$Hl^&-hBwn$TC>roMKlx zLZIY3SN^7!Ll{jL>cZ+^dh;gPAvf9Hi#V}hOvEmoIbF9Ox5&!-exx}vrj0XhVQ>)2 zyQ>O14UmVT!dR5djEh|2voVOd2_mZ=yEvM6iKj%utXuz1S15VYFG6`VnuYz7V-&*) zK}1$WF?7}H8Yhl=B&xAKeNv6qwgb$p0+s;W!t`Q~rMInbrxbRE-F~}M$GDPJ$hrB@ zU&x9EW@a-jDkh~YW@0Ze?`h-jL#~!atkbSOQ*In>Xv53T5q8rvu>ojEixqkvPDQ%J zKS*f@gBrIoDa___n{@JP0vZA;?=lk89s0{`EOUM(p+4_z&6)f|Z)?``Hu){Es1wT% zbtoEI9<_FSpVk<-4v|)tpQ>+4z`t-G5IB&lV9t{!0tlD&1NUM}hP_e_8PdIydl{W!X&#>8ae|>}m1I#-h7DkXkq87)ey_cua!JNka@_&5v0- zkoDCc_MV~pB26kSx5qT*MDs1Ri?&9jBr3HQP1&^#x^1LEe_5Wc=Qv{wI{I`@oZI6( z0JXHOIYZNkO0In)Qf1vm}jc8BwRONQ+M3oW*8A^Q& zOnL9?fD~{T{>%u5z1vWdfZ}cn{lw7&(1)yg`%GgW-Dl*E?S|EM1r?U9l zw9!*zSr2DI*KB{L${Fbi$3ESrl2M${%QwBhGQZM9@1Jwa0Xf=YBi(D)AnILxzklZN zD&7RVpFR}o`S7ashk9ONJf7v6lld>Pc#q|$wW`CZi=1e}GtkR+!s+EhP^~grxmK3roz)gBouSx6m4zppqY737(77=~c zl#p&s_j4RFckNP$&sLVuYS)5!q)AXX!bt9S>Mrr_aR0oLePWL>?oV+tg{&i}=HHH0 z$C<6KuylSMRpdzYskKq>xxN6}^q2HMw7wx0pr^SmQi`@BulWpLVr6Zs!=oT8<7w5| zSL+Q;)0Df56`Fq+;N@aF$;~B5S(0~CA?V-a=f%9JOq0O$YB?vAb=AT@0RK>UF^*jT z(EShHCNWoL1U`K2S5!?@X!80Sn^8KU+}~iYQITtwz?BK6nj;o@YxAM`#HPd27CESU zfVl7~t@KR!q2W*Z@@VnT9x59+?8D^F6*}J`9-`k)gz-IDhGKG99tFzOEPjiTZV7aF zsBBzg^FzhG`ZqzYvcwm_mx;@&@UwXMfkiuS{0SyWZP%De!t;h(Sfcf%A+v$#^D$aW z<%ste$CI&yfpaL+Z=t3dVi+Hb>v6C%+Id-nt9eII#DMy}`gUD&TYH=oRww_OiyoO# z_(@)tWm-G{ZTrBM@vH&kK(A;o{OmP|iIf>j;gQkDOsOsZpkmZC-CSz2JzC`;SXMzx z@Jw!j0NFv#s*q1FOeJ^|Su1)7pQD>SM7U_Vu39`(DO}_TZjT{>rXQTofs@0N8O}i+ z1M+jt`p1;z(BK`(0X5t0f%`6Dgeu@tP_ps{e(0Kux{zKN^k3)^0L-cG3tq?XHaXRw$;H#4^nDH@>;@V zDL<=@7gR72NsaQ>kXpr?DG4}UC3|hWGx@?-OA;}TQK*&^t{EeVtwA(h@rv;dP#G-B?6FqYhCNZ*QIBk#lH6= zxh&TT@dpr<*P&b(VXW%wd-r_d8a=`;G|ooVxZXFcnFH5hceG31A9p{o$VuV5CVm-u zZX8}0o#Kl0#6xpDien?mQ^U{&Zsw^q1kDZ*1uonNEn6%bz%4`DFE` zxy%DIuyT`s?Yb;QGN5(s3CCPtdaAX8nF*;dz^mH!JAt5jM*|l5C75nmKF3pceEoI+uI{P+PG=Bl0!R)%}_wy0jDST}tO zv8*?EyhjzXgYjM!0}s}M7SiXjrD4z2O-fu|b)Q=sN*JTGy3NLUO1jWfjHf%Cp_ER_ zH)P)(F1=)sT*=YL!O>r;z1F-~s(i7@Q|2-ocrJ|^b+O`VSK&*dD#ec`7i{11>q-+!8P z>7VU-D5}bbzYbON;VHSKl<@A>tg(YZ8lK+Gdxhi_f z?&zg8sHc&-w8(FnTSZ5O$yh}HoGNrEO2U1H$J=jv^iwZt0kZw|{WZ;crrNzYzZ{H^ zL_hW#YsoyNk+1Z*n#8)On6C`2K!Phf3e{-kq_;pllbXYo4kp?VVIf$StqV!7e@8oz00>8I(p%EuKP{eMGNHj-G`8aNVR<`x8 z6|xD~erqf`KDAmC^I3{MyP$o9w>2U=;3I#Aqw?soMta4>wc_Mp7X;m~xc0a@g@W6~ zm}0ATXh4?->yP!q2;e-cyqra0nyB%*I}faF(8W9`9cqKGbB5D8w(xu={Tk}a zJ|~y8ct`bigzBl7u4b{g5hwd__+IHovZO$?`aghb)sX;SItS;`YHGVkdGv#e0uncR`qrH3R@#fkeWSgS?YQW;P zSnJA0sC|woOcs0y^?wcxCs*1jVJa@qzH2;w0kCmgk(5N@KOdIell5{hZfXyCNJE16 zMsy>d?q8Q3jRUQrC{86Gh^^qE+Kv`Gtl{m4$3L1}F$1I(Y_B93F7#?6uW@4sbQ5ZE zaIU{}s5VB~1GFvoM57_RJk^!bS4>yy1|nmia?PY0^VlB$SXyj(7!Az4U(-}ooBcUu zLfj5>fJS@t(aVr;2{PSBP1d~tVl^HEvc704tKh9G#Gj<`aU!dhl4}42OnHWek} z(Pd9Czd$j*jt?RFr8Tk_2dAT>XNvm7O@*ZFmUFz^3qXJCIjq)Q*9Uj2CU!Nd#x^J0 z^m96?Mo=dE<^@rRTEx?~$^BeB7;IiQqQR#4V2(E}D$=g@HR7)a{0T?pJ3|Yb{;o#O z!7Cl7)a{e0g;O=*!du2)Bf*5W!`v3Glw8P=SAlv|C3((Cp9JLP?-QK!f_TIY4)@$P zxw5c~!4=`)bG^DDE(et^h+Q$9+s;m46N4jJKBkLGY!j4arlw?gF2!UxC+%NEKSJak z{{t6oEEDexYA5&ZNR^l4JkXhi%>mFVP5WK%moXlV2H*3iW*D_aQ*BcSMdnug{_UKz zlAWrw+JpRnr2n2h1yv^4vY<-GCV|y$@Jsluih0nf{_$x9PuVp_@tRluQkYGWb| z!RU6j#N@dmkCYKu&wjpr4qI#0p<}YS$!e7_Pa^76=$&J0gVoXeC)Tg1;+s!KO>@mS zXut1MI=&J&ygjGu)X~A6rGlO6;)dF-uQ0P=JHOlUc7%_}q0XBE!7K6SM7)}pVA zmV-d!MKtVpfgn}6bi>)aNJ9h8;WbkQ_uZMOb*Jf718EZzss-Z4kjyPeaVvkETS!Qq zX~rJ4Fk&ka89Oi@g7cd69W5D=?q{!(zeqw>O1)&m78ec$1D!&(9;`9;XsuY3FKneW*cYDkQI%2v#vI7kb%@+l6(xPBA#;8N{ zppjY<0f9rEbqZIFP54}CJUTW19!u<-Cs<2-q4{R5=7!57Lq4-_FpGr1UI4wKQ@~tv z7Rpq5`9wK0`_pKE`V+IrENTbqwU2jul=lXN{-Q$C$Ws<6Z=<~OKDP#Pm0O>JLFjFf zl-JKS87qJKotjx1XC?i^HU;|uuI*G?l*GfKxsy+?qP%6a?4redinLc>qgZU$g9=Z^ z8y8?T#$^ic7k|^LG4zF&bb$n(82Rs;RKXQ+_LU_ikcSJ_D@nQrzYK)ezS;`S`}8{I zj#%D;1KX|&poAfPsrJ}YfxD=h(C%KqBG2(ak+YX4@2MB>o)&}j5QP_XuP1#Cg1j`^ zVd^xT7R+xfGuIYUsE6Nwbx#&~sp-_l_jK6;?MR9eGy-JaYNDBN=S;U^IOHX!Mq*qo z>7PU;?B5Hy6daF2oI5^)!>^+^%fRx2)}7n&}{{} zjZ6%?oZ~8AmNj?PqvbwZ#OsqiuWs(q(F^d9}oB9ER4;uvQgn$UMj=vyG$TxPbW*8sz4J zQ%5O>HmOBXJdB9`eatd*j7HF@@xxdeb6Lf2c<1Hy=8Lurg>UoKIEUtY4>JdD`wreh zIuZ4M2&`O+`oTUe~j$uvY0Nd{EZo?K}^`xXm7$aR`Ate>k=gs7nT!dnf{V* zAS8RBM?>(gb2`&(IJ)p;Tzpd|isg?7Rw^g4>b7J7z>{Kj@F?XjMS&k+eY?^Gq|RvB zp9&CM`YwCosh3|R!|IhS=<5QON=kTR5nluP-iWrvT;OZV1oOjpv$&ntk;qWU)#CTn zeuBp_e}!b|VYIYyoQ)*t!i?l^A?6&jJ*|;?ZX=_wc}N4M>K}dA{qn6rm6ZydYWqAipkdGRdMtc~>Foiw1TL zZPdY7eshe4_yThe%|H3;8raW=(y}0(f%5TPFITi%>m4DbLxp|llWk)4^RjH z3EZ^|@#xGo>=!^}scDV(?yALVwk|FB)g0DNY_?rOG3Dhe!$w&YF}^G&8Z9l2Cdjoe zZIfzVZWd`ZOeQs@{b7Nm(9p3L5mm{`e~mthNYS>B8Oba^K#di2aT0dh@mFm-I$qYs4i-nE;5} z_zA~qq#%vKOD9YxvYV16B&0t*fkHO!)j2?5d90Y7CgK2wo{@?@_5lynZzYW>sn-1F zVmiqp8x9M{O@Y1?^D1nSq`2tCu(qJ3Gw54}{1t?7Y*)4f7FspZI`n&W**=?L`D`T+ zS~cF-kpQN|QSouibV^=5NqDvJ5Im*+M0cn6{M>|=(3 z$nU@JuMvPbD@gnU9j=|`Qx0b5ODZYq*^>A#0ClkOJS+DaPSy`D+!&!WP+Uc{y^Zn; z+wHbLypdg;O8R19lk(py2~zn2K-=g0Yn?9BNi(j$wxr=_k8G%J)wEM$=V`5T&C@BMj?Sf5R7m3Pg@8tMZmQZfjnm_@LEbY+6U^ z^XRxU?nDxRB}|cQD(7Y~H@>sYflxL;aCPd)zuPtStspqhg?ZO*EMh*JDdOshUTkJp zc{R_asn|u&E_Yv^oi%?SB5n8c>^TqWmn{IQH?hH^(#l3aI*eK|dNV{c)#F#Ryx1O& z*;~N`Qn8I^ND}nOYB1%ek)3qcAR&U9AqC*b1F<;~s6#ouoPggS#?E7%e2g{qP*P|P zj#|b=vdRnZzvNhDY1t=m+Y@CA&;;o!(5etC52FHd2j#{Cn327U^VVZ*`#Gyi#&<~= zK1!J@h*S_nY}cJ@k*qM$JZoNJ*uVZ4hZ6)sF^X45;j37YamxjCyaoGH zOi02+_!`lcB@}TzV(Tq*gbh=V@|-(wP7*WMvwNq`eEJG~+bRVEF?EnWn@b0lH~!2Z ztYvGgK_H-`f%0BffF7o&I*x0LCTb4wSW+2^N#_k`#w#r+%b_-RQV4zB3ilT=Q$N;# zss7M#IvFE<4T(Y>-4mL4!Z*Cz|KhEb^8dDM!V|l!?D*aB+mF)=%i8MhvS+$NdL^=@zBc|8U;ZsSPC-4_L0jlufI_nED*AlGy%oi3SQ|BN z16WqYLWtf)EU3*m=Hpl zRqBV)R{6@zmHcYfUTKTl>xpwQ0Puv$D`nI(6=$WzR_f|2aI48+wT99&bLsO%vF+j^ zSeuhrJrf=qR`5jg@z&}q`OAhllR!Fd@4>EphPk-io;E{7oo!=Awg5zGIA3>TX| zIvnd@Ih+$cAT?;E-iCGQc?Vy!Uf4tenEU?IVpB7< zoQ;{gLq(lki8ZPUAe;8A!g$oPvx!Gmq(=xG>w0xii}<2=mbO8bp_|I5C|!?ZR=JfP zoP$T?-+Vdf%>=f5E;Qc5?T;r;KNg@(QshjxFulD#{^wO%X7-5LFa4NOxwMDJC?Yi) zGAI3}`ieXKi&t$mUleQJ!w+D|av+P)E#zR0+tX9EJTak+>cr2F`S@30?OIM<-}8|r z_;D$A8b&v5%eYt_8Rj!+)$5I7|!i{{&~Z=foGd8M*#eIL@cAGjF<>sE%hq_OkDY0jA#($u00nq|oP*`rE@ ziABp0x6b7rt%?4LG0NqAd}9{PR3TWG#v{z3%n_(GGb2DWfg7DXxM@?N8#i8UE{t|n zAz81T|B0D5$2M5}xGOoZOnd7!@te3mmOX$Vr?ihe)8oq%j$jfdEA209O3m6Bk!m#1Cobeqna;XGu+#d+%rJD;s}Hv~NeJjS$|=sJ1p|CU{y|WI|xN zW}!|+^7JtS0Hmuv%fGU;p$qcT!iwg@B)G;uM8fZ8^XLS>6;cU;y>iI^^qZzxkO);n zWs1arrV8O8){xNW2AwoFTR}Tnq3gsE|;og2xNtBjgm z%Bi1GzcBpJkg$!D@de6ML>^ek4Fb8_r76sl~wbZq9Ns%rbAO`(X=YUXS2Qrt>z3QX?RNjK(Pf9^&HBdiKO+0CjUeM-?^ zD`SN0@@###kAoci9h|SxBN&7(L_Zso0o8#n$@GhPjna@6)t~i9BUHte_! z_`*%j-TS>Oi)yBvh^Co#GIXMA?QYB;naQDItjGjksE1dF`!urJDF~y|U!AT>s-C+U z%Z4z^<%6XT&4{uc)s%eLpiG2&qyAGZk^5b@(XO`c(^$u0B!TQ!7#)HT{)C~j{GU{X z&;bJ3l18P|UCp9tH~i=??U$owQPVsHemc$#7H*%UWC>145&2WJ2h=lhMJHO29(P)e z?HESncw;a)ovepOtWqdm833D|y4N5}OKPn6k|9B5?w`2wUtEy&hBON7kN^?tn~r{QHnX$5J^!zL40S>`Wi zVmZbo;_3e14-&A*#(I)&n#Sdg_6x0_Lr_Bk5>rckssc3PDf8+uI*+)jJ*`gVpJ3=i z8NrzM5n{lIueWe+tZ%?y=`0FQg5|IF3Cn}1Uiz}KFMwY@U<25p-U3<_YN8W0N57&- z|G`%na^^r-9L_MB65O>a%*A1KSMmZ{-bY0HrUk%iON5|rumkgB8;x%m)ieks9q`$U z&VY&P2fDUt3AcfP_kQ2qWT*9oAleDFp8&h?X_dq&6zTlr-xHefVIqZ;rRQ0%MLD-3 zy)<&Sq!GTdDk=fEUL}WKs0ur23*%~=frv$jRFn=bKHc)bB(9x~SU>ZQO7hl`;In8c zp|jd9rO%w3bU_X~;fd`hLdR6)rk04Tybz=#8RBs{4}S54Qby9dFg)SCXgIhhnUB#o zD?16LZ@uM7{XcD8dlM^fNBFjeA z@f&yg_40(Q4#${8yj*iz=*^{ACa^iikFp()*q_kvwanI*mfETtWVnBstA;Kpceunj z)cr~ROngLNgh6)d-^-DBd~Dj^IyC(gcpEixVlEg6tqrnXA`HIY1{Un)qJ?Tp} zWZasn34-&&8;ohkVN%WWkXrL$CZ69IWovLU*T)6iBR`!>ej*8-7?~*{0!7h@e zef>3?W9~@?#Yzn#{jK8xqE__@VChtXlIy}Hl;Y%Sc|9ig4&0wLRxY$OfCl30aP}?vlr+!tpiSlPbp_Nc3jk-C^pybFH}|8vC>}V|=Z`JQYj#a{|31 zcH~#H^2uP&RkhZPk$;ZkYE9m&!(^Ayd?wo3p1oe(7zwmoq#x(>hfV61{9)T{!fBQa z;=`Y(JYWRI>!m8o7nQ7H)w}W%om+Ca{iQr`;we8#b|T6*I82ORtyfc*qE z3ZQ7!=bjtStqu1~WQvBF&SKBH^cHZvFg7i#CPJaX4p^mRCkyo3g zEy(2|J=A&Qo!)=o9*LZ{97<}q)9`CD`)Z88`J3+BL|?o@x_F?LaYcfntZHZL-((CU zV;@Ij@1OuLjMq%^sCADWJ5PxDdV+?tUl-4w?$#$({O{tj{y(p)=zD!UmQ!+zDxnul zcUr;~@Z$Me*%Xu8G{oEB4ULCXax0^Pz<_MK+`3RlApz?`!iPHk`^zU5a!pusj@)#K z_4^A|vX%asoTP2#ExUrVbrzG70>nxTWc#LAjfh&=(`NXW4+SXX22 zEcAkyng(yEcEJC(rP&GW;0y^(Qcjy%zr>T$%ZU3-1C8ng?!Le?l?!^vZala z&?SZa;lAEuj9(+kFl@D-^GDJ>WmZ*){XeF6oPt69%a|kWvmOWzys-|5r$5}?l$1$? z0XN+hg3^VJ;Fz5|NNwXJz87J3CT6u6(7|MfpA9%V{fnO_L798wE_#OMrjML(M9dDAxJmEhhXY7A#WS@|R$bb9wv|t(r6E$YSe! zqTPo@r2u)?W+8T@e;aYJLOUT-E-}HcBH%ag zDWL&(Y;z+XB}*18twfwQSZisX2H|dAbG13cgS`3xkX&3hw1=lm91ClUC}!;h$% zEC5~0W6LffmY=10ro?V1+`L=;fYce6X338bFjzcNxT13~U%xak8roRPubMbO1j=#R zC{E`$6rCEN#tG~=w=>ks2yf<4MC#8?O#1x8q@@rN#G8^>hM|E*OOoxnFzP!bD6*YejTlSn!-rUdxH{mtfyWwMxHiauGIgu{N-LQYyQ)As&U7-pk^oT(w(4j zd=MV(xVBkTOYygB6#*m$w!cLt62iUl{pMNA$s^`h3@y6#JA`#!yiNt2{h~AoLp-BO z-9J(8>J3mDr8Ag-*&Y7L6TKoH_ZrIXxD#rtvAtZ3Hx@3h#4XtrPge1_rgxG1T>i~G z`L>XHkSt04($k#Df0dn41;sAc-!Ic%0NDXhBkq2a_+Xhl(0EzrUyyDm&C^l#xNUU1 z?C+NHBYiJ&-By7e)gu<#p8zE(h2n$8xtVwuZkLM37E1tgMbRE?(>jqDmi{-?Qml}`gG*qBx;?|&v;P2KRQlXZv0IbOGC_fKihqNoetN_*6XVvptbmeL`KEk;tZ79xsH>9SgZ?RxZrOl1RGmBx!j)dK z{Bs~f!mIbjZBeh+#F?)Vqg;@xa&$)^XNMm_RA7ilOS`#I5VW|NBu^VJ?jS(QLmgh? zpl2XwPL=(6^Uv18^^o9mwWY>t+!XDa7(KDC66n zkumLWA~tVWqbF{}&*cig*jKw&#oFHRYT~c6J;1w|D99TZLO+Mez?p!S{`cT2Zh~6=!JB=EoM#oOTilCjc=<$28AL_Vw7^mP> z74YH~VFJRT%GD&eB~Eo?W(PM20}ViJ`&$y-PtobXHTGyJT%2D* zUot(jX0dkd*Ab$f0Gs5-J$WPOV~NkNO6XnbYohlwPlluCp?d5o9rX^2?2KU4TOmWk zPft9I7l7IOyw{vQPht6-N3RzERBMkkp1-fR;Hh$s?d%002NKh3GJE&wHh{UelX@TN zX>nXi#x*hezoWO+__TVOK;y3=)bUlhbBvL1aQOTugL*Uc9+>6{}4iq&%w{7r7 z2%awbozYxbthzr;9yH;%a`MFw*K{8+lTcYCOkWQYv@im`O?8&cAQ4a6T<9#@{oZ(& zGy$|Hkp&3H&WGrZSW1m2;4-M6YPDRIbGR`3Nf}mIB07+6;SECtWuog!Hc-GNtD-l& zF$A0y>?Ew5C^nQ{Kw#7-rYw9;1e!pWl$JTiILY5&%@x@7xpo{Lb*OtvO0`Wfw5_#8 zik`Wd^5Ip2Ucc7Ytv5w6%$Hr7sY)25|2?tD7V?y}-nfqDna9-#t=-QwJ@0*b(0O8^ zR?Hax$}SnIJVqmcG-=g2*U&BG7f>Ymi!SO$$W<^TefK0%@k{KQSsPWamK6Ws>tP6` znjxHSz@2#o(p^*vdJGTAt4f-oXgHU&lzzODJK?m9JAU3cV_`bQo_PmER0d$$jU>(` zI@HVd(OxL&e{1)%CCO*4bahn@*j2m$h`?ACzneN2rkk-!*kBHHK;&=sH8->MYYcr;05zolw`B{$Y(*}ep9CA%kEOwD$r(x`*-&3QsiCkwnQ7((NR#*^w%V)wHob})*dcY!;?r) z6H|1pQS4hD@%1f}-$3Mex|6viHtiojU<&Xaq{Hh_A#fRh8lq;0GZINBnN*4mjkwiJ zh2L|O1dN(ICElwR#9r#+J%%!f#OG}5u|?l!Vm4T5G|44#ORMNpZSv$*>FMg)s$v-v z7b3SpLT2`rYFoaK*09oAEV>Q`w)y-I0NOw$znq?etu5>l+8HilaGUlj%A<3A2(GwC z_i6bZbt_3?ywg_xyw0adUAje}{{W_9uGI+cVX@It;$yNHp$x?K7_6TU-_Ld~FD?$( zc?l?6ATMPfLH%o)M&~VQr8nwyjEd@2fFSTes?bF(HQk0RiHyCU~&lJkkCbw z8hTcB-aPn!-mMntS+`&D@eljdm@>AhDG^GlGGFBB)6~`-`>n8n9|{>q8R=VEn|Wx? zI)<(rRk^sjy`9e-s;8nax75~BNwYiqwl{90E2G@L?ip|g<6NKid)`O27%1J6O?5Yq zvqX|JlGqtF%g3sHk>FMUM$B?*ZuGD_$3$+g%dL<0p&z4v_3KR5WS=grZhyTS57Zjd zHD^hmAIq%DKfM|s<|{_CkISs7{`5b|zxwr{4I!DgqZcji1!C$W_o#iVcKm+$A62YP zN33V-Q6iB*)<=j&bcub6pVU^ltj%?IX!kzJpU8@s?pe+*y>n-$+uK@`3X~l$Jx_^>T2@!70KWEqB(qw`I$R$*R56_oMfLe7gK$FK;-jozxUNupT_fB z+(`+tLJ^ARe_F`0Gn-}mMtsbi?yQ|?x?WwF$IrZw0L^PUaE{1!S30=-ZzRsKn-v?* z-0$g{l5H~DOss>KmAM(cC`I1oB(#p- z20xWYL{I>!QL=I9MLJKrQ77MT_k~6tq^7STYQ;s_1l=o%@dd~FagRSLjFInMwB0Mt zb;dv1*BigRis>?m3|xZU%{&bEs1>mo^))PUyRZr>S-Mvw@`g8Onz045x%pI+Ql*rt ztCg;oOw!~?gR-1swL_haV@l=}b}|>i1Oe35<Fl-jAWqej>57fm3+nmisT?mxX4+ofvocDNv!^5j zf-1^tVYdStF2nN^(Q1{nH>&5)h^mp!-t-rmCO_!T-0*S1t4Z7&jg1fOTW!HZIV5CZ z4^LXVV=~-EWJ8rLissGa(U#0^yM_rM@;yG4&}iU&f+7Yt5`S7H7M7%`MY|)t(Z~8F zHO@5)qv;v{0MKdrNBnwG2o0-F2*}0{-sI^63x#^GEhofd2rONWbrz(NvO;DctK(b=78>kK!FZd;b6n#}&H} z$P!JX__5lsEufJjSYo}}vaV7=!iMi&gS2B97{)PNFNpMAMmxyj(%>>fJe$a0;BNl_ zKzh=QoL$c{v{QWc)aX1hCF59072_kkQWaNDjJ>O9)HYVa&dMk^ZYZD@^*zl04f_tic2O$Q?*VG?&qyTjoA^B zS{&`)`ht=iFG3A)`ltcoPLEI`iy=lWFI z%!sQquDbbk3nuq*`hWGSOxA7p652PU*!;n*F^mkFqo~iH<<)J^tZqM0YW8ZC_7e8V zv(?#uHU9wXRkJ|MjdxI6A0?VH;j%bAD;o0tIR(B^hnXNj-vs*A?-j0W;BQGkrBbrx z7yZ#$)_kfjxug}-WGcwbFb)2twzfr8zJy*uC4_FGd6kg^WDMgyYhqwA8 z=PaID?^BT28K}$@=uGc!Ve9Wm;+$x0kJH1i`084$FctKgp&y zhc8{(w?l$S<*QCR8%QQI#cdRFk%H>DBzji3`=jYvQLSt8lHHC__-^!n96$HfP`&VF z{mtByEY|8A~X|s}fPJQcMtKD3E zoF*50F~CrH_chI0oN9c14Jpodv`kyuIc;rZnaY(xlY`A+ORPl$k|S~s4RxB|Iz7+( znXf&({{UB8;jq-yU4m0`dYS`U7YtQlBaHHEkJpK9MdTn2z#c1N&;4=#0Cd$Ia@n0$ zU^BGf))hV4+^b^LS0&085PhapQ=DU;YU=DPAwn>``qpNRZn0P-tUhPS&$epB_vorn z$U!|3I{qfImD{n^PSICqRRx3+5ZoHoML>W6Fe}dO^$BgI50>`J=DPh7?eCWa=bn`< zSlLN4X=Q>gWOY&0=B-)l8f!_gP6_Nl;<;}SyV^R(kT)+mtc^POiNtYVMy^gavV6Jp zs)}Syqt#_ZxPg%2k<^TihP<}iO$MWJYUJV>3jP(`=z4?88G=~Cus_0bKBBU<4L5&@ zrw9V9fn;O&bNs57r##h*_9|A&Abl#xrl`OGbf;HI!1Wv{!kQ`KfeyeU1OrmW04e~$ z9fd{(N`vMfS{Tm9NdEwjIxYVIc{CSE?U-=4LnzTbSX=y2GfK(S(D{Bv! z!y_PKr>qYU$RxP6wP^|_8b=_01NoY1Tuqx0UBhxecKrGtwa)mq>7|y(M?%Bxa&DB5 z`R2Tl_|t#0Ck zv2M;I2s<9ey1SVSl3TVhl`W6LxS3_QxQ@`<7bHs=4*gps0&BUrP;SD3!lAAV9qi7` zb(M<$0Av?YI6rs~mp-)kt(Mx?VEf1KA5&Ishwk31$#n@PHIYkwd-_*-<|MZ;wY6Dd zNKSK{)(o0(XtqbRzH_;SZ)>fy$iNvabNN<$XD2n!Qhcmh^AYMiM+Klt@o9Et$I@lgK& ziE1B7NAfkBV1IU>?$<@E!5rFqEQ%RJ1A|<}?8i>Ad7zC+KrpUOKTc~J@0}>E&7ka= zqnZKcxrFg!jwG^-{{YuJf&7jt)LtjIVguRTrh9}8KQL>Z(VFNNM_|0DKGYh9JBU1_ zCg$96&Sg^Cn#Qy*)p4(C_Z@sp${^;Ws zy)@&v)i)&C=xEX!&pMl9{ZRbrhf|ZZYAar3WoBra!PO^Z)uRKVp#5sm)aE@E2jN+A z$S!Z1Sq~(E$Dpa4v^y}7eD`Lirp8SY;GU*4UVnB!c5Au0oU$8!3`Ia-MP^-D+K3Jz zi;rsBo+32WnlPI8*~nUdulx;3cMqKj8;Ah%J!?_njY%mIkD}H+>zFU?nVnGyDnqv1 z=i9w=PF~WdGBkv&tjm^=2C|7e1;tXENkGzhiq5Vu2<=+vzDw=??OcjgV}gL1&zYun zMhZy6O)@xa6If!`D?0xG3GZCqpP)|;v-ZS-HJhg6(N9d{*1Ox=hPQ!bIUr*{k9wt*xOI5g z1Js;#ty{Cu#YdTHU$WDnf*@5!am!+{wIda^?3c4JNYw)5{{WwQ+eutT7j|nK#JXE* zIxE7GENtus;xper(uHQsrtF!OCy8vAh{Tc~YytY!SMfB2{_52+{?q6ARzLh9S7Ywp zz<=N-oID?>54&-0-cjq6q54QGUqI6Jh&5pV`*A=X&!vy_LC5J(+nnmxKz8D=FZ7GssUSADI=pc#V{%!_h>UaGvCeB_MKS{< zQm)w};I4NS9_P9BHE4!widsrqp#^8(STyqa$iTJ$+IxXo6tvT6-3g@CnTEF0jFS^7 z2e)dct9X8WMr$ci!ucyEbJr{}pTfF)QXZ5}T|)vGD%CRn!xp^$XQ#%m$;_FIj+j>Y-6de*cB z!xhKLj=uES`kK2O_Dvk#zJ7aQ?rMZyq*UG~yMoT<(n-I%+j;s_QO=SovYdt)1PqGj zoG!%PqTIcdkUVo-fTVI)wJ-LSswUMgzz<62uF_|;lmQs|52>qmT4&m4 zJu6eJedma6L=v}`DMT4KT-L3OrfVoehKq2Zf6F3x;wi-P)eVCSrFxA}uq&6|Ghhy06tmbQYGt8JKtyYveX7a4wjc7@Ynjd~b~{Lq?AJKKzhR!c zVNqEYu`=&bk^v){*lj}Cf6GFCifb7i{?jJVHWxS~)H%iM&a66W>5>|j-q_r3!-d=H zQ16MKV#pctcmt=@)Thn2nIS3~8Ae!-;vSSHi1t!svRI-c6L5s6&Ie!TR3fn5Ak3VT z=~_ohw2s%zwS-&9KK9N7k9w+n=w{mJ%ilDmXR*^lE-BoNhA#2J!vR;W!15db2NjzI3gWc$^3;~ zjDVmIO65FFsU+93+Q#2Kv}ZW=BR}C=Q&(pdXJj#FbvYRyjcD55`G;hSlj~l691MUo zcN3xYSq)o??(P>|m(vV?d8uY8-_5DPBiu5xMLCQz zuHC?Q#ZCVJ2^=wNQd&0i5}mIh7+A>b^{JBOc3_#c@k%FWZ zI3SLMQ=$I=TEAKV?)3LhvMvsOf~#1SYx}lSkX!oH_8;-)m0L_7=@%bg>snZbX^L7X zpar6mia;$PqL9!bulG%4Oh3}w=qp*y6xJovmAxa>3T&BdXv54xu`j2&Tb3NE1M-Y@ z_pK-{fMF8@lhD&{(HyB@2~&|t>Wtp2L(P65PFbMb4p!ZcJ;|+21q$ib-|h;d<9JNh zpmEG0dH(==HLa&SLe41SISQhpS_(qQs$y^y45=L{x?$a?#s2828>T89ApZcMs`?T? zQ$f~Ec$@Uu*CQq-{#4yHx9QL~st@H!b|+{G!lAb*Qc1=IL83l%m^0aNK+PBb09M~h z!MYi>lz*^)m2EqGgnL&kZYDdCn<{b+MJDVtj$z@A{`_j+QBa!;c03_d{>iR}O(qlf z9n=rL1MEunD=g1@a;@*mstubHU{IlCjdPAM%& zYP5|foalga&P`wP7W^Of!IitAgN$z1en_~){-WIJ9? z7zOK(rBasU+*%hZ+%Km}$cI@=*GVOmF#`%fz{P7#bsff+Bq=e=DFCMhexCHMuVQ4a z12r3LihBYo)!fk=cRpft^{gwMC(E2|n^2uW1hd>6W4{0aRjzMs))V{CPoU-(2PD@cberXOkCfbSN2Oy?Bc}}7xiqck5Jw%V<+hgu z*fKdetb{B%SI@DlP+rRs#?nW%V`tFrQe953Pta|Hk1FAi`gN-^Ky9u9$oVRA4PjZ{ z&m#;16!kqTdMJL-!KQ4J*i^ALY+BtZfutwpKuaHCUT+lAU5o8O&-&f@^~pK@Rp|ag z4L(?a!m=j=#XCc9A3Jm$;DTvQC;7{^r&1 znc$8>WneJJyM1w5J{yTsLY~6P^&aSMJCI{(Zk5ki>AoRb>0nE1k1+8hn|pfhJabvp zT+cwdy1D7`gcj(rDOkd&PsBm(&R?@%LPxbz_WEzxGQqUl!q@sWdLra=U0FF<)Sa)ML z5l8N#lUi&`Bz%%!WG1|1ZZi75$ZDQbuagkiase;2fsZGlE z2lA|3vVpq+yY0q5PAc3o?_3_DvE)}Qx^72hHJy5QTtt7oq<*zv8iP^!EY{!*n46z) zXtG7pcA7Ia8z*!m5^EhVW461ukL>A{$dQ1_HPyiDeFo@MliYe%be1v2d`rf=lz%#; zdJkhJ6y0?t(ykIv3C9C>emYl0rp)pn7&rt}YaO|Z$stg67#%6gJT^!R@SyfRew7kU zvSlQqYg`=0-$Ps+;F!n*Jl4(TvvYBkh^#4&Lh|38bF)c1IYo`O_at*&bRyvvpHs_h z<<6CS@-Y_7ps~SxE`K`P(DeJ8DQ4VLb0`M~A%Dcw_QQ0=rR|(&o@-A{Uobf!*go7Z(ykvPlV0F@eTuEr7-dt206Sv&U*^grNi}!LBZ5_dO*A9f;@C zOAj^?&vg}5Baj?m^sx=tg*tC>OXvq_mVY>&=cC4A~ZDw=!{XPktkM)s!jroe6J<7Og z65sixwBpe|l~+kW>%O%lnxc%;b4F=^>M69jpasn)X){Th0A#0%=gVgPZ)021 zpOn`)A2)X&?^Lrn6Ev<-hW<0qn$Ej#DZ>l{jH09ldKr{oH$2E}bH_kpu1_LJaoBYeLM>A#g)uy=N`J$(Vx21QDLcH6^*`s)&pM zkjP)>W0G^!^s5&9u&i3t(7Gv;k2W-bV=PI*=}Ju{sPk?~9OHpeJ&kEb@+v}3n?6|# zW51!Qy1l`6HxNjSG0xLnb3j}Hv^UgME1P9Ow4&hk8$hV$J1=vDO+slT3RgMr(w%W~ zuatk87pnEat!-K)wTt|doP*aVw1-taf;|U3H*eYEJ46H0M(mlV@U=+ zQ`?>m7V8_^NX7QD^T^=-GA6oIt#QtaTBE+5buA=Wj?^YLn!2{njDjif zMhf%ISx^AQWn-e`F~Hr;PlZwRro7R@KX}1&(>?1Z`u<4|mke_a#{&t;{{R8+R~l|x z8BVH>R>H=tV_v;kkAJ0h!U_vRf~4Ht*|OIL*Hdd*^2k6So(krcQHFHh z%nw3NY1*7I&2erP>g8FY1axuv`cw+56j+j2U9IQ$1rF}+pc9IZ)?g~9~TXxdM;3@fssIEdg z^K5pI9D~bt6|-qEJ6;A?1Z17qtG&r*eQ3biE)PLfw4RdvYKEJ7$PVCko(QY@Pu!R5 zS+!zKDqPcPX#lyT%@mZtT+(KmO(AY62#$8bn&#F20DC)sv}0_OhWRr4W9A=pi`N_}Y zRn)(j=RYYu`_dbvjeyA~+qGmvG$}_~N;+1js41#&@pW=P-8FF4G~)VE>Vkj?JJ*|d z#dhnt+z#l$$EA8ygNpNS87?)@ePR_zXza8AA4RjugZr`8wXgudtbYwQ?FQ5R&+A(R z)G#q8U6M(aBP>rWTmJyn^r)p4PhsCcT za=szFNpGTnlFFQw9<@fsFDp`Yi+0&#InZ_3- z8ysiTn(l;btaDk|yX5(m40#uG!kOODxiYPA~_S*yrn48rdL~+2dBp z$Su@)&*d*5;0}cT9Pv@jJofDvXc?JLCt*9jpEd{OQ(7)G zm0_IjElx+d%~G_O%{gm$=82CahX8&#J!?YKBF`s3 zg;7=_p`(-wu)vM;+=PWs7TvVM@2q>FCU(0zxkC(K)+5ZjA*SY zg~{ixDqI!Drz=|Iv5U_!x88A&yt(7?>-yDfNYgWYwsRhNMFB>Bxiz733~^vE%W;A^ zsv8*`AU%6`ssASsCG3`|K3p_?7iPMfw2;fp^ z33Z5D?Q_bJtZ&zN@Ay@{Db{@+Id?am8{mR-pTeUvwbI1+Qd%&$7{?q`I$2`3)~AL8 za34x`)JI2WcOW>!k<=CbAFXv-OoBvnf(hrE;w&c%8Z?SdILe$F=q&GiiInApYl6g% z#*~pKRhlWP!ITlu(&n=PX{69iHH|R{#-nE9k=mhm;L;HU@4+>IANO(}Qfpe`OewB= z&BSE;nubKm7caLw_o}{l6t}WvkG)dQrC?!V!#HqoeX5U^Rj@g!2g{S1sP~^f5O6w^ z-lQ!08b4yXfAzYR!S;^`KT3u>2%yy6>%LvE!&tj#_jlw?-SOVir2M_VRlJ8O#ZMdrcf zfDZG>Cj%AP$Uk;|mFAu(m7i59vnZ-L=Y#KC(^rwtRoW$MS#5785h0LG-4-%O=UdkT zTWcjRY``M|H=JO7D=NqAvs+-q+s6mXI1BE5s@zu|b-cDx1>Y2BV<{?Je>3>kVmM73 z;N~dg2^uR5<>cGP(DkhOvO9F)I`LjwxIPztk2f5O1eM4b;azk3 z@lr)9NW=XVF^)FFoPI#n=90t62=NzeU@Jqk52qCF*cEP_{KhYBBxpOcb@~BSt=u)h z2HY;w_hcmgEsmd#DXj5{NZd1?5DuSOx2Bk8EauFxUe4qL^aG_WTLM}22o6#7>tK6r zo&Nx?YAby~R_pgr*+xe@h{+z=G|Q!p$#t`WA@_Yf|3sJFh0_5@C(DkPlPZvoGYemPuaTJ&se74p$#RQ0P}iODUmHN~32j z+|%4grRlR5gK0S{(E5tGn!(VgBq}y@j8@q-5?YceH5)Yq)NIs%YqeLA_@_wqR#)PX zinlU+t@N&DNpTqf*7ei=?f!ycKfrNn=^qf3Bfedc&M+x*AJyrmUfC3A&xr==A1RT zq*cf-?mWr7wLdEL_cZ%B!EQxTOtHzWYZd5gCeKC@mc-xn&-s=n4eGDi$PwashNqAtMfGQ%7BBm8Tn z=yIBDiK+k$`n%yjvi9-+o&MLUL3mZ(MaxdO1+KYjwuIkX~nlb>} zu4NcV@G<`J_N;vmNJove3*FLOKg^+r-S_(c04mMX^UK zgN?ZyA9LEO>cDN=ru=8Oa%x+r#CuCHC#DY-%)_gAiuN|1(!m-L#}SjC#GZc&raVo2 zE<`ucuH54rHkJG+y09BBkVq%-2Bx;Yf(bs$hBG>D;BW`MSGr`jg`}6|MH{kC2kTgV zAC>O)dFR+zvikksN>{MX%4=|KGWd*RJk}qA#_@as87-bYD@OZJw6?U7B$D8;L!GLs zKQmaiJ|5H)Op4;x>+JGQr_EPjFr@MNQGG-+NV&PT)UPaU3_fMU7?xRE9A{<;`F{~zZ-}*-G+Ql~7OfO) z!7|Zx&$zEPg7s8;{eqPvNXr8(Z&6%Eop}|^t8ESz z7|vcy=W+BE)j@W$P30gs3+qEAmrGO*)aGh|+Mq)uYNspIvNctisu&cn9~SZ-_Dypv zcMK6-4fA5!Po;BsJBK*+tZEs|uX0it&tX~1ERB*obQ!HXxP+0M_U5y8Y*I1Sp%RBh zHuM{rclrusw+e@Der!}r2x5(Zp?Z#ar%xKlGDkH%M$$TpuXp~ZK7<;ctKIW%^|{tw z&Quz!bN;du=;EhCn3Vept$D(s^kGa3%hsEAF&fjN(%FJaBbYSY%%V-(l zkyPU>2;lz!O5v}sB)Yf}>{25+1P-3nyW$J7u3?4F(s)vS@6xig%R=%t;Cbh99M@8O z#}uQ=>~Gpk>8C2a#BsJb1|R|aYa3a*NNmNtO&NJxYZ&@ty>6lufB}<%isZHVH) z!YJby#%Z)k(P)X}Sw(CuCi7b|7iM6j{{X;$#;@MrTWK%@J=BrRc@V%Ecm8KTiLO>} z5Zq53cJ^_)F#&Q;=KlbIj@756czbJ$txFO}c@eSQk9IxHCFBK5*)=P@K3zqnXl-PD zimc~*{yoR(Owcr!yp^XgG|)tFRB#yjR_}=P`-}TXo&{I(kNUB}BiL3BmwSDr+!GzE zFh71bjPv?awxD;h+D;(^%JHEXNd95B>DIYV62oT&<+_=bWk6n1=X?8oN%yUI^&MLM zT01>4Z8r>g^BiO72>$>Yr8k73GkMeA%QLqx&~86owM}*rfb+?$-t3OvC51j?jxs&Z ztyPNZZ94VUT;nHp&N%iayC|(AvyaM#Fp>HW{{ULe)busfrAZc5iNL`-bCFYED_Bb& zwRD!k*rZBB%Iw>ikFRe|E72|HNT68IF44dToDX4K#+PMprotkKGch@LU^2$G;eG}= z6>&gnDx|7OME?N3sb+)9jf)15o=7ZBM{gpk<8c||0Kebe_wIHy9Y}UM+4#ob3#&l7x;$Wj0(+ zgH67S7H5u9pnb#}bM+^sYQZeCCf(~}ZvOy$C_9{bbIGg=d*ng#?NWPz$g8&ZOhyzO zo~@i`>)h5(aa*%RPEy$&cAKaryY04%XgqFnm;8GQ>-4F%faLOe*PrRG6^7zHg>}{! zINMlH5qD_pbw>-zuPx58pCdH`wKgd?!lsz*T`ApM^V+kq9F0{aYMIVztcH+^8iOCQ z$$&}6YUd@G!;Q%KKGoDoS(oYzEOE_eC2=^WVNHJ-Tw#IwRVgnaNXxMyK;+`DOA4^$ zRz9TxODUKRHqUs~xhZL2{RFgJyP~42$ztW}6M>jD)(zGm|1Dkly`y!yd z{{U0;BA;q=Yah~?dCUz!7Sc_i5mmKKP+QumWZX9ZaB0Bh6#ELt*U$PaV?V|z#a)dM zYE!JyZbRFl>sY9GtqYiAXguc5^dB!iwM|ojTr!t3x#-Z1u8H94D^3=`tmuXa&0USK zY7x+C!6pS?Nxo6fHH{P1fhbT;>{gL7k!s>@K+h(zwT(q!fT$yJ;0)D?LAjDGc7Y=A*OJ?JuO*V*mxq7ft~D>D-a}To!f*Dx-NE%I7EP z)A?4w)GhEAb1r|pF`CAYSkt3jkjxc_MtECq^EI;ow-#S&xQ5DD@w;-f2FKGBCIyJ~ z1ZN1a+&BA65hL@f$52Q>S8}J(m!I*hPwnk3PE}A2za+$eL006skH{A|kzp&ii6q8X z{`$}9R+x+Je{A^u=U?uO)KlHtq5^UW=vg|}a`?8!EEH&zuS^nuPL(vep_bfVd2mR$ z&iQ3MJ(hewEps?9Ks#Br~fPw^6Q{Hs1M5&f!gmhrntdX!n3dq9*BLYX)9V%`z^2;Jg^Tr50HiCaTw++bLRDiyrv!BYbt}m`*gU^9}(H=Va z#Qr=~dPb`Aq{_DN#>z4oOB4M0qTqG#>K2I~D=QJkJiZU>n$Wd(l2w`_kw!X$3iJHy z%G+Dj1k8TY$iR?xs0Oy}Ws^|w?ZeAF#%ReqjGa&6RG6%KRn5(>1!8&U2LK5Ie<8(E zZB|GpjvpjjiJKTtn3L+n^Zcubu%2__d8LN-c;|%h6n6Uct9}*K=9}$MT%SEcd8*PJ zkVm~*C7rZz&o#k#&Tany<)oYiC)>M!D)Mg-TZpv@WL}FQQ~B4h$2pc5MAsAFV}Ip;X?w7}m{@D_Y&Lisz!0qJNnP8RE4q=M9WkpEP>ZnbO(K zh8XKz9hB$gIXSLA+Ds8$1)abke~n^n&ho--(BPicGqqxAS38Iq;V@$A$*at2jraPW#-)tLk$I{bj14uD#EQ)Cg;i0KN$e|7M)S(C z#;oqg3aU9KyFClT$!4N!jjcKA!=n2y^)y9XZP?%-_*)g_jAHuscqJz;B8)I!_H*m% zdRL=b{gX|yhSmVf6bK`YHufA=t;O7SkpX~CK2#NhG|h1-d0Ugz`VXaR8a&(VMDZMo z%X5~^HcnB8wJjrZ4PtB-M>eVW(RIuZ^rl#!^n7|Tr_any^riyFa}s?8Wb4XJyhpb2 zT99)BeJZ{Bl8b?!X>)SwQZa6U`wQdRtHd)9H0?(HEQ+JWzBw`*2a!-|*VfWzGa%!p zc&;u-%X7Yr)!Hnn0Mx!_D?aAxIN0rP%CqFvQ9kh|h@*K)BcT^%1uEPbUj*SrbCF+7 zbl8Fiaq0&jooZUEZXaoN3*76PH{ZB++Ms$4=kOHUKZn+l zC~MovW^e97HZSMN{#B?oD55_oEssu>Fx6y~e25f#^IN8o#Wv*6JiUQ*?L?$&v_&@^ z_^s8EN_mZ*Msh1J#7e_amCsiJs@1#smNBp+l|hg3nolbF0>o`8jw*7#PM2_?e-Y$*RS2hH5T5chU^bJJk=nXQ^#!=PxV70ImKOtR z0a+R>S@UK*5H^F3m1fq+{F0T-0XrblKntX?x3ajMa1Jq&Gt#mP7GlKYlagyoO_)h#HNM~p=rikC zYzjG22qUc~2F8ao3EC2VRvE$ds~TtSHH(OW!r=6(8am?Pren1gPtEU3XLi5Z&na(} z$pF&=E6gSA!#r*^x#8yXZLZ{zBOduYn#Azrs`qz5xLn3hCZM#@^&7X$ zcFw5Ge|Y0){d(1=CVEA!^l*4~JC=XBZ@ZsiUQZm)adh%IC7hNu*Laff>E0fLO!E}a zB86pN;ZfH<=D7c_wT09u+?0OfnhhpsCcN|08DxG(9*$~R zc}5=9Ud-XyYIAOsw;0+fmWTHP*qU2|gdbW=XCvb2-q~%L0uaQ847ts7 zYc0Lc3Vf+Qy2p>e*G=O14Azja2jyd3T)qwc&NOh zgCz+1&@#uA7ff4tVv**4S%cw!Dx@^|iN@8>pgE;Ctg`t|4i9rz)pLxB0Ca#)rz|fV zX(;~ymWL$M?jlR8SYQ$)epvaRXJ68wn&E8rlMo?}GB7dvRp>yK10v^)q1=x`xtKiJ&a+*S0F|*kK#C#HX%tKp61Y7^M#! z+fPt(1za}bLJX0t&Hl&+q`TG-Mp8Ypx&9Ob^)*P}+{T%f(Un}_5X1@qwJagx@>(K@ zJ8udC%UkKe-3*e=DHu3sIQ*-*(Cmy~ymbQ|2XbpjqFXp`7O0O~Fa!Rn z06gU9sn5M-+XKHfq2h>)J|MUx968(x?^%&P)5m({pTy3{KXn&##Wdr&tM(cWtEj|f zhS9_zWXj`e;C}j zq*7Nm;f@;!{I%uJRwJ+Z^rlHWN4R7e4B18vjq;f!egGr<@$LE0(yp5Bo>Iv<#`zzR zJ%APEaePqMp(n|;v{HJp3`zZJjrYXQ70CFFqCk4Ew+HggQ=ef*2|LLi!v)Rt!{ls4 z^$~&jRf)30dmQ7Buh3V4-1z?h#ST7gT2;?wMPKPuzu_wJ46T;dZ%ICq5&Wsfb|z45 zo~N1#;+vW)BSJeQ)sx7oupC{;Jw;h=lmQK?#B4nn(%d)@u{{Sh90wj?{{U*E zx?&)Fb=qiSGIe?hKaFNb8^dy{>OuZ>WR7c-7dHl!P3b~1)sHjE z!6jJX{Y5DBhYZca(FS@Nja4mAOAjk$;m>UgMNd#mUq zl_rK5(BOmyMknfUKb=Jmo+q`E=HSMRzw*}lL$!T4>G)#1k~v<)^WMR69>`@^$5OnC zqA<=`vJY|&Do8B_qHZ@Uc4a%7R6j4!3Yig69z{^u9SNZnpI2ri`Ffp#|<@-`bvIz+p;dukztk`|3SspFOLUEEg zsV%PUUS^o9w5%`@KZJdI)AaXQR%iP=JG1=9u=b<{eNs8rB=ZOWwio53Ci2(Ih6{m$ zd!ZQo>c!l0OL=by4BYN2PH-z!S;H%W`$0WPVkv=zcW$k90BNO`M?X7}*XS!pP=d+} zCv~^DEsde&e2o1mk82P1^f1I5YA)s>x}V04bA*Nj54E2-C#j?b-69KEY!NU_tTzy( zReg0~TWHw<`{OxaXokvYj$`u&7~z1b+N@V1(OO_i?%IVBc)_p z+|6wc5mly~3Y z(zAAEnrc>eq{eXH_0c$}XVA2(ut~N+ePcCArH}%*7J<8Ni{&TO`&454Nw=CMl4EY! z$X4imYE9if#5W!cv3_EB^XTi3?U#h$)s< zgu87{bDym_B#ac9=64Z{71Ws$RuvIKA1~#QoRUvUg8iIC zSwjNfF9Yuyy|O8nd5rFCiTGQo|?7>9E03-}8 zUAdI4w2g5F^S6eLut()pwCA^vPu(HN!8{C*Xac>IZ8o7hd9n~VI6RuvFd$xc12&9UQane3&O|_PtuwLKFtzcN@+4kUI!+nx=%AxwvTVQsq|HJ zv@)bf&gUePRanU;xZY~9IOv{~0lsbmovD^#{3>f7P?meksBGWlQoyhrk@(fQAgfi4-v*ELpMAou?=2PUGoof})< zJcZIVBxl#@QVXvyUJnL9lyUMJ24B`zIP4u0Jm7QIu33$?@h2l{fmB{Ib*bCi+_%Zh zg-%qQe!rz_G;CNbdlfVH+!ayu9FtU@q>8h#e=Zd){{UVGxvfhWm`V)qmOTKf@!GUI zRuUc0Qp17nar~=AOfa{T8<}Ko8bewkGc&|)t!_dLs*&@0n#R)4`fPt%zv4O5bawEP z$PQV(>pM&T0FTuA)-^sMt&c*zZ}^nS&-}Bj{TaXFTEA0QFEZL(fPZqUX*TT^oS^kI zjLQzy1F@;y4r&HN-jIkHjYXUqosd*6xamPfdz-NUQ{9LFS6g8RpAyJ<&r(kUxZ|VV z>Q^E_1Xj^oKa@eu}P%$Ce(GC4Kn!J+^!DLcY%@3Gt1L; zc$nLm<{)ILT6U?X#jGJPO%l8R0DNVCDlDw$({Ao=uI{b8wuNGjI7ToBQhv3Xz0I#> zdzIE>3n%~$y#;BsrG#HT{eQTEL!hB+STg3FC^6^53_t*M z?@fVb>-|Xrv1aXBm%*OZ)f;PeHIXB5p!KYzTt%lwe|RZ|n5;~yymE0_v^HNDA3JmD z?^5czHO{v7(AubJc7j82pn9KbuXCx097k^yOe6j$T$VJ*{7-nTF)jg^ZDvt|gW9x$ zvJO|d4yUE)dI#=xEo9Gj2h9blXKD05{d`trcQ(v-TLRFIK5@<~6IavavAR3*(a3is zop)#7)~xAw7QR}<)9jbBxWGS+Y>eA|O+CPpF_`*;(-Z}^JnnD8nAwd1Ehy60w*}t4 z#R{kiE1VOOy~P47FOUX2%!AY(hM7Ee^T1+4k(^*Mj8lk30PW(CJVTJU{b_*=5lL?V zh)k@j{>ZA=(|@9}m5^tEPa?F{@-UHS-0@3^nBxIxuoUdfNox|M?YxdcsjAn+Ti?er zGZ01&REpU#q+>4QKb2OV7_Jjx4&&65MS!V!a;Dg9FXlf08nI_+ZQxL21-iFC{dz65 zxMFSlS)6n%+z-O9i+!pc*;F2wJkXFCc18aHwkI(Sqz>4?tCy`TR~FZeC}u{%Ip`@- zZLMXI<1X(10C>QC<+fWgfzY`a1L;~(NRUUhOFN!2JJyL3TZnlI5mO}g%{JogEu&xn54V;A zs=d-72^$k5b;TfwWq+O3R2;K0<29lruXUzRKAJ9>h$=S)J;$wQ>3{M1pIYdzq%EV& zAayDimnW~%x!ouJKjZq=6&0CFW6&-*)0_R;OCyUkrMw_%?f&gWXxOt-NC0;=CS=ZP z7Ua}2_xx!AmeY0p1HR76n43pJ^|wVS9^l*qr4r+L}pwDhei=Twsrjj@lt zD}B}f02A#~T9T5xb_!J*c1WRjcdE@CQM}f-F@eNvxGVJosj3G{x1Ea}LTIKu<)g?6>%;dJDrUBq&MGoNTya>FYC?FLIiNzvjom*w=8ZWu?&@}XRUeB&a@3ouDI{3N z=U}7MoKi++pZ!D*ujXq5L9@Oc5233DT7~TS2IlEO9QkmM=1)J$gV&Cfz=}x^ z+E?jJk%^?2i-a_dKpeM;Vqr8gjF1jKmC#x~ZKFTzijMIW{#RYfM<9x9Ga@KKg#)0e zY-O94EeipYky$Ov3cowCg|_v@W`cMptwf56DLhnm=QnZZ`@)89DqS&EujAd&9MqJ} z9d}II{*e-6BP0P_*2QKeIrSClHt3fyd2&V>Pf%+oQ1E4}!KJfv1ie7&rkavlnj@98 zHh1=qrs^Ca8H!HmYm3!1>9otnhF(`cD~^mStGTz9+To#{c1(x2dWPmDyoARf+;PzV z07}s@N*6FR%|b{d5wntw#u~N<-`p}jrm|$wq%MBW;fVeRI5i|Uk8OxABWTFz%qom5 z(Xr-bCOq01@IT`K!D-kc}PztKA zY=x=eGu^o>y_?jI1y?X6YuKYtCe%`7lYxcHW7u{TsC2f03G(gIUdtwBko^Zr%+oGc z!}E)kxjuG&Y`5O_uS2!f^xawkeG)_Vksd?803WSVm`W`(KSl8D_jZyUMl%aK;0XeQ zkM}`4e;#Xvn$kTl#8TR<%Ig#3a`gIFb73~9s^VL>ksm+27{*U=RO9fRFf&hV=2=^* zm;!#h_pGMd)JYJ{dM<6ny}B1-I`+?}9ci#>cX-=>BV~W(h~N*xt*yM4Sd6Nxk)5Nr z<5P!I5G)wKQH&4QtzzWvQi?@%*n`T60uGqPOBKYCvE2F3a(Je)?tRCWJ$uu)EO;vz z9-01huc=lnZCOa?8TIc?XhNK4ny%8Z84?Wo4r%bakGui=Ygow5qC2s&&TO67Q`)%r zWdd|9jAtgg?L?2T%ufSpu4YXF`|OE4TOFsq`PMRAm&= zE;49(IV>yGbgO@{X?FJOoQ2%pNZyeb4(K>Hps(DowQn+!mTuLH^Ojb2r{5yO@y{*oUa)zdFO3;z?Yy zvojv-a%o(v9VO|n`U+U?7ID1~;atXYnf`TR*5#vMLw+8$oR!f>PHrE| zAa%zT413IAz5{o~GTvpKGB`cOYC#lc5XAv+QYuy6fw56wc?MJ*dY+Y~q-o#jYa_OH z^MTTaKP_r$skRN^WU=W~)sWV#(TeS@jtp$dd#I~Re2>xH5Bp2SHWYKoh-2$kgd2zP zDg5geY>s!t8e3{niLK*TnR}t@TulCDtlmw^JW_TnFs4!Nz1-6+|!Mpeu|!?<+(YJ+gT zRNpdoZ%WxRTuRouNtqg376Me|peOGSYMM4%jIF%vldlg1yf8lAw2G2iOtK>oe}&ec zt6N8@+l!d+muNCbINeU>ZW;_S%>n)ENQdb`yjCAGv!7D6k!h}7+OUpR62=Y+NHdDu zx%(8Bt1yg2?lKAm61+G&OW0x16|5K`BZW(G)^zuDb^T|JJIeQ1HAwnar91CR&nK#cn@3+fWb=UkX9qW<;E@_*nX zn$`aRgmP83G8_5Y5IUqnB|k#PCbca!8-|Z;T79a?&`$X{_XE8TZzSZrtt7H%CD`YW z=qoofRIE_bd?#ylAU7U#VYyK&jm`KDmDE9@+1bD$`#LmZpO|ERRiA7^u=2o32k{*L z0Q!Y*wxMqnOSy}ZG4hPljFq(}SGfs}=gp7o?+QXN3bON$YPA&5`K*a5`GE4d=Aw$` z-e(IOpf_E)=A`mrSqzC92{G3k)`^+2XGmuQdM@u%Syy%rj?AdLI_I#fk+r~AHy&E3 z=v33zU{@fAPh*-*COwQCK1M$QoKw8z$zF%11!>P=9LID-M#rxmY4BKETl~-S%j@a> z6`v!ye9FZL;F3kg(HI>4-nAnIjDLBm?1*2d1JHM>pC_8p=jH>ZD^#pz^)U6TfHe8{ z9DKbiR>a3XlWrA}kCr+Ram8Wl*35MKhLMXlI0`F>u+-+TU|^Z!ZumGAe7wldo0Z)4 zSRe)bxnqr&zTujKQSgqFa}&(57-YtGN5+2&;9&7Sr39PB*^``+FU|VbOJU=<ISJlMGmP6+0d>dJo*;Z894LtfBdTD-QLU3qB<`@3_Io^kJ7 zXO1tG^@O)m#3%v!*JTaVrHa7q5Cec;f9PwE@ehWzJKO0mMa*-ve+gZLdjVQeousbz zBCIZ*x|MY;R?@%}j71OX$NJYdFNmZpe3a+=(jVzqQp#Psob@@RP)&1O=&^p|Q@Oh0 zS)GTba6c-nS(}PQPeDpZ921{mNMi`?)|CPIwX|j5rLS0u2(_Be}5>;8fsLQ4m1E2k2^G zD+X*OHIy2CAryvCyRu2phEZI0v!OBuk~AOgf!4dJT%zW)E+5UvUaxY^PF}T5`*u0tB2U&RtSW< zdML>?qidtH9I|;s*k!6~J!8Z0jj_DZXQ?pO)ury6azMAgft&lTcAwUn4qb}Y+9Y6t z5R>ZMn%cF}V_)ITS%wJ$J$YV&+0) z1BlRf`gi77zbCCa?mK8M_QLK|9KReX`qN}8H!5Ms8Nh7*X0SF0$t+k7G1vHM!g%Aynh-By zX5;8#ctES}NkrPQGStAUETn1Cr5memy z5bd;%Jm>D`in#OV~j&^Ixux&t=W{|irTaBez9tzF?Z(2{mF)ZUbRAPIX5wiQmQ%! z9cqNulc3~&0chttz=XQDXixXo=U?%zuESHY)RZ(g5zGm~s5w7ecCQp^ z%8|M;7#v|}7f!MVh1xb984e8`sA;~X5)X5Vkw_gmKJ^l*W8S4z3)?2LH68OeQ=g?d zMJ_#Q%0ZxEia!cgWl@$m9`ysylY|{<412gyRi0AEj%q;*Im?_?l!X(JIrX4Ldv$gP zdhyz&F*jkwN>t{U>cnFw6vblRiMRV++_xcLC)&MG>HEN*510|03iC|{+YZvO_8G3* zP1G(d$nu{n{nq4ExunZf+gC=af({75sf3a*M`8HYs5MI~#S3=^#{Tf+esw$P2|Dkz zoHF`n`qieH4LI&m7c-8Mx8qLxY~%RHk2cHaH^vwuG{!}=3E&jf)INWT>eTwt!!!5D+D+oZf;om)}&G6paPSr*wQp_ zt1>P8Cv1P#-%j84&Hz7|tw=l_rLY^Py+8NJttb-}qX@-HsLOPsQ`7VaY#mLep{d5% z;0GA|x>rb8s(jAOd$SyqP}`=|+(*o4o=~WAYh|&@(!PY&>>5qE=h#-PQnV^ENe7G( z&0<@Jk}_d9axe+)Q%7{VJ&x@{;pAp-yr8uKV(V!?X_2H$tO9elW^ww}S+v=$mE4l+ zp19_(!zh+G?qG5ehH^(=uWG#=!oC&wZ+?cQ!7=kRVcA-txcgk zgK@eH!>hVrDE0%2(QA}XmL%MLK*0Y1>(nLWlx~webQuF5;Ym}CwGMZCk4aYA6^b#u zfsNaG{uJOD+&dHgALrVs-CVW4#Y=f6&t0dd)|P7{aWrz7rHp_HMd|p~gp&QOO~HUg zCVB?P%S^VnYjW(@4=(P_&{XXq&eaDU2fz5#ki&-EA>?-d06i!H0yK-aE&RXzRLNm= zZ0^bd&~-HXyY-9rai}lY3c?z+%W?rFfjsg2s$A00YAu(-JDMv zpdAQqwV@M5bbzM~^s4i~z_PgcNaWQBh1r!b2IM`5IjsAQKF#wfwcjA;Zg2^!QQ1dm zl00TY2iOajgzTy{Jm*3p5tCdCCqZkKKUak%h5o>ibuDf$qwT*SQ_8KB;7d~9#MNql zD!hABfC8Fl1MZB|2$n;fV189VIivvf=9}h7#|XUBmH;^?CapxEDD6NZr`ex5k-7A# zmK6hmin3H1X8_UyFu11D~I#A{mDbVG&X878!XyD_UPBI~e3 z_7ziWPWe45t^MNyFu*A5p7m7g1}MJZ&s_G$wP@y%%%I-J^l~gCfl|dhQ;@R76AbXL zgZXB;71kyaE3|ACy5wME@vUfXmT1XIwt_jq=kTVan4DTRZ(C80;xS-i5HAj+9DOSI zOvoA6=Od^i`PNm1++JCXZaa7-n*a}f4;5zi-sb2eR`&+lKC%?ae0Cn$s}|(*G}iXA zJTNrQPYO>{>6(dPeNMqe^bc-9;yBMWJW7yTA_f>yjm*b)=6U>S7;bE=Y~wu@xcq$u z09dw(ZJ|hF+*JlLTlt!{AuKZADEI#W5Ame5X!hZFVe8lb0IgKDTbsDZ5XN?%qzvMe zot42WyBB4aD|I*{arflbP37#a2GnI=PF?FZe?PBAS%o4e3ja(?s=?v z+>7P2A>O5V`F%!eHUoYao<9*yZ?*lIAYsTpq)?{Q&>T}n?68R=^C5l1&>kwDa7vtqJw9G@S@xHb*vL_e z`F(PFejfFyYkzO3DbL8`)YkE+o}Emk28`=VZA@J_yPi31`t9Q*>sOWIFNo)i$U22# zpQb9zkjoeh0Cmq_>V0aQT1AMy7mFK-bN9D(KT5Jodt8iBQINmYO6pg$=!d?(A)4ZM$U{=E$+xLu&%yojPh9DO(#Vn6m#`u!@*Ht2w| zsltxKf%Fwxd%Jx;5hTpYy~2+E^vL6$>SVlz^^yb5#vN&h@D+t4=(#?ol!}yKieVL* zLq$l9wA4gmlu!t;NFySmIHgwYO36r~9n7cY=AIjH$fY2yCcxuzFj6{-0B||2Ejc+P zjw>y48=Bs-k8CSZJrS)nc4R^5+~5Ye-BT4l{wrHCD(dx82Ce z?^0bjj@j9JFBq$E7?}v zi+S*_dHvz2mA5K4y^P&PM=V2@0DlPQbyl*K)>5GSq;fM#V{54$(%@s%f&uytzl}B& zF8+p+LvIYuc52fw%y`V34@Lt4pQGm)N|6x)a+xr~B}Td^aNS-5r@pK}H@1-W8L>PYB?-! z;FAmhjDH(8DoAFC<7*ekeDPS@TQghr8vg*h8;g)TfGV7_Wt1RhQ^`JpwAd?xIOo>0 zZk#J(Cfwe*$Q3hIE-vJ97~);?f)Jh;sUnaoYOa>HHjzOXIVEym9;J^;(6G@iFC&gw zW*$=<^T{H*P>|WeI0%D)0P1~*b5$BnTC!y{v_)+`(rarqidj6z9dXc9Q~6Dk2xE?} zoeA_FwIq_Y%NY1n?wS7p(2w-|=?h11Zqmsq3I{G1kUhArvz$wCae}TJ)6@L=)2}4C zirl@VUUa#@B`E%SxLhVx#Rx;uTe!6;@zFnM(`iuJ!+7d^X}G9m~ts{ z7-UqL;}s9wZ(~^&#AT*|ikSW0DVWUy0Z&tr&ssdZ4A2HC3~}UgGgRGVN8F?3tIE5U zg1xao$nB8JB9G3x7=Qo@%dv-R7Oh0>Sk2v?RHI~DjjG&csYE%ev5L&xvXv-mgi?mZ zF%mOYeayfUR$ch(S(k6tftlBHa(S$~iMhpCxRaAvbHD3aMHtPA5}TXEPg7lFNEK8L zfMT$;NH;r7M@|KAsG>|Dw7DqhQUg)a9Fi1p$AQL8N)(=k+)TboC>i3O;4}}oe4uou zMQm0iPcgXadz!x$y6j-whUzP(+8kHZ=d9;hZQe5DAoLxDGGw&3+DZlh<(MvN=4rNdCWT9wZXtF;#1HQ-0Qy!;(Ug=+ zoRi-*YFpG}vN%CPdbc_JDU%C;gU^I29)lRbs*AZY(6ws7y1i>!f~A{3rD0n*7*W%; zZ`u6NwtMug(St8r+>VC_*woDkU|t+_)GKd8tQ;uANb1CN>;8YvD)%R5TGLkI#>*G?OS>mBGv|+~tth2gu+T`3f7on~#MV^t zL#kN4v5|s<^Ee>w_UtIIw6@VK9lYrt6Z3AzZ){M5b8(bPrCmly!K^FYGJ9obiP@s+ zQ~(WMu+?pK6k%&2C3@~spjGIkI2rlS^faXvAWg*OBZlhx2&4rqfP)!7jdV6TL@`97 z>Lij=+o%Wcw{mh4dWQC8zm<8 zFOpRoX^($9P#pesnPo1gcXH5bHmWViJnX>!bgQAjx`N*M>=>Mcz~_q9GOw6MazM^H z0q$rXi(!`b*4Aj^3w4M$p}}wPsiF@r$f%_j1RK}{1+!{W4R|Bmin0`UcFsa2pG25C&5tL$iJXMI$Z32_EISvgm5&?mX zW}+i$sR;t3kkSG0xK_dFYGRo=6-*kr1MV0-X)@!hE!(cu6>>h+UNO?FM_lagin1<5 zwQ&}z#5fgkI#L@Q+M{NtlTgUR6+$AKOaskiT~E|ztn=vYo@$Y^|5T ztCO`=w2#leMeUrL)fh`wblPklO`-$W88x7zy+nfm3Ylv?&2~ia!qT`3KBlIU)t2o_ zAu8R+YM#`2Q4Tq3w6ZUAirO(&IcGN5JjntEY>+ss&`lc^0P;r_og+pOnoJcO^HW72 zkrq^9SFx=Onk(y&km&2dCzIBxN2OfdNUt=YAn(uUE1_v(##n-S?Z!{#Rb;s=a0b=- z=k=`l6L&35rDQ6k7SV-8A1KEFXY;DJP8u`v^`d*EgaTJ2@Br&fnVF#6sn?t}XhDwX z5^dtPZEjV4QV+#;BLs&T45b zLr7VGR9*&02mETS!T@<74^LXc_cyXz9Y=>R50K+ODw^LKg|xD*ypA`KmB&$B1*QD9 zPn8P5^;1?Sx)RQ22OEbNCbZ_VGvvEF)sgL73@MMX+mLG1a>IC%Ln`4;OP)r4oy~Dt zcCF;H?_yV>MkI`S{cEd0L~Aq!iX0pc2&;^gh?IFtc9wQpY*Rg?1zQfX&1+)N=~rDy6I%vx)tURylQepN>4+a!_t3cV$)S1}-(*;^mO_l{3qzt61!ZskkS zsNJ$nrd%(QM@)<#%vOkm7|_iWPcIoQj1R_|HbD@9Vc8n+0-nCyQ^GyOn^6G^)Z~O; zsqgd@SS~r-h6Px2#{=eXU@BPc)j*Qx01iZC@IBb~KHUXR6e|{364D+Ep1(opD<4&k zC%IPpO9>O7FV?0~FL7{Am>omjE+Hfcx|n zEG2h5Xbwrn?c8FVbQ3&40qIfT20Lm00K-jQTiUt|hL*wRn8c1j#Y-x2kyY4{^`IE# zBxIJ!rSk#fy+T;`rjMEW;+Z4M;i~nQ&ChD8BL}r$Z$p>1T?Ie9<2qo4k@LH)e0 z*jsknkC^W1OPL2NVq8Y(-#7E9CAes9$wANZs5Kkqxpea6Y!1VYed{YBJ%xw@?qRc&t)2DNT?L0jOem*@EN+ z9Mt!2RE@YJ*Vdp{d}N9@9>vs@mO$RW!`{6H&g;pwMtuCM(!AOxXO#(HoQ_3yBH$Y} z3gL$Xb!h`Sn%L6cb2NdD?WdfNUt#T934d)2@xeUti-!3|F~8`lGmojoWLnL;$tNEV4g=umUJqc~?TI=l|Qu(;TF$0%?_rJr{JO5kJA3S^D6ytdT$n`sFsHjqX( zeieEtUL{kK(UZqH{Hm?3rJbWn*6=KHFx<)yBzm7r)hkaB+umvoXl+?0B#q432NVw7 zjoIaYCwxi2{hpPA@;};l5~_Uw`KxIlnH7kWcHXM^=m)tqa&0WjZl%J9 z$IJlF;aKuY#=Pp~MRvHttZK*AMLilsV7UZm?ghvH0Is2m0}(mir1m^jl#s-@RT=I` zq@$qQJUAXHj!N<=u@cCn^Ghd6=`j#oBb}g})NC@;fB@M7l+ytU4zwx&YDEKOCwc@* zgOOS=js;Lo)u9hh#<7{#Nf#p>D%?w&tsg;GE&EnR<*3F5Jeon$kkB+kGh(u?n}b?6 z2a3zNszPRThbF5_(A3U(H4L3AL}JX##=_QyfaI%>dd$B5wWpzfsx?nzIQ&OVW}alq zxX-O?e`wn!*V$dRw_tnK4I}+zpGwNrxYXQ^IH~64R|zg@SnRx%VUXCSc`}9@c^=ix zY4?{9#;Y8p0^E+Z)xhk?q@GCTwTrogla7Nhgs26*%~-HzQzty*fmGaJp1nP4Z7iQWj@Ydc zl(rz2X$;I?=4{oH;ILwPiqO4+CAVo+0Dd{D)@ZUtIdunbO!lnpXJYP}xk^&5{{VOO zs2c>0xWK7mC9|G#X$Tv$j&V&b1ot7%0q2U=(u;kTQgT;38p@SNl*b(Awe-*ioWy#X zxb95$G!5I^*|SE9&yEn2w0(Vkm3K(g!>`h{A(T%Hb0fCd03lY9tSv7THO;(opH~^FQYhgI1ZWm5xY{~W zu=FHLkfe!7z~dvJt0eJ}$gJDHmNZrQL0~>!IH|44Sqg%7`c)EAy_wqNAOq{^ResVu o!>~-je~WMc{RL^=MH@`{PHOD8p(H)Wh*?D_6GXMYp literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/15cb4e8b-ba1d-46f1-8456-247016a599a4.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/15cb4e8b-ba1d-46f1-8456-247016a599a4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89a9a91039cd3761a4f06eeda328f531fb59e9a0 GIT binary patch literal 15717 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 GH~$9#Zq*I| literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/18e20af8-8fe1-48d4-bd0e-83fa9e2db88e.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/18e20af8-8fe1-48d4-bd0e-83fa9e2db88e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57b8bf3b16e3708ddc949883a7b13ea1da746082 GIT binary patch literal 31928 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 literal 0 HcmV?d00001 diff --git a/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/20e2164d-3473-4d42-8755-22cdbd4417ba.jpg b/mediapipe/model_maker/python/vision/gesture_recognizer/test_data/raw_data/rock/20e2164d-3473-4d42-8755-22cdbd4417ba.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c56a32cdd5ac156e780aa871963283e23e10b67 GIT binary patch literal 17442 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 literal 0 HcmV?d00001 diff --git a/mediapipe/python/BUILD b/mediapipe/python/BUILD index 8548a60d8..debe5404a 100644 --- a/mediapipe/python/BUILD +++ b/mediapipe/python/BUILD @@ -120,6 +120,34 @@ py_library( ], ) +py_library( + name = "solution_base", + srcs = ["solution_base.py"], + srcs_version = "PY3", + visibility = [ + "//mediapipe/python:__subpackages__", + ], + deps = [ + ":_framework_bindings", + ":packet_creator", + ":packet_getter", + "//mediapipe/calculators/core:constant_side_packet_calculator_py_pb2", + "//mediapipe/calculators/image:image_transformation_calculator_py_pb2", + "//mediapipe/calculators/tensor:tensors_to_detections_calculator_py_pb2", + "//mediapipe/calculators/util:landmarks_smoothing_calculator_py_pb2", + "//mediapipe/calculators/util:logic_calculator_py_pb2", + "//mediapipe/calculators/util:thresholding_calculator_py_pb2", + "//mediapipe/framework:calculator_py_pb2", + "//mediapipe/framework/formats:classification_py_pb2", + "//mediapipe/framework/formats:detection_py_pb2", + "//mediapipe/framework/formats:landmark_py_pb2", + "//mediapipe/framework/formats:rect_py_pb2", + "//mediapipe/modules/objectron/calculators:annotation_py_pb2", + "//mediapipe/modules/objectron/calculators:lift_2d_frame_annotation_to_3d_calculator_py_pb2", + "@com_google_protobuf//:protobuf_python", + ], +) + py_test( name = "calculator_graph_test", srcs = ["calculator_graph_test.py"], @@ -175,3 +203,24 @@ py_test( ":_framework_bindings", ], ) + +py_test( + name = "solution_base_test", + srcs = ["solution_base_test.py"], + python_version = "PY3", + srcs_version = "PY3", + deps = [ + ":solution_base", + "//file/google_src", + "//file/localfile", + "//mediapipe/calculators/core:gate_calculator", + "//mediapipe/calculators/core:pass_through_calculator", + "//mediapipe/calculators/core:side_packet_to_stream_calculator", + "//mediapipe/calculators/image:image_transformation_calculator", + "//mediapipe/calculators/util:detection_unique_id_calculator", + "//mediapipe/calculators/util:to_image_calculator", + "//mediapipe/framework:calculator_py_pb2", + "//mediapipe/framework/formats:detection_py_pb2", + "@com_google_protobuf//:protobuf_python", + ], +) diff --git a/mediapipe/python/solution_base.py b/mediapipe/python/solution_base.py index a482e6f6a..020d16371 100644 --- a/mediapipe/python/solution_base.py +++ b/mediapipe/python/solution_base.py @@ -40,7 +40,6 @@ from mediapipe.calculators.util import landmarks_smoothing_calculator_pb2 from mediapipe.calculators.util import logic_calculator_pb2 from mediapipe.calculators.util import thresholding_calculator_pb2 from mediapipe.framework import calculator_pb2 -from mediapipe.framework.formats import body_rig_pb2 from mediapipe.framework.formats import classification_pb2 from mediapipe.framework.formats import detection_pb2 from mediapipe.framework.formats import landmark_pb2 diff --git a/mediapipe/python/solutions/BUILD b/mediapipe/python/solutions/BUILD new file mode 100644 index 000000000..2ca0ba9ff --- /dev/null +++ b/mediapipe/python/solutions/BUILD @@ -0,0 +1,105 @@ +# Copyright 2020 The MediaPipe Authors. +# +# 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. + +licenses(["notice"]) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "hands", + srcs = [ + "hands.py", + "hands_connections.py", + ], + data = [ + "//mediapipe/modules/hand_landmark:hand_landmark_full.tflite", + "//mediapipe/modules/hand_landmark:hand_landmark_lite.tflite", + "//mediapipe/modules/hand_landmark:hand_landmark_tracking_cpu_graph", + "//mediapipe/modules/hand_landmark:handedness.txt", + "//mediapipe/modules/palm_detection:palm_detection_full.tflite", + "//mediapipe/modules/palm_detection:palm_detection_lite.tflite", + ], + srcs_version = "PY3", + deps = [ + "//mediapipe/calculators/core:constant_side_packet_calculator_py_pb2", + "//mediapipe/calculators/core:gate_calculator_py_pb2", + "//mediapipe/calculators/core:split_vector_calculator_py_pb2", + "//mediapipe/calculators/tensor:image_to_tensor_calculator_py_pb2", + "//mediapipe/calculators/tensor:inference_calculator_py_pb2", + "//mediapipe/calculators/tensor:tensors_to_classification_calculator_py_pb2", + "//mediapipe/calculators/tensor:tensors_to_detections_calculator_py_pb2", + "//mediapipe/calculators/tensor:tensors_to_landmarks_calculator_py_pb2", + "//mediapipe/calculators/tflite:ssd_anchors_calculator_py_pb2", + "//mediapipe/calculators/util:association_calculator_py_pb2", + "//mediapipe/calculators/util:detections_to_rects_calculator_py_pb2", + "//mediapipe/calculators/util:logic_calculator_py_pb2", + "//mediapipe/calculators/util:non_max_suppression_calculator_py_pb2", + "//mediapipe/calculators/util:rect_transformation_calculator_py_pb2", + "//mediapipe/calculators/util:thresholding_calculator_py_pb2", + "//mediapipe/python:solution_base", + ], +) + +py_library( + name = "drawing_styles", + srcs = ["drawing_styles.py"], + srcs_version = "PY3", + deps = [ + "drawing_utils", + "face_mesh", + "hands", + "pose", + ], +) + +py_library( + name = "drawing_utils", + srcs = ["drawing_utils.py"], + srcs_version = "PY3", + deps = [ + "//mediapipe/framework/formats:detection_py_pb2", + "//mediapipe/framework/formats:landmark_py_pb2", + "//mediapipe/framework/formats:location_data_py_pb2", + ], +) + +py_test( + name = "drawing_utils_test", + srcs = ["drawing_utils_test.py"], + python_version = "PY3", + srcs_version = "PY3", + deps = [ + ":drawing_utils", + "//mediapipe/framework/formats:detection_py_pb2", + "//mediapipe/framework/formats:landmark_py_pb2", + "@com_google_protobuf//:protobuf_python", + ], +) + +py_test( + name = "hands_test", + srcs = ["hands_test.py"], + data = [ + ":testdata/asl_hand.25fps.mp4", + ":testdata/asl_hand.full.npz", + ":testdata/hands.jpg", + ], + python_version = "PY3", + srcs_version = "PY3", + deps = [ + ":drawing_styles", + ":drawing_utils", + ":hands", + ], +) diff --git a/third_party/external_files.bzl b/third_party/external_files.bzl index a89a192ee..b4ec3b36c 100644 --- a/third_party/external_files.bzl +++ b/third_party/external_files.bzl @@ -88,6 +88,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/burger_rotated.jpg?generation=1665065843774448"], ) + http_file( + name = "com_google_mediapipe_canned_gesture_classifier_tflite", + sha256 = "2fc7e279966a7a9e15fc869223793e390791fc61fdc0062f9bc7d0eef6be98a2", + urls = ["https://storage.googleapis.com/mediapipe-assets/canned_gesture_classifier.tflite?generation=1668124189331326"], + ) + http_file( name = "com_google_mediapipe_cat_jpg", sha256 = "2533197401eebe9410ea4d063f86c43fbd2666f3e8165a38aca155c0d09c21be", @@ -286,6 +292,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/general_meta.json?generation=1665422822603848"], ) + http_file( + name = "com_google_mediapipe_gesture_embedder_tflite", + sha256 = "54abe78de1d1cd5e3cdaa0dab01db18e3ec7e09a76e7c3b5fa278572f7a60977", + urls = ["https://storage.googleapis.com/mediapipe-assets/gesture_embedder.tflite?generation=1668124192126494"], + ) + http_file( name = "com_google_mediapipe_gesture_recognizer_task", sha256 = "a966b1d4e774e0423c19c8aa71f070e5a72fe7a03c2663dd2f3cb0b0095ee3e1", @@ -721,7 +733,7 @@ def external_files(): http_file( name = "com_google_mediapipe_README_md", sha256 = "a96d08c9c70cd9717207ed72c926e02e5eada751f00bdc5d3a7e82e3492b72cb", - urls = ["https://storage.googleapis.com/mediapipe-assets/README.md?generation=1661875904887163"], + urls = ["https://storage.googleapis.com/mediapipe-assets/README.md?generation=1668124179156767"], ) http_file( @@ -970,6 +982,18 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/yamnet_audio_classifier_with_metadata.tflite?generation=1661875980774466"], ) + http_file( + name = "com_google_mediapipe_gesture_embedder_keras_metadata_pb", + sha256 = "24268b69429be4e307f9ab099ba20d1de7c40e4191a53f6a92dcbbd97a7047d3", + urls = ["https://storage.googleapis.com/mediapipe-assets/gesture_embedder/keras_metadata.pb?generation=1668124196996131"], + ) + + http_file( + name = "com_google_mediapipe_gesture_embedder_saved_model_pb", + sha256 = "f3a2870ba3ef537a4f6a5889ffc5b7061ad98f9fd96ec431a62116892f100659", + urls = ["https://storage.googleapis.com/mediapipe-assets/gesture_embedder/saved_model.pb?generation=1668124199460071"], + ) + http_file( name = "com_google_mediapipe_object_detection_saved_model_model_ckpt_data-00000-of-00001", sha256 = "ad2f733f271dd5000a8c7f926bfea1083e6408b34d4f3b60679e5a6f96251c97", @@ -1005,3 +1029,15 @@ def external_files(): sha256 = "f29606cf218397d5580c496e50fd28cddf66e2f59b819ab9c761b72270a5adf3", urls = ["https://storage.googleapis.com/mediapipe-assets/object_detection_saved_model/saved_model.pb?generation=1661875999264354"], ) + + http_file( + name = "com_google_mediapipe_gesture_embedder_variables_variables_data-00000-of-00001", + sha256 = "9fdb750c4bac67afb9c0f61916510930b496cc47e7f89449aee2bec6b6ed0af8", + urls = ["https://storage.googleapis.com/mediapipe-assets/gesture_embedder/variables/variables.data-00000-of-00001?generation=1668124201918980"], + ) + + http_file( + name = "com_google_mediapipe_gesture_embedder_variables_variables_index", + sha256 = "3ccbcee9488fec4627d496abd9837997276b32b839a4d0ae434bd806fe380b86", + urls = ["https://storage.googleapis.com/mediapipe-assets/gesture_embedder/variables/variables.index?generation=1668124204353848"], + ) From 9f681d20e86e9b038cb327956b501ab5e76942eb Mon Sep 17 00:00:00 2001 From: Mark McDonald Date: Thu, 10 Nov 2022 17:00:00 -0800 Subject: [PATCH 16/21] Internal change PiperOrigin-RevId: 487676791 --- docs/BUILD | 18 +++++++++++++ docs/build_java_api_docs.py | 51 +++++++++++++++++++++++++++++++++++++ docs/build_py_api_docs.py | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 docs/build_java_api_docs.py diff --git a/docs/BUILD b/docs/BUILD index cb8794dab..ad08df66a 100644 --- a/docs/BUILD +++ b/docs/BUILD @@ -12,3 +12,21 @@ py_binary( "//third_party/py/tensorflow_docs/api_generator:public_api", ], ) + +py_binary( + name = "build_java_api_docs", + srcs = ["build_java_api_docs.py"], + data = [ + "//third_party/java/doclava/current:doclava.jar", + "//third_party/java/jsilver:jsilver_jar", + ], + env = { + "DOCLAVA_JAR": "$(location //third_party/java/doclava/current:doclava.jar)", + "JSILVER_JAR": "$(location //third_party/java/jsilver:jsilver_jar)", + }, + deps = [ + "//third_party/py/absl:app", + "//third_party/py/absl/flags", + "//third_party/py/tensorflow_docs/api_generator/gen_java", + ], +) diff --git a/docs/build_java_api_docs.py b/docs/build_java_api_docs.py new file mode 100644 index 000000000..54e96aae1 --- /dev/null +++ b/docs/build_java_api_docs.py @@ -0,0 +1,51 @@ +# Copyright 2022 The MediaPipe 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. +# ============================================================================== +"""Generate Java reference docs for MediaPipe.""" +import pathlib + +from absl import app +from absl import flags + +from tensorflow_docs.api_generator import gen_java + +_OUT_DIR = flags.DEFINE_string('output_dir', '/tmp/mp_java/', + 'Write docs here.') + +_SITE_PATH = flags.DEFINE_string('site_path', '/mediapipe/api_docs/java', + 'Path prefix in the _toc.yaml') + +_ = flags.DEFINE_string('code_url_prefix', None, + '[UNUSED] The url prefix for links to code.') + +_ = flags.DEFINE_bool( + 'search_hints', True, + '[UNUSED] Include metadata search hints in the generated files') + + +def main(_) -> None: + mp_root = pathlib.Path(__file__) + while (mp_root := mp_root.parent).name != 'mediapipe': + # Find the nearest `mediapipe` dir. + pass + + gen_java.gen_java_docs( + package='com.google.mediapipe', + source_path=mp_root / 'java', + output_dir=pathlib.Path(_OUT_DIR.value), + site_path=pathlib.Path(_SITE_PATH.value)) + + +if __name__ == '__main__': + app.run(main) diff --git a/docs/build_py_api_docs.py b/docs/build_py_api_docs.py index 9911d0736..fa1e4314f 100644 --- a/docs/build_py_api_docs.py +++ b/docs/build_py_api_docs.py @@ -1,4 +1,4 @@ -# Copyright 2022 The TensorFlow Authors. All Rights Reserved. +# Copyright 2022 The MediaPipe 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. From 849134cfce463da7a93c795dc9502c1b838c6021 Mon Sep 17 00:00:00 2001 From: Jiuqiang Tang Date: Thu, 10 Nov 2022 17:46:57 -0800 Subject: [PATCH 17/21] Copy metatdata_schema.fbs into PyPI packages. PiperOrigin-RevId: 487685505 --- setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.py b/setup.py index 40c4a7361..b072a850e 100644 --- a/setup.py +++ b/setup.py @@ -307,6 +307,9 @@ class GenerateMetadataSchema(build_ext.build_ext): _copy_to_build_lib_dir( self.build_lib, 'mediapipe/tasks/metadata/' + target + '_generated.py') + schema_file = 'mediapipe/tasks/metadata/metadata_schema.fbs' + shutil.copyfile(schema_file, + os.path.join(self.build_lib + '/', schema_file)) class BazelExtension(setuptools.Extension): From 8c8b668ba3684c3e756bf9fccafbd1bd8e1a7cfe Mon Sep 17 00:00:00 2001 From: Mark McDonald Date: Thu, 10 Nov 2022 18:04:42 -0800 Subject: [PATCH 18/21] Fix comment for `mediapipe` license. The `"""` comment indicates a public docstring for the module, and will end up in the generated docs. By using a "private" comment (`#`) we will not document the license as part of the API. The Apache license is noted in the footer of generated docs, and this is sufficient. PiperOrigin-RevId: 487688719 --- mediapipe/__init__.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/mediapipe/__init__.py b/mediapipe/__init__.py index 69d7dfc6f..bf29fed39 100644 --- a/mediapipe/__init__.py +++ b/mediapipe/__init__.py @@ -1,14 +1,13 @@ -"""Copyright 2019 - 2020 The MediaPipe Authors. - -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. -""" +# Copyright 2019 - 2022 The MediaPipe Authors. +# +# 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. From d2284083b35cb9b8c2387e6f7365aa73004cbc96 Mon Sep 17 00:00:00 2001 From: Mark McDonald Date: Thu, 10 Nov 2022 19:36:37 -0800 Subject: [PATCH 19/21] Generate docs from `mediapipe/tasks/java`. The last CL used `mediapipe/java`, which is an old API. I've also added a flag to override the Java source location. This shouldn't be needed normally but makes local testing easier for both internal and external users. PiperOrigin-RevId: 487704937 --- docs/build_java_api_docs.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/build_java_api_docs.py b/docs/build_java_api_docs.py index 54e96aae1..7b44e79f4 100644 --- a/docs/build_java_api_docs.py +++ b/docs/build_java_api_docs.py @@ -20,6 +20,10 @@ from absl import flags from tensorflow_docs.api_generator import gen_java +_JAVA_ROOT = flags.DEFINE_string('java_src', None, + 'Override the Java source path.', + required=False) + _OUT_DIR = flags.DEFINE_string('output_dir', '/tmp/mp_java/', 'Write docs here.') @@ -35,14 +39,17 @@ _ = flags.DEFINE_bool( def main(_) -> None: - mp_root = pathlib.Path(__file__) - while (mp_root := mp_root.parent).name != 'mediapipe': - # Find the nearest `mediapipe` dir. - pass + if not (java_root := _JAVA_ROOT.value): + # Default to using a relative path to find the Java source. + mp_root = pathlib.Path(__file__) + while (mp_root := mp_root.parent).name != 'mediapipe': + # Find the nearest `mediapipe` dir. + pass + java_root = mp_root / 'tasks/java' gen_java.gen_java_docs( package='com.google.mediapipe', - source_path=mp_root / 'java', + source_path=pathlib.Path(java_root), output_dir=pathlib.Path(_OUT_DIR.value), site_path=pathlib.Path(_SITE_PATH.value)) From 3e05871f980a7d78c9dc48c308890cbe82e27599 Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 19:51:08 -0800 Subject: [PATCH 20/21] Open source Model Maker text tasks. PiperOrigin-RevId: 487706929 --- mediapipe/model_maker/python/text/core/BUILD | 35 ++ .../model_maker/python/text/core/__init__.py | 13 + .../python/text/core/bert_model_options.py | 33 ++ .../python/text/core/bert_model_spec.py | 58 +++ .../python/text/text_classifier/BUILD | 146 ++++++ .../python/text/text_classifier/__init__.py | 13 + .../python/text/text_classifier/dataset.py | 88 ++++ .../text/text_classifier/dataset_test.py | 75 +++ .../text/text_classifier/model_options.py | 45 ++ .../python/text/text_classifier/model_spec.py | 70 +++ .../text/text_classifier/model_spec_test.py | 118 +++++ .../text/text_classifier/preprocessor.py | 285 ++++++++++++ .../text/text_classifier/preprocessor_test.py | 96 ++++ .../text/text_classifier/testdata/BUILD | 23 + .../average_word_embedding_metadata.json | 63 +++ .../text/text_classifier/text_classifier.py | 437 ++++++++++++++++++ .../text_classifier/text_classifier_demo.py | 108 +++++ .../text_classifier_options.py | 38 ++ .../text_classifier/text_classifier_test.py | 138 ++++++ 19 files changed, 1882 insertions(+) create mode 100644 mediapipe/model_maker/python/text/core/BUILD create mode 100644 mediapipe/model_maker/python/text/core/__init__.py create mode 100644 mediapipe/model_maker/python/text/core/bert_model_options.py create mode 100644 mediapipe/model_maker/python/text/core/bert_model_spec.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/BUILD create mode 100644 mediapipe/model_maker/python/text/text_classifier/__init__.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/dataset.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/dataset_test.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/model_options.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/model_spec.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/model_spec_test.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/preprocessor.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/preprocessor_test.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/testdata/BUILD create mode 100644 mediapipe/model_maker/python/text/text_classifier/testdata/average_word_embedding_metadata.json create mode 100644 mediapipe/model_maker/python/text/text_classifier/text_classifier.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/text_classifier_demo.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/text_classifier_options.py create mode 100644 mediapipe/model_maker/python/text/text_classifier/text_classifier_test.py diff --git a/mediapipe/model_maker/python/text/core/BUILD b/mediapipe/model_maker/python/text/core/BUILD new file mode 100644 index 000000000..db06c3a75 --- /dev/null +++ b/mediapipe/model_maker/python/text/core/BUILD @@ -0,0 +1,35 @@ +# Copyright 2022 The MediaPipe 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. + +# Placeholder for internal Python strict library and test compatibility macro. + +package( + default_visibility = ["//mediapipe:__subpackages__"], +) + +licenses(["notice"]) + +py_library( + name = "bert_model_options", + srcs = ["bert_model_options.py"], +) + +py_library( + name = "bert_model_spec", + srcs = ["bert_model_spec.py"], + deps = [ + ":bert_model_options", + "//mediapipe/model_maker/python/core:hyperparameters", + ], +) diff --git a/mediapipe/model_maker/python/text/core/__init__.py b/mediapipe/model_maker/python/text/core/__init__.py new file mode 100644 index 000000000..7ca2f9216 --- /dev/null +++ b/mediapipe/model_maker/python/text/core/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 The MediaPipe 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. diff --git a/mediapipe/model_maker/python/text/core/bert_model_options.py b/mediapipe/model_maker/python/text/core/bert_model_options.py new file mode 100644 index 000000000..ce5ef6af4 --- /dev/null +++ b/mediapipe/model_maker/python/text/core/bert_model_options.py @@ -0,0 +1,33 @@ +# Copyright 2022 The MediaPipe 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. +"""Configurable model options for a BERT model.""" + +import dataclasses + + +@dataclasses.dataclass +class BertModelOptions: + """Configurable model options for a BERT model. + + See https://arxiv.org/abs/1810.04805 (BERT: Pre-training of Deep Bidirectional + Transformers for Language Understanding) for more details. + + Attributes: + seq_len: Length of the sequence to feed into the model. + do_fine_tuning: If true, then the BERT model is not frozen for training. + dropout_rate: The rate for dropout. + """ + seq_len: int = 128 + do_fine_tuning: bool = True + dropout_rate: float = 0.1 diff --git a/mediapipe/model_maker/python/text/core/bert_model_spec.py b/mediapipe/model_maker/python/text/core/bert_model_spec.py new file mode 100644 index 000000000..6c0085617 --- /dev/null +++ b/mediapipe/model_maker/python/text/core/bert_model_spec.py @@ -0,0 +1,58 @@ +# Copyright 2022 The MediaPipe 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. +"""Specification for a BERT model.""" + +import dataclasses +from typing import Dict + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.text.core import bert_model_options + +_DEFAULT_TFLITE_INPUT_NAME = { + 'ids': 'serving_default_input_word_ids:0', + 'mask': 'serving_default_input_mask:0', + 'segment_ids': 'serving_default_input_type_ids:0' +} + + +@dataclasses.dataclass +class BertModelSpec: + """Specification for a BERT model. + + See https://arxiv.org/abs/1810.04805 (BERT: Pre-training of Deep Bidirectional + Transformers for Language Understanding) for more details. + + Attributes: + hparams: Hyperparameters used for training. + model_options: Configurable options for a BERT model. + do_lower_case: boolean, whether to lower case the input text. Should be + True / False for uncased / cased models respectively, where the models + are specified by the `uri`. + tflite_input_name: Dict, input names for the TFLite model. + uri: URI for the BERT module. + name: The name of the object. + """ + + hparams: hp.BaseHParams = hp.BaseHParams( + epochs=3, + batch_size=32, + learning_rate=3e-5, + distribution_strategy='mirrored') + model_options: bert_model_options.BertModelOptions = ( + bert_model_options.BertModelOptions()) + do_lower_case: bool = True + tflite_input_name: Dict[str, str] = dataclasses.field( + default_factory=lambda: _DEFAULT_TFLITE_INPUT_NAME) + uri: str = 'https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/1' + name: str = 'Bert' diff --git a/mediapipe/model_maker/python/text/text_classifier/BUILD b/mediapipe/model_maker/python/text/text_classifier/BUILD new file mode 100644 index 000000000..357263678 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/BUILD @@ -0,0 +1,146 @@ +# Copyright 2022 The MediaPipe 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. + +# Placeholder for internal Python strict library and test compatibility macro. +# Placeholder for internal Python strict test compatibility macro. + +package( + default_visibility = ["//mediapipe:__subpackages__"], +) + +licenses(["notice"]) + +py_library( + name = "model_options", + srcs = ["model_options.py"], + deps = ["//mediapipe/model_maker/python/text/core:bert_model_options"], +) + +py_library( + name = "model_spec", + srcs = ["model_spec.py"], + deps = [ + ":model_options", + "//mediapipe/model_maker/python/core:hyperparameters", + "//mediapipe/model_maker/python/text/core:bert_model_spec", + ], +) + +py_test( + name = "model_spec_test", + srcs = ["model_spec_test.py"], + deps = [ + ":model_options", + ":model_spec", + "//mediapipe/model_maker/python/core:hyperparameters", + ], +) + +py_library( + name = "dataset", + srcs = ["dataset.py"], + deps = ["//mediapipe/model_maker/python/core/data:classification_dataset"], +) + +py_test( + name = "dataset_test", + srcs = ["dataset_test.py"], + deps = [":dataset"], +) + +py_library( + name = "preprocessor", + srcs = ["preprocessor.py"], + deps = [":dataset"], +) + +py_test( + name = "preprocessor_test", + srcs = ["preprocessor_test.py"], + tags = ["requires-net:external"], + deps = [ + ":dataset", + ":model_spec", + ":preprocessor", + ], +) + +py_library( + name = "text_classifier_options", + srcs = ["text_classifier_options.py"], + deps = [ + ":model_options", + ":model_spec", + "//mediapipe/model_maker/python/core:hyperparameters", + ], +) + +py_library( + name = "text_classifier", + srcs = ["text_classifier.py"], + deps = [ + ":dataset", + ":model_options", + ":model_spec", + ":preprocessor", + ":text_classifier_options", + "//mediapipe/model_maker/python/core:hyperparameters", + "//mediapipe/model_maker/python/core/data:dataset", + "//mediapipe/model_maker/python/core/tasks:classifier", + "//mediapipe/model_maker/python/core/utils:model_util", + "//mediapipe/model_maker/python/core/utils:quantization", + "//mediapipe/tasks/python/metadata/metadata_writers:metadata_writer", + "//mediapipe/tasks/python/metadata/metadata_writers:text_classifier", + ], +) + +py_test( + name = "text_classifier_test", + size = "large", + srcs = ["text_classifier_test.py"], + data = [ + "//mediapipe/model_maker/python/text/text_classifier/testdata", + ], + tags = ["requires-net:external"], + deps = [ + ":dataset", + ":model_options", + ":model_spec", + ":text_classifier", + ":text_classifier_options", + "//mediapipe/model_maker/python/core:hyperparameters", + "//mediapipe/tasks/python/test:test_utils", + ], +) + +py_library( + name = "text_classifier_demo_lib", + srcs = ["text_classifier_demo.py"], + deps = [ + ":dataset", + ":model_spec", + ":text_classifier", + ":text_classifier_options", + "//mediapipe/model_maker/python/core:hyperparameters", + "//mediapipe/model_maker/python/core/utils:quantization", + ], +) + +py_binary( + name = "text_classifier_demo", + srcs = ["text_classifier_demo.py"], + deps = [ + ":text_classifier_demo_lib", + ], +) diff --git a/mediapipe/model_maker/python/text/text_classifier/__init__.py b/mediapipe/model_maker/python/text/text_classifier/__init__.py new file mode 100644 index 000000000..7ca2f9216 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 The MediaPipe 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. diff --git a/mediapipe/model_maker/python/text/text_classifier/dataset.py b/mediapipe/model_maker/python/text/text_classifier/dataset.py new file mode 100644 index 000000000..3679b67ae --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/dataset.py @@ -0,0 +1,88 @@ +# Copyright 2022 The MediaPipe 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. +"""Text classifier dataset library.""" + +import csv +import dataclasses +import random + +from typing import Optional, Sequence +import tensorflow as tf + +from mediapipe.model_maker.python.core.data import classification_dataset + + +@dataclasses.dataclass +class CSVParameters: + """Parameters used when reading a CSV file. + + Attributes: + text_column: Column name for the input text. + label_column: Column name for the labels. + fieldnames: Sequence of keys for the CSV columns. If None, the first row of + the CSV file is used as the keys. + delimiter: Character that separates fields. + quotechar: Character used to quote fields that contain special characters + like the `delimiter`. + """ + text_column: str + label_column: str + fieldnames: Optional[Sequence[str]] = None + delimiter: str = "," + quotechar: str = '"' + + +class Dataset(classification_dataset.ClassificationDataset): + """Dataset library for text classifier.""" + + @classmethod + def from_csv(cls, + filename: str, + csv_params: CSVParameters, + shuffle: bool = True) -> "Dataset": + """Loads text with labels from a CSV file. + + Args: + filename: Name of the CSV file. + csv_params: Parameters used for reading the CSV file. + shuffle: If True, randomly shuffle the data. + + Returns: + Dataset containing (text, label) pairs and other related info. + """ + with tf.io.gfile.GFile(filename, "r") as f: + reader = csv.DictReader( + f, + fieldnames=csv_params.fieldnames, + delimiter=csv_params.delimiter, + quotechar=csv_params.quotechar) + + lines = list(reader) + if shuffle: + random.shuffle(lines) + + label_names = sorted(set([line[csv_params.label_column] for line in lines])) + index_by_label = {label: index for index, label in enumerate(label_names)} + + texts = [line[csv_params.text_column] for line in lines] + text_ds = tf.data.Dataset.from_tensor_slices(tf.cast(texts, tf.string)) + label_indices = [ + index_by_label[line[csv_params.label_column]] for line in lines + ] + label_index_ds = tf.data.Dataset.from_tensor_slices( + tf.cast(label_indices, tf.int64)) + text_label_ds = tf.data.Dataset.zip((text_ds, label_index_ds)) + + return Dataset( + dataset=text_label_ds, size=len(texts), label_names=label_names) diff --git a/mediapipe/model_maker/python/text/text_classifier/dataset_test.py b/mediapipe/model_maker/python/text/text_classifier/dataset_test.py new file mode 100644 index 000000000..ec9e8fa2d --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/dataset_test.py @@ -0,0 +1,75 @@ +# Copyright 2022 The MediaPipe 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. + +import csv +import os + +import tensorflow as tf + +from mediapipe.model_maker.python.text.text_classifier import dataset + + +class DatasetTest(tf.test.TestCase): + + def _get_csv_file(self): + labels_and_text = (('neutral', 'indifferent'), ('pos', 'extremely great'), + ('neg', 'totally awful'), ('pos', 'super good'), + ('neg', 'really bad')) + csv_file = os.path.join(self.get_temp_dir(), 'data.csv') + if os.path.exists(csv_file): + return csv_file + fieldnames = ['text', 'label'] + with open(csv_file, 'w') as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + for label, text in labels_and_text: + writer.writerow({'text': text, 'label': label}) + return csv_file + + def test_from_csv(self): + csv_file = self._get_csv_file() + csv_params = dataset.CSVParameters(text_column='text', label_column='label') + data = dataset.Dataset.from_csv(filename=csv_file, csv_params=csv_params) + self.assertLen(data, 5) + self.assertEqual(data.num_classes, 3) + self.assertEqual(data.label_names, ['neg', 'neutral', 'pos']) + data_values = set([(text.numpy()[0], label.numpy()[0]) + for text, label in data.gen_tf_dataset()]) + expected_data_values = set([(b'indifferent', 1), (b'extremely great', 2), + (b'totally awful', 0), (b'super good', 2), + (b'really bad', 0)]) + self.assertEqual(data_values, expected_data_values) + + def test_split(self): + ds = tf.data.Dataset.from_tensor_slices(['good', 'bad', 'neutral', 'odd']) + data = dataset.Dataset(ds, 4, ['pos', 'neg']) + train_data, test_data = data.split(0.5) + expected_train_data = [b'good', b'bad'] + expected_test_data = [b'neutral', b'odd'] + + self.assertLen(train_data, 2) + train_data_values = [elem.numpy() for elem in train_data._dataset] + self.assertEqual(train_data_values, expected_train_data) + self.assertEqual(train_data.num_classes, 2) + self.assertEqual(train_data.label_names, ['pos', 'neg']) + + self.assertLen(test_data, 2) + test_data_values = [elem.numpy() for elem in test_data._dataset] + self.assertEqual(test_data_values, expected_test_data) + self.assertEqual(test_data.num_classes, 2) + self.assertEqual(test_data.label_names, ['pos', 'neg']) + + +if __name__ == '__main__': + tf.test.main() diff --git a/mediapipe/model_maker/python/text/text_classifier/model_options.py b/mediapipe/model_maker/python/text/text_classifier/model_options.py new file mode 100644 index 000000000..b48e38da1 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/model_options.py @@ -0,0 +1,45 @@ +# Copyright 2022 The MediaPipe 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. +"""Configurable model options for text classifier models.""" + +import dataclasses +from typing import Union + +from mediapipe.model_maker.python.text.core import bert_model_options + +# BERT text classifier options inherited from BertModelOptions. +BertClassifierOptions = bert_model_options.BertModelOptions + + +@dataclasses.dataclass +class AverageWordEmbeddingClassifierOptions: + """Configurable model options for an Average Word Embedding classifier. + + Attributes: + seq_len: Length of the sequence to feed into the model. + wordvec_dim: Dimension of the word embedding. + do_lower_case: Whether to convert all uppercase characters to lowercase + during preprocessing. + vocab_size: Number of words to generate the vocabulary from data. + dropout_rate: The rate for dropout. + """ + seq_len: int = 256 + wordvec_dim: int = 16 + do_lower_case: bool = True + vocab_size: int = 10000 + dropout_rate: float = 0.2 + + +TextClassifierModelOptions = Union[AverageWordEmbeddingClassifierOptions, + BertClassifierOptions] diff --git a/mediapipe/model_maker/python/text/text_classifier/model_spec.py b/mediapipe/model_maker/python/text/text_classifier/model_spec.py new file mode 100644 index 000000000..c2694786c --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/model_spec.py @@ -0,0 +1,70 @@ +# Copyright 2022 The MediaPipe 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. +"""Specifications for text classifier models.""" + +import dataclasses +import enum +import functools + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.text.core import bert_model_spec +from mediapipe.model_maker.python.text.text_classifier import model_options as mo + +# BERT-based text classifier spec inherited from BertModelSpec +BertClassifierSpec = bert_model_spec.BertModelSpec + + +@dataclasses.dataclass +class AverageWordEmbeddingClassifierSpec: + """Specification for an average word embedding classifier model. + + Attributes: + hparams: Configurable hyperparameters for training. + model_options: Configurable options for the average word embedding model. + name: The name of the object. + """ + + # `learning_rate` is unused for the average word embedding model + hparams: hp.BaseHParams = hp.BaseHParams( + epochs=10, batch_size=32, learning_rate=0) + model_options: mo.AverageWordEmbeddingClassifierOptions = ( + mo.AverageWordEmbeddingClassifierOptions()) + name: str = 'AverageWordEmbedding' + + +average_word_embedding_classifier_spec = functools.partial( + AverageWordEmbeddingClassifierSpec) + +mobilebert_classifier_spec = functools.partial( + BertClassifierSpec, + hparams=hp.BaseHParams( + epochs=3, + batch_size=48, + learning_rate=3e-5, + distribution_strategy='off'), + name='MobileBert', + uri='https://tfhub.dev/tensorflow/mobilebert_en_uncased_L-24_H-128_B-512_A-4_F-4_OPT/1', + tflite_input_name={ + 'ids': 'serving_default_input_1:0', + 'mask': 'serving_default_input_3:0', + 'segment_ids': 'serving_default_input_2:0' + }, +) + + +@enum.unique +class SupportedModels(enum.Enum): + """Predefined text classifier model specs supported by Model Maker.""" + AVERAGE_WORD_EMBEDDING_CLASSIFIER = average_word_embedding_classifier_spec + MOBILEBERT_CLASSIFIER = mobilebert_classifier_spec diff --git a/mediapipe/model_maker/python/text/text_classifier/model_spec_test.py b/mediapipe/model_maker/python/text/text_classifier/model_spec_test.py new file mode 100644 index 000000000..118b84fdc --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/model_spec_test.py @@ -0,0 +1,118 @@ +# Copyright 2022 The MediaPipe 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 model_spec.""" + +import os + +import tensorflow as tf + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.text.text_classifier import model_options as classifier_model_options +from mediapipe.model_maker.python.text.text_classifier import model_spec as ms + + +class ModelSpecTest(tf.test.TestCase): + + def test_predefined_bert_spec(self): + model_spec_obj = ms.SupportedModels.MOBILEBERT_CLASSIFIER.value() + self.assertIsInstance(model_spec_obj, ms.BertClassifierSpec) + self.assertEqual(model_spec_obj.name, 'MobileBert') + self.assertEqual( + model_spec_obj.uri, 'https://tfhub.dev/tensorflow/' + 'mobilebert_en_uncased_L-24_H-128_B-512_A-4_F-4_OPT/1') + self.assertTrue(model_spec_obj.do_lower_case) + self.assertEqual( + model_spec_obj.tflite_input_name, { + 'ids': 'serving_default_input_1:0', + 'mask': 'serving_default_input_3:0', + 'segment_ids': 'serving_default_input_2:0' + }) + self.assertEqual( + model_spec_obj.model_options, + classifier_model_options.BertClassifierOptions( + seq_len=128, do_fine_tuning=True, dropout_rate=0.1)) + self.assertEqual( + model_spec_obj.hparams, + hp.BaseHParams( + epochs=3, + batch_size=48, + learning_rate=3e-5, + distribution_strategy='off')) + + def test_predefined_average_word_embedding_spec(self): + model_spec_obj = ( + ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER.value()) + self.assertIsInstance(model_spec_obj, ms.AverageWordEmbeddingClassifierSpec) + self.assertEqual(model_spec_obj.name, 'AverageWordEmbedding') + self.assertEqual( + model_spec_obj.model_options, + classifier_model_options.AverageWordEmbeddingClassifierOptions( + seq_len=256, + wordvec_dim=16, + do_lower_case=True, + vocab_size=10000, + dropout_rate=0.2)) + self.assertEqual( + model_spec_obj.hparams, + hp.BaseHParams( + epochs=10, + batch_size=32, + learning_rate=0, + steps_per_epoch=None, + shuffle=False, + distribution_strategy='off', + num_gpus=-1, + tpu='')) + + def test_custom_bert_spec(self): + custom_bert_classifier_options = ( + classifier_model_options.BertClassifierOptions( + seq_len=512, do_fine_tuning=False, dropout_rate=0.3)) + model_spec_obj = ( + ms.SupportedModels.MOBILEBERT_CLASSIFIER.value( + model_options=custom_bert_classifier_options)) + self.assertEqual(model_spec_obj.model_options, + custom_bert_classifier_options) + + def test_custom_average_word_embedding_spec(self): + custom_hparams = hp.BaseHParams( + learning_rate=0.4, + batch_size=64, + epochs=10, + steps_per_epoch=10, + shuffle=True, + export_dir='foo/bar', + distribution_strategy='mirrored', + num_gpus=3, + tpu='tpu/address') + custom_average_word_embedding_model_options = ( + classifier_model_options.AverageWordEmbeddingClassifierOptions( + seq_len=512, + wordvec_dim=32, + do_lower_case=False, + vocab_size=5000, + dropout_rate=0.5)) + model_spec_obj = ( + ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER.value( + model_options=custom_average_word_embedding_model_options, + hparams=custom_hparams)) + self.assertEqual(model_spec_obj.model_options, + custom_average_word_embedding_model_options) + self.assertEqual(model_spec_obj.hparams, custom_hparams) + + +if __name__ == '__main__': + # Load compressed models from tensorflow_hub + os.environ['TFHUB_MODEL_LOAD_FORMAT'] = 'COMPRESSED' + tf.test.main() diff --git a/mediapipe/model_maker/python/text/text_classifier/preprocessor.py b/mediapipe/model_maker/python/text/text_classifier/preprocessor.py new file mode 100644 index 000000000..0a48f459c --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/preprocessor.py @@ -0,0 +1,285 @@ +# Copyright 2022 The MediaPipe 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. +# ============================================================================== +"""Preprocessors for text classification.""" + +import collections +import os +import re +import tempfile +from typing import Mapping, Sequence, Tuple, Union + +import tensorflow as tf +import tensorflow_hub + +from mediapipe.model_maker.python.text.text_classifier import dataset as text_classifier_ds +from official.nlp.data import classifier_data_lib +from official.nlp.tools import tokenization + + +def _validate_text_and_label(text: tf.Tensor, label: tf.Tensor) -> None: + """Validates the shape and type of `text` and `label`. + + Args: + text: Stores text data. Should have shape [1] and dtype tf.string. + label: Stores the label for the corresponding `text`. Should have shape [1] + and dtype tf.int64. + + Raises: + ValueError: If either tensor has the wrong shape or type. + """ + if text.shape != [1]: + raise ValueError(f"`text` should have shape [1], got {text.shape}") + if text.dtype != tf.string: + raise ValueError(f"Expected dtype string for `text`, got {text.dtype}") + if label.shape != [1]: + raise ValueError(f"`label` should have shape [1], got {text.shape}") + if label.dtype != tf.int64: + raise ValueError(f"Expected dtype int64 for `label`, got {label.dtype}") + + +def _decode_record( + record: tf.Tensor, name_to_features: Mapping[str, tf.io.FixedLenFeature] +) -> Tuple[Mapping[str, tf.Tensor], tf.Tensor]: + """Decodes a record into input for a BERT model. + + Args: + record: Stores serialized example. + name_to_features: Maps record keys to feature types. + + Returns: + BERT model input features and label for the record. + """ + example = tf.io.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + for name in list(example.keys()): + example[name] = tf.cast(example[name], tf.int32) + + bert_features = { + "input_word_ids": example["input_ids"], + "input_mask": example["input_mask"], + "input_type_ids": example["segment_ids"] + } + return bert_features, example["label_ids"] + + +def _single_file_dataset( + input_file: str, name_to_features: Mapping[str, tf.io.FixedLenFeature] +) -> tf.data.TFRecordDataset: + """Creates a single-file dataset to be passed for BERT custom training. + + Args: + input_file: Filepath for the dataset. + name_to_features: Maps record keys to feature types. + + Returns: + Dataset containing BERT model input features and labels. + """ + d = tf.data.TFRecordDataset(input_file) + d = d.map( + lambda record: _decode_record(record, name_to_features), + num_parallel_calls=tf.data.AUTOTUNE) + return d + + +class AverageWordEmbeddingClassifierPreprocessor: + """Preprocessor for an Average Word Embedding model. + + Takes (text, label) data and applies regex tokenization and padding to the + text to generate (token IDs, label) data. + + Attributes: + seq_len: Length of the input sequence to the model. + do_lower_case: Whether text inputs should be converted to lower-case. + vocab: Vocabulary of tokens used by the model. + """ + + PAD: str = "" # Index: 0 + START: str = "" # Index: 1 + UNKNOWN: str = "" # Index: 2 + + def __init__(self, seq_len: int, do_lower_case: bool, texts: Sequence[str], + vocab_size: int): + self._seq_len = seq_len + self._do_lower_case = do_lower_case + self._vocab = self._gen_vocab(texts, vocab_size) + + def _gen_vocab(self, texts: Sequence[str], + vocab_size: int) -> Mapping[str, int]: + """Generates vocabulary list in `texts` with size `vocab_size`. + + Args: + texts: All texts (across training and validation data) that will be + preprocessed by the model. + vocab_size: Size of the vocab. + + Returns: + The vocab mapping tokens to IDs. + """ + vocab_counter = collections.Counter() + + for text in texts: + tokens = self._regex_tokenize(text) + for token in tokens: + vocab_counter[token] += 1 + + vocab_freq = vocab_counter.most_common(vocab_size) + vocab_list = [self.PAD, self.START, self.UNKNOWN + ] + [word for word, _ in vocab_freq] + return collections.OrderedDict(((v, i) for i, v in enumerate(vocab_list))) + + def get_vocab(self) -> Mapping[str, int]: + """Returns the vocab of the AverageWordEmbeddingClassifierPreprocessor.""" + return self._vocab + + # TODO: Align with MediaPipe's RegexTokenizer. + def _regex_tokenize(self, text: str) -> Sequence[str]: + """Splits `text` by words but does not split on single quotes. + + Args: + text: Text to be tokenized. + + Returns: + List of tokens. + """ + text = tf.compat.as_text(text) + if self._do_lower_case: + text = text.lower() + tokens = re.compile(r"[^\w\']+").split(text.strip()) + # Filters out any empty strings in `tokens`. + return list(filter(None, tokens)) + + def _tokenize_and_pad(self, text: str) -> Sequence[int]: + """Tokenizes `text` and pads the tokens to `seq_len`. + + Args: + text: Text to be tokenized and padded. + + Returns: + List of token IDs padded to have length `seq_len`. + """ + tokens = self._regex_tokenize(text) + + # Gets ids for START, PAD and UNKNOWN tokens. + start_id = self._vocab[self.START] + pad_id = self._vocab[self.PAD] + unknown_id = self._vocab[self.UNKNOWN] + + token_ids = [self._vocab.get(token, unknown_id) for token in tokens] + token_ids = [start_id] + token_ids + + if len(token_ids) < self._seq_len: + pad_length = self._seq_len - len(token_ids) + token_ids = token_ids + pad_length * [pad_id] + else: + token_ids = token_ids[:self._seq_len] + return token_ids + + def preprocess( + self, dataset: text_classifier_ds.Dataset) -> text_classifier_ds.Dataset: + """Preprocesses data into input for an Average Word Embedding model. + + Args: + dataset: Stores (text, label) data. + + Returns: + Dataset containing (token IDs, label) data. + """ + token_ids_list = [] + labels_list = [] + for text, label in dataset.gen_tf_dataset(): + _validate_text_and_label(text, label) + token_ids = self._tokenize_and_pad(text.numpy()[0].decode("utf-8")) + token_ids_list.append(token_ids) + labels_list.append(label.numpy()[0]) + + token_ids_ds = tf.data.Dataset.from_tensor_slices(token_ids_list) + labels_ds = tf.data.Dataset.from_tensor_slices(labels_list) + preprocessed_ds = tf.data.Dataset.zip((token_ids_ds, labels_ds)) + return text_classifier_ds.Dataset( + dataset=preprocessed_ds, + size=dataset.size, + label_names=dataset.label_names) + + +class BertClassifierPreprocessor: + """Preprocessor for a BERT-based classifier. + + Attributes: + seq_len: Length of the input sequence to the model. + vocab_file: File containing the BERT vocab. + tokenizer: BERT tokenizer. + """ + + def __init__(self, seq_len: int, do_lower_case: bool, uri: str): + self._seq_len = seq_len + # Vocab filepath is tied to the BERT module's URI. + self._vocab_file = os.path.join( + tensorflow_hub.resolve(uri), "assets", "vocab.txt") + self._tokenizer = tokenization.FullTokenizer(self._vocab_file, + do_lower_case) + + def _get_name_to_features(self): + """Gets the dictionary mapping record keys to feature types.""" + return { + "input_ids": tf.io.FixedLenFeature([self._seq_len], tf.int64), + "input_mask": tf.io.FixedLenFeature([self._seq_len], tf.int64), + "segment_ids": tf.io.FixedLenFeature([self._seq_len], tf.int64), + "label_ids": tf.io.FixedLenFeature([], tf.int64), + } + + def get_vocab_file(self) -> str: + """Returns the vocab file of the BertClassifierPreprocessor.""" + return self._vocab_file + + def preprocess( + self, dataset: text_classifier_ds.Dataset) -> text_classifier_ds.Dataset: + """Preprocesses data into input for a BERT-based classifier. + + Args: + dataset: Stores (text, label) data. + + Returns: + Dataset containing (bert_features, label) data. + """ + examples = [] + for index, (text, label) in enumerate(dataset.gen_tf_dataset()): + _validate_text_and_label(text, label) + examples.append( + classifier_data_lib.InputExample( + guid=str(index), + text_a=text.numpy()[0].decode("utf-8"), + text_b=None, + # InputExample expects the label name rather than the int ID + label=dataset.label_names[label.numpy()[0]])) + + tfrecord_file = os.path.join(tempfile.mkdtemp(), "bert_features.tfrecord") + classifier_data_lib.file_based_convert_examples_to_features( + examples=examples, + label_list=dataset.label_names, + max_seq_length=self._seq_len, + tokenizer=self._tokenizer, + output_file=tfrecord_file) + preprocessed_ds = _single_file_dataset(tfrecord_file, + self._get_name_to_features()) + return text_classifier_ds.Dataset( + dataset=preprocessed_ds, + size=dataset.size, + label_names=dataset.label_names) + + +TextClassifierPreprocessor = ( + Union[BertClassifierPreprocessor, + AverageWordEmbeddingClassifierPreprocessor]) diff --git a/mediapipe/model_maker/python/text/text_classifier/preprocessor_test.py b/mediapipe/model_maker/python/text/text_classifier/preprocessor_test.py new file mode 100644 index 000000000..b9558b2b5 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/preprocessor_test.py @@ -0,0 +1,96 @@ +# Copyright 2022 The MediaPipe 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. + +import csv +import os + +import numpy as np +import numpy.testing as npt +import tensorflow as tf + +from mediapipe.model_maker.python.text.text_classifier import dataset as text_classifier_ds +from mediapipe.model_maker.python.text.text_classifier import model_spec +from mediapipe.model_maker.python.text.text_classifier import preprocessor + + +class PreprocessorTest(tf.test.TestCase): + CSV_PARAMS_ = text_classifier_ds.CSVParameters( + text_column='text', label_column='label') + + def _get_csv_file(self): + labels_and_text = (('pos', 'super super super super good'), + (('neg', 'really bad'))) + csv_file = os.path.join(self.get_temp_dir(), 'data.csv') + if os.path.exists(csv_file): + return csv_file + fieldnames = ['text', 'label'] + with open(csv_file, 'w') as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + for label, text in labels_and_text: + writer.writerow({'text': text, 'label': label}) + return csv_file + + def test_average_word_embedding_preprocessor(self): + csv_file = self._get_csv_file() + dataset = text_classifier_ds.Dataset.from_csv( + filename=csv_file, csv_params=self.CSV_PARAMS_) + average_word_embedding_preprocessor = ( + preprocessor.AverageWordEmbeddingClassifierPreprocessor( + seq_len=5, + do_lower_case=True, + texts=['super super super super good', 'really bad'], + vocab_size=7)) + preprocessed_dataset = ( + average_word_embedding_preprocessor.preprocess(dataset)) + labels = [] + features_list = [] + for features, label in preprocessed_dataset.gen_tf_dataset(): + self.assertEqual(label.shape, [1]) + labels.append(label.numpy()[0]) + self.assertEqual(features.shape, [1, 5]) + features_list.append(features.numpy()[0]) + self.assertEqual(labels, [1, 0]) + npt.assert_array_equal( + np.stack(features_list), np.array([[1, 3, 3, 3, 3], [1, 5, 6, 0, 0]])) + + def test_bert_preprocessor(self): + csv_file = self._get_csv_file() + dataset = text_classifier_ds.Dataset.from_csv( + filename=csv_file, csv_params=self.CSV_PARAMS_) + bert_spec = model_spec.SupportedModels.MOBILEBERT_CLASSIFIER.value() + bert_preprocessor = preprocessor.BertClassifierPreprocessor( + seq_len=5, do_lower_case=bert_spec.do_lower_case, uri=bert_spec.uri) + preprocessed_dataset = bert_preprocessor.preprocess(dataset) + labels = [] + input_masks = [] + for features, label in preprocessed_dataset.gen_tf_dataset(): + self.assertEqual(label.shape, [1]) + labels.append(label.numpy()[0]) + self.assertSameElements( + features.keys(), ['input_word_ids', 'input_mask', 'input_type_ids']) + for feature in features.values(): + self.assertEqual(feature.shape, [1, 5]) + input_masks.append(features['input_mask'].numpy()[0]) + npt.assert_array_equal(features['input_type_ids'].numpy()[0], + [0, 0, 0, 0, 0]) + npt.assert_array_equal( + np.stack(input_masks), np.array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 0]])) + self.assertEqual(labels, [1, 0]) + + +if __name__ == '__main__': + # Load compressed models from tensorflow_hub + os.environ['TFHUB_MODEL_LOAD_FORMAT'] = 'COMPRESSED' + tf.test.main() diff --git a/mediapipe/model_maker/python/text/text_classifier/testdata/BUILD b/mediapipe/model_maker/python/text/text_classifier/testdata/BUILD new file mode 100644 index 000000000..663c72082 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/testdata/BUILD @@ -0,0 +1,23 @@ +# Copyright 2022 The MediaPipe 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. + +package( + default_visibility = ["//mediapipe/model_maker/python/text/text_classifier:__subpackages__"], + licenses = ["notice"], # Apache 2.0 +) + +filegroup( + name = "testdata", + srcs = ["average_word_embedding_metadata.json"], +) diff --git a/mediapipe/model_maker/python/text/text_classifier/testdata/average_word_embedding_metadata.json b/mediapipe/model_maker/python/text/text_classifier/testdata/average_word_embedding_metadata.json new file mode 100644 index 000000000..bf5cb3640 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/testdata/average_word_embedding_metadata.json @@ -0,0 +1,63 @@ +{ + "name": "TextClassifier", + "description": "Classify the input text into a set of known categories.", + "subgraph_metadata": [ + { + "input_tensor_metadata": [ + { + "name": "input_text", + "description": "Embedding vectors representing the input text to be processed.", + "content": { + "content_properties_type": "FeatureProperties", + "content_properties": { + } + }, + "process_units": [ + { + "options_type": "RegexTokenizerOptions", + "options": { + "delim_regex_pattern": "[^\\w\\']+", + "vocab_file": [ + { + "name": "vocab.txt", + "description": "Vocabulary file to convert natural language words to embedding vectors.", + "type": "VOCABULARY" + } + ] + } + } + ], + "stats": { + } + } + ], + "output_tensor_metadata": [ + { + "name": "score", + "description": "Score of the labels respectively.", + "content": { + "content_properties_type": "FeatureProperties", + "content_properties": { + } + }, + "stats": { + "max": [ + 1.0 + ], + "min": [ + 0.0 + ] + }, + "associated_files": [ + { + "name": "labels.txt", + "description": "Labels for categories that the model can recognize.", + "type": "TENSOR_AXIS_LABELS" + } + ] + } + ] + } + ], + "min_parser_version": "1.2.1" +} diff --git a/mediapipe/model_maker/python/text/text_classifier/text_classifier.py b/mediapipe/model_maker/python/text/text_classifier/text_classifier.py new file mode 100644 index 000000000..919277b8a --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/text_classifier.py @@ -0,0 +1,437 @@ +# Copyright 2022 The MediaPipe 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. +"""API for text classification.""" + +import abc +import os +import tempfile +from typing import Any, Optional, Sequence, Tuple + +import tensorflow as tf +import tensorflow_hub as hub + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.core.data import dataset as ds +from mediapipe.model_maker.python.core.tasks import classifier +from mediapipe.model_maker.python.core.utils import model_util +from mediapipe.model_maker.python.core.utils import quantization +from mediapipe.model_maker.python.text.text_classifier import dataset as text_ds +from mediapipe.model_maker.python.text.text_classifier import model_options as mo +from mediapipe.model_maker.python.text.text_classifier import model_spec as ms +from mediapipe.model_maker.python.text.text_classifier import preprocessor +from mediapipe.model_maker.python.text.text_classifier import text_classifier_options +from mediapipe.tasks.python.metadata.metadata_writers import metadata_writer +from mediapipe.tasks.python.metadata.metadata_writers import text_classifier as text_classifier_writer +from official.nlp import optimization + + +def _validate(options: text_classifier_options.TextClassifierOptions): + """Validates that `model_options` and `supported_model` are compatible. + + Args: + options: Options for creating and training a text classifier. + + Raises: + ValueError if there is a mismatch between `model_options` and + `supported_model`. + """ + + if options.model_options is None: + return + + if (isinstance(options.model_options, + mo.AverageWordEmbeddingClassifierOptions) and + (options.supported_model != + ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER)): + raise ValueError("Expected AVERAGE_WORD_EMBEDDING_CLASSIFIER," + f" got {options.supported_model}") + if (isinstance(options.model_options, mo.BertClassifierOptions) and + (options.supported_model != ms.SupportedModels.MOBILEBERT_CLASSIFIER)): + raise ValueError( + f"Expected MOBILEBERT_CLASSIFIER, got {options.supported_model}") + + +class TextClassifier(classifier.Classifier): + """API for creating and training a text classification model.""" + + def __init__(self, model_spec: Any, hparams: hp.BaseHParams, + label_names: Sequence[str]): + super().__init__( + model_spec=model_spec, label_names=label_names, shuffle=hparams.shuffle) + self._model_spec = model_spec + self._hparams = hparams + self._callbacks = model_util.get_default_callbacks(self._hparams.export_dir) + self._text_preprocessor: preprocessor.TextClassifierPreprocessor = None + + @classmethod + def create( + cls, train_data: text_ds.Dataset, validation_data: text_ds.Dataset, + options: text_classifier_options.TextClassifierOptions + ) -> "TextClassifier": + """Factory function that creates and trains a text classifier. + + Note that `train_data` and `validation_data` are expected to share the same + `label_names` since they should be split from the same dataset. + + Args: + train_data: Training data. + validation_data: Validation data. + options: Options for creating and training the text classifier. + + Returns: + A text classifier. + + Raises: + ValueError if `train_data` and `validation_data` do not have the + same label_names or `options` contains an unknown `supported_model` + """ + if train_data.label_names != validation_data.label_names: + raise ValueError( + f"Training data label names {train_data.label_names} not equal to " + f"validation data label names {validation_data.label_names}") + + _validate(options) + if options.model_options is None: + options.model_options = options.supported_model.value().model_options + + if options.hparams is None: + options.hparams = options.supported_model.value().hparams + + if options.supported_model == ms.SupportedModels.MOBILEBERT_CLASSIFIER: + text_classifier = ( + _BertClassifier.create_bert_classifier(train_data, validation_data, + options, + train_data.label_names)) + elif (options.supported_model == + ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER): + text_classifier = ( + _AverageWordEmbeddingClassifier + .create_average_word_embedding_classifier(train_data, validation_data, + options, + train_data.label_names)) + else: + raise ValueError(f"Unknown model {options.supported_model}") + + return text_classifier + + def evaluate(self, data: ds.Dataset, batch_size: int = 32) -> Any: + """Overrides Classifier.evaluate(). + + Args: + data: Evaluation dataset. Must be a TextClassifier Dataset. + batch_size: Number of samples per evaluation step. + + Returns: + The loss value and accuracy. + + Raises: + ValueError if `data` is not a TextClassifier Dataset. + """ + # This override is needed because TextClassifier preprocesses its data + # outside of the `gen_tf_dataset()` method. The preprocess call also + # requires a TextClassifier Dataset instead of a core Dataset. + if not isinstance(data, text_ds.Dataset): + raise ValueError("Need a TextClassifier Dataset.") + + processed_data = self._text_preprocessor.preprocess(data) + dataset = processed_data.gen_tf_dataset(batch_size, is_training=False) + return self._model.evaluate(dataset) + + def export_model( + self, + model_name: str = "model.tflite", + quantization_config: Optional[quantization.QuantizationConfig] = None): + """Converts and saves the model to a TFLite file with metadata included. + + Note that only the TFLite file is needed for deployment. This function also + saves a metadata.json file to the same directory as the TFLite file which + can be used to interpret the metadata content in the TFLite file. + + Args: + model_name: File name to save TFLite model with metadata. The full export + path is {self._hparams.export_dir}/{model_name}. + quantization_config: The configuration for model quantization. + """ + if not tf.io.gfile.exists(self._hparams.export_dir): + tf.io.gfile.makedirs(self._hparams.export_dir) + tflite_file = os.path.join(self._hparams.export_dir, model_name) + metadata_file = os.path.join(self._hparams.export_dir, "metadata.json") + + tflite_model = model_util.convert_to_tflite( + model=self._model, quantization_config=quantization_config) + vocab_filepath = os.path.join(tempfile.mkdtemp(), "vocab.txt") + self._save_vocab(vocab_filepath) + + writer = self._get_metadata_writer(tflite_model, vocab_filepath) + tflite_model_with_metadata, metadata_json = writer.populate() + model_util.save_tflite(tflite_model_with_metadata, tflite_file) + with open(metadata_file, "w") as f: + f.write(metadata_json) + + @abc.abstractmethod + def _save_vocab(self, vocab_filepath: str): + """Saves the preprocessor's vocab to `vocab_filepath`.""" + + @abc.abstractmethod + def _get_metadata_writer(self, tflite_model: bytearray, vocab_filepath: str): + """Gets the metadata writer for the text classifier TFLite model.""" + + +class _AverageWordEmbeddingClassifier(TextClassifier): + """APIs to help create and train an Average Word Embedding text classifier.""" + + _DELIM_REGEX_PATTERN = r"[^\w\']+" + + def __init__(self, model_spec: ms.AverageWordEmbeddingClassifierSpec, + model_options: mo.AverageWordEmbeddingClassifierOptions, + hparams: hp.BaseHParams, label_names: Sequence[str]): + super().__init__(model_spec, hparams, label_names) + self._model_options = model_options + self._loss_function = "sparse_categorical_crossentropy" + self._metric_function = "accuracy" + self._text_preprocessor: ( + preprocessor.AverageWordEmbeddingClassifierPreprocessor) = None + + @classmethod + def create_average_word_embedding_classifier( + cls, train_data: text_ds.Dataset, validation_data: text_ds.Dataset, + options: text_classifier_options.TextClassifierOptions, + label_names: Sequence[str]) -> "_AverageWordEmbeddingClassifier": + """Creates, trains, and returns an Average Word Embedding classifier. + + Args: + train_data: Training data. + validation_data: Validation data. + options: Options for creating and training the text classifier. + label_names: Label names used in the data. + + Returns: + An Average Word Embedding classifier. + """ + average_word_embedding_classifier = _AverageWordEmbeddingClassifier( + model_spec=options.supported_model.value(), + model_options=options.model_options, + hparams=options.hparams, + label_names=train_data.label_names) + average_word_embedding_classifier._create_and_train_model( + train_data, validation_data) + return average_word_embedding_classifier + + def _create_and_train_model(self, train_data: text_ds.Dataset, + validation_data: text_ds.Dataset): + """Creates the Average Word Embedding classifier keras model and trains it. + + Args: + train_data: Training data. + validation_data: Validation data. + """ + (processed_train_data, processed_validation_data) = ( + self._load_and_run_preprocessor(train_data, validation_data)) + self._create_model() + self._optimizer = "rmsprop" + self._train_model(processed_train_data, processed_validation_data) + + def _load_and_run_preprocessor( + self, train_data: text_ds.Dataset, validation_data: text_ds.Dataset + ) -> Tuple[text_ds.Dataset, text_ds.Dataset]: + """Runs an AverageWordEmbeddingClassifierPreprocessor on the data. + + Args: + train_data: Training data. + validation_data: Validation data. + + Returns: + Preprocessed training data and preprocessed validation data. + """ + train_texts = [text.numpy()[0] for text, _ in train_data.gen_tf_dataset()] + validation_texts = [ + text.numpy()[0] for text, _ in validation_data.gen_tf_dataset() + ] + self._text_preprocessor = ( + preprocessor.AverageWordEmbeddingClassifierPreprocessor( + seq_len=self._model_options.seq_len, + do_lower_case=self._model_options.do_lower_case, + texts=train_texts + validation_texts, + vocab_size=self._model_options.vocab_size)) + return self._text_preprocessor.preprocess( + train_data), self._text_preprocessor.preprocess(validation_data) + + def _create_model(self): + """Creates an Average Word Embedding model.""" + self._model = tf.keras.Sequential([ + tf.keras.layers.InputLayer( + input_shape=[self._model_options.seq_len], dtype=tf.int32), + tf.keras.layers.Embedding( + len(self._text_preprocessor.get_vocab()), + self._model_options.wordvec_dim, + input_length=self._model_options.seq_len), + tf.keras.layers.GlobalAveragePooling1D(), + tf.keras.layers.Dense( + self._model_options.wordvec_dim, activation=tf.nn.relu), + tf.keras.layers.Dropout(self._model_options.dropout_rate), + tf.keras.layers.Dense(self._num_classes, activation="softmax") + ]) + + def _save_vocab(self, vocab_filepath: str): + with tf.io.gfile.GFile(vocab_filepath, "w") as f: + for token, index in self._text_preprocessor.get_vocab().items(): + f.write(f"{token} {index}\n") + + def _get_metadata_writer(self, tflite_model: bytearray, vocab_filepath: str): + return text_classifier_writer.MetadataWriter.create_for_regex_model( + model_buffer=tflite_model, + regex_tokenizer=metadata_writer.RegexTokenizer( + # TODO: Align with MediaPipe's RegexTokenizer. + delim_regex_pattern=self._DELIM_REGEX_PATTERN, + vocab_file_path=vocab_filepath), + labels=metadata_writer.Labels().add(list(self._label_names))) + + +class _BertClassifier(TextClassifier): + """APIs to help create and train a BERT-based text classifier.""" + + _INITIALIZER_RANGE = 0.02 + + def __init__(self, model_spec: ms.BertClassifierSpec, + model_options: mo.BertClassifierOptions, hparams: hp.BaseHParams, + label_names: Sequence[str]): + super().__init__(model_spec, hparams, label_names) + self._model_options = model_options + self._loss_function = tf.keras.losses.SparseCategoricalCrossentropy() + self._metric_function = tf.keras.metrics.SparseCategoricalAccuracy( + "test_accuracy", dtype=tf.float32) + self._text_preprocessor: preprocessor.BertClassifierPreprocessor = None + + @classmethod + def create_bert_classifier( + cls, train_data: text_ds.Dataset, validation_data: text_ds.Dataset, + options: text_classifier_options.TextClassifierOptions, + label_names: Sequence[str]) -> "_BertClassifier": + """Creates, trains, and returns a BERT-based classifier. + + Args: + train_data: Training data. + validation_data: Validation data. + options: Options for creating and training the text classifier. + label_names: Label names used in the data. + + Returns: + A BERT-based classifier. + """ + bert_classifier = _BertClassifier( + model_spec=options.supported_model.value(), + model_options=options.model_options, + hparams=options.hparams, + label_names=train_data.label_names) + bert_classifier._create_and_train_model(train_data, validation_data) + return bert_classifier + + def _create_and_train_model(self, train_data: text_ds.Dataset, + validation_data: text_ds.Dataset): + """Creates the BERT-based classifier keras model and trains it. + + Args: + train_data: Training data. + validation_data: Validation data. + """ + (processed_train_data, processed_validation_data) = ( + self._load_and_run_preprocessor(train_data, validation_data)) + self._create_model() + self._create_optimizer(processed_train_data) + self._train_model(processed_train_data, processed_validation_data) + + def _load_and_run_preprocessor( + self, train_data: text_ds.Dataset, validation_data: text_ds.Dataset + ) -> Tuple[text_ds.Dataset, text_ds.Dataset]: + """Loads a BertClassifierPreprocessor and runs it on the data. + + Args: + train_data: Training data. + validation_data: Validation data. + + Returns: + Preprocessed training data and preprocessed validation data. + """ + self._text_preprocessor = preprocessor.BertClassifierPreprocessor( + seq_len=self._model_options.seq_len, + do_lower_case=self._model_spec.do_lower_case, + uri=self._model_spec.uri) + return (self._text_preprocessor.preprocess(train_data), + self._text_preprocessor.preprocess(validation_data)) + + def _create_model(self): + """Creates a BERT-based classifier model. + + The model architecture consists of stacking a dense classification layer and + dropout layer on top of the BERT encoder outputs. + """ + encoder_inputs = dict( + input_word_ids=tf.keras.layers.Input( + shape=(self._model_options.seq_len,), dtype=tf.int32), + input_mask=tf.keras.layers.Input( + shape=(self._model_options.seq_len,), dtype=tf.int32), + input_type_ids=tf.keras.layers.Input( + shape=(self._model_options.seq_len,), dtype=tf.int32), + ) + encoder = hub.KerasLayer( + self._model_spec.uri, trainable=self._model_options.do_fine_tuning) + encoder_outputs = encoder(encoder_inputs) + pooled_output = encoder_outputs["pooled_output"] + + output = tf.keras.layers.Dropout(rate=self._model_options.dropout_rate)( + pooled_output) + initializer = tf.keras.initializers.TruncatedNormal( + stddev=self._INITIALIZER_RANGE) + output = tf.keras.layers.Dense( + self._num_classes, + kernel_initializer=initializer, + name="output", + activation="softmax", + dtype=tf.float32)( + output) + self._model = tf.keras.Model(inputs=encoder_inputs, outputs=output) + + def _create_optimizer(self, train_data: text_ds.Dataset): + """Loads an optimizer with a learning rate schedule. + + The decay steps in the learning rate schedule depend on the + `steps_per_epoch` which may depend on the size of the training data. + + Args: + train_data: Training data. + """ + self._hparams.steps_per_epoch = model_util.get_steps_per_epoch( + steps_per_epoch=self._hparams.steps_per_epoch, + batch_size=self._hparams.batch_size, + train_data=train_data) + total_steps = self._hparams.steps_per_epoch * self._hparams.epochs + warmup_steps = int(total_steps * 0.1) + initial_lr = self._hparams.learning_rate + self._optimizer = optimization.create_optimizer(initial_lr, total_steps, + warmup_steps) + + def _save_vocab(self, vocab_filepath: str): + tf.io.gfile.copy( + self._text_preprocessor.get_vocab_file(), + vocab_filepath, + overwrite=True) + + def _get_metadata_writer(self, tflite_model: bytearray, vocab_filepath: str): + return text_classifier_writer.MetadataWriter.create_for_bert_model( + model_buffer=tflite_model, + tokenizer=metadata_writer.BertTokenizer(vocab_filepath), + labels=metadata_writer.Labels().add(list(self._label_names)), + ids_name=self._model_spec.tflite_input_name["ids"], + mask_name=self._model_spec.tflite_input_name["mask"], + segment_name=self._model_spec.tflite_input_name["segment_ids"]) diff --git a/mediapipe/model_maker/python/text/text_classifier/text_classifier_demo.py b/mediapipe/model_maker/python/text/text_classifier/text_classifier_demo.py new file mode 100644 index 000000000..de6b85751 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/text_classifier_demo.py @@ -0,0 +1,108 @@ +# Copyright 2022 The MediaPipe 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. +"""Demo for making a text classifier model by MediaPipe Model Maker.""" + +import os +import tempfile + +# Dependency imports + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.core.utils import quantization +from mediapipe.model_maker.python.text.text_classifier import dataset as text_ds +from mediapipe.model_maker.python.text.text_classifier import model_spec as ms +from mediapipe.model_maker.python.text.text_classifier import text_classifier +from mediapipe.model_maker.python.text.text_classifier import text_classifier_options + +FLAGS = flags.FLAGS + + +def define_flags(): + flags.DEFINE_string('export_dir', None, + 'The directory to save exported files.') + flags.DEFINE_enum('supported_model', 'average_word_embedding', + ['average_word_embedding', 'bert'], + 'The text classifier to run.') + flags.mark_flag_as_required('export_dir') + + +def download_demo_data(): + """Downloads demo data, and returns directory path.""" + data_path = tf.keras.utils.get_file( + fname='SST-2.zip', + origin='https://dl.fbaipublicfiles.com/glue/data/SST-2.zip', + extract=True) + return os.path.join(os.path.dirname(data_path), 'SST-2') # folder name + + +def run(data_dir, + export_dir=tempfile.mkdtemp(), + supported_model=ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER): + """Runs demo.""" + + # Gets training data and validation data. + csv_params = text_ds.CSVParameters( + text_column='sentence', label_column='label', delimiter='\t') + train_data = text_ds.Dataset.from_csv( + filename=os.path.join(os.path.join(data_dir, 'train.tsv')), + csv_params=csv_params) + validation_data = text_ds.Dataset.from_csv( + filename=os.path.join(os.path.join(data_dir, 'dev.tsv')), + csv_params=csv_params) + + quantization_config = None + if supported_model == ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER: + hparams = hp.BaseHParams( + epochs=10, batch_size=32, learning_rate=0, export_dir=export_dir) + # Warning: This takes extremely long to run on CPU + elif supported_model == ms.SupportedModels.MOBILEBERT_CLASSIFIER: + quantization_config = quantization.QuantizationConfig.for_dynamic() + hparams = hp.BaseHParams( + epochs=3, batch_size=48, learning_rate=3e-5, export_dir=export_dir) + + # Fine-tunes the model. + options = text_classifier_options.TextClassifierOptions( + supported_model=supported_model, hparams=hparams) + model = text_classifier.TextClassifier.create(train_data, validation_data, + options) + + # Gets evaluation results. + _, acc = model.evaluate(validation_data) + print('Eval accuracy: %f' % acc) + + model.export_model(quantization_config=quantization_config) + model.export_labels(export_dir=options.hparams.export_dir) + + +def main(_): + logging.set_verbosity(logging.INFO) + data_dir = download_demo_data() + export_dir = os.path.expanduser(FLAGS.export_dir) + + if FLAGS.supported_model == 'average_word_embedding': + supported_model = ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER + elif FLAGS.supported_model == 'bert': + supported_model = ms.SupportedModels.MOBILEBERT_CLASSIFIER + + run(data_dir, export_dir, supported_model) + + +if __name__ == '__main__': + define_flags() + app.run(main) diff --git a/mediapipe/model_maker/python/text/text_classifier/text_classifier_options.py b/mediapipe/model_maker/python/text/text_classifier/text_classifier_options.py new file mode 100644 index 000000000..a02f17347 --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/text_classifier_options.py @@ -0,0 +1,38 @@ +# Copyright 2022 The MediaPipe 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. +"""User-facing customization options to create and train a text classifier.""" + +import dataclasses +from typing import Optional + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.text.text_classifier import model_options as mo +from mediapipe.model_maker.python.text.text_classifier import model_spec as ms + + +@dataclasses.dataclass +class TextClassifierOptions: + """User-facing options for creating the text classifier. + + Attributes: + supported_model: A preconfigured model spec. + hparams: Training hyperparameters the user can set to override the ones in + `supported_model`. + model_options: Model options the user can set to override the ones in + `supported_model`. The model options type should be consistent with the + architecture of the `supported_model`. + """ + supported_model: ms.SupportedModels + hparams: Optional[hp.BaseHParams] = None + model_options: Optional[mo.TextClassifierModelOptions] = None diff --git a/mediapipe/model_maker/python/text/text_classifier/text_classifier_test.py b/mediapipe/model_maker/python/text/text_classifier/text_classifier_test.py new file mode 100644 index 000000000..41dbb464a --- /dev/null +++ b/mediapipe/model_maker/python/text/text_classifier/text_classifier_test.py @@ -0,0 +1,138 @@ +# Copyright 2022 The MediaPipe 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. + +import csv +import filecmp +import os + +import tensorflow as tf + +from mediapipe.model_maker.python.core import hyperparameters as hp +from mediapipe.model_maker.python.text.text_classifier import dataset +from mediapipe.model_maker.python.text.text_classifier import model_options as mo +from mediapipe.model_maker.python.text.text_classifier import model_spec as ms +from mediapipe.model_maker.python.text.text_classifier import text_classifier +from mediapipe.model_maker.python.text.text_classifier import text_classifier_options +from mediapipe.tasks.python.test import test_utils + + +class TextClassifierTest(tf.test.TestCase): + + _AVERAGE_WORD_EMBEDDING_JSON_FILE = ( + test_utils.get_test_data_path('average_word_embedding_metadata.json')) + + def _get_data(self): + labels_and_text = (('pos', 'super good'), (('neg', 'really bad'))) + csv_file = os.path.join(self.get_temp_dir(), 'data.csv') + if os.path.exists(csv_file): + return csv_file + fieldnames = ['text', 'label'] + with open(csv_file, 'w') as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + for label, text in labels_and_text: + writer.writerow({'text': text, 'label': label}) + csv_params = dataset.CSVParameters(text_column='text', label_column='label') + all_data = dataset.Dataset.from_csv( + filename=csv_file, csv_params=csv_params) + return all_data.split(0.5) + + def test_create_and_train_average_word_embedding_model(self): + train_data, validation_data = self._get_data() + options = text_classifier_options.TextClassifierOptions( + supported_model=ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER, + hparams=hp.BaseHParams(epochs=1, batch_size=1, learning_rate=0)) + average_word_embedding_classifier = text_classifier.TextClassifier.create( + train_data, validation_data, options) + + _, accuracy = average_word_embedding_classifier.evaluate(validation_data) + self.assertGreaterEqual(accuracy, 0.0) + + # Test export_model + average_word_embedding_classifier.export_model() + output_metadata_file = os.path.join(options.hparams.export_dir, + 'metadata.json') + output_tflite_file = os.path.join(options.hparams.export_dir, + 'model.tflite') + + self.assertTrue(os.path.exists(output_tflite_file)) + self.assertGreater(os.path.getsize(output_tflite_file), 0) + + self.assertTrue(os.path.exists(output_metadata_file)) + self.assertGreater(os.path.getsize(output_metadata_file), 0) + self.assertTrue( + filecmp.cmp(output_metadata_file, + self._AVERAGE_WORD_EMBEDDING_JSON_FILE)) + + def test_create_and_train_bert(self): + train_data, validation_data = self._get_data() + options = text_classifier_options.TextClassifierOptions( + supported_model=ms.SupportedModels.MOBILEBERT_CLASSIFIER, + model_options=mo.BertClassifierOptions(do_fine_tuning=False, seq_len=2), + hparams=hp.BaseHParams( + epochs=1, + batch_size=1, + learning_rate=3e-5, + distribution_strategy='off')) + bert_classifier = text_classifier.TextClassifier.create( + train_data, validation_data, options) + + _, accuracy = bert_classifier.evaluate(validation_data) + self.assertGreaterEqual(accuracy, 0.0) + # TODO: Add a unit test that does not run OOM. + + def test_label_mismatch(self): + options = ( + text_classifier_options.TextClassifierOptions( + supported_model=ms.SupportedModels.MOBILEBERT_CLASSIFIER)) + train_tf_dataset = tf.data.Dataset.from_tensor_slices([[0]]) + train_data = dataset.Dataset(train_tf_dataset, 1, ['foo']) + validation_tf_dataset = tf.data.Dataset.from_tensor_slices([[0]]) + validation_data = dataset.Dataset(validation_tf_dataset, 1, ['bar']) + with self.assertRaisesRegex( + ValueError, + 'Training data label names .* not equal to validation data label names' + ): + text_classifier.TextClassifier.create(train_data, validation_data, + options) + + def test_options_mismatch(self): + train_data, validation_data = self._get_data() + + avg_options = ( + text_classifier_options.TextClassifierOptions( + supported_model=ms.SupportedModels.MOBILEBERT_CLASSIFIER, + model_options=mo.AverageWordEmbeddingClassifierOptions())) + with self.assertRaisesRegex( + ValueError, 'Expected AVERAGE_WORD_EMBEDDING_CLASSIFIER, got' + ' SupportedModels.MOBILEBERT_CLASSIFIER'): + text_classifier.TextClassifier.create(train_data, validation_data, + avg_options) + + bert_options = ( + text_classifier_options.TextClassifierOptions( + supported_model=( + ms.SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER), + model_options=mo.BertClassifierOptions())) + with self.assertRaisesRegex( + ValueError, 'Expected MOBILEBERT_CLASSIFIER, got' + ' SupportedModels.AVERAGE_WORD_EMBEDDING_CLASSIFIER'): + text_classifier.TextClassifier.create(train_data, validation_data, + bert_options) + + +if __name__ == '__main__': + # Load compressed models from tensorflow_hub + os.environ['TFHUB_MODEL_LOAD_FORMAT'] = 'COMPRESSED' + tf.test.main() From b4972ed4ae2f52da33e0ded75a8807293458aced Mon Sep 17 00:00:00 2001 From: MediaPipe Team Date: Thu, 10 Nov 2022 20:23:38 -0800 Subject: [PATCH 21/21] Update GestureRecognitionResult to GestureRecognizerResult. PiperOrigin-RevId: 487712873 --- .../tasks/cc/components/containers/BUILD | 9 --- .../tasks/cc/vision/gesture_recognizer/BUILD | 11 ++- .../gesture_recognizer/gesture_recognizer.cc | 6 +- .../gesture_recognizer/gesture_recognizer.h | 21 +++--- .../gesture_recognizer_result.h} | 16 ++--- .../com/google/mediapipe/tasks/vision/BUILD | 2 +- .../gesturerecognizer/GestureRecognizer.java | 30 ++++---- ...sult.java => GestureRecognizerResult.java} | 10 +-- .../vision/handlandmarker/HandLandmarker.java | 6 +- .../GestureRecognizerTest.java | 72 +++++++++---------- .../tasks/python/vision/gesture_recognizer.py | 6 +- .../gesture_recognizer/gesture_recognizer.ts | 4 +- .../gesture_recognizer_result.ts | 2 +- 13 files changed, 95 insertions(+), 100 deletions(-) rename mediapipe/tasks/cc/{components/containers/gesture_recognition_result.h => vision/gesture_recognizer/gesture_recognizer_result.h} (79%) rename mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/{GestureRecognitionResult.java => GestureRecognizerResult.java} (95%) diff --git a/mediapipe/tasks/cc/components/containers/BUILD b/mediapipe/tasks/cc/components/containers/BUILD index 5004383d2..bd66a0f28 100644 --- a/mediapipe/tasks/cc/components/containers/BUILD +++ b/mediapipe/tasks/cc/components/containers/BUILD @@ -21,15 +21,6 @@ cc_library( hdrs = ["rect.h"], ) -cc_library( - name = "gesture_recognition_result", - hdrs = ["gesture_recognition_result.h"], - deps = [ - "//mediapipe/framework/formats:classification_cc_proto", - "//mediapipe/framework/formats:landmark_cc_proto", - ], -) - cc_library( name = "category", srcs = ["category.cc"], diff --git a/mediapipe/tasks/cc/vision/gesture_recognizer/BUILD b/mediapipe/tasks/cc/vision/gesture_recognizer/BUILD index f32d4cc58..75289b1e8 100644 --- a/mediapipe/tasks/cc/vision/gesture_recognizer/BUILD +++ b/mediapipe/tasks/cc/vision/gesture_recognizer/BUILD @@ -124,12 +124,22 @@ cc_library( alwayslink = 1, ) +cc_library( + name = "gesture_recognizer_result", + hdrs = ["gesture_recognizer_result.h"], + deps = [ + "//mediapipe/framework/formats:classification_cc_proto", + "//mediapipe/framework/formats:landmark_cc_proto", + ], +) + cc_library( name = "gesture_recognizer", srcs = ["gesture_recognizer.cc"], hdrs = ["gesture_recognizer.h"], deps = [ ":gesture_recognizer_graph", + ":gesture_recognizer_result", ":hand_gesture_recognizer_graph", "//mediapipe/framework:packet", "//mediapipe/framework/api2:builder", @@ -140,7 +150,6 @@ cc_library( "//mediapipe/framework/formats:rect_cc_proto", "//mediapipe/tasks/cc:common", "//mediapipe/tasks/cc/components:image_preprocessing", - "//mediapipe/tasks/cc/components/containers:gesture_recognition_result", "//mediapipe/tasks/cc/components/processors:classifier_options", "//mediapipe/tasks/cc/components/processors/proto:classifier_options_cc_proto", "//mediapipe/tasks/cc/core:base_options", diff --git a/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.cc b/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.cc index 38cb5169d..8d555b12c 100644 --- a/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.cc +++ b/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.cc @@ -58,8 +58,6 @@ namespace { using GestureRecognizerGraphOptionsProto = ::mediapipe::tasks::vision:: gesture_recognizer::proto::GestureRecognizerGraphOptions; -using ::mediapipe::tasks::components::containers::GestureRecognitionResult; - constexpr char kHandGestureSubgraphTypeName[] = "mediapipe.tasks.vision.gesture_recognizer.GestureRecognizerGraph"; @@ -214,7 +212,7 @@ absl::StatusOr> GestureRecognizer::Create( std::move(packets_callback)); } -absl::StatusOr GestureRecognizer::Recognize( +absl::StatusOr GestureRecognizer::Recognize( mediapipe::Image image, std::optional image_processing_options) { if (image.UsesGpu()) { @@ -250,7 +248,7 @@ absl::StatusOr GestureRecognizer::Recognize( }; } -absl::StatusOr GestureRecognizer::RecognizeForVideo( +absl::StatusOr GestureRecognizer::RecognizeForVideo( mediapipe::Image image, int64 timestamp_ms, std::optional image_processing_options) { if (image.UsesGpu()) { diff --git a/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.h b/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.h index 3f3d7acfe..392aa586f 100644 --- a/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.h +++ b/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer.h @@ -24,12 +24,12 @@ limitations under the License. #include "mediapipe/framework/formats/classification.pb.h" #include "mediapipe/framework/formats/image.h" #include "mediapipe/framework/formats/landmark.pb.h" -#include "mediapipe/tasks/cc/components/containers/gesture_recognition_result.h" #include "mediapipe/tasks/cc/components/processors/classifier_options.h" #include "mediapipe/tasks/cc/core/base_options.h" #include "mediapipe/tasks/cc/vision/core/base_vision_task_api.h" #include "mediapipe/tasks/cc/vision/core/image_processing_options.h" #include "mediapipe/tasks/cc/vision/core/running_mode.h" +#include "mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer_result.h" namespace mediapipe { namespace tasks { @@ -81,9 +81,8 @@ struct GestureRecognizerOptions { // The user-defined result callback for processing live stream data. // The result callback should only be specified when the running mode is set // to RunningMode::LIVE_STREAM. - std::function, - const Image&, int64)> + std::function, const Image&, + int64)> result_callback = nullptr; }; @@ -104,7 +103,7 @@ struct GestureRecognizerOptions { // 'width' and 'height' fields is NOT supported and will result in an // invalid argument error being returned. // Outputs: -// GestureRecognitionResult +// GestureRecognizerResult // - The hand gesture recognition results. class GestureRecognizer : tasks::vision::core::BaseVisionTaskApi { public: @@ -139,7 +138,7 @@ class GestureRecognizer : tasks::vision::core::BaseVisionTaskApi { // The image can be of any size with format RGB or RGBA. // TODO: Describes how the input image will be preprocessed // after the yuv support is implemented. - absl::StatusOr Recognize( + absl::StatusOr Recognize( Image image, std::optional image_processing_options = std::nullopt); @@ -157,10 +156,10 @@ class GestureRecognizer : tasks::vision::core::BaseVisionTaskApi { // The image can be of any size with format RGB or RGBA. It's required to // provide the video frame's timestamp (in milliseconds). The input timestamps // must be monotonically increasing. - absl::StatusOr - RecognizeForVideo(Image image, int64 timestamp_ms, - std::optional - image_processing_options = std::nullopt); + absl::StatusOr RecognizeForVideo( + Image image, int64 timestamp_ms, + std::optional image_processing_options = + std::nullopt); // Sends live image data to perform gesture recognition, and the results will // be available via the "result_callback" provided in the @@ -179,7 +178,7 @@ class GestureRecognizer : tasks::vision::core::BaseVisionTaskApi { // and will result in an invalid argument error being returned. // // The "result_callback" provides - // - A vector of GestureRecognitionResult, each is the recognized results + // - A vector of GestureRecognizerResult, each is the recognized results // for a input frame. // - The const reference to the corresponding input image that the gesture // recognizer runs on. Note that the const reference to the image will no diff --git a/mediapipe/tasks/cc/components/containers/gesture_recognition_result.h b/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer_result.h similarity index 79% rename from mediapipe/tasks/cc/components/containers/gesture_recognition_result.h rename to mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer_result.h index 4e2e8d775..914217801 100644 --- a/mediapipe/tasks/cc/components/containers/gesture_recognition_result.h +++ b/mediapipe/tasks/cc/vision/gesture_recognizer/gesture_recognizer_result.h @@ -13,20 +13,20 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#ifndef MEDIAPIPE_TASKS_CC_COMPONENTS_CONTAINERS_GESTURE_RECOGNITION_RESULT_H_ -#define MEDIAPIPE_TASKS_CC_COMPONENTS_CONTAINERS_GESTURE_RECOGNITION_RESULT_H_ +#ifndef MEDIAPIPE_TASKS_CC_VISION_GESTURE_RECOGNIZER_GESTURE_RECOGNIZER_RESULT_H_ +#define MEDIAPIPE_TASKS_CC_VISION_GESTURE_RECOGNIZER_GESTURE_RECOGNIZER_RESULT_H_ #include "mediapipe/framework/formats/classification.pb.h" #include "mediapipe/framework/formats/landmark.pb.h" namespace mediapipe { namespace tasks { -namespace components { -namespace containers { +namespace vision { +namespace gesture_recognizer { // The gesture recognition result from GestureRecognizer, where each vector // element represents a single hand detected in the image. -struct GestureRecognitionResult { +struct GestureRecognizerResult { // Recognized hand gestures with sorted order such that the winning label is // the first item in the list. std::vector gestures; @@ -38,9 +38,9 @@ struct GestureRecognitionResult { std::vector hand_world_landmarks; }; -} // namespace containers -} // namespace components +} // namespace gesture_recognizer +} // namespace vision } // namespace tasks } // namespace mediapipe -#endif // MEDIAPIPE_TASKS_CC_COMPONENTS_CONTAINERS_GESTURE_RECOGNITION_RESULT_H_ +#endif // MEDIAPIPE_TASKS_CC_VISION_GESTURE_RECOGNIZER_GESTURE_RECOGNIZER_RESULT_H_ diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD index 2b71dcdd8..4dc4a547e 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD @@ -111,8 +111,8 @@ android_library( android_library( name = "gesturerecognizer", srcs = [ - "gesturerecognizer/GestureRecognitionResult.java", "gesturerecognizer/GestureRecognizer.java", + "gesturerecognizer/GestureRecognizerResult.java", ], javacopts = [ "-Xep:AndroidJdkLibsChecker:OFF", diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java index d1ba94a1f..7cbedb32e 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizer.java @@ -64,9 +64,9 @@ import java.util.Optional; *

- *
  • Output GestureRecognitionResult {@link GestureRecognitionResult} + *
  • Output GestureRecognizerResult {@link GestureRecognizerResult} *
      - *
    • A GestureRecognitionResult containing hand landmarks and recognized hand gestures. + *
    • A GestureRecognizerResult containing hand landmarks and recognized hand gestures. *
    * */ @@ -152,21 +152,21 @@ public final class GestureRecognizer extends BaseVisionTaskApi { public static GestureRecognizer createFromOptions( Context context, GestureRecognizerOptions recognizerOptions) { // TODO: Consolidate OutputHandler and TaskRunner. - OutputHandler handler = new OutputHandler<>(); + OutputHandler handler = new OutputHandler<>(); handler.setOutputPacketConverter( - new OutputHandler.OutputPacketConverter() { + new OutputHandler.OutputPacketConverter() { @Override - public GestureRecognitionResult convertToTaskResult(List packets) { + public GestureRecognizerResult convertToTaskResult(List packets) { // If there is no hands detected in the image, just returns empty lists. if (packets.get(HAND_GESTURES_OUT_STREAM_INDEX).isEmpty()) { - return GestureRecognitionResult.create( + return GestureRecognizerResult.create( new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), packets.get(HAND_GESTURES_OUT_STREAM_INDEX).getTimestamp()); } - return GestureRecognitionResult.create( + return GestureRecognizerResult.create( PacketGetter.getProtoVector( packets.get(LANDMARKS_OUT_STREAM_INDEX), NormalizedLandmarkList.parser()), PacketGetter.getProtoVector( @@ -228,7 +228,7 @@ public final class GestureRecognizer extends BaseVisionTaskApi { * @param image a MediaPipe {@link MPImage} object for processing. * @throws MediaPipeException if there is an internal error. */ - public GestureRecognitionResult recognize(MPImage image) { + public GestureRecognizerResult recognize(MPImage image) { return recognize(image, ImageProcessingOptions.builder().build()); } @@ -252,10 +252,10 @@ public final class GestureRecognizer extends BaseVisionTaskApi { * region-of-interest. * @throws MediaPipeException if there is an internal error. */ - public GestureRecognitionResult recognize( + public GestureRecognizerResult recognize( MPImage image, ImageProcessingOptions imageProcessingOptions) { validateImageProcessingOptions(imageProcessingOptions); - return (GestureRecognitionResult) processImageData(image, imageProcessingOptions); + return (GestureRecognizerResult) processImageData(image, imageProcessingOptions); } /** @@ -276,7 +276,7 @@ public final class GestureRecognizer extends BaseVisionTaskApi { * @param timestampMs the input timestamp (in milliseconds). * @throws MediaPipeException if there is an internal error. */ - public GestureRecognitionResult recognizeForVideo(MPImage image, long timestampMs) { + public GestureRecognizerResult recognizeForVideo(MPImage image, long timestampMs) { return recognizeForVideo(image, ImageProcessingOptions.builder().build(), timestampMs); } @@ -303,10 +303,10 @@ public final class GestureRecognizer extends BaseVisionTaskApi { * region-of-interest. * @throws MediaPipeException if there is an internal error. */ - public GestureRecognitionResult recognizeForVideo( + public GestureRecognizerResult recognizeForVideo( MPImage image, ImageProcessingOptions imageProcessingOptions, long timestampMs) { validateImageProcessingOptions(imageProcessingOptions); - return (GestureRecognitionResult) processVideoData(image, imageProcessingOptions, timestampMs); + return (GestureRecognizerResult) processVideoData(image, imageProcessingOptions, timestampMs); } /** @@ -425,7 +425,7 @@ public final class GestureRecognizer extends BaseVisionTaskApi { * recognizer is in the live stream mode. */ public abstract Builder setResultListener( - ResultListener value); + ResultListener value); /** Sets an optional error listener. */ public abstract Builder setErrorListener(ErrorListener value); @@ -472,7 +472,7 @@ public final class GestureRecognizer extends BaseVisionTaskApi { abstract Optional customGesturesClassifierOptions(); - abstract Optional> resultListener(); + abstract Optional> resultListener(); abstract Optional errorListener(); diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognitionResult.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerResult.java similarity index 95% rename from mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognitionResult.java rename to mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerResult.java index e9e1ebe8a..ef76bf226 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognitionResult.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerResult.java @@ -29,20 +29,20 @@ import java.util.List; /** Represents the gesture recognition results generated by {@link GestureRecognizer}. */ @AutoValue -public abstract class GestureRecognitionResult implements TaskResult { +public abstract class GestureRecognizerResult implements TaskResult { private static final int kGestureDefaultIndex = -1; /** - * Creates a {@link GestureRecognitionResult} instance from the lists of landmarks, handedness, - * and gestures protobuf messages. + * Creates a {@link GestureRecognizerResult} instance from the lists of landmarks, handedness, and + * gestures protobuf messages. * * @param landmarksProto a List of {@link NormalizedLandmarkList} * @param worldLandmarksProto a List of {@link LandmarkList} * @param handednessesProto a List of {@link ClassificationList} * @param gesturesProto a List of {@link ClassificationList} */ - static GestureRecognitionResult create( + static GestureRecognizerResult create( List landmarksProto, List worldLandmarksProto, List handednessesProto, @@ -106,7 +106,7 @@ public abstract class GestureRecognitionResult implements TaskResult { classification.getDisplayName())); } } - return new AutoValue_GestureRecognitionResult( + return new AutoValue_GestureRecognizerResult( timestampMs, Collections.unmodifiableList(multiHandLandmarks), Collections.unmodifiableList(multiHandWorldLandmarks), diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java index 089e1c6e7..9be489bbe 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/handlandmarker/HandLandmarker.java @@ -242,8 +242,7 @@ public final class HandLandmarker extends BaseVisionTaskApi { * region-of-interest. * @throws MediaPipeException if there is an internal error. */ - public HandLandmarkerResult detect( - MPImage image, ImageProcessingOptions imageProcessingOptions) { + public HandLandmarkerResult detect(MPImage image, ImageProcessingOptions imageProcessingOptions) { validateImageProcessingOptions(imageProcessingOptions); return (HandLandmarkerResult) processImageData(image, imageProcessingOptions); } @@ -296,8 +295,7 @@ public final class HandLandmarker extends BaseVisionTaskApi { public HandLandmarkerResult detectForVideo( MPImage image, ImageProcessingOptions imageProcessingOptions, long timestampMs) { validateImageProcessingOptions(imageProcessingOptions); - return (HandLandmarkerResult) - processVideoData(image, imageProcessingOptions, timestampMs); + return (HandLandmarkerResult) processVideoData(image, imageProcessingOptions, timestampMs); } /** diff --git a/mediapipe/tasks/javatests/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerTest.java b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerTest.java index f76c4eaab..c0be4cffe 100644 --- a/mediapipe/tasks/javatests/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerTest.java +++ b/mediapipe/tasks/javatests/com/google/mediapipe/tasks/vision/gesturerecognizer/GestureRecognizerTest.java @@ -80,10 +80,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(THUMB_UP_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); } @@ -98,7 +98,7 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(NO_HANDS_IMAGE)); assertThat(actualResult.landmarks()).isEmpty(); assertThat(actualResult.worldLandmarks()).isEmpty(); @@ -119,10 +119,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(THUMB_UP_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); // Only contains one top scoring gesture. assertThat(actualResult.gestures().get(0)).hasSize(1); assertActualGestureEqualExpectedGesture( @@ -141,7 +141,7 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(TWO_HANDS_IMAGE)); assertThat(actualResult.handednesses()).hasSize(2); } @@ -160,7 +160,7 @@ public class GestureRecognizerTest { GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); ImageProcessingOptions imageProcessingOptions = ImageProcessingOptions.builder().setRotationDegrees(-90).build(); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize( getImageFromAsset(POINTING_UP_ROTATED_IMAGE), imageProcessingOptions); assertThat(actualResult.gestures()).hasSize(1); @@ -179,10 +179,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(FIST_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(FIST_LANDMARKS, FIST_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(FIST_LANDMARKS, FIST_LABEL); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); } @@ -199,10 +199,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(FIST_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(FIST_LANDMARKS, ROCK_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(FIST_LANDMARKS, ROCK_LABEL); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); } @@ -223,10 +223,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(FIST_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(FIST_LANDMARKS, FIST_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(FIST_LANDMARKS, FIST_LABEL); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); } @@ -247,7 +247,7 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(FIST_IMAGE)); assertThat(actualResult.landmarks()).isEmpty(); assertThat(actualResult.worldLandmarks()).isEmpty(); @@ -280,7 +280,7 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(FIST_IMAGE)); assertThat(actualResult.landmarks()).isEmpty(); assertThat(actualResult.worldLandmarks()).isEmpty(); @@ -306,10 +306,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(FIST_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(FIST_LANDMARKS, FIST_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(FIST_LANDMARKS, FIST_LABEL); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); } @@ -478,10 +478,10 @@ public class GestureRecognizerTest { GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognize(getImageFromAsset(THUMB_UP_IMAGE)); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); } @@ -497,10 +497,10 @@ public class GestureRecognizerTest { .build(); GestureRecognizer gestureRecognizer = GestureRecognizer.createFromOptions(ApplicationProvider.getApplicationContext(), options); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); for (int i = 0; i < 3; i++) { - GestureRecognitionResult actualResult = + GestureRecognizerResult actualResult = gestureRecognizer.recognizeForVideo( getImageFromAsset(THUMB_UP_IMAGE), /*timestampsMs=*/ i); assertActualResultApproximatelyEqualsToExpectedResult(actualResult, expectedResult); @@ -510,8 +510,8 @@ public class GestureRecognizerTest { @Test public void recognize_failsWithOutOfOrderInputTimestamps() throws Exception { MPImage image = getImageFromAsset(THUMB_UP_IMAGE); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); GestureRecognizerOptions options = GestureRecognizerOptions.builder() .setBaseOptions( @@ -542,8 +542,8 @@ public class GestureRecognizerTest { @Test public void recognize_successWithLiveSteamMode() throws Exception { MPImage image = getImageFromAsset(THUMB_UP_IMAGE); - GestureRecognitionResult expectedResult = - getExpectedGestureRecognitionResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); + GestureRecognizerResult expectedResult = + getExpectedGestureRecognizerResult(THUMB_UP_LANDMARKS, THUMB_UP_LABEL); GestureRecognizerOptions options = GestureRecognizerOptions.builder() .setBaseOptions( @@ -572,7 +572,7 @@ public class GestureRecognizerTest { return new BitmapImageBuilder(BitmapFactory.decodeStream(istr)).build(); } - private static GestureRecognitionResult getExpectedGestureRecognitionResult( + private static GestureRecognizerResult getExpectedGestureRecognizerResult( String filePath, String gestureLabel) throws Exception { AssetManager assetManager = ApplicationProvider.getApplicationContext().getAssets(); InputStream istr = assetManager.open(filePath); @@ -583,7 +583,7 @@ public class GestureRecognizerTest { .addClassification( ClassificationProto.Classification.newBuilder().setLabel(gestureLabel)) .build(); - return GestureRecognitionResult.create( + return GestureRecognizerResult.create( Arrays.asList(landmarksDetectionResultProto.getLandmarks()), Arrays.asList(landmarksDetectionResultProto.getWorldLandmarks()), Arrays.asList(landmarksDetectionResultProto.getClassifications()), @@ -592,7 +592,7 @@ public class GestureRecognizerTest { } private static void assertActualResultApproximatelyEqualsToExpectedResult( - GestureRecognitionResult actualResult, GestureRecognitionResult expectedResult) { + GestureRecognizerResult actualResult, GestureRecognizerResult expectedResult) { // Expects to have the same number of hands detected. assertThat(actualResult.landmarks()).hasSize(expectedResult.landmarks().size()); assertThat(actualResult.worldLandmarks()).hasSize(expectedResult.worldLandmarks().size()); diff --git a/mediapipe/tasks/python/vision/gesture_recognizer.py b/mediapipe/tasks/python/vision/gesture_recognizer.py index d118a315a..9b6fd8cab 100644 --- a/mediapipe/tasks/python/vision/gesture_recognizer.py +++ b/mediapipe/tasks/python/vision/gesture_recognizer.py @@ -80,7 +80,7 @@ class GestureRecognizerResult: def _build_recognition_result( output_packets: Mapping[str, packet_module.Packet]) -> GestureRecognizerResult: - """Consturcts a `GestureRecognizerResult` from output packets.""" + """Constructs a `GestureRecognizerResult` from output packets.""" gestures_proto_list = packet_getter.get_proto_list( output_packets[_HAND_GESTURE_STREAM_NAME]) handedness_proto_list = packet_getter.get_proto_list( @@ -270,9 +270,9 @@ class GestureRecognizer(base_vision_task_api.BaseVisionTaskApi): empty_packet.timestamp.value // _MICRO_SECONDS_PER_MILLISECOND) return - gesture_recognition_result = _build_recognition_result(output_packets) + gesture_recognizer_result = _build_recognition_result(output_packets) timestamp = output_packets[_HAND_GESTURE_STREAM_NAME].timestamp - options.result_callback(gesture_recognition_result, image, + options.result_callback(gesture_recognizer_result, image, timestamp.value // _MICRO_SECONDS_PER_MILLISECOND) task_info = _TaskInfo( diff --git a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer.ts b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer.ts index 1275ae875..c24d1a7b3 100644 --- a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer.ts +++ b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer.ts @@ -35,7 +35,7 @@ import {createMediaPipeLib, FileLocator, ImageSource, WasmModule} from '../../.. // Placeholder for internal dependency on trusted resource url import {GestureRecognizerOptions} from './gesture_recognizer_options'; -import {GestureRecognitionResult} from './gesture_recognizer_result'; +import {GestureRecognizerResult} from './gesture_recognizer_result'; export {ImageSource}; @@ -237,7 +237,7 @@ export class GestureRecognizer extends TaskRunner { * @return The detected gestures. */ recognize(imageSource: ImageSource, timestamp: number = performance.now()): - GestureRecognitionResult { + GestureRecognizerResult { this.gestures = []; this.landmarks = []; this.worldLandmarks = []; diff --git a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts index 08c8c2931..7c295c9e9 100644 --- a/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts +++ b/mediapipe/tasks/web/vision/gesture_recognizer/gesture_recognizer_result.ts @@ -20,7 +20,7 @@ import {Landmark} from '../../../../tasks/web/components/containers/landmark'; /** * Represents the gesture recognition results generated by `GestureRecognizer`. */ -export declare interface GestureRecognitionResult { +export declare interface GestureRecognizerResult { /** Hand landmarks of detected hands. */ landmarks: Landmark[][];