diff --git a/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp b/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp index 99b3d7ac2f..ef9e68a873 100644 --- a/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp +++ b/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp @@ -725,6 +725,21 @@ private: bool negativeScales; }; +class ClipByValueSubgraph : public TFSubgraph +{ +public: + ClipByValueSubgraph() + { + int input = addNodeToMatch(""); + int maxValue = addNodeToMatch("Const"); + int minimum = addNodeToMatch("Minimum", input, maxValue); + int minValue = addNodeToMatch("Const"); + addNodeToMatch("Maximum", minimum, minValue); + + setFusedNode("ClipByValue", input, minValue, maxValue); + } +}; + void simplifySubgraphs(tensorflow::GraphDef& net) { std::vector > subgraphs; @@ -749,6 +764,7 @@ void simplifySubgraphs(tensorflow::GraphDef& net) subgraphs.push_back(Ptr(new PReLUSubgraph(false))); subgraphs.push_back(Ptr(new FlattenProdSubgraph())); subgraphs.push_back(Ptr(new ResizeBilinearSubgraphDown())); + subgraphs.push_back(Ptr(new ClipByValueSubgraph())); for (int i = 0; i < net.node_size(); ++i) { diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index b20b2a58ff..fd5da62a93 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -977,6 +977,11 @@ TEST_P(Test_TensorFlow_layers, tf2_dense) runTensorFlowNet("tf2_dense"); } +TEST_P(Test_TensorFlow_layers, clip_by_value) +{ + runTensorFlowNet("clip_by_value"); +} + TEST_P(Test_TensorFlow_layers, tf2_prelu) { if (backend == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019)