Move ImagePreprocessing to "processors" folder.
PiperOrigin-RevId: 490444821
This commit is contained in:
		
							parent
							
								
									c5ce523697
								
							
						
					
					
						commit
						b5189758f7
					
				| 
						 | 
				
			
			@ -12,55 +12,10 @@
 | 
			
		|||
# See the License for the specific language governing permissions and
 | 
			
		||||
# limitations under the License.
 | 
			
		||||
 | 
			
		||||
load("//mediapipe/framework/port:build_config.bzl", "mediapipe_proto_library")
 | 
			
		||||
 | 
			
		||||
package(default_visibility = ["//mediapipe/tasks:internal"])
 | 
			
		||||
 | 
			
		||||
licenses(["notice"])
 | 
			
		||||
 | 
			
		||||
mediapipe_proto_library(
 | 
			
		||||
    name = "image_preprocessing_options_proto",
 | 
			
		||||
    srcs = ["image_preprocessing_options.proto"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator_proto",
 | 
			
		||||
        "//mediapipe/framework:calculator_options_proto",
 | 
			
		||||
        "//mediapipe/framework:calculator_proto",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
cc_library(
 | 
			
		||||
    name = "image_preprocessing",
 | 
			
		||||
    srcs = ["image_preprocessing.cc"],
 | 
			
		||||
    hdrs = ["image_preprocessing.h"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        ":image_preprocessing_options_cc_proto",
 | 
			
		||||
        "//mediapipe/calculators/core:pass_through_calculator",
 | 
			
		||||
        "//mediapipe/calculators/image:image_clone_calculator",
 | 
			
		||||
        "//mediapipe/calculators/image:image_clone_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/calculators/image:image_properties_calculator",
 | 
			
		||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator",
 | 
			
		||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/calculators/tensor:inference_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/framework:calculator_framework",
 | 
			
		||||
        "//mediapipe/framework/api2:builder",
 | 
			
		||||
        "//mediapipe/framework/api2:port",
 | 
			
		||||
        "//mediapipe/framework/formats:image",
 | 
			
		||||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:tensor",
 | 
			
		||||
        "//mediapipe/gpu:gpu_origin_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core/proto:acceleration_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/vision/utils:image_tensor_specs",
 | 
			
		||||
        "@com_google_absl//absl/status",
 | 
			
		||||
        "@com_google_absl//absl/status:statusor",
 | 
			
		||||
        "@org_tensorflow//tensorflow/lite/schema:schema_fbs",
 | 
			
		||||
    ],
 | 
			
		||||
    alwayslink = 1,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# TODO: Enable this test
 | 
			
		||||
 | 
			
		||||
# TODO: Investigate rewriting the build rule to only link
 | 
			
		||||
# the Bert Preprocessor if it's needed.
 | 
			
		||||
cc_library(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,3 +100,36 @@ cc_library(
 | 
			
		|||
    ],
 | 
			
		||||
    alwayslink = 1,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
cc_library(
 | 
			
		||||
    name = "image_preprocessing_graph",
 | 
			
		||||
    srcs = ["image_preprocessing_graph.cc"],
 | 
			
		||||
    hdrs = ["image_preprocessing_graph.h"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//mediapipe/calculators/core:pass_through_calculator",
 | 
			
		||||
        "//mediapipe/calculators/image:image_clone_calculator",
 | 
			
		||||
        "//mediapipe/calculators/image:image_clone_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/calculators/image:image_properties_calculator",
 | 
			
		||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator",
 | 
			
		||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/calculators/tensor:inference_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/framework:calculator_framework",
 | 
			
		||||
        "//mediapipe/framework/api2:builder",
 | 
			
		||||
        "//mediapipe/framework/api2:port",
 | 
			
		||||
        "//mediapipe/framework/formats:image",
 | 
			
		||||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:tensor",
 | 
			
		||||
        "//mediapipe/gpu:gpu_origin_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:image_preprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core/proto:acceleration_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/vision/utils:image_tensor_specs",
 | 
			
		||||
        "@com_google_absl//absl/status",
 | 
			
		||||
        "@com_google_absl//absl/status:statusor",
 | 
			
		||||
        "@org_tensorflow//tensorflow/lite/schema:schema_fbs",
 | 
			
		||||
    ],
 | 
			
		||||
    alwayslink = 1,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# TODO: Enable this test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ 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/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <complex>
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/tensor.h"
 | 
			
		||||
#include "mediapipe/gpu/gpu_origin.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/proto/acceleration.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/vision/utils/image_tensor_specs.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -42,6 +42,7 @@ limitations under the License.
 | 
			
		|||
namespace mediapipe {
 | 
			
		||||
namespace tasks {
 | 
			
		||||
namespace components {
 | 
			
		||||
namespace processors {
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
using ::mediapipe::Tensor;
 | 
			
		||||
| 
						 | 
				
			
			@ -144,9 +145,9 @@ bool DetermineImagePreprocessingGpuBackend(
 | 
			
		|||
  return acceleration.has_gpu();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
absl::Status ConfigureImagePreprocessing(const ModelResources& model_resources,
 | 
			
		||||
                                         bool use_gpu,
 | 
			
		||||
                                         ImagePreprocessingOptions* options) {
 | 
			
		||||
absl::Status ConfigureImagePreprocessingGraph(
 | 
			
		||||
    const ModelResources& model_resources, bool use_gpu,
 | 
			
		||||
    proto::ImagePreprocessingGraphOptions* options) {
 | 
			
		||||
  ASSIGN_OR_RETURN(auto image_tensor_specs,
 | 
			
		||||
                   BuildImageTensorSpecs(model_resources));
 | 
			
		||||
  MP_RETURN_IF_ERROR(ConfigureImageToTensorCalculator(
 | 
			
		||||
| 
						 | 
				
			
			@ -154,9 +155,9 @@ absl::Status ConfigureImagePreprocessing(const ModelResources& model_resources,
 | 
			
		|||
  // The GPU backend isn't able to process int data. If the input tensor is
 | 
			
		||||
  // quantized, forces the image preprocessing graph to use CPU backend.
 | 
			
		||||
  if (use_gpu && image_tensor_specs.tensor_type != tflite::TensorType_UINT8) {
 | 
			
		||||
    options->set_backend(ImagePreprocessingOptions::GPU_BACKEND);
 | 
			
		||||
    options->set_backend(proto::ImagePreprocessingGraphOptions::GPU_BACKEND);
 | 
			
		||||
  } else {
 | 
			
		||||
    options->set_backend(ImagePreprocessingOptions::CPU_BACKEND);
 | 
			
		||||
    options->set_backend(proto::ImagePreprocessingGraphOptions::CPU_BACKEND);
 | 
			
		||||
  }
 | 
			
		||||
  return absl::OkStatus();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -170,8 +171,7 @@ Source<Image> AddDataConverter(Source<Image> image_in, Graph& graph,
 | 
			
		|||
  return image_converter[Output<Image>("")];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A "mediapipe.tasks.components.ImagePreprocessingSubgraph" performs image
 | 
			
		||||
// preprocessing.
 | 
			
		||||
// An ImagePreprocessingGraph performs image preprocessing.
 | 
			
		||||
// - Accepts CPU input images and outputs CPU tensors.
 | 
			
		||||
//
 | 
			
		||||
// Inputs:
 | 
			
		||||
| 
						 | 
				
			
			@ -192,7 +192,7 @@ Source<Image> AddDataConverter(Source<Image> image_in, Graph& graph,
 | 
			
		|||
//     An std::array<float, 4> representing the letterbox padding from the 4
 | 
			
		||||
//     sides ([left, top, right, bottom]) of the output image, normalized to
 | 
			
		||||
//     [0.f, 1.f] by the output dimensions. The padding values are non-zero only
 | 
			
		||||
//     when the "keep_aspect_ratio" is true in ImagePreprocessingOptions.
 | 
			
		||||
//     when the "keep_aspect_ratio" is true in ImagePreprocessingGraphOptions.
 | 
			
		||||
//   IMAGE_SIZE - std::pair<int,int> @Optional
 | 
			
		||||
//     The size of the original input image as a <width, height> pair.
 | 
			
		||||
//   IMAGE - Image @Optional
 | 
			
		||||
| 
						 | 
				
			
			@ -200,15 +200,15 @@ Source<Image> AddDataConverter(Source<Image> image_in, Graph& graph,
 | 
			
		|||
//     GPU).
 | 
			
		||||
//
 | 
			
		||||
// The recommended way of using this subgraph is through the GraphBuilder API
 | 
			
		||||
// using the 'ConfigureImagePreprocessing()' function. See header file for more
 | 
			
		||||
// details.
 | 
			
		||||
class ImagePreprocessingSubgraph : public Subgraph {
 | 
			
		||||
// using the 'ConfigureImagePreprocessingGraph()' function. See header file for
 | 
			
		||||
// more details.
 | 
			
		||||
class ImagePreprocessingGraph : public Subgraph {
 | 
			
		||||
 public:
 | 
			
		||||
  absl::StatusOr<CalculatorGraphConfig> GetConfig(
 | 
			
		||||
      SubgraphContext* sc) override {
 | 
			
		||||
    Graph graph;
 | 
			
		||||
    auto output_streams = BuildImagePreprocessing(
 | 
			
		||||
        sc->Options<ImagePreprocessingOptions>(),
 | 
			
		||||
        sc->Options<proto::ImagePreprocessingGraphOptions>(),
 | 
			
		||||
        graph[Input<Image>(kImageTag)],
 | 
			
		||||
        graph[Input<NormalizedRect>::Optional(kNormRectTag)], graph);
 | 
			
		||||
    output_streams.tensors >> graph[Output<std::vector<Tensor>>(kTensorsTag)];
 | 
			
		||||
| 
						 | 
				
			
			@ -233,24 +233,25 @@ class ImagePreprocessingSubgraph : public Subgraph {
 | 
			
		|||
  //   - the image that has pixel data stored on the target storage
 | 
			
		||||
  //     (mediapipe::Image).
 | 
			
		||||
  //
 | 
			
		||||
  // options: the mediapipe tasks ImagePreprocessingOptions.
 | 
			
		||||
  // options: the mediapipe tasks ImagePreprocessingGraphOptions.
 | 
			
		||||
  // image_in: (mediapipe::Image) stream to preprocess.
 | 
			
		||||
  // graph: the mediapipe builder::Graph instance to be updated.
 | 
			
		||||
  ImagePreprocessingOutputStreams BuildImagePreprocessing(
 | 
			
		||||
      const ImagePreprocessingOptions& options, Source<Image> image_in,
 | 
			
		||||
      Source<NormalizedRect> norm_rect_in, Graph& graph) {
 | 
			
		||||
      const proto::ImagePreprocessingGraphOptions& options,
 | 
			
		||||
      Source<Image> image_in, Source<NormalizedRect> norm_rect_in,
 | 
			
		||||
      Graph& graph) {
 | 
			
		||||
    // Convert image to tensor.
 | 
			
		||||
    auto& image_to_tensor = graph.AddNode("ImageToTensorCalculator");
 | 
			
		||||
    image_to_tensor.GetOptions<mediapipe::ImageToTensorCalculatorOptions>()
 | 
			
		||||
        .CopyFrom(options.image_to_tensor_options());
 | 
			
		||||
    switch (options.backend()) {
 | 
			
		||||
      case ImagePreprocessingOptions::CPU_BACKEND: {
 | 
			
		||||
      case proto::ImagePreprocessingGraphOptions::CPU_BACKEND: {
 | 
			
		||||
        auto cpu_image =
 | 
			
		||||
            AddDataConverter(image_in, graph, /*output_on_gpu=*/false);
 | 
			
		||||
        cpu_image >> image_to_tensor.In(kImageTag);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case ImagePreprocessingOptions::GPU_BACKEND: {
 | 
			
		||||
      case proto::ImagePreprocessingGraphOptions::GPU_BACKEND: {
 | 
			
		||||
        auto gpu_image =
 | 
			
		||||
            AddDataConverter(image_in, graph, /*output_on_gpu=*/true);
 | 
			
		||||
        gpu_image >> image_to_tensor.In(kImageTag);
 | 
			
		||||
| 
						 | 
				
			
			@ -284,8 +285,9 @@ class ImagePreprocessingSubgraph : public Subgraph {
 | 
			
		|||
  }
 | 
			
		||||
};
 | 
			
		||||
REGISTER_MEDIAPIPE_GRAPH(
 | 
			
		||||
    ::mediapipe::tasks::components::ImagePreprocessingSubgraph);
 | 
			
		||||
    ::mediapipe::tasks::components::processors::ImagePreprocessingGraph);
 | 
			
		||||
 | 
			
		||||
}  // namespace processors
 | 
			
		||||
}  // namespace components
 | 
			
		||||
}  // namespace tasks
 | 
			
		||||
}  // namespace mediapipe
 | 
			
		||||
| 
						 | 
				
			
			@ -13,35 +13,36 @@ See the License for the specific language governing permissions and
 | 
			
		|||
limitations under the License.
 | 
			
		||||
==============================================================================*/
 | 
			
		||||
 | 
			
		||||
#ifndef MEDIAPIPE_TASKS_CC_COMPONENTS_IMAGE_PREPROCESSING_H_
 | 
			
		||||
#define MEDIAPIPE_TASKS_CC_COMPONENTS_IMAGE_PREPROCESSING_H_
 | 
			
		||||
#ifndef MEDIAPIPE_TASKS_CC_COMPONENTS_PROCESSORS_IMAGE_PREPROCESSING_GRAPH_H_
 | 
			
		||||
#define MEDIAPIPE_TASKS_CC_COMPONENTS_PROCESSORS_IMAGE_PREPROCESSING_GRAPH_H_
 | 
			
		||||
 | 
			
		||||
#include "absl/status/status.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/proto/acceleration.pb.h"
 | 
			
		||||
 | 
			
		||||
namespace mediapipe {
 | 
			
		||||
namespace tasks {
 | 
			
		||||
namespace components {
 | 
			
		||||
namespace processors {
 | 
			
		||||
 | 
			
		||||
// Configures an ImagePreprocessing subgraph using the provided model resources
 | 
			
		||||
// Configures an ImagePreprocessingGraph using the provided model resources
 | 
			
		||||
// When use_gpu is true, use GPU as backend to convert image to tensor.
 | 
			
		||||
// - Accepts CPU input images and outputs CPU tensors.
 | 
			
		||||
//
 | 
			
		||||
// Example usage:
 | 
			
		||||
//
 | 
			
		||||
//   auto& preprocessing =
 | 
			
		||||
//       graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
//       graph.AddNode("mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
//   core::proto::Acceleration acceleration;
 | 
			
		||||
//   acceleration.mutable_xnnpack();
 | 
			
		||||
//   bool use_gpu = DetermineImagePreprocessingGpuBackend(acceleration);
 | 
			
		||||
//   MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
//   MP_RETURN_IF_ERROR(ConfigureImagePreprocessingGraph(
 | 
			
		||||
//       model_resources,
 | 
			
		||||
//       use_gpu,
 | 
			
		||||
//       &preprocessing.GetOptions<ImagePreprocessingOptions>()));
 | 
			
		||||
//       &preprocessing.GetOptions<ImagePreprocessingGraphOptions>()));
 | 
			
		||||
//
 | 
			
		||||
// The resulting ImagePreprocessing subgraph has the following I/O:
 | 
			
		||||
// The resulting ImagePreprocessingGraph has the following I/O:
 | 
			
		||||
// Inputs:
 | 
			
		||||
//   IMAGE - Image
 | 
			
		||||
//     The image to preprocess.
 | 
			
		||||
| 
						 | 
				
			
			@ -61,17 +62,18 @@ namespace components {
 | 
			
		|||
//   IMAGE - Image @Optional
 | 
			
		||||
//     The image that has the pixel data stored on the target storage (CPU vs
 | 
			
		||||
//     GPU).
 | 
			
		||||
absl::Status ConfigureImagePreprocessing(
 | 
			
		||||
absl::Status ConfigureImagePreprocessingGraph(
 | 
			
		||||
    const core::ModelResources& model_resources, bool use_gpu,
 | 
			
		||||
    ImagePreprocessingOptions* options);
 | 
			
		||||
    proto::ImagePreprocessingGraphOptions* options);
 | 
			
		||||
 | 
			
		||||
// Determine if the image preprocessing subgraph should use GPU as the backend
 | 
			
		||||
// Determine if the image preprocessing graph should use GPU as the backend
 | 
			
		||||
// according to the given acceleration setting.
 | 
			
		||||
bool DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    const core::proto::Acceleration& acceleration);
 | 
			
		||||
 | 
			
		||||
}  // namespace processors
 | 
			
		||||
}  // namespace components
 | 
			
		||||
}  // namespace tasks
 | 
			
		||||
}  // namespace mediapipe
 | 
			
		||||
 | 
			
		||||
#endif  // MEDIAPIPE_TASKS_CC_COMPONENTS_IMAGE_PREPROCESSING_H_
 | 
			
		||||
#endif  // MEDIAPIPE_TASKS_CC_COMPONENTS_PROCESSORS_IMAGE_PREPROCESSING_GRAPH_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,343 @@
 | 
			
		|||
/* 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/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <utility>
 | 
			
		||||
 | 
			
		||||
#include "absl/flags/flag.h"
 | 
			
		||||
#include "absl/status/statusor.h"
 | 
			
		||||
#include "mediapipe/calculators/tensor/image_to_tensor_calculator.pb.h"
 | 
			
		||||
#include "mediapipe/framework/api2/builder.h"
 | 
			
		||||
#include "mediapipe/framework/api2/port.h"
 | 
			
		||||
#include "mediapipe/framework/calculator_framework.h"
 | 
			
		||||
#include "mediapipe/framework/deps/file_path.h"
 | 
			
		||||
#include "mediapipe/framework/formats/image.h"
 | 
			
		||||
#include "mediapipe/framework/formats/tensor.h"
 | 
			
		||||
#include "mediapipe/framework/packet.h"
 | 
			
		||||
#include "mediapipe/framework/port/gmock.h"
 | 
			
		||||
#include "mediapipe/framework/port/gtest.h"
 | 
			
		||||
#include "mediapipe/framework/port/status_matchers.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/proto/acceleration.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/proto/external_file.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/task_runner.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/vision/utils/image_utils.h"
 | 
			
		||||
#include "tensorflow/lite/core/shims/cc/shims_test_util.h"
 | 
			
		||||
 | 
			
		||||
namespace mediapipe {
 | 
			
		||||
namespace tasks {
 | 
			
		||||
namespace components {
 | 
			
		||||
namespace processors {
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
using ::mediapipe::api2::Input;
 | 
			
		||||
using ::mediapipe::api2::Output;
 | 
			
		||||
using ::mediapipe::api2::builder::Graph;
 | 
			
		||||
using ::mediapipe::api2::builder::Source;
 | 
			
		||||
using ::mediapipe::file::JoinPath;
 | 
			
		||||
using ::mediapipe::tasks::core::ModelResources;
 | 
			
		||||
using ::mediapipe::tasks::core::TaskRunner;
 | 
			
		||||
using ::mediapipe::tasks::vision::DecodeImageFromFile;
 | 
			
		||||
using ::testing::ContainerEq;
 | 
			
		||||
using ::testing::HasSubstr;
 | 
			
		||||
using ::testing::TestParamInfo;
 | 
			
		||||
using ::testing::TestWithParam;
 | 
			
		||||
using ::testing::Values;
 | 
			
		||||
 | 
			
		||||
constexpr char kTestDataDirectory[] = "/mediapipe/tasks/testdata/vision/";
 | 
			
		||||
constexpr char kMobileNetFloatWithMetadata[] = "mobilenet_v2_1.0_224.tflite";
 | 
			
		||||
constexpr char kMobileNetFloatWithoutMetadata[] =
 | 
			
		||||
    "mobilenet_v1_0.25_224_1_default_1.tflite";
 | 
			
		||||
constexpr char kMobileNetQuantizedWithMetadata[] =
 | 
			
		||||
    "mobilenet_v1_0.25_224_quant.tflite";
 | 
			
		||||
constexpr char kMobileNetQuantizedWithoutMetadata[] =
 | 
			
		||||
    "mobilenet_v1_0.25_192_quantized_1_default_1.tflite";
 | 
			
		||||
 | 
			
		||||
constexpr char kTestImage[] = "burger.jpg";
 | 
			
		||||
constexpr int kTestImageWidth = 480;
 | 
			
		||||
constexpr int kTestImageHeight = 325;
 | 
			
		||||
 | 
			
		||||
constexpr char kTestModelResourcesTag[] = "test_model_resources";
 | 
			
		||||
constexpr std::array<float, 16> kIdentityMatrix = {1, 0, 0, 0, 0, 1, 0, 0,
 | 
			
		||||
                                                   0, 0, 1, 0, 0, 0, 0, 1};
 | 
			
		||||
 | 
			
		||||
constexpr char kImageTag[] = "IMAGE";
 | 
			
		||||
constexpr char kImageName[] = "image_in";
 | 
			
		||||
constexpr char kMatrixTag[] = "MATRIX";
 | 
			
		||||
constexpr char kMatrixName[] = "matrix_out";
 | 
			
		||||
constexpr char kTensorsTag[] = "TENSORS";
 | 
			
		||||
constexpr char kTensorsName[] = "tensors_out";
 | 
			
		||||
constexpr char kImageSizeTag[] = "IMAGE_SIZE";
 | 
			
		||||
constexpr char kImageSizeName[] = "image_size_out";
 | 
			
		||||
constexpr char kLetterboxPaddingTag[] = "LETTERBOX_PADDING";
 | 
			
		||||
constexpr char kLetterboxPaddingName[] = "letterbox_padding_out";
 | 
			
		||||
 | 
			
		||||
constexpr float kLetterboxMaxAbsError = 1e-5;
 | 
			
		||||
 | 
			
		||||
// Helper function to get ModelResources.
 | 
			
		||||
absl::StatusOr<std::unique_ptr<ModelResources>> CreateModelResourcesForModel(
 | 
			
		||||
    absl::string_view model_name) {
 | 
			
		||||
  auto external_file = std::make_unique<core::proto::ExternalFile>();
 | 
			
		||||
  external_file->set_file_name(JoinPath("./", kTestDataDirectory, model_name));
 | 
			
		||||
  return ModelResources::Create(kTestModelResourcesTag,
 | 
			
		||||
                                std::move(external_file));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function to create a TaskRunner from ModelResources.
 | 
			
		||||
absl::StatusOr<std::unique_ptr<TaskRunner>> CreateTaskRunner(
 | 
			
		||||
    const ModelResources& model_resources, bool keep_aspect_ratio) {
 | 
			
		||||
  Graph graph;
 | 
			
		||||
 | 
			
		||||
  auto& preprocessing = graph.AddNode(
 | 
			
		||||
      "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
  auto& options =
 | 
			
		||||
      preprocessing.GetOptions<proto::ImagePreprocessingGraphOptions>();
 | 
			
		||||
  options.mutable_image_to_tensor_options()->set_keep_aspect_ratio(
 | 
			
		||||
      keep_aspect_ratio);
 | 
			
		||||
  MP_RETURN_IF_ERROR(
 | 
			
		||||
      ConfigureImagePreprocessingGraph(model_resources, false, &options));
 | 
			
		||||
  graph[Input<Image>(kImageTag)].SetName(kImageName) >>
 | 
			
		||||
      preprocessing.In(kImageTag);
 | 
			
		||||
  preprocessing.Out(kTensorsTag).SetName(kTensorsName) >>
 | 
			
		||||
      graph[Output<std::vector<Tensor>>(kTensorsTag)];
 | 
			
		||||
  preprocessing.Out(kMatrixTag).SetName(kMatrixName) >>
 | 
			
		||||
      graph[Output<std::array<float, 16>>(kMatrixTag)];
 | 
			
		||||
  preprocessing.Out(kImageSizeTag).SetName(kImageSizeName) >>
 | 
			
		||||
      graph[Output<std::pair<int, int>>(kImageSizeTag)];
 | 
			
		||||
  preprocessing.Out(kLetterboxPaddingTag).SetName(kLetterboxPaddingName) >>
 | 
			
		||||
      graph[Output<std::array<float, 4>>(kLetterboxPaddingTag)];
 | 
			
		||||
 | 
			
		||||
  return TaskRunner::Create(graph.GetConfig());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ConfigureTest : public tflite_shims::testing::Test {};
 | 
			
		||||
 | 
			
		||||
TEST_F(ConfigureTest, SucceedsWithQuantizedModelWithMetadata) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(kMobileNetQuantizedWithMetadata));
 | 
			
		||||
 | 
			
		||||
  proto::ImagePreprocessingGraphOptions options;
 | 
			
		||||
  MP_EXPECT_OK(
 | 
			
		||||
      ConfigureImagePreprocessingGraph(*model_resources, false, &options));
 | 
			
		||||
 | 
			
		||||
  EXPECT_THAT(options, EqualsProto(
 | 
			
		||||
                           R"pb(image_to_tensor_options {
 | 
			
		||||
                                  output_tensor_width: 224
 | 
			
		||||
                                  output_tensor_height: 224
 | 
			
		||||
                                  output_tensor_uint_range { min: 0 max: 255 }
 | 
			
		||||
                                  gpu_origin: TOP_LEFT
 | 
			
		||||
                                }
 | 
			
		||||
                                backend: CPU_BACKEND)pb"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(ConfigureTest, SucceedsWithQuantizedModelWithoutMetadata) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(kMobileNetQuantizedWithoutMetadata));
 | 
			
		||||
 | 
			
		||||
  proto::ImagePreprocessingGraphOptions options;
 | 
			
		||||
  MP_EXPECT_OK(
 | 
			
		||||
      ConfigureImagePreprocessingGraph(*model_resources, false, &options));
 | 
			
		||||
 | 
			
		||||
  EXPECT_THAT(options, EqualsProto(
 | 
			
		||||
                           R"pb(image_to_tensor_options {
 | 
			
		||||
                                  output_tensor_width: 192
 | 
			
		||||
                                  output_tensor_height: 192
 | 
			
		||||
                                  output_tensor_uint_range { min: 0 max: 255 }
 | 
			
		||||
                                  gpu_origin: TOP_LEFT
 | 
			
		||||
                                }
 | 
			
		||||
                                backend: CPU_BACKEND)pb"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(ConfigureTest, SucceedsWithFloatModelWithMetadata) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(kMobileNetFloatWithMetadata));
 | 
			
		||||
 | 
			
		||||
  proto::ImagePreprocessingGraphOptions options;
 | 
			
		||||
  MP_EXPECT_OK(
 | 
			
		||||
      ConfigureImagePreprocessingGraph(*model_resources, false, &options));
 | 
			
		||||
 | 
			
		||||
  EXPECT_THAT(options, EqualsProto(
 | 
			
		||||
                           R"pb(image_to_tensor_options {
 | 
			
		||||
                                  output_tensor_width: 224
 | 
			
		||||
                                  output_tensor_height: 224
 | 
			
		||||
                                  output_tensor_float_range { min: -1 max: 1 }
 | 
			
		||||
                                  gpu_origin: TOP_LEFT
 | 
			
		||||
                                }
 | 
			
		||||
                                backend: CPU_BACKEND)pb"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(ConfigureTest, SucceedsWithQuantizedModelFallbacksCpuBackend) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(kMobileNetQuantizedWithMetadata));
 | 
			
		||||
 | 
			
		||||
  proto::ImagePreprocessingGraphOptions options;
 | 
			
		||||
  core::proto::Acceleration acceleration;
 | 
			
		||||
  acceleration.mutable_gpu();
 | 
			
		||||
  bool use_gpu = DetermineImagePreprocessingGpuBackend(acceleration);
 | 
			
		||||
  EXPECT_TRUE(use_gpu);
 | 
			
		||||
  MP_EXPECT_OK(
 | 
			
		||||
      ConfigureImagePreprocessingGraph(*model_resources, use_gpu, &options));
 | 
			
		||||
 | 
			
		||||
  EXPECT_THAT(options, EqualsProto(
 | 
			
		||||
                           R"pb(image_to_tensor_options {
 | 
			
		||||
                                  output_tensor_width: 224
 | 
			
		||||
                                  output_tensor_height: 224
 | 
			
		||||
                                  output_tensor_uint_range { min: 0 max: 255 }
 | 
			
		||||
                                  gpu_origin: TOP_LEFT
 | 
			
		||||
                                }
 | 
			
		||||
                                backend: CPU_BACKEND)pb"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(ConfigureTest, SucceedsWithFloatModelGpuBackend) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(kMobileNetFloatWithMetadata));
 | 
			
		||||
 | 
			
		||||
  proto::ImagePreprocessingGraphOptions options;
 | 
			
		||||
  core::proto::Acceleration acceleration;
 | 
			
		||||
  acceleration.mutable_gpu();
 | 
			
		||||
  bool use_gpu = DetermineImagePreprocessingGpuBackend(acceleration);
 | 
			
		||||
  EXPECT_TRUE(use_gpu);
 | 
			
		||||
  MP_EXPECT_OK(
 | 
			
		||||
      ConfigureImagePreprocessingGraph(*model_resources, use_gpu, &options));
 | 
			
		||||
 | 
			
		||||
  EXPECT_THAT(options, EqualsProto(
 | 
			
		||||
                           R"pb(image_to_tensor_options {
 | 
			
		||||
                                  output_tensor_width: 224
 | 
			
		||||
                                  output_tensor_height: 224
 | 
			
		||||
                                  output_tensor_float_range { min: -1 max: 1 }
 | 
			
		||||
                                  gpu_origin: TOP_LEFT
 | 
			
		||||
                                }
 | 
			
		||||
                                backend: GPU_BACKEND)pb"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(ConfigureTest, FailsWithFloatModelWithoutMetadata) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(kMobileNetFloatWithoutMetadata));
 | 
			
		||||
 | 
			
		||||
  proto::ImagePreprocessingGraphOptions options;
 | 
			
		||||
  auto status =
 | 
			
		||||
      ConfigureImagePreprocessingGraph(*model_resources, false, &options);
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(status.code(), absl::StatusCode::kNotFound);
 | 
			
		||||
  EXPECT_THAT(status.message(),
 | 
			
		||||
              HasSubstr("requires specifying NormalizationOptions metadata"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Struct holding the parameters for parameterized PreprocessingTest class.
 | 
			
		||||
struct PreprocessingParams {
 | 
			
		||||
  // The name of this test, for convenience when displaying test results.
 | 
			
		||||
  std::string test_name;
 | 
			
		||||
  // The filename of the model to test.
 | 
			
		||||
  std::string input_model_name;
 | 
			
		||||
  // If true, keep test image aspect ratio.
 | 
			
		||||
  bool keep_aspect_ratio;
 | 
			
		||||
  // The expected output tensor type.
 | 
			
		||||
  Tensor::ElementType expected_type;
 | 
			
		||||
  // The expected outoput tensor shape.
 | 
			
		||||
  std::vector<int> expected_shape;
 | 
			
		||||
  // The expected output letterbox padding;
 | 
			
		||||
  std::array<float, 4> expected_letterbox_padding;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PreprocessingTest : public testing::TestWithParam<PreprocessingParams> {};
 | 
			
		||||
 | 
			
		||||
TEST_P(PreprocessingTest, Succeeds) {
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      Image image,
 | 
			
		||||
      DecodeImageFromFile(JoinPath("./", kTestDataDirectory, kTestImage)));
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto model_resources,
 | 
			
		||||
      CreateModelResourcesForModel(GetParam().input_model_name));
 | 
			
		||||
  MP_ASSERT_OK_AND_ASSIGN(
 | 
			
		||||
      auto task_runner,
 | 
			
		||||
      CreateTaskRunner(*model_resources, GetParam().keep_aspect_ratio));
 | 
			
		||||
 | 
			
		||||
  auto output_packets =
 | 
			
		||||
      task_runner->Process({{kImageName, MakePacket<Image>(std::move(image))}});
 | 
			
		||||
  MP_ASSERT_OK(output_packets);
 | 
			
		||||
 | 
			
		||||
  const std::vector<Tensor>& tensors =
 | 
			
		||||
      (*output_packets)[kTensorsName].Get<std::vector<Tensor>>();
 | 
			
		||||
  EXPECT_EQ(tensors.size(), 1);
 | 
			
		||||
  EXPECT_EQ(tensors[0].element_type(), GetParam().expected_type);
 | 
			
		||||
  EXPECT_THAT(tensors[0].shape().dims, ContainerEq(GetParam().expected_shape));
 | 
			
		||||
  auto& matrix = (*output_packets)[kMatrixName].Get<std::array<float, 16>>();
 | 
			
		||||
  if (!GetParam().keep_aspect_ratio) {
 | 
			
		||||
    for (int i = 0; i < matrix.size(); ++i) {
 | 
			
		||||
      EXPECT_FLOAT_EQ(matrix[i], kIdentityMatrix[i]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  auto& image_size =
 | 
			
		||||
      (*output_packets)[kImageSizeName].Get<std::pair<int, int>>();
 | 
			
		||||
  EXPECT_EQ(image_size.first, kTestImageWidth);
 | 
			
		||||
  EXPECT_EQ(image_size.second, kTestImageHeight);
 | 
			
		||||
  std::array<float, 4> letterbox_padding =
 | 
			
		||||
      (*output_packets)[kLetterboxPaddingName].Get<std::array<float, 4>>();
 | 
			
		||||
  for (int i = 0; i < letterbox_padding.size(); ++i) {
 | 
			
		||||
    EXPECT_NEAR(letterbox_padding[i], GetParam().expected_letterbox_padding[i],
 | 
			
		||||
                kLetterboxMaxAbsError);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_SUITE_P(
 | 
			
		||||
    PreprocessingTest, PreprocessingTest,
 | 
			
		||||
    Values(
 | 
			
		||||
        PreprocessingParams{.test_name = "kMobileNetQuantizedWithMetadata",
 | 
			
		||||
                            .input_model_name = kMobileNetQuantizedWithMetadata,
 | 
			
		||||
                            .keep_aspect_ratio = false,
 | 
			
		||||
                            .expected_type = Tensor::ElementType::kUInt8,
 | 
			
		||||
                            .expected_shape = {1, 224, 224, 3},
 | 
			
		||||
                            .expected_letterbox_padding = {0, 0, 0, 0}},
 | 
			
		||||
        PreprocessingParams{
 | 
			
		||||
            .test_name = "kMobileNetQuantizedWithoutMetadata",
 | 
			
		||||
            .input_model_name = kMobileNetQuantizedWithoutMetadata,
 | 
			
		||||
            .keep_aspect_ratio = false,
 | 
			
		||||
            .expected_type = Tensor::ElementType::kUInt8,
 | 
			
		||||
            .expected_shape = {1, 192, 192, 3},
 | 
			
		||||
            .expected_letterbox_padding = {0, 0, 0, 0}},
 | 
			
		||||
        PreprocessingParams{.test_name = "kMobileNetFloatWithMetadata",
 | 
			
		||||
                            .input_model_name = kMobileNetFloatWithMetadata,
 | 
			
		||||
                            .keep_aspect_ratio = false,
 | 
			
		||||
                            .expected_type = Tensor::ElementType::kFloat32,
 | 
			
		||||
                            .expected_shape = {1, 224, 224, 3},
 | 
			
		||||
                            .expected_letterbox_padding = {0, 0, 0, 0}},
 | 
			
		||||
        PreprocessingParams{
 | 
			
		||||
            .test_name = "kMobileNetFloatWithMetadataKeepAspectRatio",
 | 
			
		||||
            .input_model_name = kMobileNetFloatWithMetadata,
 | 
			
		||||
            .keep_aspect_ratio = true,
 | 
			
		||||
            .expected_type = Tensor::ElementType::kFloat32,
 | 
			
		||||
            .expected_shape = {1, 224, 224, 3},
 | 
			
		||||
            .expected_letterbox_padding = {/*left*/ 0,
 | 
			
		||||
                                           /*top*/ 0.161458,
 | 
			
		||||
                                           /*right*/ 0,
 | 
			
		||||
                                           /*bottom*/ 0.161458}}),
 | 
			
		||||
    [](const TestParamInfo<PreprocessingTest::ParamType>& info) {
 | 
			
		||||
      return info.param.test_name;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
}  // namespace processors
 | 
			
		||||
}  // namespace components
 | 
			
		||||
}  // namespace tasks
 | 
			
		||||
}  // namespace mediapipe
 | 
			
		||||
| 
						 | 
				
			
			@ -49,3 +49,13 @@ mediapipe_proto_library(
 | 
			
		|||
        "//mediapipe/tasks/cc/components/calculators:tensors_to_embeddings_calculator_proto",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
mediapipe_proto_library(
 | 
			
		||||
    name = "image_preprocessing_graph_options_proto",
 | 
			
		||||
    srcs = ["image_preprocessing_graph_options.proto"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator_proto",
 | 
			
		||||
        "//mediapipe/framework:calculator_options_proto",
 | 
			
		||||
        "//mediapipe/framework:calculator_proto",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,14 +15,14 @@ limitations under the License.
 | 
			
		|||
 | 
			
		||||
syntax = "proto2";
 | 
			
		||||
 | 
			
		||||
package mediapipe.tasks.components;
 | 
			
		||||
package mediapipe.tasks.components.processors.proto;
 | 
			
		||||
 | 
			
		||||
import "mediapipe/calculators/tensor/image_to_tensor_calculator.proto";
 | 
			
		||||
import "mediapipe/framework/calculator.proto";
 | 
			
		||||
 | 
			
		||||
message ImagePreprocessingOptions {
 | 
			
		||||
message ImagePreprocessingGraphOptions {
 | 
			
		||||
  extend mediapipe.CalculatorOptions {
 | 
			
		||||
    optional ImagePreprocessingOptions ext = 456882436;
 | 
			
		||||
    optional ImagePreprocessingGraphOptions ext = 456882436;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Options for the ImageToTensor calculator encapsulated by the
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,6 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/formats:landmark_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:classifier_options",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:classifier_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:base_options",
 | 
			
		||||
| 
						 | 
				
			
			@ -105,10 +104,7 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:tensor",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:classification_postprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:classification_postprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:classifier_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_asset_bundle_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources_cache",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,6 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/rect.pb.h"
 | 
			
		||||
#include "mediapipe/framework/packet.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/classifier_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/base_task_api.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,8 +29,6 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/tensor.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/classification_postprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/classification_postprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/classifier_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_asset_bundle_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources_cache.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:tensor",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:image_preprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_task_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:utils",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/rect.pb.h"
 | 
			
		||||
#include "mediapipe/framework/formats/tensor.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_task_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/proto/inference_subgraph.pb.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -226,21 +226,23 @@ class HandDetectorGraph : public core::ModelTaskGraph {
 | 
			
		|||
      Source<NormalizedRect> norm_rect_in, Graph& graph) {
 | 
			
		||||
    // Add image preprocessing subgraph. The model expects aspect ratio
 | 
			
		||||
    // unchanged.
 | 
			
		||||
    auto& preprocessing =
 | 
			
		||||
        graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
    auto& preprocessing = graph.AddNode(
 | 
			
		||||
        "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
    auto& image_to_tensor_options =
 | 
			
		||||
        *preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()
 | 
			
		||||
             .GetOptions<components::processors::proto::
 | 
			
		||||
                             ImagePreprocessingGraphOptions>()
 | 
			
		||||
             .mutable_image_to_tensor_options();
 | 
			
		||||
    image_to_tensor_options.set_keep_aspect_ratio(true);
 | 
			
		||||
    image_to_tensor_options.set_border_mode(
 | 
			
		||||
        mediapipe::ImageToTensorCalculatorOptions::BORDER_ZERO);
 | 
			
		||||
    bool use_gpu = components::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    bool use_gpu =
 | 
			
		||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
            subgraph_options.base_options().acceleration());
 | 
			
		||||
    MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
    MP_RETURN_IF_ERROR(components::processors::ConfigureImagePreprocessingGraph(
 | 
			
		||||
        model_resources, use_gpu,
 | 
			
		||||
        &preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()));
 | 
			
		||||
        &preprocessing.GetOptions<
 | 
			
		||||
            components::processors::proto::ImagePreprocessingGraphOptions>()));
 | 
			
		||||
    image_in >> preprocessing.In("IMAGE");
 | 
			
		||||
    norm_rect_in >> preprocessing.In("NORM_RECT");
 | 
			
		||||
    auto preprocessed_tensors = preprocessing.Out("TENSORS");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,6 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/formats:landmark_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:classifier_options",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:classifier_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:base_options",
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +88,7 @@ cc_library(
 | 
			
		|||
        "//mediapipe/modules/hand_landmark/calculators:hand_landmarks_to_rect_calculator",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/utils:gate",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:image_preprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_task_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:utils",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,6 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/landmark.pb.h"
 | 
			
		||||
#include "mediapipe/framework/formats/rect.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/classifier_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/base_task_api.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/rect.pb.h"
 | 
			
		||||
#include "mediapipe/framework/formats/tensor.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/utils/gate.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_task_graph.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -281,14 +281,15 @@ class SingleHandLandmarksDetectorGraph : public core::ModelTaskGraph {
 | 
			
		|||
      Source<NormalizedRect> hand_rect, Graph& graph) {
 | 
			
		||||
    MP_RETURN_IF_ERROR(SanityCheckOptions(subgraph_options));
 | 
			
		||||
 | 
			
		||||
    auto& preprocessing =
 | 
			
		||||
        graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
    bool use_gpu = components::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    auto& preprocessing = graph.AddNode(
 | 
			
		||||
        "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
    bool use_gpu =
 | 
			
		||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
            subgraph_options.base_options().acceleration());
 | 
			
		||||
    MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
    MP_RETURN_IF_ERROR(components::processors::ConfigureImagePreprocessingGraph(
 | 
			
		||||
        model_resources, use_gpu,
 | 
			
		||||
        &preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()));
 | 
			
		||||
        &preprocessing.GetOptions<tasks::components::processors::proto::
 | 
			
		||||
                                      ImagePreprocessingGraphOptions>()));
 | 
			
		||||
    image_in >> preprocessing.In("IMAGE");
 | 
			
		||||
    hand_rect >> preprocessing.In("NORM_RECT");
 | 
			
		||||
    auto image_size = preprocessing[Output<std::pair<int, int>>("IMAGE_SIZE")];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,11 +59,11 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/api2:port",
 | 
			
		||||
        "//mediapipe/framework/formats:image",
 | 
			
		||||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/containers/proto:classifications_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:classification_postprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:image_preprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:classification_postprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:image_preprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_task_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/vision/image_classifier/proto:image_classifier_graph_options_cc_proto",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,10 +23,10 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/image.h"
 | 
			
		||||
#include "mediapipe/framework/formats/rect.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/containers/proto/classifications.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/classification_postprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/classification_postprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_task_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/vision/image_classifier/proto/image_classifier_graph_options.pb.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -135,14 +135,15 @@ class ImageClassifierGraph : public core::ModelTaskGraph {
 | 
			
		|||
      Source<NormalizedRect> norm_rect_in, Graph& graph) {
 | 
			
		||||
    // Adds preprocessing calculators and connects them to the graph input image
 | 
			
		||||
    // stream.
 | 
			
		||||
    auto& preprocessing =
 | 
			
		||||
        graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
    bool use_gpu = components::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    auto& preprocessing = graph.AddNode(
 | 
			
		||||
        "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
    bool use_gpu =
 | 
			
		||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
            task_options.base_options().acceleration());
 | 
			
		||||
    MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
    MP_RETURN_IF_ERROR(components::processors::ConfigureImagePreprocessingGraph(
 | 
			
		||||
        model_resources, use_gpu,
 | 
			
		||||
        &preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()));
 | 
			
		||||
        &preprocessing.GetOptions<tasks::components::processors::proto::
 | 
			
		||||
                                      ImagePreprocessingGraphOptions>()));
 | 
			
		||||
    image_in >> preprocessing.In(kImageTag);
 | 
			
		||||
    norm_rect_in >> preprocessing.In(kNormRectTag);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,12 +57,12 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/api2:port",
 | 
			
		||||
        "//mediapipe/framework/formats:image",
 | 
			
		||||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/calculators:tensors_to_embeddings_calculator",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/containers/proto:embeddings_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:embedding_postprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:image_preprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:embedding_postprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:image_preprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_task_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/vision/image_embedder/proto:image_embedder_graph_options_cc_proto",
 | 
			
		||||
        "@com_google_absl//absl/status:statusor",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,10 +20,10 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/formats/image.h"
 | 
			
		||||
#include "mediapipe/framework/formats/rect.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/containers/proto/embeddings.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/embedding_postprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/embedding_postprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_task_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/vision/image_embedder/proto/image_embedder_graph_options.pb.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -130,14 +130,15 @@ class ImageEmbedderGraph : public core::ModelTaskGraph {
 | 
			
		|||
      Source<NormalizedRect> norm_rect_in, Graph& graph) {
 | 
			
		||||
    // Adds preprocessing calculators and connects them to the graph input image
 | 
			
		||||
    // stream.
 | 
			
		||||
    auto& preprocessing =
 | 
			
		||||
        graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
    bool use_gpu = components::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    auto& preprocessing = graph.AddNode(
 | 
			
		||||
        "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
    bool use_gpu =
 | 
			
		||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
            task_options.base_options().acceleration());
 | 
			
		||||
    MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
    MP_RETURN_IF_ERROR(components::processors::ConfigureImagePreprocessingGraph(
 | 
			
		||||
        model_resources, use_gpu,
 | 
			
		||||
        &preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()));
 | 
			
		||||
        &preprocessing.GetOptions<tasks::components::processors::proto::
 | 
			
		||||
                                      ImagePreprocessingGraphOptions>()));
 | 
			
		||||
    image_in >> preprocessing.In(kImageTag);
 | 
			
		||||
    norm_rect_in >> preprocessing.In(kNormRectTag);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,10 +56,10 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/port:status",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/calculators/tensor:tensors_to_segmentation_calculator",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/calculators/tensor:tensors_to_segmentation_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:image_preprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors/proto:image_preprocessing_graph_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/proto:segmenter_options_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_task_graph",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/framework/port/status_macros.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/calculators/tensor/tensors_to_segmentation_calculator.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/proto/segmenter_options.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_task_graph.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -243,14 +243,15 @@ class ImageSegmenterGraph : public core::ModelTaskGraph {
 | 
			
		|||
 | 
			
		||||
    // Adds preprocessing calculators and connects them to the graph input image
 | 
			
		||||
    // stream.
 | 
			
		||||
    auto& preprocessing =
 | 
			
		||||
        graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
    bool use_gpu = components::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    auto& preprocessing = graph.AddNode(
 | 
			
		||||
        "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
    bool use_gpu =
 | 
			
		||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
            task_options.base_options().acceleration());
 | 
			
		||||
    MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
    MP_RETURN_IF_ERROR(components::processors::ConfigureImagePreprocessingGraph(
 | 
			
		||||
        model_resources, use_gpu,
 | 
			
		||||
        &preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()));
 | 
			
		||||
        &preprocessing.GetOptions<tasks::components::processors::proto::
 | 
			
		||||
                                      ImagePreprocessingGraphOptions>()));
 | 
			
		||||
    image_in >> preprocessing.In(kImageTag);
 | 
			
		||||
    norm_rect_in >> preprocessing.In(kNormRectTag);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,9 +71,9 @@ cc_library(
 | 
			
		|||
        "//mediapipe/framework/formats:rect_cc_proto",
 | 
			
		||||
        "//mediapipe/framework/formats:tensor",
 | 
			
		||||
        "//mediapipe/tasks/cc:common",
 | 
			
		||||
        "//mediapipe/tasks/cc/components:image_preprocessing",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/calculators:score_calibration_calculator_cc_proto",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/calculators:score_calibration_utils",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/processors:image_preprocessing_graph",
 | 
			
		||||
        "//mediapipe/tasks/cc/components/utils:source_or_node_output",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_resources",
 | 
			
		||||
        "//mediapipe/tasks/cc/core:model_task_graph",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ limitations under the License.
 | 
			
		|||
#include "mediapipe/tasks/cc/common.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/calculators/score_calibration_calculator.pb.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/calculators/score_calibration_utils.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/image_preprocessing.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/processors/image_preprocessing_graph.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/components/utils/source_or_node_output.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_resources.h"
 | 
			
		||||
#include "mediapipe/tasks/cc/core/model_task_graph.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -561,14 +561,15 @@ class ObjectDetectorGraph : public core::ModelTaskGraph {
 | 
			
		|||
 | 
			
		||||
    // Adds preprocessing calculators and connects them to the graph input image
 | 
			
		||||
    // stream.
 | 
			
		||||
    auto& preprocessing =
 | 
			
		||||
        graph.AddNode("mediapipe.tasks.components.ImagePreprocessingSubgraph");
 | 
			
		||||
    bool use_gpu = components::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
    auto& preprocessing = graph.AddNode(
 | 
			
		||||
        "mediapipe.tasks.components.processors.ImagePreprocessingGraph");
 | 
			
		||||
    bool use_gpu =
 | 
			
		||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
			
		||||
            task_options.base_options().acceleration());
 | 
			
		||||
    MP_RETURN_IF_ERROR(ConfigureImagePreprocessing(
 | 
			
		||||
    MP_RETURN_IF_ERROR(components::processors::ConfigureImagePreprocessingGraph(
 | 
			
		||||
        model_resources, use_gpu,
 | 
			
		||||
        &preprocessing
 | 
			
		||||
             .GetOptions<tasks::components::ImagePreprocessingOptions>()));
 | 
			
		||||
        &preprocessing.GetOptions<tasks::components::processors::proto::
 | 
			
		||||
                                      ImagePreprocessingGraphOptions>()));
 | 
			
		||||
    image_in >> preprocessing.In(kImageTag);
 | 
			
		||||
    norm_rect_in >> preprocessing.In(kNormRectTag);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user