From 1b4a835be0a73eaa83bf80fdd991fe4293d29b54 Mon Sep 17 00:00:00 2001 From: Chris McClanahan Date: Mon, 13 Mar 2023 16:07:36 -0700 Subject: [PATCH] Internal change PiperOrigin-RevId: 516349788 --- mediapipe/calculators/image/BUILD | 1 + .../calculators/image/affine_transformation.h | 3 + .../image/affine_transformation_runner_gl.cc | 141 ++++++++++++++---- .../image/affine_transformation_runner_gl.h | 3 +- .../affine_transformation_runner_opencv.cc | 23 ++- .../affine_transformation_runner_opencv.h | 3 +- .../image/warp_affine_calculator.cc | 28 +++- .../image/warp_affine_calculator.proto | 13 ++ .../image/warp_affine_calculator_test.cc | 101 ++++++++++--- ...with_rotation_border_zero_interp_cubic.png | Bin 0 -> 65093 bytes 10 files changed, 256 insertions(+), 60 deletions(-) create mode 100644 mediapipe/calculators/tensor/testdata/image_to_tensor/medium_sub_rect_with_rotation_border_zero_interp_cubic.png diff --git a/mediapipe/calculators/image/BUILD b/mediapipe/calculators/image/BUILD index 18a1d60a..d627bdc4 100644 --- a/mediapipe/calculators/image/BUILD +++ b/mediapipe/calculators/image/BUILD @@ -748,6 +748,7 @@ cc_test( "//mediapipe/calculators/tensor:testdata/image_to_tensor/medium_sub_rect_keep_aspect_with_rotation_border_zero.png", "//mediapipe/calculators/tensor:testdata/image_to_tensor/medium_sub_rect_with_rotation.png", "//mediapipe/calculators/tensor:testdata/image_to_tensor/medium_sub_rect_with_rotation_border_zero.png", + "//mediapipe/calculators/tensor:testdata/image_to_tensor/medium_sub_rect_with_rotation_border_zero_interp_cubic.png", "//mediapipe/calculators/tensor:testdata/image_to_tensor/noop_except_range.png", ], tags = ["desktop_only_test"], diff --git a/mediapipe/calculators/image/affine_transformation.h b/mediapipe/calculators/image/affine_transformation.h index 40793e7a..3e40e46d 100644 --- a/mediapipe/calculators/image/affine_transformation.h +++ b/mediapipe/calculators/image/affine_transformation.h @@ -29,6 +29,9 @@ class AffineTransformation { // pixels will be calculated. enum class BorderMode { kZero, kReplicate }; + // Pixel sampling interpolation method. + enum class Interpolation { kLinear, kCubic }; + struct Size { int width; int height; diff --git a/mediapipe/calculators/image/affine_transformation_runner_gl.cc b/mediapipe/calculators/image/affine_transformation_runner_gl.cc index 361dfc90..00641691 100644 --- a/mediapipe/calculators/image/affine_transformation_runner_gl.cc +++ b/mediapipe/calculators/image/affine_transformation_runner_gl.cc @@ -77,8 +77,11 @@ class GlTextureWarpAffineRunner std::unique_ptr> { public: GlTextureWarpAffineRunner(std::shared_ptr gl_helper, - GpuOrigin::Mode gpu_origin) - : gl_helper_(gl_helper), gpu_origin_(gpu_origin) {} + GpuOrigin::Mode gpu_origin, + AffineTransformation::Interpolation interpolation) + : gl_helper_(gl_helper), + gpu_origin_(gpu_origin), + interpolation_(interpolation) {} absl::Status Init() { return gl_helper_->RunInGlContext([this]() -> absl::Status { const GLint attr_location[kNumAttributes] = { @@ -103,28 +106,83 @@ class GlTextureWarpAffineRunner } )"; + // TODO Move bicubic code to common shared place. constexpr GLchar kFragShader[] = R"( - DEFAULT_PRECISION(highp, float) - in vec2 sample_coordinate; - uniform sampler2D input_texture; + DEFAULT_PRECISION(highp, float) - #ifdef GL_ES - #define fragColor gl_FragColor - #else - out vec4 fragColor; - #endif // defined(GL_ES); + in vec2 sample_coordinate; + uniform sampler2D input_texture; + uniform vec2 input_size; - void main() { - vec4 color = texture2D(input_texture, sample_coordinate); - #ifdef CUSTOM_ZERO_BORDER_MODE - float out_of_bounds = - float(sample_coordinate.x < 0.0 || sample_coordinate.x > 1.0 || - sample_coordinate.y < 0.0 || sample_coordinate.y > 1.0); - color = mix(color, vec4(0.0, 0.0, 0.0, 0.0), out_of_bounds); - #endif // defined(CUSTOM_ZERO_BORDER_MODE) - fragColor = color; - } - )"; + #ifdef GL_ES + #define fragColor gl_FragColor + #else + out vec4 fragColor; + #endif // defined(GL_ES); + + #ifdef CUBIC_INTERPOLATION + vec4 sample(sampler2D tex, vec2 tex_coord, vec2 tex_size) { + const vec2 halve = vec2(0.5,0.5); + const vec2 one = vec2(1.0,1.0); + const vec2 two = vec2(2.0,2.0); + const vec2 three = vec2(3.0,3.0); + const vec2 six = vec2(6.0,6.0); + + // Calculate the fraction and integer. + tex_coord = tex_coord * tex_size - halve; + vec2 frac = fract(tex_coord); + vec2 index = tex_coord - frac + halve; + + // Calculate weights for Catmull-Rom filter. + vec2 w0 = frac * (-halve + frac * (one - halve * frac)); + vec2 w1 = one + frac * frac * (-(two+halve) + three/two * frac); + vec2 w2 = frac * (halve + frac * (two - three/two * frac)); + vec2 w3 = frac * frac * (-halve + halve * frac); + + // Calculate weights to take advantage of bilinear texture lookup. + vec2 w12 = w1 + w2; + vec2 offset12 = w2 / (w1 + w2); + + vec2 index_tl = index - one; + vec2 index_br = index + two; + vec2 index_eq = index + offset12; + + index_tl /= tex_size; + index_br /= tex_size; + index_eq /= tex_size; + + // 9 texture lookup and linear blending. + vec4 color = vec4(0.0); + color += texture2D(tex, vec2(index_tl.x, index_tl.y)) * w0.x * w0.y; + color += texture2D(tex, vec2(index_eq.x, index_tl.y)) * w12.x *w0.y; + color += texture2D(tex, vec2(index_br.x, index_tl.y)) * w3.x * w0.y; + + color += texture2D(tex, vec2(index_tl.x, index_eq.y)) * w0.x * w12.y; + color += texture2D(tex, vec2(index_eq.x, index_eq.y)) * w12.x *w12.y; + color += texture2D(tex, vec2(index_br.x, index_eq.y)) * w3.x * w12.y; + + color += texture2D(tex, vec2(index_tl.x, index_br.y)) * w0.x * w3.y; + color += texture2D(tex, vec2(index_eq.x, index_br.y)) * w12.x *w3.y; + color += texture2D(tex, vec2(index_br.x, index_br.y)) * w3.x * w3.y; + return color; + } + #else + vec4 sample(sampler2D tex, vec2 tex_coord, vec2 tex_size) { + return texture2D(tex, tex_coord); + } + #endif // defined(CUBIC_INTERPOLATION) + + void main() { + vec4 color = sample(input_texture, sample_coordinate, input_size); + #ifdef CUSTOM_ZERO_BORDER_MODE + float out_of_bounds = + float(sample_coordinate.x < 0.0 || sample_coordinate.x > 1.0 || + sample_coordinate.y < 0.0 || sample_coordinate.y > 1.0); + color = mix(color, vec4(0.0, 0.0, 0.0, 0.0), out_of_bounds); + #endif // defined(CUSTOM_ZERO_BORDER_MODE) + fragColor = color; + } + )"; // Create program and set parameters. auto create_fn = [&](const std::string& vs, @@ -137,14 +195,28 @@ class GlTextureWarpAffineRunner glUseProgram(program); glUniform1i(glGetUniformLocation(program, "input_texture"), 1); GLint matrix_id = glGetUniformLocation(program, "transform_matrix"); - return Program{.id = program, .matrix_id = matrix_id}; + GLint size_id = glGetUniformLocation(program, "input_size"); + return Program{ + .id = program, .matrix_id = matrix_id, .size_id = size_id}; }; const std::string vert_src = absl::StrCat(mediapipe::kMediaPipeVertexShaderPreamble, kVertShader); - const std::string frag_src = absl::StrCat( - mediapipe::kMediaPipeFragmentShaderPreamble, kFragShader); + std::string interpolation_def; + switch (interpolation_) { + case AffineTransformation::Interpolation::kCubic: + interpolation_def = R"( + #define CUBIC_INTERPOLATION + )"; + break; + case AffineTransformation::Interpolation::kLinear: + break; + } + + const std::string frag_src = + absl::StrCat(mediapipe::kMediaPipeFragmentShaderPreamble, + interpolation_def, kFragShader); ASSIGN_OR_RETURN(program_, create_fn(vert_src, frag_src)); @@ -152,9 +224,9 @@ class GlTextureWarpAffineRunner std::string custom_zero_border_mode_def = R"( #define CUSTOM_ZERO_BORDER_MODE )"; - const std::string frag_custom_zero_src = - absl::StrCat(mediapipe::kMediaPipeFragmentShaderPreamble, - custom_zero_border_mode_def, kFragShader); + const std::string frag_custom_zero_src = absl::StrCat( + mediapipe::kMediaPipeFragmentShaderPreamble, + custom_zero_border_mode_def, interpolation_def, kFragShader); return create_fn(vert_src, frag_custom_zero_src); }; #if GL_CLAMP_TO_BORDER_MAY_BE_SUPPORTED @@ -256,6 +328,7 @@ class GlTextureWarpAffineRunner } glUseProgram(program->id); + // uniforms Eigen::Matrix eigen_mat(matrix.data()); if (IsMatrixVerticalFlipNeeded(gpu_origin_)) { // @matrix describes affine transformation in terms of TOP LEFT origin, so @@ -275,6 +348,10 @@ class GlTextureWarpAffineRunner eigen_mat.transposeInPlace(); glUniformMatrix4fv(program->matrix_id, 1, GL_FALSE, eigen_mat.data()); + if (interpolation_ == AffineTransformation::Interpolation::kCubic) { + glUniform2f(program->size_id, texture.width(), texture.height()); + } + // vao glBindVertexArray(vao_); @@ -327,6 +404,7 @@ class GlTextureWarpAffineRunner struct Program { GLuint id; GLint matrix_id; + GLint size_id; }; std::shared_ptr gl_helper_; GpuOrigin::Mode gpu_origin_; @@ -335,6 +413,8 @@ class GlTextureWarpAffineRunner Program program_; std::optional program_custom_zero_; GLuint framebuffer_ = 0; + AffineTransformation::Interpolation interpolation_ = + AffineTransformation::Interpolation::kLinear; }; #undef GL_CLAMP_TO_BORDER_MAY_BE_SUPPORTED @@ -344,9 +424,10 @@ class GlTextureWarpAffineRunner absl::StatusOr>>> CreateAffineTransformationGlRunner( - std::shared_ptr gl_helper, GpuOrigin::Mode gpu_origin) { - auto runner = - absl::make_unique(gl_helper, gpu_origin); + std::shared_ptr gl_helper, GpuOrigin::Mode gpu_origin, + AffineTransformation::Interpolation interpolation) { + auto runner = absl::make_unique( + gl_helper, gpu_origin, interpolation); MP_RETURN_IF_ERROR(runner->Init()); return runner; } diff --git a/mediapipe/calculators/image/affine_transformation_runner_gl.h b/mediapipe/calculators/image/affine_transformation_runner_gl.h index 677e0720..826c7b5c 100644 --- a/mediapipe/calculators/image/affine_transformation_runner_gl.h +++ b/mediapipe/calculators/image/affine_transformation_runner_gl.h @@ -29,7 +29,8 @@ absl::StatusOr>>> CreateAffineTransformationGlRunner( std::shared_ptr gl_helper, - mediapipe::GpuOrigin::Mode gpu_origin); + mediapipe::GpuOrigin::Mode gpu_origin, + AffineTransformation::Interpolation interpolation); } // namespace mediapipe diff --git a/mediapipe/calculators/image/affine_transformation_runner_opencv.cc b/mediapipe/calculators/image/affine_transformation_runner_opencv.cc index 46026a98..c43d73ff 100644 --- a/mediapipe/calculators/image/affine_transformation_runner_opencv.cc +++ b/mediapipe/calculators/image/affine_transformation_runner_opencv.cc @@ -39,9 +39,22 @@ cv::BorderTypes GetBorderModeForOpenCv( } } +int GetInterpolationForOpenCv( + AffineTransformation::Interpolation interpolation) { + switch (interpolation) { + case AffineTransformation::Interpolation::kLinear: + return cv::INTER_LINEAR; + case AffineTransformation::Interpolation::kCubic: + return cv::INTER_CUBIC; + } +} + class OpenCvRunner : public AffineTransformation::Runner { public: + OpenCvRunner(AffineTransformation::Interpolation interpolation) + : interpolation_(GetInterpolationForOpenCv(interpolation)) {} + absl::StatusOr Run( const ImageFrame& input, const std::array& matrix, const AffineTransformation::Size& size, @@ -142,19 +155,23 @@ class OpenCvRunner cv::warpAffine(in_mat, out_mat, cv_affine_transform, cv::Size(out_mat.cols, out_mat.rows), - /*flags=*/cv::INTER_LINEAR | cv::WARP_INVERSE_MAP, + /*flags=*/interpolation_ | cv::WARP_INVERSE_MAP, GetBorderModeForOpenCv(border_mode)); return out_image; } + + private: + int interpolation_ = cv::INTER_LINEAR; }; } // namespace absl::StatusOr< std::unique_ptr>> -CreateAffineTransformationOpenCvRunner() { - return absl::make_unique(); +CreateAffineTransformationOpenCvRunner( + AffineTransformation::Interpolation interpolation) { + return absl::make_unique(interpolation); } } // namespace mediapipe diff --git a/mediapipe/calculators/image/affine_transformation_runner_opencv.h b/mediapipe/calculators/image/affine_transformation_runner_opencv.h index 200281c9..6de48d4c 100644 --- a/mediapipe/calculators/image/affine_transformation_runner_opencv.h +++ b/mediapipe/calculators/image/affine_transformation_runner_opencv.h @@ -25,7 +25,8 @@ namespace mediapipe { absl::StatusOr< std::unique_ptr>> -CreateAffineTransformationOpenCvRunner(); +CreateAffineTransformationOpenCvRunner( + AffineTransformation::Interpolation interpolation); } // namespace mediapipe diff --git a/mediapipe/calculators/image/warp_affine_calculator.cc b/mediapipe/calculators/image/warp_affine_calculator.cc index 615d1697..38870177 100644 --- a/mediapipe/calculators/image/warp_affine_calculator.cc +++ b/mediapipe/calculators/image/warp_affine_calculator.cc @@ -53,6 +53,17 @@ AffineTransformation::BorderMode GetBorderMode( } } +AffineTransformation::Interpolation GetInterpolation( + mediapipe::WarpAffineCalculatorOptions::Interpolation interpolation) { + switch (interpolation) { + case mediapipe::WarpAffineCalculatorOptions::INTER_UNSPECIFIED: + case mediapipe::WarpAffineCalculatorOptions::INTER_LINEAR: + return AffineTransformation::Interpolation::kLinear; + case mediapipe::WarpAffineCalculatorOptions::INTER_CUBIC: + return AffineTransformation::Interpolation::kCubic; + } +} + template class WarpAffineRunnerHolder {}; @@ -61,16 +72,22 @@ template <> class WarpAffineRunnerHolder { public: using RunnerType = AffineTransformation::Runner; - absl::Status Open(CalculatorContext* cc) { return absl::OkStatus(); } + absl::Status Open(CalculatorContext* cc) { + interpolation_ = GetInterpolation( + cc->Options().interpolation()); + return absl::OkStatus(); + } absl::StatusOr GetRunner() { if (!runner_) { - ASSIGN_OR_RETURN(runner_, CreateAffineTransformationOpenCvRunner()); + ASSIGN_OR_RETURN(runner_, + CreateAffineTransformationOpenCvRunner(interpolation_)); } return runner_.get(); } private: std::unique_ptr runner_; + AffineTransformation::Interpolation interpolation_; }; #endif // !MEDIAPIPE_DISABLE_OPENCV @@ -85,12 +102,14 @@ class WarpAffineRunnerHolder { gpu_origin_ = cc->Options().gpu_origin(); gl_helper_ = std::make_shared(); + interpolation_ = GetInterpolation( + cc->Options().interpolation()); return gl_helper_->Open(cc); } absl::StatusOr GetRunner() { if (!runner_) { - ASSIGN_OR_RETURN( - runner_, CreateAffineTransformationGlRunner(gl_helper_, gpu_origin_)); + ASSIGN_OR_RETURN(runner_, CreateAffineTransformationGlRunner( + gl_helper_, gpu_origin_, interpolation_)); } return runner_.get(); } @@ -99,6 +118,7 @@ class WarpAffineRunnerHolder { mediapipe::GpuOrigin::Mode gpu_origin_; std::shared_ptr gl_helper_; std::unique_ptr runner_; + AffineTransformation::Interpolation interpolation_; }; #endif // !MEDIAPIPE_DISABLE_GPU diff --git a/mediapipe/calculators/image/warp_affine_calculator.proto b/mediapipe/calculators/image/warp_affine_calculator.proto index 20e6c1b0..b68f71ac 100644 --- a/mediapipe/calculators/image/warp_affine_calculator.proto +++ b/mediapipe/calculators/image/warp_affine_calculator.proto @@ -31,6 +31,13 @@ message WarpAffineCalculatorOptions { BORDER_REPLICATE = 2; } + // Pixel sampling interpolation methods. See @interpolation. + enum Interpolation { + INTER_UNSPECIFIED = 0; + INTER_LINEAR = 1; + INTER_CUBIC = 2; + } + // Pixel extrapolation method. // When converting image to tensor it may happen that tensor needs to read // pixels outside image boundaries. Border mode helps to specify how such @@ -43,4 +50,10 @@ message WarpAffineCalculatorOptions { // to be flipped vertically as tensors are expected to start at top. // (DEFAULT or unset interpreted as CONVENTIONAL.) optional GpuOrigin.Mode gpu_origin = 2; + + // Sampling method for neighboring pixels. + // INTER_LINEAR (bilinear) linearly interpolates from the nearest 4 neighbors. + // INTER_CUBIC (bicubic) interpolates a small neighborhood with cubic weights. + // INTER_UNSPECIFIED or unset interpreted as INTER_LINEAR. + optional Interpolation interpolation = 3; } diff --git a/mediapipe/calculators/image/warp_affine_calculator_test.cc b/mediapipe/calculators/image/warp_affine_calculator_test.cc index 959912cc..b911b66f 100644 --- a/mediapipe/calculators/image/warp_affine_calculator_test.cc +++ b/mediapipe/calculators/image/warp_affine_calculator_test.cc @@ -63,7 +63,8 @@ void RunTest(const std::string& graph_text, const std::string& tag, const cv::Mat& input, cv::Mat expected_result, float similarity_threshold, std::array matrix, int out_width, int out_height, - absl::optional border_mode) { + std::optional border_mode, + std::optional interpolation) { std::string border_mode_str; if (border_mode) { switch (*border_mode) { @@ -75,8 +76,20 @@ void RunTest(const std::string& graph_text, const std::string& tag, break; } } + std::string interpolation_str; + if (interpolation) { + switch (*interpolation) { + case AffineTransformation::Interpolation::kLinear: + interpolation_str = "interpolation: INTER_LINEAR"; + break; + case AffineTransformation::Interpolation::kCubic: + interpolation_str = "interpolation: INTER_CUBIC"; + break; + } + } auto graph_config = mediapipe::ParseTextProtoOrDie( - absl::Substitute(graph_text, /*$0=*/border_mode_str)); + absl::Substitute(graph_text, /*$0=*/border_mode_str, + /*$1=*/interpolation_str)); std::vector output_packets; tool::AddVectorSink("output_image", &graph_config, &output_packets); @@ -132,7 +145,8 @@ struct SimilarityConfig { void RunTest(cv::Mat input, cv::Mat expected_result, const SimilarityConfig& similarity, std::array matrix, int out_width, int out_height, - absl::optional border_mode) { + std::optional border_mode, + std::optional interpolation) { RunTest(R"( input_stream: "input_image" input_stream: "output_size" @@ -146,12 +160,13 @@ void RunTest(cv::Mat input, cv::Mat expected_result, options { [mediapipe.WarpAffineCalculatorOptions.ext] { $0 # border mode + $1 # interpolation } } } )", "cpu", input, expected_result, similarity.threshold_on_cpu, matrix, - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); RunTest(R"( input_stream: "input_image" @@ -171,6 +186,7 @@ void RunTest(cv::Mat input, cv::Mat expected_result, options { [mediapipe.WarpAffineCalculatorOptions.ext] { $0 # border mode + $1 # interpolation } } } @@ -181,7 +197,7 @@ void RunTest(cv::Mat input, cv::Mat expected_result, } )", "cpu_image", input, expected_result, similarity.threshold_on_cpu, - matrix, out_width, out_height, border_mode); + matrix, out_width, out_height, border_mode, interpolation); RunTest(R"( input_stream: "input_image" @@ -201,6 +217,7 @@ void RunTest(cv::Mat input, cv::Mat expected_result, options { [mediapipe.WarpAffineCalculatorOptions.ext] { $0 # border mode + $1 # interpolation gpu_origin: TOP_LEFT } } @@ -212,7 +229,7 @@ void RunTest(cv::Mat input, cv::Mat expected_result, } )", "gpu", input, expected_result, similarity.threshold_on_gpu, matrix, - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); RunTest(R"( input_stream: "input_image" @@ -237,6 +254,7 @@ void RunTest(cv::Mat input, cv::Mat expected_result, options { [mediapipe.WarpAffineCalculatorOptions.ext] { $0 # border mode + $1 # interpolation gpu_origin: TOP_LEFT } } @@ -253,7 +271,7 @@ void RunTest(cv::Mat input, cv::Mat expected_result, } )", "gpu_image", input, expected_result, similarity.threshold_on_gpu, - matrix, out_width, out_height, border_mode); + matrix, out_width, out_height, border_mode, interpolation); } std::array GetMatrix(cv::Mat input, mediapipe::NormalizedRect roi, @@ -287,10 +305,11 @@ TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspect) { int out_height = 256; bool keep_aspect_ratio = true; std::optional border_mode = {}; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.82}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspectBorderZero) { @@ -312,10 +331,11 @@ TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspectBorderZero) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.81}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspectWithRotation) { @@ -337,10 +357,11 @@ TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspectWithRotation) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kReplicate; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.77}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspectWithRotationBorderZero) { @@ -362,10 +383,11 @@ TEST(WarpAffineCalculatorTest, MediumSubRectKeepAspectWithRotationBorderZero) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.75}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, MediumSubRectWithRotation) { @@ -386,10 +408,11 @@ TEST(WarpAffineCalculatorTest, MediumSubRectWithRotation) { bool keep_aspect_ratio = false; std::optional border_mode = AffineTransformation::BorderMode::kReplicate; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.81}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, MediumSubRectWithRotationBorderZero) { @@ -411,10 +434,38 @@ TEST(WarpAffineCalculatorTest, MediumSubRectWithRotationBorderZero) { bool keep_aspect_ratio = false; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.80}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); +} + +TEST(WarpAffineCalculatorTest, MediumSubRectWithRotationBorderZeroInterpCubic) { + mediapipe::NormalizedRect roi; + roi.set_x_center(0.65f); + roi.set_y_center(0.4f); + roi.set_width(0.5f); + roi.set_height(0.5f); + roi.set_rotation(M_PI * -45.0f / 180.0f); + auto input = GetRgb( + "/mediapipe/calculators/" + "tensor/testdata/image_to_tensor/input.jpg"); + auto expected_output = GetRgb( + "/mediapipe/calculators/" + "tensor/testdata/image_to_tensor/" + "medium_sub_rect_with_rotation_border_zero_interp_cubic.png"); + int out_width = 256; + int out_height = 256; + bool keep_aspect_ratio = false; + std::optional border_mode = + AffineTransformation::BorderMode::kZero; + std::optional interpolation = + AffineTransformation::Interpolation::kCubic; + RunTest(input, expected_output, + {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.78}, + GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, LargeSubRect) { @@ -435,10 +486,11 @@ TEST(WarpAffineCalculatorTest, LargeSubRect) { bool keep_aspect_ratio = false; std::optional border_mode = AffineTransformation::BorderMode::kReplicate; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.95}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, LargeSubRectBorderZero) { @@ -459,10 +511,11 @@ TEST(WarpAffineCalculatorTest, LargeSubRectBorderZero) { bool keep_aspect_ratio = false; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.92}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspect) { @@ -483,10 +536,11 @@ TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspect) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kReplicate; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.97}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspectBorderZero) { @@ -508,10 +562,11 @@ TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspectBorderZero) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.97}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspectWithRotation) { @@ -532,10 +587,11 @@ TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspectWithRotation) { int out_height = 128; bool keep_aspect_ratio = true; std::optional border_mode = {}; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.91}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspectWithRotationBorderZero) { @@ -557,10 +613,11 @@ TEST(WarpAffineCalculatorTest, LargeSubRectKeepAspectWithRotationBorderZero) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.88}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, NoOp) { @@ -581,10 +638,11 @@ TEST(WarpAffineCalculatorTest, NoOp) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kReplicate; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.99}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } TEST(WarpAffineCalculatorTest, NoOpBorderZero) { @@ -605,10 +663,11 @@ TEST(WarpAffineCalculatorTest, NoOpBorderZero) { bool keep_aspect_ratio = true; std::optional border_mode = AffineTransformation::BorderMode::kZero; + std::optional interpolation = {}; RunTest(input, expected_output, {.threshold_on_cpu = 0.99, .threshold_on_gpu = 0.99}, GetMatrix(input, roi, keep_aspect_ratio, out_width, out_height), - out_width, out_height, border_mode); + out_width, out_height, border_mode, interpolation); } } // namespace diff --git a/mediapipe/calculators/tensor/testdata/image_to_tensor/medium_sub_rect_with_rotation_border_zero_interp_cubic.png b/mediapipe/calculators/tensor/testdata/image_to_tensor/medium_sub_rect_with_rotation_border_zero_interp_cubic.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2e266a98ef8016e87e8343e095dc8c945b35f8 GIT binary patch literal 65093 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ⅇ-5IW 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