From eb52b72707d303eba354236bda76e735a4163d8a Mon Sep 17 00:00:00 2001 From: Yuqi Li Date: Fri, 14 Oct 2022 16:11:15 -0700 Subject: [PATCH] Internal change PiperOrigin-RevId: 481255129 --- mediapipe/tasks/cc/core/BUILD | 39 +++ .../cc/core/model_asset_bundle_resources.cc | 107 ++++++++ .../cc/core/model_asset_bundle_resources.h | 92 +++++++ .../core/model_asset_bundle_resources_test.cc | 229 ++++++++++++++++++ .../tasks/cc/core/model_resources_test.cc | 11 +- mediapipe/tasks/testdata/core/BUILD | 2 + .../core/dummy_gesture_recognizer.task | Bin 0 -> 45490 bytes third_party/external_files.bzl | 6 + 8 files changed, 476 insertions(+), 10 deletions(-) create mode 100644 mediapipe/tasks/cc/core/model_asset_bundle_resources.cc create mode 100644 mediapipe/tasks/cc/core/model_asset_bundle_resources.h create mode 100644 mediapipe/tasks/cc/core/model_asset_bundle_resources_test.cc create mode 100644 mediapipe/tasks/testdata/core/dummy_gesture_recognizer.task diff --git a/mediapipe/tasks/cc/core/BUILD b/mediapipe/tasks/cc/core/BUILD index 8d19227f..f3258a60 100644 --- a/mediapipe/tasks/cc/core/BUILD +++ b/mediapipe/tasks/cc/core/BUILD @@ -138,6 +138,7 @@ cc_test_with_tflite( "@org_tensorflow//tensorflow/lite/core/shims:framework_stable", ], deps = [ + ":utils", "//mediapipe/framework/api2:packet", "//mediapipe/framework/port:gtest_main", "//mediapipe/tasks/cc:common", @@ -314,3 +315,41 @@ cc_library( "@flatbuffers//:runtime_cc", ], ) + +cc_library( + name = "model_asset_bundle_resources", + srcs = ["model_asset_bundle_resources.cc"], + hdrs = ["model_asset_bundle_resources.h"], + deps = [ + ":external_file_handler", + "//mediapipe/framework/port:status", + "//mediapipe/tasks/cc:common", + "//mediapipe/tasks/cc/core/proto:external_file_cc_proto", + "//mediapipe/tasks/cc/metadata/utils:zip_utils", + "//mediapipe/util:resource_util", + "@com_google_absl//absl/container:flat_hash_map", + "@com_google_absl//absl/status", + "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", + ], +) + +cc_test( + name = "model_asset_bundle_resources_test", + srcs = ["model_asset_bundle_resources_test.cc"], + data = [ + "//mediapipe/tasks/testdata/core:test_models", + ], + deps = [ + ":model_asset_bundle_resources", + ":model_resources", + ":utils", + "//mediapipe/framework/port:gtest_main", + "//mediapipe/framework/port:status", + "//mediapipe/tasks/cc:common", + "//mediapipe/tasks/cc/core/proto:external_file_cc_proto", + "//mediapipe/tasks/cc/metadata/utils:zip_utils", + "@org_tensorflow//tensorflow/lite/c:common", + ], +) diff --git a/mediapipe/tasks/cc/core/model_asset_bundle_resources.cc b/mediapipe/tasks/cc/core/model_asset_bundle_resources.cc new file mode 100644 index 00000000..5867be49 --- /dev/null +++ b/mediapipe/tasks/cc/core/model_asset_bundle_resources.cc @@ -0,0 +1,107 @@ +/* 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. +==============================================================================*/ + +#include "mediapipe/tasks/cc/core/model_asset_bundle_resources.h" + +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_format.h" +#include "absl/strings/str_join.h" +#include "mediapipe/framework/port/status_macros.h" +#include "mediapipe/tasks/cc/common.h" +#include "mediapipe/tasks/cc/metadata/utils/zip_utils.h" +#include "mediapipe/util/resource_util.h" + +namespace mediapipe { +namespace tasks { +namespace core { + +namespace { +using ::absl::StatusCode; +} // namespace + +ModelAssetBundleResources::ModelAssetBundleResources( + const std::string& tag, + std::unique_ptr model_asset_bundle_file) + : tag_(tag), model_asset_bundle_file_(std::move(model_asset_bundle_file)) {} + +/* static */ +absl::StatusOr> +ModelAssetBundleResources::Create( + const std::string& tag, + std::unique_ptr model_asset_bundle_file) { + if (model_asset_bundle_file == nullptr) { + return CreateStatusWithPayload( + StatusCode::kInvalidArgument, + "The model asset bundle file proto cannot be nullptr.", + MediaPipeTasksStatus::kInvalidArgumentError); + } + auto model_bundle_resources = absl::WrapUnique( + new ModelAssetBundleResources(tag, std::move(model_asset_bundle_file))); + MP_RETURN_IF_ERROR( + model_bundle_resources->ExtractModelFilesFromExternalFileProto()); + return model_bundle_resources; +} + +absl::Status +ModelAssetBundleResources::ExtractModelFilesFromExternalFileProto() { + if (model_asset_bundle_file_->has_file_name()) { + // If the model asset bundle file name is a relative path, searches the file + // in a platform-specific location and returns the absolute path on success. + ASSIGN_OR_RETURN( + std::string path_to_resource, + mediapipe::PathToResourceAsFile(model_asset_bundle_file_->file_name())); + model_asset_bundle_file_->set_file_name(path_to_resource); + } + ASSIGN_OR_RETURN(model_asset_bundle_file_handler_, + ExternalFileHandler::CreateFromExternalFile( + model_asset_bundle_file_.get())); + const char* buffer_data = + model_asset_bundle_file_handler_->GetFileContent().data(); + size_t buffer_size = + model_asset_bundle_file_handler_->GetFileContent().size(); + return metadata::ExtractFilesfromZipFile(buffer_data, buffer_size, + &model_files_); +} + +absl::StatusOr ModelAssetBundleResources::GetModelFile( + const std::string& filename) const { + auto it = model_files_.find(filename); + if (it == model_files_.end()) { + auto model_files = ListModelFiles(); + std::string all_model_files = + absl::StrJoin(model_files.begin(), model_files.end(), ", "); + + return CreateStatusWithPayload( + StatusCode::kNotFound, + absl::StrFormat("No model file with name: %s. All model files in the " + "model asset bundle are: %s.", + filename, all_model_files), + MediaPipeTasksStatus::kFileNotFoundError); + } + return it->second; +} + +std::vector ModelAssetBundleResources::ListModelFiles() const { + std::vector model_names; + for (const auto& [model_name, _] : model_files_) { + model_names.push_back(model_name); + } + return model_names; +} + +} // namespace core +} // namespace tasks +} // namespace mediapipe diff --git a/mediapipe/tasks/cc/core/model_asset_bundle_resources.h b/mediapipe/tasks/cc/core/model_asset_bundle_resources.h new file mode 100644 index 00000000..61474d3a --- /dev/null +++ b/mediapipe/tasks/cc/core/model_asset_bundle_resources.h @@ -0,0 +1,92 @@ +/* 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. +==============================================================================*/ + +#ifndef MEDIAPIPE_TASKS_CC_CORE_MODEL_ASSET_BUNDLE_RESOURCES_H_ +#define MEDIAPIPE_TASKS_CC_CORE_MODEL_ASSET_BUNDLE_RESOURCES_H_ + +#include "absl/container/flat_hash_map.h" +#include "absl/status/statusor.h" +#include "mediapipe/tasks/cc/core/external_file_handler.h" +#include "mediapipe/tasks/cc/core/proto/external_file.pb.h" + +namespace mediapipe { +namespace tasks { +namespace core { + +// The mediapipe task model asset bundle resources class. +// A ModelAssetBundleResources object, created from an external file proto, +// contains model asset bundle related resources and the method to extract the +// tflite models or model asset bundles for the mediapipe sub-tasks. As the +// resources are owned by the ModelAssetBundleResources object +// callers must keep ModelAssetBundleResources alive while using any of the +// resources. +class ModelAssetBundleResources { + public: + // Takes the ownership of the provided ExternalFile proto and creates + // ModelAssetBundleResources from the proto. A non-empty tag + // must be set if the ModelAssetBundleResources will be used through + // ModelResourcesCacheService. + static absl::StatusOr> Create( + const std::string& tag, + std::unique_ptr model_asset_bundle_file); + + // ModelResources is neither copyable nor movable. + ModelAssetBundleResources(const ModelAssetBundleResources&) = delete; + ModelAssetBundleResources& operator=(const ModelAssetBundleResources&) = + delete; + + // Returns the model asset bundle resources tag. + std::string GetTag() const { return tag_; } + + // Gets the contents of the model file (either tflite model file or model + // bundle file) with the provided name. An error is returned if there is no + // such model file. + absl::StatusOr GetModelFile( + const std::string& filename) const; + + // Lists all the model file names in the model asset model. + std::vector ListModelFiles() const; + + private: + // Constructor. + ModelAssetBundleResources( + const std::string& tag, + std::unique_ptr model_asset_bundle_file); + + // Extracts the model files (either tflite model file or model bundle file) + // from the external file proto. + absl::Status ExtractModelFilesFromExternalFileProto(); + + // The model asset bundle resources tag. + const std::string tag_; + + // The model asset bundle file. + std::unique_ptr model_asset_bundle_file_; + + // The ExternalFileHandler for the model asset bundle. + std::unique_ptr model_asset_bundle_file_handler_; + + // The model files bundled in model asset bundle, as a map with the filename + // (corresponding to a basename, e.g. "hand_detector.tflite") as key and + // a pointer to the file contents as value. Each model file can be either + // a TFLite model file or a model bundle file for sub-task. + absl::flat_hash_map model_files_; +}; + +} // namespace core +} // namespace tasks +} // namespace mediapipe + +#endif // MEDIAPIPE_TASKS_CC_CORE_MODEL_ASSET_BUNDLE_RESOURCES_H_ diff --git a/mediapipe/tasks/cc/core/model_asset_bundle_resources_test.cc b/mediapipe/tasks/cc/core/model_asset_bundle_resources_test.cc new file mode 100644 index 00000000..bcf88713 --- /dev/null +++ b/mediapipe/tasks/cc/core/model_asset_bundle_resources_test.cc @@ -0,0 +1,229 @@ +/* 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. +==============================================================================*/ + +#include "mediapipe/tasks/cc/core/model_asset_bundle_resources.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "mediapipe/framework/port/gmock.h" +#include "mediapipe/framework/port/gtest.h" +#include "mediapipe/framework/port/status_macros.h" +#include "mediapipe/framework/port/status_matchers.h" +#include "mediapipe/tasks/cc/common.h" +#include "mediapipe/tasks/cc/core/model_resources.h" +#include "mediapipe/tasks/cc/core/proto/external_file.pb.h" +#include "mediapipe/tasks/cc/core/utils.h" +#include "mediapipe/tasks/cc/metadata/utils/zip_utils.h" + +namespace mediapipe { +namespace tasks { +namespace core { +namespace { + +constexpr char kTestModelResourcesTag[] = "test_model_asset_resources"; + +constexpr char kTestModelBundleResourcesTag[] = + "test_model_asset_bundle_resources"; + +// Models files in dummy_gesture_recognizer.task: +// gesture_recognizer.task +// dummy_gesture_recognizer.tflite +// dummy_hand_landmarker.task +// dummy_hand_detector.tflite +// dummy_hand_landmarker.tflite +constexpr char kTestModelBundlePath[] = + "mediapipe/tasks/testdata/core/dummy_gesture_recognizer.task"; + +constexpr char kInvalidTestModelBundlePath[] = + "mediapipe/tasks/testdata/core/i_do_not_exist.task"; + +} // namespace + +TEST(ModelAssetBundleResourcesTest, CreateFromBinaryContent) { + auto model_file = std::make_unique(); + model_file->set_file_content(LoadBinaryContent(kTestModelBundlePath)); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_hand_landmarker.task") + .status()); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_gesture_recognizer.tflite") + .status()); +} + +TEST(ModelAssetBundleResourcesTest, CreateFromFile) { + auto model_file = std::make_unique(); + model_file->set_file_name(kTestModelBundlePath); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_hand_landmarker.task") + .status()); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_gesture_recognizer.tflite") + .status()); +} + +TEST(ModelAssetBundleResourcesTest, CreateFromFileDescriptor) { + const int model_file_descriptor = open(kTestModelBundlePath, O_RDONLY); + auto model_file = std::make_unique(); + model_file->mutable_file_descriptor_meta()->set_fd(model_file_descriptor); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_hand_landmarker.task") + .status()); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_gesture_recognizer.tflite") + .status()); +} + +TEST(ModelAssetBundleResourcesTest, CreateFromFilePointer) { + auto file_content = LoadBinaryContent(kTestModelBundlePath); + auto model_file = std::make_unique(); + metadata::SetExternalFile(file_content, model_file.get()); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_hand_landmarker.task") + .status()); + MP_EXPECT_OK( + model_bundle_resources->GetModelFile("dummy_gesture_recognizer.tflite") + .status()); +} + +TEST(ModelAssetBundleResourcesTest, CreateFromInvalidFile) { + auto model_file = std::make_unique(); + model_file->set_file_name(kInvalidTestModelBundlePath); + auto status_or_model_bundle_resources = ModelAssetBundleResources::Create( + kTestModelBundleResourcesTag, std::move(model_file)); + + EXPECT_EQ(status_or_model_bundle_resources.status().code(), + absl::StatusCode::kNotFound); + EXPECT_THAT(status_or_model_bundle_resources.status().message(), + testing::HasSubstr("Unable to open file")); + EXPECT_THAT(status_or_model_bundle_resources.status().GetPayload( + kMediaPipeTasksPayload), + testing::Optional(absl::Cord( + absl::StrCat(MediaPipeTasksStatus::kFileNotFoundError)))); +} + +TEST(ModelAssetBundleResourcesTest, ExtractValidModelBundleFile) { + // Creates top-level model asset bundle resources. + auto model_file = std::make_unique(); + model_file->set_file_name(kTestModelBundlePath); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + auto status_or_model_bundle_file = + model_bundle_resources->GetModelFile("dummy_hand_landmarker.task"); + MP_EXPECT_OK(status_or_model_bundle_file.status()); + + // Creates sub-task model asset bundle resources. + auto hand_landmaker_model_file = std::make_unique(); + metadata::SetExternalFile(status_or_model_bundle_file.value(), + hand_landmaker_model_file.get()); + MP_ASSERT_OK_AND_ASSIGN( + auto hand_landmaker_model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(hand_landmaker_model_file))); + MP_EXPECT_OK(hand_landmaker_model_bundle_resources + ->GetModelFile("dummy_hand_detector.tflite") + .status()); + MP_EXPECT_OK(hand_landmaker_model_bundle_resources + ->GetModelFile("dummy_hand_landmarker.tflite") + .status()); +} + +TEST(ModelAssetBundleResourcesTest, ExtractValidTFLiteModelFile) { + // Creates top-level model asset bundle resources. + auto model_file = std::make_unique(); + model_file->set_file_name(kTestModelBundlePath); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + auto status_or_model_bundle_file = + model_bundle_resources->GetModelFile("dummy_gesture_recognizer.tflite"); + MP_EXPECT_OK(status_or_model_bundle_file.status()); + + // Verify tflite model works. + auto hand_detector_model_file = std::make_unique(); + metadata::SetExternalFile(status_or_model_bundle_file.value(), + hand_detector_model_file.get()); + MP_ASSERT_OK_AND_ASSIGN( + auto hand_detector_model_resources, + ModelResources::Create(kTestModelResourcesTag, + std::move(hand_detector_model_file))); + Packet model_packet = hand_detector_model_resources->GetModelPacket(); + ASSERT_FALSE(model_packet.IsEmpty()); + MP_ASSERT_OK(model_packet.ValidateAsType()); + EXPECT_TRUE(model_packet.Get()->initialized()); +} + +TEST(ModelAssetBundleResourcesTest, ExtractInvalidModelFile) { + // Creates top-level model asset bundle resources. + auto model_file = std::make_unique(); + model_file->set_file_name(kTestModelBundlePath); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + auto status = model_bundle_resources->GetModelFile("not_found.task").status(); + EXPECT_EQ(status.code(), absl::StatusCode::kNotFound); + EXPECT_THAT(status.message(), + testing::HasSubstr( + "No model file with name: not_found.task. All model files in " + "the model asset bundle are: ")); + EXPECT_THAT(status.GetPayload(kMediaPipeTasksPayload), + testing::Optional(absl::Cord( + absl::StrCat(MediaPipeTasksStatus::kFileNotFoundError)))); +} + +TEST(ModelAssetBundleResourcesTest, ListModelFiles) { + // Creates top-level model asset bundle resources. + auto model_file = std::make_unique(); + model_file->set_file_name(kTestModelBundlePath); + MP_ASSERT_OK_AND_ASSIGN( + auto model_bundle_resources, + ModelAssetBundleResources::Create(kTestModelBundleResourcesTag, + std::move(model_file))); + auto model_files = model_bundle_resources->ListModelFiles(); + std::vector expected_model_files = { + "dummy_gesture_recognizer.tflite", "dummy_hand_landmarker.task"}; + std::sort(model_files.begin(), model_files.end()); + EXPECT_THAT(expected_model_files, testing::ElementsAreArray(model_files)); +} + +} // namespace core +} // namespace tasks +} // namespace mediapipe diff --git a/mediapipe/tasks/cc/core/model_resources_test.cc b/mediapipe/tasks/cc/core/model_resources_test.cc index 0b13c6da..de480c5a 100644 --- a/mediapipe/tasks/cc/core/model_resources_test.cc +++ b/mediapipe/tasks/cc/core/model_resources_test.cc @@ -34,6 +34,7 @@ limitations under the License. #include "mediapipe/framework/port/status_matchers.h" #include "mediapipe/tasks/cc/common.h" #include "mediapipe/tasks/cc/core/proto/external_file.pb.h" +#include "mediapipe/tasks/cc/core/utils.h" #include "mediapipe/tasks/cc/metadata/metadata_extractor.h" #include "tensorflow/lite/c/common.h" #include "tensorflow/lite/core/api/op_resolver.h" @@ -88,16 +89,6 @@ constexpr char kCorruptedModelPath[] = "mediapipe/tasks/testdata/core/" "corrupted_mobilenet_v1_0.25_224_1_default_1.tflite"; -std::string LoadBinaryContent(const char* filename) { - std::ifstream input_file(filename, std::ios::binary | std::ios::ate); - // Find buffer size from input file, and load the buffer. - size_t buffer_size = input_file.tellg(); - std::string buffer(buffer_size, '\0'); - input_file.seekg(0, std::ios::beg); - input_file.read(const_cast(buffer.c_str()), buffer_size); - return buffer; -} - void AssertStatusHasMediaPipeTasksStatusCode( absl::Status status, MediaPipeTasksStatus mediapipe_tasks_code) { EXPECT_THAT( diff --git a/mediapipe/tasks/testdata/core/BUILD b/mediapipe/tasks/testdata/core/BUILD index dd4a0246..50f70d8a 100644 --- a/mediapipe/tasks/testdata/core/BUILD +++ b/mediapipe/tasks/testdata/core/BUILD @@ -24,6 +24,7 @@ package( mediapipe_files(srcs = [ "corrupted_mobilenet_v1_0.25_224_1_default_1.tflite", + "dummy_gesture_recognizer.task", "mobilenet_v1_0.25_224_quant.tflite", "test_model_add_op.tflite", "test_model_with_custom_op.tflite", @@ -36,6 +37,7 @@ filegroup( name = "test_models", srcs = [ "corrupted_mobilenet_v1_0.25_224_1_default_1.tflite", + "dummy_gesture_recognizer.task", "mobilenet_v1_0.25_224_quant.tflite", "test_model_add_op.tflite", "test_model_with_custom_op.tflite", diff --git a/mediapipe/tasks/testdata/core/dummy_gesture_recognizer.task b/mediapipe/tasks/testdata/core/dummy_gesture_recognizer.task new file mode 100644 index 0000000000000000000000000000000000000000..c62854c0c2b74cc5369837e2cdd40b3e80caae4e GIT binary patch literal 45490 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