Internal change
PiperOrigin-RevId: 529617578
This commit is contained in:
		
							parent
							
								
									18d893c697
								
							
						
					
					
						commit
						c24e7a250c
					
				| 
						 | 
					@ -63,6 +63,8 @@ cc_library(
 | 
				
			||||||
        "//mediapipe/calculators/image:image_properties_calculator",
 | 
					        "//mediapipe/calculators/image:image_properties_calculator",
 | 
				
			||||||
        "//mediapipe/calculators/image:image_transformation_calculator",
 | 
					        "//mediapipe/calculators/image:image_transformation_calculator",
 | 
				
			||||||
        "//mediapipe/calculators/image:image_transformation_calculator_cc_proto",
 | 
					        "//mediapipe/calculators/image:image_transformation_calculator_cc_proto",
 | 
				
			||||||
 | 
					        "//mediapipe/calculators/image:set_alpha_calculator",
 | 
				
			||||||
 | 
					        "//mediapipe/calculators/image:set_alpha_calculator_cc_proto",
 | 
				
			||||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator",
 | 
					        "//mediapipe/calculators/tensor:image_to_tensor_calculator",
 | 
				
			||||||
        "//mediapipe/calculators/tensor:image_to_tensor_calculator_cc_proto",
 | 
					        "//mediapipe/calculators/tensor:image_to_tensor_calculator_cc_proto",
 | 
				
			||||||
        "//mediapipe/calculators/tensor:inference_calculator",
 | 
					        "//mediapipe/calculators/tensor:inference_calculator",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ limitations under the License.
 | 
				
			||||||
#include "absl/strings/str_format.h"
 | 
					#include "absl/strings/str_format.h"
 | 
				
			||||||
#include "mediapipe/calculators/image/image_clone_calculator.pb.h"
 | 
					#include "mediapipe/calculators/image/image_clone_calculator.pb.h"
 | 
				
			||||||
#include "mediapipe/calculators/image/image_transformation_calculator.pb.h"
 | 
					#include "mediapipe/calculators/image/image_transformation_calculator.pb.h"
 | 
				
			||||||
 | 
					#include "mediapipe/calculators/image/set_alpha_calculator.pb.h"
 | 
				
			||||||
#include "mediapipe/calculators/tensor/tensor_converter_calculator.pb.h"
 | 
					#include "mediapipe/calculators/tensor/tensor_converter_calculator.pb.h"
 | 
				
			||||||
#include "mediapipe/framework/api2/builder.h"
 | 
					#include "mediapipe/framework/api2/builder.h"
 | 
				
			||||||
#include "mediapipe/framework/api2/port.h"
 | 
					#include "mediapipe/framework/api2/port.h"
 | 
				
			||||||
| 
						 | 
					@ -249,7 +250,8 @@ void ConfigureTensorConverterCalculator(
 | 
				
			||||||
// the tflite model.
 | 
					// the tflite model.
 | 
				
			||||||
absl::StatusOr<ImageAndTensorsOnDevice> ConvertImageToTensors(
 | 
					absl::StatusOr<ImageAndTensorsOnDevice> ConvertImageToTensors(
 | 
				
			||||||
    Source<Image> image_in, Source<NormalizedRect> norm_rect_in, bool use_gpu,
 | 
					    Source<Image> image_in, Source<NormalizedRect> norm_rect_in, bool use_gpu,
 | 
				
			||||||
    const core::ModelResources& model_resources, Graph& graph) {
 | 
					    bool is_hair_segmentation, const core::ModelResources& model_resources,
 | 
				
			||||||
 | 
					    Graph& graph) {
 | 
				
			||||||
  ASSIGN_OR_RETURN(const tflite::Tensor* tflite_input_tensor,
 | 
					  ASSIGN_OR_RETURN(const tflite::Tensor* tflite_input_tensor,
 | 
				
			||||||
                   GetInputTensor(model_resources));
 | 
					                   GetInputTensor(model_resources));
 | 
				
			||||||
  if (tflite_input_tensor->shape()->size() != 4) {
 | 
					  if (tflite_input_tensor->shape()->size() != 4) {
 | 
				
			||||||
| 
						 | 
					@ -294,9 +296,17 @@ absl::StatusOr<ImageAndTensorsOnDevice> ConvertImageToTensors(
 | 
				
			||||||
    // Convert from Image to legacy ImageFrame or GpuBuffer.
 | 
					    // Convert from Image to legacy ImageFrame or GpuBuffer.
 | 
				
			||||||
    auto& from_image = graph.AddNode("FromImageCalculator");
 | 
					    auto& from_image = graph.AddNode("FromImageCalculator");
 | 
				
			||||||
    image_on_device >> from_image.In(kImageTag);
 | 
					    image_on_device >> from_image.In(kImageTag);
 | 
				
			||||||
    auto image_cpu_or_gpu =
 | 
					    Source<api2::AnyType> image_cpu_or_gpu =
 | 
				
			||||||
        from_image.Out(use_gpu ? kImageGpuTag : kImageCpuTag);
 | 
					        from_image.Out(use_gpu ? kImageGpuTag : kImageCpuTag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (is_hair_segmentation) {
 | 
				
			||||||
 | 
					      auto& set_alpha = graph.AddNode("SetAlphaCalculator");
 | 
				
			||||||
 | 
					      set_alpha.GetOptions<mediapipe::SetAlphaCalculatorOptions>()
 | 
				
			||||||
 | 
					          .set_alpha_value(0);
 | 
				
			||||||
 | 
					      image_cpu_or_gpu >> set_alpha.In(use_gpu ? kImageGpuTag : kImageTag);
 | 
				
			||||||
 | 
					      image_cpu_or_gpu = set_alpha.Out(use_gpu ? kImageGpuTag : kImageTag);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Resize the input image to the model input size.
 | 
					    // Resize the input image to the model input size.
 | 
				
			||||||
    auto& image_transformation = graph.AddNode("ImageTransformationCalculator");
 | 
					    auto& image_transformation = graph.AddNode("ImageTransformationCalculator");
 | 
				
			||||||
    ConfigureImageTransformationCalculator(
 | 
					    ConfigureImageTransformationCalculator(
 | 
				
			||||||
| 
						 | 
					@ -461,22 +471,41 @@ class ImageSegmenterGraph : public core::ModelTaskGraph {
 | 
				
			||||||
    bool use_gpu =
 | 
					    bool use_gpu =
 | 
				
			||||||
        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
					        components::processors::DetermineImagePreprocessingGpuBackend(
 | 
				
			||||||
            task_options.base_options().acceleration());
 | 
					            task_options.base_options().acceleration());
 | 
				
			||||||
    ASSIGN_OR_RETURN(auto image_and_tensors,
 | 
					 | 
				
			||||||
                     ConvertImageToTensors(image_in, norm_rect_in, use_gpu,
 | 
					 | 
				
			||||||
                                           model_resources, graph));
 | 
					 | 
				
			||||||
    // Adds inference subgraph and connects its input stream to the output
 | 
					 | 
				
			||||||
    // tensors produced by the ImageToTensorCalculator.
 | 
					 | 
				
			||||||
    auto& inference = AddInference(
 | 
					 | 
				
			||||||
        model_resources, task_options.base_options().acceleration(), graph);
 | 
					 | 
				
			||||||
    image_and_tensors.tensors >> inference.In(kTensorsTag);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Adds segmentation calculators for output streams.
 | 
					    // Adds segmentation calculators for output streams. Add this calculator
 | 
				
			||||||
 | 
					    // first to get the labels.
 | 
				
			||||||
    auto& tensor_to_images =
 | 
					    auto& tensor_to_images =
 | 
				
			||||||
        graph.AddNode("mediapipe.tasks.TensorsToSegmentationCalculator");
 | 
					        graph.AddNode("mediapipe.tasks.TensorsToSegmentationCalculator");
 | 
				
			||||||
    RET_CHECK_OK(ConfigureTensorsToSegmentationCalculator(
 | 
					    RET_CHECK_OK(ConfigureTensorsToSegmentationCalculator(
 | 
				
			||||||
        task_options, model_resources,
 | 
					        task_options, model_resources,
 | 
				
			||||||
        &tensor_to_images
 | 
					        &tensor_to_images
 | 
				
			||||||
             .GetOptions<TensorsToSegmentationCalculatorOptions>()));
 | 
					             .GetOptions<TensorsToSegmentationCalculatorOptions>()));
 | 
				
			||||||
 | 
					    const auto& tensor_to_images_options =
 | 
				
			||||||
 | 
					        tensor_to_images.GetOptions<TensorsToSegmentationCalculatorOptions>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: remove special logic for hair segmentation model.
 | 
				
			||||||
 | 
					    // The alpha channel of hair segmentation model indicates the interested
 | 
				
			||||||
 | 
					    // area. The model was designed for live stream mode, so that the mask of
 | 
				
			||||||
 | 
					    // previous frame is used as the indicator for the next frame. For the first
 | 
				
			||||||
 | 
					    // frame, it expects the alpha channel to be empty. To consolidate IMAGE,
 | 
				
			||||||
 | 
					    // VIDEO and LIVE_STREAM mode in mediapipe tasks, here we forcely set the
 | 
				
			||||||
 | 
					    // alpha channel to be empty if we find the model is the hair segmentation
 | 
				
			||||||
 | 
					    // model.
 | 
				
			||||||
 | 
					    bool is_hair_segmentation = false;
 | 
				
			||||||
 | 
					    if (tensor_to_images_options.label_items_size() == 2 &&
 | 
				
			||||||
 | 
					        tensor_to_images_options.label_items().at(1).name() == "hair") {
 | 
				
			||||||
 | 
					      is_hair_segmentation = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ASSIGN_OR_RETURN(
 | 
				
			||||||
 | 
					        auto image_and_tensors,
 | 
				
			||||||
 | 
					        ConvertImageToTensors(image_in, norm_rect_in, use_gpu,
 | 
				
			||||||
 | 
					                              is_hair_segmentation, model_resources, graph));
 | 
				
			||||||
 | 
					    // Adds inference subgraph and connects its input stream to the output
 | 
				
			||||||
 | 
					    // tensors produced by the ImageToTensorCalculator.
 | 
				
			||||||
 | 
					    auto& inference = AddInference(
 | 
				
			||||||
 | 
					        model_resources, task_options.base_options().acceleration(), graph);
 | 
				
			||||||
 | 
					    image_and_tensors.tensors >> inference.In(kTensorsTag);
 | 
				
			||||||
    inference.Out(kTensorsTag) >> tensor_to_images.In(kTensorsTag);
 | 
					    inference.Out(kTensorsTag) >> tensor_to_images.In(kTensorsTag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Adds image property calculator for output size.
 | 
					    // Adds image property calculator for output size.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								third_party/external_files.bzl
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								third_party/external_files.bzl
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -204,8 +204,8 @@ def external_files():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    http_file(
 | 
					    http_file(
 | 
				
			||||||
        name = "com_google_mediapipe_conv2d_input_channel_1_tflite",
 | 
					        name = "com_google_mediapipe_conv2d_input_channel_1_tflite",
 | 
				
			||||||
        sha256 = "126edac445967799f3b8b124d15483b1506f6d6cb57a501c1636eb8f2fb3734f",
 | 
					        sha256 = "ccb667092f3aed3a35a57fb3478fecc0c8f6360dbf477a9db9c24e5b3ec4273e",
 | 
				
			||||||
        urls = ["https://storage.googleapis.com/mediapipe-assets/conv2d_input_channel_1.tflite?generation=1678218348519744"],
 | 
					        urls = ["https://storage.googleapis.com/mediapipe-assets/conv2d_input_channel_1.tflite?generation=1683252905577703"],
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    http_file(
 | 
					    http_file(
 | 
				
			||||||
| 
						 | 
					@ -246,8 +246,8 @@ def external_files():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    http_file(
 | 
					    http_file(
 | 
				
			||||||
        name = "com_google_mediapipe_dense_tflite",
 | 
					        name = "com_google_mediapipe_dense_tflite",
 | 
				
			||||||
        sha256 = "be9323068461b1cbf412692ee916be30dcb1a5fb59a9ee875d470bc340d9e869",
 | 
					        sha256 = "6795e7c3a263f44e97be048a5e1166e0921b453bfbaf037f4f69ac5c059ee945",
 | 
				
			||||||
        urls = ["https://storage.googleapis.com/mediapipe-assets/dense.tflite?generation=1678218351373709"],
 | 
					        urls = ["https://storage.googleapis.com/mediapipe-assets/dense.tflite?generation=1683252907920466"],
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    http_file(
 | 
					    http_file(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user