Added Files for Text Classifier iOS Task
This commit is contained in:
parent
6f54308c25
commit
d7b0f660e6
26
mediapipe/tasks/ios/common/BUILD
Normal file
26
mediapipe/tasks/ios/common/BUILD
Normal file
|
@ -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"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPCommon",
|
||||
hdrs = [
|
||||
"sources/MPPCommon.h",
|
||||
],
|
||||
module_name = "MPPCommon",
|
||||
)
|
||||
|
179
mediapipe/tasks/ios/common/sources/MPPCommon.h
Normal file
179
mediapipe/tasks/ios/common/sources/MPPCommon.h
Normal file
|
@ -0,0 +1,179 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* @enum TFLSupportErrorCode
|
||||
* This enum specifies error codes for TensorFlow Lite Task Library.
|
||||
* It maintains a 1:1 mapping to TfLiteSupportErrorCode of C libray.
|
||||
*/
|
||||
typedef NS_ENUM(NSUInteger, MPPTasksErrorCode) {
|
||||
|
||||
// Generic error codes.
|
||||
|
||||
// Unspecified error.
|
||||
MPPTasksErrorCodeError = 1,
|
||||
// Invalid argument specified.
|
||||
MPPTasksErrorCodeInvalidArgumentError = 2,
|
||||
// Invalid FlatBuffer file or buffer specified.
|
||||
MPPTasksErrorCodeInvalidFlatBufferError = 3,
|
||||
// Model contains a builtin op that isn't supported by the OpResolver or
|
||||
// delegates.
|
||||
MPPTasksErrorCodeUnsupportedBuiltinOp = 4,
|
||||
// Model contains a custom op that isn't supported by the OpResolver or
|
||||
// delegates.
|
||||
MPPTasksErrorCodeUnsupportedCustomOp = 5,
|
||||
|
||||
// File I/O error codes.
|
||||
|
||||
// No such file.
|
||||
MPPTasksErrorCodeFileNotFoundError = 100,
|
||||
// Permission issue.
|
||||
MPPTasksErrorCodeFilePermissionDeniedError,
|
||||
// I/O error when reading file.
|
||||
MPPTasksErrorCodeFileReadError,
|
||||
// I/O error when mmap-ing file.
|
||||
MPPTasksErrorCodeFileMmapError,
|
||||
// ZIP I/O error when unpacMPPTasksErrorCodeing the zip file.
|
||||
MPPTasksErrorCodeFileZipError,
|
||||
|
||||
// TensorFlow Lite metadata error codes.
|
||||
|
||||
// Unexpected schema version (aMPPTasksErrorCodea file_identifier) in the Metadata FlatBuffer.
|
||||
MPPTasksErrorCodeMetadataInvalidSchemaVersionError = 200,
|
||||
// No such associated file within metadata, or file has not been pacMPPTasksErrorCodeed.
|
||||
MPPTasksErrorCodeMetadataAssociatedFileNotFoundError,
|
||||
// ZIP I/O error when unpacMPPTasksErrorCodeing an associated file.
|
||||
MPPTasksErrorCodeMetadataAssociatedFileZipError,
|
||||
// Inconsistency error between the metadata and actual TF Lite model.
|
||||
// E.g.: number of labels and output tensor values differ.
|
||||
MPPTasksErrorCodeMetadataInconsistencyError,
|
||||
// Invalid process units specified.
|
||||
// E.g.: multiple ProcessUnits with the same type for a given tensor.
|
||||
MPPTasksErrorCodeMetadataInvalidProcessUnitsError,
|
||||
// Inconsistency error with the number of labels.
|
||||
// E.g.: label files for different locales have a different number of labels.
|
||||
MPPTasksErrorCodeMetadataNumLabelsMismatchError,
|
||||
// Score calibration parameters parsing error.
|
||||
// E.g.: too many parameters provided in the corresponding associated file.
|
||||
MPPTasksErrorCodeMetadataMalformedScoreCalibrationError,
|
||||
// Unexpected number of subgraphs for the current task.
|
||||
// E.g.: image classification expects a single subgraph.
|
||||
MPPTasksErrorCodeMetadataInvalidNumSubgraphsError,
|
||||
// A given tensor requires NormalizationOptions but none were found.
|
||||
// E.g.: float input tensor requires normalization to preprocess input images.
|
||||
MPPTasksErrorCodeMetadataMissingNormalizationOptionsError,
|
||||
// Invalid ContentProperties specified.
|
||||
// E.g. expected ImageProperties, got BoundingBoxProperties.
|
||||
MPPTasksErrorCodeMetadataInvalidContentPropertiesError,
|
||||
// Metadata is mandatory but was not found.
|
||||
// E.g. current task requires TFLite Model Metadata but none was found.
|
||||
MPPTasksErrorCodeMetadataNotFoundError,
|
||||
// Associated TENSOR_AXIS_LABELS or TENSOR_VALUE_LABELS file is mandatory but
|
||||
// none was found or it was empty.
|
||||
// E.g. current task requires labels but none were found.
|
||||
MPPTasksErrorCodeMetadataMissingLabelsError,
|
||||
// The ProcessingUnit for tokenizer is not correctly configured.
|
||||
// E.g BertTokenizer doesn't have a valid vocab file associated.
|
||||
MPPTasksErrorCodeMetadataInvalidTokenizerError,
|
||||
|
||||
// Input tensor(s) error codes.
|
||||
|
||||
// Unexpected number of input tensors for the current task.
|
||||
// E.g. current task expects a single input tensor.
|
||||
MPPTasksErrorCodeInvalidNumInputTensorsError = 300,
|
||||
// Unexpected input tensor dimensions for the current task.
|
||||
// E.g.: only 4D input tensors supported.
|
||||
MPPTasksErrorCodeInvalidInputTensorDimensionsError,
|
||||
// Unexpected input tensor type for the current task.
|
||||
// E.g.: current task expects a uint8 pixel image as input.
|
||||
MPPTasksErrorCodeInvalidInputTensorTypeError,
|
||||
// Unexpected input tensor bytes size.
|
||||
// E.g.: size in bytes does not correspond to the expected number of pixels.
|
||||
MPPTasksErrorCodeInvalidInputTensorSizeError,
|
||||
// No correct input tensor found for the model.
|
||||
// E.g.: input tensor name is not part of the text model's input tensors.
|
||||
MPPTasksErrorCodeInputTensorNotFoundError,
|
||||
|
||||
// Output tensor(s) error codes.
|
||||
|
||||
// Unexpected output tensor dimensions for the current task.
|
||||
// E.g.: only a batch size of 1 is supported.
|
||||
MPPTasksErrorCodeInvalidOutputTensorDimensionsError = 400,
|
||||
// Unexpected input tensor type for the current task.
|
||||
// E.g.: multi-head model with different output tensor types.
|
||||
MPPTasksErrorCodeInvalidOutputTensorTypeError,
|
||||
// No correct output tensor found for the model.
|
||||
// E.g.: output tensor name is not part of the text model's output tensors.
|
||||
MPPTasksErrorCodeOutputTensorNotFoundError,
|
||||
// Unexpected number of output tensors for the current task.
|
||||
// E.g.: current task expects a single output tensor.
|
||||
MPPTasksErrorCodeInvalidNumOutputTensorsError,
|
||||
|
||||
// Image processing error codes.
|
||||
|
||||
// Unspecified image processing failures.
|
||||
MPPTasksErrorCodeImageProcessingError = 500,
|
||||
// Unexpected input or output buffer metadata.
|
||||
// E.g.: rotate RGBA buffer to Grayscale buffer by 90 degrees.
|
||||
MPPTasksErrorCodeImageProcessingInvalidArgumentError,
|
||||
// Image processing operation failures.
|
||||
// E.g. libyuv rotation failed for an unknown reason.
|
||||
MPPTasksErrorCodeImageProcessingBackendError,
|
||||
|
||||
// Task runner error codes.
|
||||
MPPTasksErrorCodeRunnerError = 600,
|
||||
// Task runner is not initialized.
|
||||
MPPTasksErrorCodeRunnerInitializationError,
|
||||
// Task runner is not started successfully.
|
||||
MPPTasksErrorCodeRunnerFailsToStartError,
|
||||
// Task runner is not started.
|
||||
MPPTasksErrorCodeRunnerNotStartedError,
|
||||
// Task runner API is called in the wrong processing mode.
|
||||
MPPTasksErrorCodeRunnerApiCalledInWrongModeError,
|
||||
// Task runner receives/produces invalid MediaPipe packet timestamp.
|
||||
MPPTasksErrorCodeRunnerInvalidTimestampError,
|
||||
// Task runner receives unexpected MediaPipe graph input packet.
|
||||
// E.g. The packet type doesn't match the graph input stream's data type.
|
||||
MPPTasksErrorCodeRunnerUnexpectedInputError,
|
||||
// Task runner produces unexpected MediaPipe graph output packet.
|
||||
// E.g. The number of output packets is not equal to the number of graph
|
||||
// output streams.
|
||||
MPPTasksErrorCodeRunnerUnexpectedOutputError,
|
||||
// Task runner is not closed successfully.
|
||||
MPPTasksErrorCodeRunnerFailsToCloseError,
|
||||
// Task runner's model resources cache service is unavailable or the
|
||||
// targeting model resources bundle is not found.
|
||||
MPPTasksErrorCodeRunnerModelResourcesCacheServiceError,
|
||||
|
||||
// Task graph error codes.
|
||||
MPPTasksErrorCodeGraphError = 700,
|
||||
// Task graph is not implemented.
|
||||
MPPTasksErrorCodeTaskGraphNotImplementedError,
|
||||
// Task graph config is invalid.
|
||||
MPPTasksErrorCodeInvalidTaskGraphConfigError,
|
||||
|
||||
MPPTasksErrorCodeFirst = MPPTasksErrorCodeError,
|
||||
|
||||
/**
|
||||
* The last error code in TFLSupportErrorCode (for internal use only).
|
||||
*/
|
||||
MPPTasksErrorCodeLast = MPPTasksErrorCodeInvalidTaskGraphConfigError,
|
||||
|
||||
} NS_SWIFT_NAME(TasksErrorCode);
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
38
mediapipe/tasks/ios/common/utils/BUILD
Normal file
38
mediapipe/tasks/ios/common/utils/BUILD
Normal file
|
@ -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.
|
||||
|
||||
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPCommonUtils",
|
||||
srcs = ["sources/MPPCommonUtils.mm"],
|
||||
hdrs = ["sources/MPPCommonUtils.h"],
|
||||
deps = [
|
||||
"//mediapipe/tasks/cc:common",
|
||||
"//mediapipe/tasks/ios/common:MPPCommon",
|
||||
],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "NSStringHelpers",
|
||||
srcs = ["sources/NSString+Helpers.mm"],
|
||||
hdrs = ["sources/NSString+Helpers.h"],
|
||||
copts = [
|
||||
"-ObjC++",
|
||||
"-std=c++17",
|
||||
],
|
||||
)
|
||||
|
78
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h
Normal file
78
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h
Normal file
|
@ -0,0 +1,78 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
#include "mediapipe/tasks/cc/common.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** Error domain of TensorFlow Lite Support related errors. */
|
||||
extern NSString *const MPPTasksErrorDomain;
|
||||
|
||||
/** Helper utility for the all tasks which encapsulates common functionality. */
|
||||
@interface MPPCommonUtils : NSObject
|
||||
|
||||
/**
|
||||
* Creates and saves an NSError in the Tensorflow Lite Task Library domain, with the given code and
|
||||
* description.
|
||||
*
|
||||
* @param code Error code.
|
||||
* @param description Error description.
|
||||
* @param error Pointer to the memory location where the created error should be saved. If `nil`,
|
||||
* no error will be saved.
|
||||
*/
|
||||
+ (void)createCustomError:(NSError **)error
|
||||
withCode:(NSUInteger)code
|
||||
description:(NSString *)description;
|
||||
|
||||
/**
|
||||
* Creates and saves an NSError with the given domain, code and description.
|
||||
*
|
||||
* @param error Pointer to the memory location where the created error should be saved. If `nil`,
|
||||
* no error will be saved.
|
||||
* @param domain Error domain.
|
||||
* @param code Error code.
|
||||
* @param description Error description.
|
||||
*/
|
||||
+ (void)createCustomError:(NSError **)error
|
||||
withDomain:(NSString *)domain
|
||||
code:(NSUInteger)code
|
||||
description:(NSString *)description;
|
||||
|
||||
/**
|
||||
* Converts an absl status to an NSError.
|
||||
*
|
||||
* @param status absl status.
|
||||
* @param error Pointer to the memory location where the created error should be saved. If `nil`,
|
||||
* no error will be saved.
|
||||
*/
|
||||
+ (BOOL)checkCppError:(const absl::Status &)status toError:(NSError **)error;
|
||||
|
||||
/**
|
||||
* Allocates a block of memory with the specified size and returns a pointer to it. If memory
|
||||
* cannot be allocated because of an invalid memSize, it saves an error. In other cases, it
|
||||
* terminates program execution.
|
||||
*
|
||||
* @param memSize size of memory to be allocated
|
||||
* @param error Pointer to the memory location where errors if any should be saved. If `nil`, no
|
||||
* error will be saved.
|
||||
*
|
||||
* @return Pointer to the allocated block of memory on successfull allocation. nil in case as
|
||||
* error is encountered because of invalid memSize. If failure is due to any other reason, method
|
||||
* terminates program execution.
|
||||
*/
|
||||
+ (void *)mallocWithSize:(size_t)memSize error:(NSError **)error;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
129
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.mm
Normal file
129
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.mm
Normal file
|
@ -0,0 +1,129 @@
|
|||
// 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.
|
||||
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h"
|
||||
#import "mediapipe/tasks/ios/common/sources/MPPCommon.h"
|
||||
|
||||
/** Error domain of TensorFlow Lite Support related errors. */
|
||||
NSString *const TFLSupportTaskErrorDomain = @"org.tensorflow.lite.tasks";
|
||||
|
||||
@implementation TFLCommonUtils
|
||||
|
||||
+ (void)createCustomError:(NSError **)error
|
||||
withCode:(NSUInteger)code
|
||||
description:(NSString *)description {
|
||||
[TFLCommonUtils createCustomError:error
|
||||
withDomain:TFLSupportTaskErrorDomain
|
||||
code:code
|
||||
description:description];
|
||||
}
|
||||
|
||||
+ (void)createCustomError:(NSError **)error
|
||||
withDomain:(NSString *)domain
|
||||
code:(NSUInteger)code
|
||||
description:(NSString *)description {
|
||||
if (error) {
|
||||
*error = [NSError errorWithDomain:domain
|
||||
code:code
|
||||
userInfo:@{NSLocalizedDescriptionKey : description}];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void *)mallocWithSize:(size_t)memSize error:(NSError **)error {
|
||||
if (!memSize) {
|
||||
[TFLCommonUtils createCustomError:error
|
||||
withCode:MPPTasksErrorCodeInvalidArgumentError
|
||||
description:@"memSize cannot be zero."];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *allocedMemory = malloc(memSize);
|
||||
if (!allocedMemory) {
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
return allocedMemory;
|
||||
}
|
||||
|
||||
+ (BOOL)checkCppError:(const absl::Status &)status toError:(NSError *_Nullable *)error {
|
||||
if (status.ok()) {
|
||||
return YES;
|
||||
}
|
||||
// Payload of absl::Status created by the tflite task library stores an appropriate value of the
|
||||
// enum TfLiteSupportStatus. The integer value corresponding to the TfLiteSupportStatus enum
|
||||
// stored in the payload is extracted here to later map to the appropriate error code to be
|
||||
// returned. In cases where the enum is not stored in (payload is NULL or the payload string
|
||||
// cannot be converted to an integer), we set the error code value to be 1
|
||||
// (TFLSupportErrorCodeUnspecifiedError of TFLSupportErrorCode used in the iOS library to signify
|
||||
// any errors not falling into other categories.) Since payload is of type absl::Cord that can be
|
||||
// type cast into an absl::optional<std::string>, we use the std::stoi function to convert it into
|
||||
// an integer code if possible.
|
||||
NSUInteger genericErrorCode = MPPTasksErrorCodeError;
|
||||
NSUInteger errorCode;
|
||||
try {
|
||||
// Try converting payload to integer if payload is not empty. Otherwise convert a string
|
||||
// signifying generic error code TFLSupportErrorCodeUnspecifiedError to integer.
|
||||
errorCode =
|
||||
(NSUInteger)std::stoi(static_cast<absl::optional<std::string>>(
|
||||
status.GetPayload(mediapipe::tasks::kMediaPipeTasksPayload))
|
||||
.value_or(std::to_string(genericErrorCode)));
|
||||
} catch (std::invalid_argument &e) {
|
||||
// If non empty payload string cannot be converted to an integer. Set error code to 1(kError).
|
||||
errorCode = MPPTasksErrorCodeError;
|
||||
}
|
||||
|
||||
// If errorCode is outside the range of enum values possible or is
|
||||
// TFLSupportErrorCodeUnspecifiedError, we try to map the absl::Status::code() to assign
|
||||
// appropriate TFLSupportErrorCode or TFLSupportErrorCodeUnspecifiedError in default cases. Note:
|
||||
// The mapping to absl::Status::code() is done to generate a more specific error code than
|
||||
// TFLSupportErrorCodeUnspecifiedError in cases when the payload can't be mapped to
|
||||
// TfLiteSupportStatus. This can happen when absl::Status returned by TfLite are in turn returned
|
||||
// without moodification by TfLite Support Methods.
|
||||
if (errorCode > MPPTasksErrorCodeLast || errorCode <= MPPTasksErrorCodeFirst) {
|
||||
switch (status.code()) {
|
||||
case absl::StatusCode::kInternal:
|
||||
errorCode = MPPTasksErrorCodeError;
|
||||
break;
|
||||
case absl::StatusCode::kInvalidArgument:
|
||||
errorCode = MPPTasksErrorCodeInvalidArgumentError;
|
||||
break;
|
||||
case absl::StatusCode::kNotFound:
|
||||
errorCode = MPPTasksErrorCodeError;
|
||||
break;
|
||||
default:
|
||||
errorCode = MPPTasksErrorCodeError;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Creates the NSEror with the appropriate error
|
||||
// TFLSupportErrorCode and message. TFLSupportErrorCode has a one to one
|
||||
// mapping with TfLiteSupportStatus starting from the value 1(TFLSupportErrorCodeUnspecifiedError)
|
||||
// and hence will be correctly initialized if directly cast from the integer code derived from
|
||||
// TfLiteSupportStatus stored in its payload. TFLSupportErrorCode omits kOk = 0 of
|
||||
// TfLiteSupportStatus.
|
||||
//
|
||||
// Stores a string including absl status code and message(if non empty) as the
|
||||
// error message See
|
||||
// https://github.com/abseil/abseil-cpp/blob/master/absl/status/status.h#L514
|
||||
// for explanation. absl::Status::message() can also be used but not always
|
||||
// guaranteed to be non empty.
|
||||
NSString *description = [NSString
|
||||
stringWithCString:status.ToString(absl::StatusToStringMode::kWithNoExtraData).c_str()
|
||||
encoding:NSUTF8StringEncoding];
|
||||
[TFLCommonUtils createCustomError:error withCode:errorCode description:description];
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
27
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h
Normal file
27
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include <string>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface NSString (Helpers)
|
||||
|
||||
@property(readonly) std::string cppString;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
23
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.mm
Normal file
23
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.mm
Normal file
|
@ -0,0 +1,23 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h"
|
||||
|
||||
@implementation NSString (Helpers)
|
||||
|
||||
- (std::string)cppString {
|
||||
return std::string(self.UTF8String, [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
|
||||
}
|
||||
|
||||
@end
|
32
mediapipe/tasks/ios/components/containers/BUILD
Normal file
32
mediapipe/tasks/ios/components/containers/BUILD
Normal file
|
@ -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.
|
||||
|
||||
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPCategory",
|
||||
srcs = ["sources/MPPCategory.m"],
|
||||
hdrs = ["sources/MPPCategory.h"],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "MPPClassificationResult",
|
||||
srcs = ["sources/MPPClassificationResult.m"],
|
||||
hdrs = ["sources/MPPClassificationResult.h"],
|
||||
deps = [
|
||||
":MPPCategory",
|
||||
],
|
||||
)
|
|
@ -0,0 +1,62 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** Encapsulates information about a class in the classification results. */
|
||||
NS_SWIFT_NAME(ClassificationCategory)
|
||||
@interface TFLCategory : NSObject
|
||||
|
||||
/** Index of the class in the corresponding label map, usually packed in the TFLite Model
|
||||
* Metadata. */
|
||||
@property(nonatomic, readonly) NSInteger index;
|
||||
|
||||
/** Confidence score for this class . */
|
||||
@property(nonatomic, readonly) float score;
|
||||
|
||||
/** Class name of the class. */
|
||||
@property(nonatomic, readonly, nullable) NSString *label;
|
||||
|
||||
/** Display name of the class. */
|
||||
@property(nonatomic, readonly, nullable) NSString *displayName;
|
||||
|
||||
/**
|
||||
* Initializes a new `TFLCategory` with the given index, score, label and display name.
|
||||
*
|
||||
* @param index Index of the class in the corresponding label map, usually packed in the TFLite
|
||||
* Model Metadata.
|
||||
*
|
||||
* @param score Confidence score for this class.
|
||||
*
|
||||
* @param label Class name of the class.
|
||||
*
|
||||
* @param displayName Display name of the class.
|
||||
*
|
||||
* @return An instance of `TFLCategory` initialized with the given index, score, label and display
|
||||
* name.
|
||||
*/
|
||||
- (instancetype)initWithIndex:(NSInteger)index
|
||||
score:(float)score
|
||||
label:(nullable NSString *)label
|
||||
displayName:(nullable NSString *)displayName;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,33 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/components/containers/sources/TFLCategory.h"
|
||||
|
||||
@implementation TFLCategory
|
||||
|
||||
- (instancetype)initWithIndex:(NSInteger)index
|
||||
score:(float)score
|
||||
label:(nullable NSString *)label
|
||||
displayName:(nullable NSString *)displayName {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_index = index;
|
||||
_score = score;
|
||||
_label = label;
|
||||
_displayName = displayName;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,94 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "mediapipe/tasks/ios/task/components/containers/sources/MPPCategory.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** Encapsulates list of predicted classes (aka labels) for a given image classifier head. */
|
||||
NS_SWIFT_NAME(Classifications)
|
||||
@interface MPPClassifications : NSObject
|
||||
|
||||
/**
|
||||
* The index of the classifier head these classes refer to. This is useful for multi-head
|
||||
* models.
|
||||
*/
|
||||
@property(nonatomic, readonly) NSInteger headIndex;
|
||||
|
||||
/** The name of the classifier head, which is the corresponding tensor metadata
|
||||
* name.
|
||||
*/
|
||||
@property(nonatomic, readonly) NSString *headName;
|
||||
|
||||
/** The array of predicted classes, usually sorted by descending scores (e.g.from high to low
|
||||
* probability). */
|
||||
@property(nonatomic, readonly) NSArray<MPPCategory *> *categories;
|
||||
|
||||
/**
|
||||
* Initializes a new `MPPClassifications` with the given head index and array of categories.
|
||||
* head name is initialized to `nil`.
|
||||
*
|
||||
* @param headIndex The index of the image classifier head these classes refer to.
|
||||
* @param categories An array of `MPPCategory` objects encapsulating a list of
|
||||
* predictions usually sorted by descending scores (e.g. from high to low probability).
|
||||
*
|
||||
* @return An instance of `MPPClassifications` initialized with the given head index and
|
||||
* array of categories.
|
||||
*/
|
||||
- (instancetype)initWithHeadIndex:(NSInteger)headIndex
|
||||
categories:(NSArray<MPPCategory *> *)categories;
|
||||
|
||||
/**
|
||||
* Initializes a new `MPPClassifications` with the given head index, head name and array of
|
||||
* categories.
|
||||
*
|
||||
* @param headIndex The index of the classifier head these classes refer to.
|
||||
* @param headName The name of the classifier head, which is the corresponding tensor metadata
|
||||
* name.
|
||||
* @param categories An array of `MPPCategory` objects encapsulating a list of
|
||||
* predictions usually sorted by descending scores (e.g. from high to low probability).
|
||||
*
|
||||
* @return An object of `MPPClassifications` initialized with the given head index, head name and
|
||||
* array of categories.
|
||||
*/
|
||||
- (instancetype)initWithHeadIndex:(NSInteger)headIndex
|
||||
headName:(nullable NSString *)headName
|
||||
categories:(NSArray<MPPCategory *> *)categories;
|
||||
|
||||
@end
|
||||
|
||||
/** Encapsulates results of any classification task. */
|
||||
NS_SWIFT_NAME(ClassificationResult)
|
||||
@interface MPPClassificationResult : NSObject
|
||||
|
||||
/** Array of MPPClassifications objects containing classifier predictions per image classifier
|
||||
* head.
|
||||
*/
|
||||
@property(nonatomic, readonly) NSArray<MPPClassifications *> *classifications;
|
||||
|
||||
/**
|
||||
* Initializes a new `MPPClassificationResult` with the given array of classifications.
|
||||
*
|
||||
* @param classifications An Aaray of `MPPClassifications` objects containing classifier
|
||||
* predictions per classifier head.
|
||||
*
|
||||
* @return An instance of MPPClassificationResult initialized with the given array of
|
||||
* classifications.
|
||||
*/
|
||||
- (instancetype)initWithClassifications:(NSArray<MPPClassifications *> *)classifications;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,50 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/components/containers/sources/MPPClassificationResult.h"
|
||||
|
||||
@implementation MPPClassifications
|
||||
|
||||
- (instancetype)initWithHeadIndex:(NSInteger)headIndex
|
||||
headName:(nullable NSString *)headName
|
||||
categories:(NSArray<MPPCategory *> *)categories {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_headIndex = headIndex;
|
||||
_headName = headName;
|
||||
_categories = categories;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithHeadIndex:(NSInteger)headIndex
|
||||
categories:(NSArray<MPPCategory *> *)categories {
|
||||
return [self initWithHeadIndex:headIndex headName:nil categories:categories];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPPClassificationResult {
|
||||
NSArray<MPPClassifications *> *_classifications;
|
||||
}
|
||||
|
||||
- (instancetype)initWithClassifications:(NSArray<MPPClassifications *> *)classifications {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_classifications = classifications;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
24
mediapipe/tasks/ios/components/processors/BUILD
Normal file
24
mediapipe/tasks/ios/components/processors/BUILD
Normal file
|
@ -0,0 +1,24 @@
|
|||
# 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"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPClassifierOptions",
|
||||
srcs = ["sources/MPPClassifierOptions.m"],
|
||||
hdrs = ["sources/MPPClassifierOptions.h"],
|
||||
)
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* Holds settings for any single iOS Mediapipe classification task.
|
||||
*/
|
||||
NS_SWIFT_NAME(ClassifierOptions)
|
||||
@interface MPPClassifierOptions : NSObject <NSCopying>
|
||||
|
||||
/** If set, all classes in this list will be filtered out from the results . */
|
||||
@property(nonatomic, copy) NSArray<NSString *> *labelDenyList;
|
||||
|
||||
/** If set, all classes not in this list will be filtered out from the results . */
|
||||
@property(nonatomic, copy) NSArray<NSString *> *labelAllowList;
|
||||
|
||||
/** Display names local for display names*/
|
||||
@property(nonatomic, copy) NSString *displayNamesLocale;
|
||||
|
||||
/** Results with score threshold greater than this value are returned . */
|
||||
@property(nonatomic) float scoreThreshold;
|
||||
|
||||
/** Limit to the number of classes that can be returned in results. */
|
||||
@property(nonatomic) NSInteger maxResults;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,40 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/components/processors/sources/MPPClassifierOptions.h"
|
||||
|
||||
@implementation MPPClassifierOptions
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.maxResults = -1;
|
||||
self.scoreThreshold = 0;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)copyWithZone:(NSZone *)zone {
|
||||
MPPClassifierOptions *classifierOptions = [[MPPClassifierOptions alloc] init];
|
||||
|
||||
classifierOptions.scoreThreshold = self.scoreThreshold;
|
||||
classifierOptions.maxResults = self.maxResults;
|
||||
classifierOptions.labelDenyList = self.labelDenyList;
|
||||
classifierOptions.labelAllowList = self.labelAllowList;
|
||||
classifierOptions.displayNamesLocale = self.displayNamesLocale;
|
||||
|
||||
return classifierOptions;
|
||||
}
|
||||
|
||||
@end
|
29
mediapipe/tasks/ios/components/processors/utils/BUILD
Normal file
29
mediapipe/tasks/ios/components/processors/utils/BUILD
Normal file
|
@ -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(default_visibility = ["//mediapipe/tasks:internal"])
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPClassifierOptionsHelpers",
|
||||
srcs = ["sources/MPPClassifierOptions+Helpers.mm"],
|
||||
hdrs = ["sources/MPPClassifierOptions+Helpers.h"],
|
||||
deps = [
|
||||
"//mediapipe/tasks/cc/components/processors/proto:classifier_options_cc_proto",
|
||||
"//mediapipe/tasks/ios/components/processors:MPPClassifierOptions",
|
||||
"//mediapipe/tasks/ios/common/utils:NSStringHelpers",
|
||||
]
|
||||
)
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#include "mediapipe/tasks/cc/components/processors/proto/classifier_options.pb.h"
|
||||
#import "mediapipe/tasks/ios/components/processors/sources/MPPClassifierOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface MPPClassifierOptions (Helpers)
|
||||
- (void)copyToProto:
|
||||
(mediapipe::tasks::components::processors::proto::ClassifierOptions *)classifierOptionsProto;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,38 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h"
|
||||
#import "mediapipe/tasks/ios/components/processors/utils/sources/MPPClassifierOptions+Helpers.h"
|
||||
|
||||
namespace {
|
||||
using ClassifierOptionsProto = ::mediapipe::tasks::components::processors::proto::ClassifierOptions;
|
||||
}
|
||||
|
||||
@implementation MPPClassifierOptions (Helpers)
|
||||
- (void)copyToProto:(ClassifierOptionsProto *)classifierOptionsProto {
|
||||
if (self.displayNamesLocale) {
|
||||
classifierOptionsProto->set_display_names_locale(self.displayNamesLocale.cppString);
|
||||
}
|
||||
classifierOptionsProto->set_max_results((int)self.maxResults);
|
||||
classifierOptionsProto->set_score_threshold(self.scoreThreshold);
|
||||
for (NSString *category in self.labelAllowList) {
|
||||
classifierOptionsProto->add_category_allowlist(category.cppString);
|
||||
}
|
||||
|
||||
for (NSString *category in self.labelDenyList) {
|
||||
classifierOptionsProto->add_category_denylist(category.cppString);
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
67
mediapipe/tasks/ios/core/BUILD
Normal file
67
mediapipe/tasks/ios/core/BUILD
Normal file
|
@ -0,0 +1,67 @@
|
|||
# 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"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPExternalFile",
|
||||
srcs = ["sources/MPPExternalFile.m"],
|
||||
hdrs = ["sources/MPPExternalFile.h"],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "MPPBaseOptions",
|
||||
srcs = ["sources/MPPBaseOptions.m"],
|
||||
hdrs = ["sources/MPPBaseOptions.h"],
|
||||
deps = [
|
||||
":MPPExternalFile",
|
||||
|
||||
],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "MPPTaskOptions",
|
||||
srcs = ["sources/MPPTaskOptions.m"],
|
||||
hdrs = ["sources/MPPTaskOptions.h"],
|
||||
copts = [
|
||||
"-ObjC++",
|
||||
"-std=c++17",
|
||||
],
|
||||
deps = [
|
||||
"//mediapipe/framework:calculator_options_cc_proto",
|
||||
":MPPBaseOptions",
|
||||
],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "MPPTaskInfo",
|
||||
srcs = ["sources/MPPTaskInfo.mm"],
|
||||
hdrs = ["sources/MPPTaskInfo.h"],
|
||||
copts = [
|
||||
"-ObjC++",
|
||||
"-std=c++17",
|
||||
],
|
||||
deps = [
|
||||
"//mediapipe/framework:calculator_cc_proto",
|
||||
"//mediapipe/framework:calculator_options_cc_proto",
|
||||
"//mediapipe/calculators/core:flow_limiter_calculator_cc_proto",
|
||||
":MPPTaskOptions",
|
||||
"//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
|
||||
"//mediapipe/tasks/ios/common/utils:NSStringHelpers",
|
||||
"//mediapipe/tasks/ios/common:MPPCommon",
|
||||
],
|
||||
)
|
||||
|
51
mediapipe/tasks/ios/core/sources/MPPBaseOptions.h
Normal file
51
mediapipe/tasks/ios/core/sources/MPPBaseOptions.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPExternalFile.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* MediaPipe Tasks delegate.
|
||||
*/
|
||||
typedef NS_ENUM(NSUInteger, MPPDelegate) {
|
||||
|
||||
/** CPU. */
|
||||
MPPDelegateCPU,
|
||||
|
||||
/** GPU. */
|
||||
MPPDelegateGPU
|
||||
} NS_SWIFT_NAME(Delegate);
|
||||
|
||||
/**
|
||||
* Holds the base options that is used for creation of any type of task. It has fields with
|
||||
* important information acceleration configuration, tflite model source etc.
|
||||
*/
|
||||
NS_SWIFT_NAME(BaseOptions)
|
||||
@interface MPPBaseOptions : NSObject <NSCopying>
|
||||
|
||||
/**
|
||||
* The external model file, as a single standalone TFLite file. It could be packed with TFLite Model
|
||||
* Metadata[1] and associated files if exist. Fail to provide the necessary metadata and associated
|
||||
* files might result in errors.
|
||||
*/
|
||||
@property(nonatomic, copy) MPPExternalFile *modelAssetFile;
|
||||
|
||||
/**
|
||||
* device delegate to run the MediaPipe pipeline. If the delegate is not set, the default
|
||||
* delegate CPU is used.
|
||||
*/
|
||||
@property(nonatomic) MPPDelegate delegate;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
36
mediapipe/tasks/ios/core/sources/MPPBaseOptions.m
Normal file
36
mediapipe/tasks/ios/core/sources/MPPBaseOptions.m
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPBaseOptions.h"
|
||||
|
||||
@implementation MPPBaseOptions
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.modelAssetFile = [[MPPExternalFile alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)copyWithZone:(NSZone *)zone {
|
||||
MPPBaseOptions *baseOptions = [[MPPBaseOptions alloc] init];
|
||||
|
||||
baseOptions.modelAssetFile = self.modelAssetFile;
|
||||
baseOptions.delegate = self.delegate;
|
||||
|
||||
return baseOptions;
|
||||
}
|
||||
|
||||
@end
|
28
mediapipe/tasks/ios/core/sources/MPPExternalFile.h
Normal file
28
mediapipe/tasks/ios/core/sources/MPPExternalFile.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* Holds information about an external file.
|
||||
*/
|
||||
NS_SWIFT_NAME(ExternalFile)
|
||||
@interface MPPExternalFile : NSObject <NSCopying>
|
||||
|
||||
/** Path to the file in bundle. */
|
||||
@property(nonatomic, copy) NSString *filePath;
|
||||
/// Add provision for other sources in future.
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
27
mediapipe/tasks/ios/core/sources/MPPExternalFile.m
Normal file
27
mediapipe/tasks/ios/core/sources/MPPExternalFile.m
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPExternalFile.h"
|
||||
|
||||
@implementation MPPExternalFile
|
||||
|
||||
- (id)copyWithZone:(NSZone *)zone {
|
||||
MPPExternalFile *externalFile = [[MPPExternalFile alloc] init];
|
||||
|
||||
externalFile.filePath = self.filePath;
|
||||
|
||||
return externalFile;
|
||||
}
|
||||
|
||||
@end
|
64
mediapipe/tasks/ios/core/sources/MPPTaskInfo.h
Normal file
64
mediapipe/tasks/ios/core/sources/MPPTaskInfo.h
Normal file
|
@ -0,0 +1,64 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
#include "mediapipe/framework/calculator.pb.h"
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPTaskOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* Holds all needed informaton to initialize a MediaPipe Task.
|
||||
*/
|
||||
@interface MPPTaskInfo : NSObject <NSCopying>
|
||||
|
||||
@property(nonatomic, copy, nonnull) NSString *taskGraphName;
|
||||
|
||||
/**
|
||||
* A task-specific options that is derived from MPPTaskOptions and confirms to
|
||||
* MPPTaskOptionsProtocol.
|
||||
*/
|
||||
@property(nonatomic, copy) id<MPPTaskOptionsProtocol> taskOptions;
|
||||
|
||||
/**
|
||||
* List of task graph input stream info strings in the form TAG:name.
|
||||
*/
|
||||
@property(nonatomic, copy) NSArray *inputStreams;
|
||||
|
||||
/**
|
||||
* List of task graph output stream info in the form TAG:name.
|
||||
*/
|
||||
@property(nonatomic, copy) NSArray *outputStreams;
|
||||
|
||||
/**
|
||||
* If the task requires a flow limiter.
|
||||
*/
|
||||
@property(nonatomic) BOOL enableFlowLimiting;
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
|
||||
- (instancetype)initWithTaskGraphName:(NSString *)taskGraphName
|
||||
inputStreams:(NSArray<NSString *> *)inputStreams
|
||||
outputStreams:(NSArray<NSString *> *)outputStreams
|
||||
taskOptions:(id<MPPTaskOptionsProtocol>)taskOptions
|
||||
enableFlowLimiting:(BOOL)enableFlowLimiting
|
||||
error:(NSError **)error;
|
||||
|
||||
/**
|
||||
* Creates a MediaPipe Task protobuf message from the MPPTaskInfo instance.
|
||||
*/
|
||||
- (mediapipe::CalculatorGraphConfig)generateGraphConfig;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
135
mediapipe/tasks/ios/core/sources/MPPTaskInfo.mm
Normal file
135
mediapipe/tasks/ios/core/sources/MPPTaskInfo.mm
Normal file
|
@ -0,0 +1,135 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPTaskInfo.h"
|
||||
#import "mediapipe/tasks/ios/common/sources/MPPCommon.h"
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h"
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h"
|
||||
|
||||
#include "mediapipe/calculators/core/flow_limiter_calculator.pb.h"
|
||||
#include "mediapipe/framework/calculator.pb.h"
|
||||
#include "mediapipe/framework/calculator_options.pb.h"
|
||||
|
||||
namespace {
|
||||
using CalculatorGraphConfig = ::mediapipe::CalculatorGraphConfig;
|
||||
using Node = ::mediapipe::CalculatorGraphConfig::Node;
|
||||
using InputStreamInfo = ::mediapipe::InputStreamInfo;
|
||||
using CalculatorOptions = ::mediapipe::CalculatorOptions;
|
||||
using FlowLimiterCalculatorOptions = ::mediapipe::FlowLimiterCalculatorOptions;
|
||||
} // namespace
|
||||
|
||||
@implementation MPPTaskInfo
|
||||
|
||||
- (instancetype)initWithTaskGraphName:(NSString *)taskGraphName
|
||||
inputStreams:(NSArray<NSString *> *)inputStreams
|
||||
outputStreams:(NSArray<NSString *> *)outputStreams
|
||||
taskOptions:(id<MPPTaskOptionsProtocol>)taskOptions
|
||||
enableFlowLimiting:(BOOL)enableFlowLimiting
|
||||
error:(NSError **)error {
|
||||
self = [super init];
|
||||
if (!taskGraphName || !inputStreams.count || !outputStreams.count) {
|
||||
[MPPCommonUtils
|
||||
createCustomError:error
|
||||
withCode:MPPTasksErrorCodeInvalidArgumentError
|
||||
description:
|
||||
@"Task graph's name, input streams, and output streams should be non-empty."];
|
||||
}
|
||||
|
||||
if (self) {
|
||||
_taskGraphName = taskGraphName;
|
||||
_inputStreams = inputStreams;
|
||||
_outputStreams = outputStreams;
|
||||
_taskOptions = taskOptions;
|
||||
_enableFlowLimiting = enableFlowLimiting;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)copyWithZone:(NSZone *)zone {
|
||||
MPPTaskInfo *taskInfo = [[MPPTaskInfo alloc] init];
|
||||
|
||||
taskInfo.taskGraphName = self.taskGraphName;
|
||||
taskInfo.inputStreams = self.inputStreams;
|
||||
taskInfo.outputStreams = self.outputStreams;
|
||||
taskInfo.taskOptions = self.taskOptions;
|
||||
taskInfo.enableFlowLimiting = self.enableFlowLimiting;
|
||||
|
||||
return taskInfo;
|
||||
}
|
||||
|
||||
- (CalculatorGraphConfig)generateGraphConfig {
|
||||
CalculatorGraphConfig graph_config;
|
||||
|
||||
Node *task_subgraph_node = graph_config.add_node();
|
||||
task_subgraph_node->set_calculator(self.taskGraphName.cppString);
|
||||
[self.taskOptions copyToProto:task_subgraph_node->mutable_options()];
|
||||
|
||||
for (NSString *outputStream in self.outputStreams) {
|
||||
auto cpp_output_stream = std::string(outputStream.cppString);
|
||||
task_subgraph_node->add_output_stream(cpp_output_stream);
|
||||
graph_config.add_output_stream(cpp_output_stream);
|
||||
}
|
||||
|
||||
if (self.enableFlowLimiting) {
|
||||
Node *flow_limit_calculator_node = graph_config.add_node();
|
||||
|
||||
flow_limit_calculator_node->set_calculator("FlowLimiterCalculator");
|
||||
|
||||
InputStreamInfo *input_stream_info = flow_limit_calculator_node->add_input_stream_info();
|
||||
input_stream_info->set_tag_index("FINISHED");
|
||||
input_stream_info->set_back_edge(true);
|
||||
|
||||
FlowLimiterCalculatorOptions *flow_limit_calculator_options =
|
||||
flow_limit_calculator_node->mutable_options()->MutableExtension(
|
||||
FlowLimiterCalculatorOptions::ext);
|
||||
flow_limit_calculator_options->set_max_in_flight(1);
|
||||
flow_limit_calculator_options->set_max_in_queue(1);
|
||||
|
||||
for (NSString *inputStream in self.inputStreams) {
|
||||
graph_config.add_input_stream(inputStream.cppString);
|
||||
|
||||
NSString *strippedInputStream = [MPPTaskInfo stripTagIndex:inputStream];
|
||||
flow_limit_calculator_node->add_input_stream(strippedInputStream.cppString);
|
||||
|
||||
NSString *taskInputStream = [MPPTaskInfo addStreamNamePrefix:inputStream];
|
||||
task_subgraph_node->add_input_stream(taskInputStream.cppString);
|
||||
|
||||
NSString *strippedTaskInputStream = [MPPTaskInfo stripTagIndex:taskInputStream];
|
||||
flow_limit_calculator_node->add_output_stream(strippedTaskInputStream.cppString);
|
||||
}
|
||||
|
||||
NSString *firstOutputStream = self.outputStreams[0];
|
||||
auto finished_output_stream = "FINISHED:" + firstOutputStream.cppString;
|
||||
flow_limit_calculator_node->add_input_stream(finished_output_stream);
|
||||
} else {
|
||||
for (NSString *inputStream in self.inputStreams) {
|
||||
auto cpp_input_stream = inputStream.cppString;
|
||||
task_subgraph_node->add_input_stream(cpp_input_stream);
|
||||
graph_config.add_input_stream(cpp_input_stream);
|
||||
}
|
||||
}
|
||||
|
||||
return graph_config;
|
||||
}
|
||||
|
||||
+ (NSString *)stripTagIndex:(NSString *)tagIndexName {
|
||||
return [tagIndexName componentsSeparatedByString:@":"][1];
|
||||
}
|
||||
|
||||
+ (NSString *)addStreamNamePrefix:(NSString *)tagIndexName {
|
||||
NSArray *splits = [tagIndexName componentsSeparatedByString:@":"];
|
||||
return [NSString stringWithFormat:@"%@:throttled_%@", splits[0], splits[1]];
|
||||
}
|
||||
|
||||
@end
|
58
mediapipe/tasks/ios/core/sources/MPPTaskOptions.h
Normal file
58
mediapipe/tasks/ios/core/sources/MPPTaskOptions.h
Normal file
|
@ -0,0 +1,58 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
#include "mediapipe/framework/calculator_options.pb.h"
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPBaseOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* MediaPipe Tasks options base class. Any MediaPipe task-specific options class should extend
|
||||
* this class.
|
||||
*/
|
||||
NS_SWIFT_NAME(TaskOptions)
|
||||
@interface MPPTaskOptions : NSObject <NSCopying>
|
||||
/**
|
||||
* Base options for configuring the Mediapipe task.
|
||||
*/
|
||||
@property(nonatomic, copy) MPPBaseOptions *baseOptions;
|
||||
|
||||
/**
|
||||
* Initializes a new `MPPTaskOptions` with the absolute path to the model file
|
||||
* stored locally on the device, set to the given the model path.
|
||||
*
|
||||
* @discussion The external model file must be a single standalone TFLite file. It could be packed
|
||||
* with TFLite Model Metadata[1] and associated files if they exist. Failure to provide the
|
||||
* necessary metadata and associated files might result in errors. Check the [documentation]
|
||||
* (https://www.tensorflow.org/lite/convert/metadata) for each task about the specific requirement.
|
||||
*
|
||||
* @param modelPath An absolute path to a TensorFlow Lite model file stored locally on the device.
|
||||
*
|
||||
* @return An instance of `MPPTaskOptions` initialized to the given model path.
|
||||
*/
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath;
|
||||
|
||||
@end
|
||||
|
||||
/**
|
||||
* Any mediapipe task options should confirm to this protocol.
|
||||
*/
|
||||
@protocol MPPTaskOptionsProtocol
|
||||
|
||||
/**
|
||||
* Copies the iOS Mediapipe task options to an object of mediapipe::CalculatorOptions proto.
|
||||
*/
|
||||
- (void)copyToProto:(mediapipe::CalculatorOptions *)optionsProto;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
36
mediapipe/tasks/ios/core/sources/MPPTaskOptions.m
Normal file
36
mediapipe/tasks/ios/core/sources/MPPTaskOptions.m
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPTaskOptions.h"
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPBaseOptions.h"
|
||||
|
||||
@implementation MPPTaskOptions
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_baseOptions = [[MPPBaseOptions alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath {
|
||||
self = [self init];
|
||||
if (self) {
|
||||
_baseOptions.modelAssetFile.filePath = modelPath;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
27
mediapipe/tasks/ios/core/utils/BUILD
Normal file
27
mediapipe/tasks/ios/core/utils/BUILD
Normal file
|
@ -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.
|
||||
|
||||
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPBaseOptionsHelpers",
|
||||
srcs = ["sources/MPPBaseOptions+Helpers.mm"],
|
||||
hdrs = ["sources/MPPBaseOptions+Helpers.h"],
|
||||
deps = [
|
||||
"//mediapipe/tasks/ios/core:MPPBaseOptions",
|
||||
"//mediapipe/tasks/cc/core/proto:base_options_cc_proto",
|
||||
],
|
||||
)
|
|
@ -0,0 +1,26 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#include "mediapipe/tasks/cc/core/proto/base_options.pb.h"
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPBaseOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface MPPBaseOptions (Helpers)
|
||||
|
||||
- (void)copyToProto:(mediapipe::tasks::core::proto::BaseOptions *)baseOptionsProto;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,40 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/core/utils/sources/MPPBaseOptions+Helpers.h"
|
||||
|
||||
namespace {
|
||||
using BaseOptionsProto = ::mediapipe::tasks::core::proto::BaseOptions;
|
||||
}
|
||||
|
||||
@implementation MPPBaseOptions (Helpers)
|
||||
|
||||
- (void)copyToProto:(BaseOptionsProto *)baseOptionsProto {
|
||||
if (self.modelAssetFile.filePath) {
|
||||
baseOptionsProto->mutable_model_asset()->set_file_name(self.modelAssetFile.filePath.UTF8String);
|
||||
}
|
||||
|
||||
switch (self.delegate) {
|
||||
case MPPDelegateCPU: {
|
||||
baseOptionsProto->mutable_acceleration()->mutable_tflite();
|
||||
break;
|
||||
}
|
||||
case MPPDelegateGPU:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
33
mediapipe/tasks/ios/text/core/BUILD
Normal file
33
mediapipe/tasks/ios/text/core/BUILD
Normal file
|
@ -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.
|
||||
|
||||
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPBaseTextTaskApi",
|
||||
srcs = ["sources/MPPBaseTextTaskApi.mm"],
|
||||
hdrs = ["sources/MPPBaseTextTaskApi.h"],
|
||||
copts = [
|
||||
"-ObjC++",
|
||||
"-std=c++17",
|
||||
],
|
||||
deps = [
|
||||
"//mediapipe/tasks/cc/core:task_runner",
|
||||
"//mediapipe/framework:calculator_cc_proto",
|
||||
"//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
|
||||
],
|
||||
)
|
||||
|
44
mediapipe/tasks/ios/text/core/sources/MPPBaseTextTaskApi.h
Normal file
44
mediapipe/tasks/ios/text/core/sources/MPPBaseTextTaskApi.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include "mediapipe/framework/calculator.pb.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* The base class of the user-facing iOS mediapipe text task api classes.
|
||||
*/
|
||||
NS_SWIFT_NAME(BaseTextTaskApi)
|
||||
@interface MPPBaseTextTaskApi : NSObject
|
||||
|
||||
/**
|
||||
* Initializes a new `MPPBaseTextTaskApi` with the mediapipe text task graph config proto.
|
||||
*
|
||||
* @param graphConfig A mediapipe text task graph config proto.
|
||||
*
|
||||
* @return An instance of `MPPBaseTextTaskApi` initialized to the given graph config proto.
|
||||
*/
|
||||
- (instancetype)initWithCalculatorGraphConfig:(mediapipe::CalculatorGraphConfig)graphConfig
|
||||
error:(NSError **)error;
|
||||
- (void)close;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
52
mediapipe/tasks/ios/text/core/sources/MPPBaseTextTaskApi.mm
Normal file
52
mediapipe/tasks/ios/text/core/sources/MPPBaseTextTaskApi.mm
Normal file
|
@ -0,0 +1,52 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/text/core/sources/MPPBaseTextTaskApi.h"
|
||||
|
||||
#include "mediapipe/tasks/cc/core/task_runner.h"
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h"
|
||||
|
||||
namespace {
|
||||
using ::mediapipe::CalculatorGraphConfig;
|
||||
using TaskRunnerCpp = ::mediapipe::tasks::core::TaskRunner;
|
||||
} // namespace
|
||||
|
||||
@interface MPPBaseTextTaskApi () {
|
||||
/** TextSearcher backed by C++ API */
|
||||
std::unique_ptr<TaskRunnerCpp> _taskRunner;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation MPPBaseTextTaskApi
|
||||
|
||||
- (instancetype)initWithCalculatorGraphConfig:(CalculatorGraphConfig)graphConfig
|
||||
error:(NSError **)error {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
auto taskRunnerResult = TaskRunnerCpp::Create(std::move(graphConfig));
|
||||
|
||||
if (![MPPCommonUtils checkCppError:taskRunnerResult.status() toError:error]) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
_taskRunner = std::move(taskRunnerResult.value());
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)close {
|
||||
_taskRunner->Close();
|
||||
}
|
||||
|
||||
@end
|
50
mediapipe/tasks/ios/text/text_classifier/BUILD
Normal file
50
mediapipe/tasks/ios/text/text_classifier/BUILD
Normal file
|
@ -0,0 +1,50 @@
|
|||
# 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"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPTextClassifier",
|
||||
srcs = ["sources/MPPTextClassifier.mm"],
|
||||
hdrs = ["sources/MPPTextClassifier.h"],
|
||||
copts = [
|
||||
"-ObjC++",
|
||||
"-std=c++17",
|
||||
],
|
||||
deps = [
|
||||
"//mediapipe/tasks/ios/core:MPPTaskOptions",
|
||||
"//mediapipe/tasks/ios/core:MPPTaskInfo",
|
||||
"//mediapipe/tasks/ios/text/core:MPPBaseTextTaskApi",
|
||||
"//mediapipe/tasks/ios/text/text_classifier/utils:MPPTextClassifierOptionsHelpers",
|
||||
"//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
|
||||
":MPPTextClassifierOptions",
|
||||
],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "MPPTextClassifierOptions",
|
||||
srcs = ["sources/MPPTextClassifierOptions.mm"],
|
||||
hdrs = ["sources/MPPTextClassifierOptions.h"],
|
||||
copts = [
|
||||
"-ObjC++",
|
||||
"-std=c++17",
|
||||
],
|
||||
deps = [
|
||||
"//mediapipe/tasks/ios/core:MPPTaskOptions",
|
||||
"//mediapipe/tasks/ios/components/processors:MPPClassifierOptions",
|
||||
],
|
||||
)
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPTaskOptions.h"
|
||||
#import "mediapipe/tasks/ios/text/core/sources/MPPBaseTextTaskApi.h"
|
||||
#import "mediapipe/tasks/ios/text/text_classifier/sources/MPPTextClassifierOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* A Mediapipe iOS Text Classifier.
|
||||
*/
|
||||
NS_SWIFT_NAME(TextClassifier)
|
||||
@interface MPPTextClassifier : MPPBaseTextTaskApi
|
||||
|
||||
/**
|
||||
* Creates a new instance of `MPPTextClassifier` from an absolute path to a TensorFlow Lite model
|
||||
* file stored locally on the device.
|
||||
*
|
||||
* @param modelPath An absolute path to a TensorFlow Lite model file stored locally on the device.
|
||||
*
|
||||
* @param error An optional error parameter populated when there is an error in initializing
|
||||
* the text classifier.
|
||||
*
|
||||
* @return A new instance of `MPPTextClassifier` with the given model path. `nil` if there is an
|
||||
* error in initializing the text classifier.
|
||||
*/
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath error:(NSError **)error;
|
||||
|
||||
/**
|
||||
* Creates a new instance of `MPPTextClassifier` from the given text classifier options.
|
||||
*
|
||||
* @param options The options to use for configuring the `MPPTextClassifier`.
|
||||
* @param error An optional error parameter populated when there is an error in initializing
|
||||
* the text classifier.
|
||||
*
|
||||
* @return A new instance of `MPPTextClassifier` with the given options. `nil` if there is an error
|
||||
* in initializing the text classifier.
|
||||
*/
|
||||
- (instancetype)initWithOptions:(MPPTextClassifierOptions *)options error:(NSError **)error;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,65 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/text/text_classifier/sources/MPPTextClassifier.h"
|
||||
|
||||
#import "mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h"
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPTaskInfo.h"
|
||||
#import "mediapipe/tasks/ios/text/text_classifier/utils/sources/MPPTextClassifierOptions+Helpers.h"
|
||||
|
||||
NSString *kClassificationsStreamName = @"classifications_out";
|
||||
NSString *kClassificationsTag = @"classifications";
|
||||
NSString *kTextInStreamName = @"text_in";
|
||||
NSString *kTextTag = @"TEXT";
|
||||
NSString *kTaskGraphName = @"mediapipe.tasks.text.text_classifier.TextClassifierGraph";
|
||||
|
||||
@implementation MPPTextClassifierOptions
|
||||
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath {
|
||||
self = [super initWithModelPath:modelPath];
|
||||
if (self) {
|
||||
_classifierOptions = [[MPPClassifierOptions alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPPTextClassifier
|
||||
|
||||
- (instancetype)initWithOptions:(MPPTextClassifierOptions *)options error:(NSError **)error {
|
||||
MPPTaskInfo *taskInfo = [[MPPTaskInfo alloc]
|
||||
initWithTaskGraphName:kTaskGraphName
|
||||
inputStreams:@[ [NSString stringWithFormat:@"@:@", kTextTag, kTextInStreamName] ]
|
||||
outputStreams:@[ [NSString stringWithFormat:@"@:@", kClassificationsTag,
|
||||
kClassificationsStreamName] ]
|
||||
taskOptions:options
|
||||
enableFlowLimiting:NO
|
||||
error:error];
|
||||
|
||||
if (!taskInfo) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [super initWithCalculatorGraphConfig:[taskInfo generateGraphConfig] error:error];
|
||||
}
|
||||
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath error:(NSError **)error {
|
||||
MPPTextClassifierOptions *options =
|
||||
[[MPPTextClassifierOptions alloc] initWithModelPath:modelPath];
|
||||
|
||||
return [self initWithOptions:options error:error];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,51 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "mediapipe/tasks/ios/components/processors/sources/MPPClassifierOptions.h"
|
||||
#import "mediapipe/tasks/ios/core/sources/MPPTaskOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* Options to configure MPPTextClassifierOptions.
|
||||
*/
|
||||
NS_SWIFT_NAME(TextClassifierOptions)
|
||||
@interface MPPTextClassifierOptions : MPPTaskOptions
|
||||
|
||||
/**
|
||||
* Options controlling the behavior of the embedding model specified in the
|
||||
* base options.
|
||||
*/
|
||||
@property(nonatomic, copy) MPPClassifierOptions *classifierOptions;
|
||||
|
||||
/**
|
||||
* Initializes a new `MPPTextClassifierOptions` with the absolute path to the model file
|
||||
* stored locally on the device, set to the given the model path.
|
||||
*
|
||||
* @discussion The external model file must be a single standalone TFLite file. It could be packed
|
||||
* with TFLite Model Metadata[1] and associated files if they exist. Failure to provide the
|
||||
* necessary metadata and associated files might result in errors. Check the [documentation]
|
||||
* (https://www.tensorflow.org/lite/convert/metadata) for each task about the specific requirement.
|
||||
*
|
||||
* @param modelPath An absolute path to a TensorFlow Lite model file stored locally on the device.
|
||||
*
|
||||
* @return An instance of `MPPTextClassifierOptions` initialized to the given model path.
|
||||
*/
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,27 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#import "mediapipe/tasks/ios/text/text_classifier/sources/MPPTextClassifierOptions.h"
|
||||
|
||||
@implementation MPPTextClassifierOptions
|
||||
|
||||
- (instancetype)initWithModelPath:(NSString *)modelPath {
|
||||
self = [super initWithModelPath:modelPath];
|
||||
if (self) {
|
||||
_classifierOptions = [[MPPClassifierOptions alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
30
mediapipe/tasks/ios/text/text_classifier/utils/BUILD
Normal file
30
mediapipe/tasks/ios/text/text_classifier/utils/BUILD
Normal file
|
@ -0,0 +1,30 @@
|
|||
# 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"])
|
||||
|
||||
objc_library(
|
||||
name = "MPPTextClassifierOptionsHelpers",
|
||||
srcs = ["sources/MPPTextClassifierOptions+Helpers.mm"],
|
||||
hdrs = ["sources/MPPTextClassifierOptions+Helpers.h"],
|
||||
deps = [
|
||||
"//mediapipe/tasks/ios/text/text_classifier:MPPTextClassifierOptions",
|
||||
"//mediapipe/tasks/ios/core/utils:MPPBaseOptionsHelpers",
|
||||
"//mediapipe/tasks/ios/components/processors/utils:MPPClassifierOptionsHelpers",
|
||||
"//mediapipe/tasks/cc/text/text_classifier/proto:text_classifier_graph_options_cc_proto",
|
||||
"//mediapipe/framework:calculator_options_cc_proto",
|
||||
],
|
||||
)
|
|
@ -0,0 +1,26 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#include "mediapipe/framework/calculator_options.pb.h"
|
||||
#import "mediapipe/tasks/ios/text/text_classifier/sources/MPPTextClassifierOptions.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface MPPTextClassifierOptions (Helpers) <MPPTaskOptionsProtocol>
|
||||
|
||||
- (void)copyToProto:(mediapipe::CalculatorOptions *)optionsProto;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,36 @@
|
|||
/* 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.
|
||||
==============================================================================*/
|
||||
#include "mediapipe/tasks/cc/text/text_classifier/proto/text_classifier_graph_options.pb.h"
|
||||
#import "mediapipe/tasks/ios/components/processors/utils/sources/MPPClassifierOptions+Helpers.h"
|
||||
#import "mediapipe/tasks/ios/core/utils/sources/MPPBaseOptions+Helpers.h"
|
||||
#import "mediapipe/tasks/ios/text/text_classifier/utils/sources/MPPTextClassifierOptions+Helpers.h"
|
||||
|
||||
namespace {
|
||||
using CalculatorOptionsProto = ::mediapipe::CalculatorOptions;
|
||||
using TextClassifierGraphOptionsProto =
|
||||
::mediapipe::tasks::text::text_classifier::proto::TextClassifierGraphOptions;
|
||||
|
||||
} // namespace
|
||||
|
||||
@implementation MPPTextClassifierOptions (Helpers)
|
||||
|
||||
- (void)copyToProto:(CalculatorOptionsProto *)optionsProto {
|
||||
TextClassifierGraphOptionsProto *graph_options =
|
||||
optionsProto->MutableExtension(TextClassifierGraphOptionsProto::ext);
|
||||
[self.baseOptions copyToProto:graph_options->mutable_base_options()];
|
||||
[self.classifierOptions copyToProto:graph_options->mutable_classifier_options()];
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in New Issue
Block a user