Project import generated by Copybara.
GitOrigin-RevId: 016275ca4057540b2370ed4531dbc81eb92caae2
This commit is contained in:
parent
017c1dc7ea
commit
ae05ad04b3
|
@ -399,4 +399,4 @@ on how to build MediaPipe examples.
|
||||||
* [Python Colab](https://mediapipe.page.link/pose_py_colab)
|
* [Python Colab](https://mediapipe.page.link/pose_py_colab)
|
||||||
|
|
||||||
[`mAP`]: https://cocodataset.org/#keypoints-eval
|
[`mAP`]: https://cocodataset.org/#keypoints-eval
|
||||||
[`PCK@0.2`]: https\://github.com/cbsudux/Human-Pose-Estimation-101
|
[`PCK@0.2`]: https://github.com/cbsudux/Human-Pose-Estimation-101
|
||||||
|
|
|
@ -405,6 +405,36 @@ cc_library(
|
||||||
alwayslink = 1,
|
alwayslink = 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mediapipe_proto_library(
|
||||||
|
name = "image_clone_calculator_proto",
|
||||||
|
srcs = ["image_clone_calculator.proto"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
"//mediapipe/framework:calculator_options_proto",
|
||||||
|
"//mediapipe/framework:calculator_proto",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "image_clone_calculator",
|
||||||
|
srcs = ["image_clone_calculator.cc"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
":image_clone_calculator_cc_proto",
|
||||||
|
"//mediapipe/framework/api2:node",
|
||||||
|
"//mediapipe/framework:calculator_framework",
|
||||||
|
"//mediapipe/framework/formats:image",
|
||||||
|
"//mediapipe/framework/port:ret_check",
|
||||||
|
"//mediapipe/framework/port:status",
|
||||||
|
] + select({
|
||||||
|
"//mediapipe/gpu:disable_gpu": [],
|
||||||
|
"//conditions:default": [
|
||||||
|
"//mediapipe/gpu:gl_calculator_helper",
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
alwayslink = 1,
|
||||||
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "image_properties_calculator",
|
name = "image_properties_calculator",
|
||||||
srcs = ["image_properties_calculator.cc"],
|
srcs = ["image_properties_calculator.cc"],
|
||||||
|
|
125
mediapipe/calculators/image/image_clone_calculator.cc
Normal file
125
mediapipe/calculators/image/image_clone_calculator.cc
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
// Copyright 2021 The MediaPipe Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "mediapipe/calculators/image/image_clone_calculator.pb.h"
|
||||||
|
#include "mediapipe/framework/api2/node.h"
|
||||||
|
#include "mediapipe/framework/calculator_framework.h"
|
||||||
|
#include "mediapipe/framework/formats/image.h"
|
||||||
|
#include "mediapipe/framework/port/status.h"
|
||||||
|
|
||||||
|
#if !MEDIAPIPE_DISABLE_GPU
|
||||||
|
#include "mediapipe/gpu/gl_calculator_helper.h"
|
||||||
|
#endif // !MEDIAPIPE_DISABLE_GPU
|
||||||
|
|
||||||
|
namespace mediapipe {
|
||||||
|
namespace api2 {
|
||||||
|
|
||||||
|
#if MEDIAPIPE_DISABLE_GPU
|
||||||
|
// Just a placeholder to not have to depend on mediapipe::GpuBuffer.
|
||||||
|
using GpuBuffer = AnyType;
|
||||||
|
#else
|
||||||
|
using GpuBuffer = mediapipe::GpuBuffer;
|
||||||
|
#endif // MEDIAPIPE_DISABLE_GPU
|
||||||
|
|
||||||
|
// Clones an input image and makes sure in the output clone the pixel data are
|
||||||
|
// stored on the target storage (CPU vs GPU) specified in the calculator option.
|
||||||
|
//
|
||||||
|
// The clone shares ownership of the input pixel data on the existing storage.
|
||||||
|
// If the target storage is diffrent from the existing one, then the data is
|
||||||
|
// further copied there.
|
||||||
|
//
|
||||||
|
// Example usage:
|
||||||
|
// node {
|
||||||
|
// calculator: "ImageCloneCalculator"
|
||||||
|
// input_stream: "input"
|
||||||
|
// output_stream: "output"
|
||||||
|
// options: {
|
||||||
|
// [mediapipe.ImageCloneCalculatorOptions.ext] {
|
||||||
|
// output_on_gpu: true
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
class ImageCloneCalculator : public Node {
|
||||||
|
public:
|
||||||
|
static constexpr Input<Image> kIn{""};
|
||||||
|
static constexpr Output<Image> kOut{""};
|
||||||
|
|
||||||
|
MEDIAPIPE_NODE_CONTRACT(kIn, kOut);
|
||||||
|
|
||||||
|
static absl::Status UpdateContract(CalculatorContract* cc) {
|
||||||
|
#if MEDIAPIPE_DISABLE_GPU
|
||||||
|
if (cc->Options<mediapipe::ImageCloneCalculatorOptions>().output_on_gpu()) {
|
||||||
|
return absl::UnimplementedError(
|
||||||
|
"GPU processing is disabled in build flags");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
MP_RETURN_IF_ERROR(mediapipe::GlCalculatorHelper::UpdateContract(cc));
|
||||||
|
#endif // MEDIAPIPE_DISABLE_GPU
|
||||||
|
return absl::OkStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
absl::Status Open(CalculatorContext* cc) override {
|
||||||
|
const auto& options = cc->Options<mediapipe::ImageCloneCalculatorOptions>();
|
||||||
|
output_on_gpu_ = options.output_on_gpu();
|
||||||
|
#if !MEDIAPIPE_DISABLE_GPU
|
||||||
|
MP_RETURN_IF_ERROR(gpu_helper_.Open(cc));
|
||||||
|
#endif // !MEDIAPIPE_DISABLE_GPU
|
||||||
|
return absl::OkStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
absl::Status Process(CalculatorContext* cc) override {
|
||||||
|
std::unique_ptr<Image> output;
|
||||||
|
const auto& input = *kIn(cc);
|
||||||
|
if (input.UsesGpu()) {
|
||||||
|
#if !MEDIAPIPE_DISABLE_GPU
|
||||||
|
// Create an output Image that co-owns the underlying texture buffer as
|
||||||
|
// the input Image.
|
||||||
|
output = std::make_unique<Image>(input.GetGpuBuffer());
|
||||||
|
#endif // !MEDIAPIPE_DISABLE_GPU
|
||||||
|
} else {
|
||||||
|
// Make a copy of the input packet to co-own the input Image.
|
||||||
|
mediapipe::Packet* packet_copy_ptr =
|
||||||
|
new mediapipe::Packet(kIn(cc).packet());
|
||||||
|
// Create an output Image that (co-)owns a new ImageFrame that points to
|
||||||
|
// the same pixel data as the input Image and also owns the packet
|
||||||
|
// copy. As a result, the output Image indirectly co-owns the input
|
||||||
|
// Image. This ensures a correct life span of the shared pixel data.
|
||||||
|
output = std::make_unique<Image>(std::make_unique<mediapipe::ImageFrame>(
|
||||||
|
input.image_format(), input.width(), input.height(), input.step(),
|
||||||
|
const_cast<uint8*>(input.GetImageFrameSharedPtr()->PixelData()),
|
||||||
|
[packet_copy_ptr](uint8*) { delete packet_copy_ptr; }));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (output_on_gpu_) {
|
||||||
|
#if !MEDIAPIPE_DISABLE_GPU
|
||||||
|
gpu_helper_.RunInGlContext([&output]() { output->ConvertToGpu(); });
|
||||||
|
#endif // !MEDIAPIPE_DISABLE_GPU
|
||||||
|
} else {
|
||||||
|
output->ConvertToCpu();
|
||||||
|
}
|
||||||
|
kOut(cc).Send(std::move(output));
|
||||||
|
|
||||||
|
return absl::OkStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool output_on_gpu_;
|
||||||
|
#if !MEDIAPIPE_DISABLE_GPU
|
||||||
|
mediapipe::GlCalculatorHelper gpu_helper_;
|
||||||
|
#endif // !MEDIAPIPE_DISABLE_GPU
|
||||||
|
};
|
||||||
|
MEDIAPIPE_REGISTER_NODE(ImageCloneCalculator);
|
||||||
|
|
||||||
|
} // namespace api2
|
||||||
|
} // namespace mediapipe
|
28
mediapipe/calculators/image/image_clone_calculator.proto
Normal file
28
mediapipe/calculators/image/image_clone_calculator.proto
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2021 The MediaPipe Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
package mediapipe;
|
||||||
|
|
||||||
|
import "mediapipe/framework/calculator.proto";
|
||||||
|
|
||||||
|
message ImageCloneCalculatorOptions {
|
||||||
|
extend CalculatorOptions {
|
||||||
|
optional ImageCloneCalculatorOptions ext = 372781894;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Whether the output clone should have pixel data already available on GPU.
|
||||||
|
optional bool output_on_gpu = 1 [default = false];
|
||||||
|
}
|
|
@ -753,6 +753,7 @@ cc_library(
|
||||||
":gl_simple_shaders",
|
":gl_simple_shaders",
|
||||||
":shader_util",
|
":shader_util",
|
||||||
"//mediapipe/framework:calculator_framework",
|
"//mediapipe/framework:calculator_framework",
|
||||||
|
"//mediapipe/framework/formats:image",
|
||||||
"//mediapipe/framework/port:ret_check",
|
"//mediapipe/framework/port:ret_check",
|
||||||
"//mediapipe/framework/port:status",
|
"//mediapipe/framework/port:status",
|
||||||
"//mediapipe/framework/tool:options_util",
|
"//mediapipe/framework/tool:options_util",
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include "mediapipe/framework/calculator_framework.h"
|
#include "mediapipe/framework/calculator_framework.h"
|
||||||
|
#include "mediapipe/framework/formats/image.h"
|
||||||
#include "mediapipe/framework/port/ret_check.h"
|
#include "mediapipe/framework/port/ret_check.h"
|
||||||
#include "mediapipe/framework/port/status.h"
|
#include "mediapipe/framework/port/status.h"
|
||||||
#include "mediapipe/framework/tool/options_util.h"
|
#include "mediapipe/framework/tool/options_util.h"
|
||||||
|
@ -33,6 +34,8 @@ typedef int DimensionsPacketType[2];
|
||||||
|
|
||||||
namespace mediapipe {
|
namespace mediapipe {
|
||||||
|
|
||||||
|
using Image = mediapipe::Image;
|
||||||
|
|
||||||
// Scales, rotates, horizontal or vertical flips the image.
|
// Scales, rotates, horizontal or vertical flips the image.
|
||||||
// See GlSimpleCalculatorBase for inputs, outputs and input side packets.
|
// See GlSimpleCalculatorBase for inputs, outputs and input side packets.
|
||||||
// Additional input streams:
|
// Additional input streams:
|
||||||
|
@ -99,8 +102,17 @@ REGISTER_CALCULATOR(GlScalerCalculator);
|
||||||
|
|
||||||
// static
|
// static
|
||||||
absl::Status GlScalerCalculator::GetContract(CalculatorContract* cc) {
|
absl::Status GlScalerCalculator::GetContract(CalculatorContract* cc) {
|
||||||
TagOrIndex(&cc->Inputs(), "VIDEO", 0).Set<GpuBuffer>();
|
if (cc->Inputs().HasTag("IMAGE")) {
|
||||||
TagOrIndex(&cc->Outputs(), "VIDEO", 0).Set<GpuBuffer>();
|
cc->Inputs().Tag("IMAGE").Set<Image>();
|
||||||
|
} else {
|
||||||
|
TagOrIndex(&cc->Inputs(), "VIDEO", 0).Set<GpuBuffer>();
|
||||||
|
}
|
||||||
|
if (cc->Outputs().HasTag("IMAGE")) {
|
||||||
|
cc->Outputs().Tag("IMAGE").Set<Image>();
|
||||||
|
} else {
|
||||||
|
TagOrIndex(&cc->Outputs(), "VIDEO", 0).Set<GpuBuffer>();
|
||||||
|
}
|
||||||
|
|
||||||
if (cc->Inputs().HasTag("ROTATION")) {
|
if (cc->Inputs().HasTag("ROTATION")) {
|
||||||
cc->Inputs().Tag("ROTATION").Set<int>();
|
cc->Inputs().Tag("ROTATION").Set<int>();
|
||||||
}
|
}
|
||||||
|
@ -198,7 +210,10 @@ absl::Status GlScalerCalculator::Process(CalculatorContext* cc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return helper_.RunInGlContext([this, cc]() -> absl::Status {
|
return helper_.RunInGlContext([this, cc]() -> absl::Status {
|
||||||
const auto& input = TagOrIndex(cc->Inputs(), "VIDEO", 0).Get<GpuBuffer>();
|
const auto& input =
|
||||||
|
cc->Inputs().HasTag("IMAGE")
|
||||||
|
? cc->Inputs().Tag("IMAGE").Get<Image>().GetGpuBuffer()
|
||||||
|
: TagOrIndex(cc->Inputs(), "VIDEO", 0).Get<GpuBuffer>();
|
||||||
QuadRenderer* renderer = nullptr;
|
QuadRenderer* renderer = nullptr;
|
||||||
GlTexture src1;
|
GlTexture src1;
|
||||||
GlTexture src2;
|
GlTexture src2;
|
||||||
|
@ -289,10 +304,14 @@ absl::Status GlScalerCalculator::Process(CalculatorContext* cc) {
|
||||||
|
|
||||||
glFlush();
|
glFlush();
|
||||||
|
|
||||||
auto output = dst.GetFrame<GpuBuffer>();
|
if (cc->Outputs().HasTag("IMAGE")) {
|
||||||
|
auto output = dst.GetFrame<Image>();
|
||||||
TagOrIndex(&cc->Outputs(), "VIDEO", 0)
|
cc->Outputs().Tag("IMAGE").Add(output.release(), cc->InputTimestamp());
|
||||||
.Add(output.release(), cc->InputTimestamp());
|
} else {
|
||||||
|
auto output = dst.GetFrame<GpuBuffer>();
|
||||||
|
TagOrIndex(&cc->Outputs(), "VIDEO", 0)
|
||||||
|
.Add(output.release(), cc->InputTimestamp());
|
||||||
|
}
|
||||||
|
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user