diff --git a/src/frontends/tensorflow/src/op_table.cpp b/src/frontends/tensorflow/src/op_table.cpp index 814b4528a2b..2377aefe0ae 100644 --- a/src/frontends/tensorflow/src/op_table.cpp +++ b/src/frontends/tensorflow/src/op_table.cpp @@ -115,6 +115,7 @@ const std::map get_supported_ops() { // Separate translators: {"AddN", CreatorFunction(translate_add_n_op)}, + {"AdjustContrastv2", CreatorFunction(translate_adjust_contrast_op)}, {"ArgMax", CreatorFunction(translate_arg_max_op)}, {"ArgMin", CreatorFunction(translate_arg_min_op)}, {"Assert", CreatorFunction(translate_no_op)}, diff --git a/src/frontends/tensorflow_common/include/common_op_table.hpp b/src/frontends/tensorflow_common/include/common_op_table.hpp index f697d17ca2a..d1cf54703f5 100644 --- a/src/frontends/tensorflow_common/include/common_op_table.hpp +++ b/src/frontends/tensorflow_common/include/common_op_table.hpp @@ -32,6 +32,7 @@ OP_T_CONVERTER(translate_binary_op); OP_T_CONVERTER(translate_direct_reduce_op); OP_CONVERTER(translate_add_n_op); +OP_CONVERTER(translate_adjust_contrast_op); OP_CONVERTER(translate_arg_max_op); OP_CONVERTER(translate_arg_min_op); OP_CONVERTER(translate_avg_pool_op); diff --git a/src/frontends/tensorflow_common/src/op/adjust_contrast.cpp b/src/frontends/tensorflow_common/src/op/adjust_contrast.cpp new file mode 100644 index 00000000000..a3bcfa08596 --- /dev/null +++ b/src/frontends/tensorflow_common/src/op/adjust_contrast.cpp @@ -0,0 +1,49 @@ +// Copyright (C) 2018-2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "common_op_table.hpp" +#include "openvino/op/add.hpp" +#include "openvino/op/constant.hpp" +#include "openvino/op/convert_like.hpp" +#include "openvino/op/multiply.hpp" +#include "openvino/op/reduce_mean.hpp" +#include "openvino/op/subtract.hpp" + +using namespace std; +using namespace ov; +using namespace ov::op; + +namespace ov { +namespace frontend { +namespace tensorflow { +namespace op { + +OutputVector translate_adjust_contrast_op(const NodeContext& node) { + default_op_checks(node, 2, {"AdjustContrastv2"}); + auto images = node.get_input(0); + auto contrast_factor = node.get_input(1); + auto node_name = node.get_name(); + + // compute mean per channel for each image + // it will reduce spatial dimensions of images in a format [batch, height, width, channel] + auto reduce_axes = make_shared(element::i32, Shape{2}, vector{-3, -2}); + auto means = make_shared(images, reduce_axes, true); + + // cast contrast_factor since its type can be different + contrast_factor = make_shared(contrast_factor, images); + + // adjust contrast by a formula: (images - means) * contrast_factor + means + auto adjust_contrast = make_shared(images, means)->output(0); + adjust_contrast = make_shared(adjust_contrast, contrast_factor); + adjust_contrast = make_shared(adjust_contrast, means); + + set_node_name(node_name, adjust_contrast.get_node_shared_ptr()); + + return {adjust_contrast}; +} + +} // namespace op +} // namespace tensorflow +} // namespace frontend +} // namespace ov diff --git a/tests/layer_tests/tensorflow_tests/test_tf_AdjustContrastv2.py b/tests/layer_tests/tensorflow_tests/test_tf_AdjustContrastv2.py new file mode 100644 index 00000000000..88944c50a38 --- /dev/null +++ b/tests/layer_tests/tensorflow_tests/test_tf_AdjustContrastv2.py @@ -0,0 +1,45 @@ +# Copyright (C) 2018-2023 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +import numpy as np +import pytest +import tensorflow as tf +from common.tf_layer_test_class import CommonTFLayerTest + + +class TestAdjustContrastv2(CommonTFLayerTest): + def _prepare_input(self, inputs_info): + assert 'images' in inputs_info + images_shape = inputs_info['images'] + inputs_data = {} + inputs_data['images'] = np.random.rand(*images_shape).astype(self.input_type) + inputs_data['contrast_factor'] = np.random.rand() + return inputs_data + + def create_adjust_contrast_net(self, input_shape, input_type): + self.input_type = input_type + tf.compat.v1.reset_default_graph() + # Create the graph and model + with tf.compat.v1.Session() as sess: + images = tf.compat.v1.placeholder(input_type, input_shape, 'images') + contrast_factor = tf.compat.v1.placeholder(input_type, [], 'contrast_factor') + tf.raw_ops.AdjustContrastv2(images=images, contrast_factor=contrast_factor) + tf.compat.v1.global_variables_initializer() + tf_net = sess.graph_def + + return tf_net, None + + test_data_basic = [ + dict(input_shape=[10, 20, 3], input_type=np.float32), + dict(input_shape=[5, 25, 15, 2], input_type=np.float32), + dict(input_shape=[3, 4, 8, 10, 4], input_type=np.float32), + ] + + @pytest.mark.parametrize("params", test_data_basic) + @pytest.mark.precommit_tf_fe + @pytest.mark.nightly + def test_adjust_contrast_basic(self, params, ie_device, precision, ir_version, temp_dir, + use_new_frontend, use_old_api): + self._test(*self.create_adjust_contrast_net(**params), + ie_device, precision, ir_version, temp_dir=temp_dir, + use_new_frontend=use_new_frontend, use_old_api=use_old_api)