From 936428cb3b7f918082bf1923a1a6eccf279b2020 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 21 Feb 2020 20:30:18 +0000 Subject: [PATCH 01/10] core(MatExpr) fetch result before InputArray wrap - avoid multiple expression evaluations - avoid issues with reduced support of InputArray::EXPR --- modules/core/include/opencv2/core/mat.hpp | 2 ++ modules/core/include/opencv2/core/mat.inl.hpp | 6 ++-- modules/core/src/matrix_expressions.cpp | 33 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index fe16ee78ee..4007031b2f 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -3580,6 +3580,8 @@ public: Mat cross(const Mat& m) const; double dot(const Mat& m) const; + void swap(MatExpr& b); + const MatOp* op; int flags; diff --git a/modules/core/include/opencv2/core/mat.inl.hpp b/modules/core/include/opencv2/core/mat.inl.hpp index 55b4e625be..9b7df87d8b 100644 --- a/modules/core/include/opencv2/core/mat.inl.hpp +++ b/modules/core/include/opencv2/core/mat.inl.hpp @@ -150,9 +150,6 @@ _InputArray::_InputArray(const Mat_<_Tp>& m) inline _InputArray::_InputArray(const double& val) { init(FIXED_TYPE + FIXED_SIZE + MATX + CV_64F + ACCESS_READ, &val, Size(1,1)); } -inline _InputArray::_InputArray(const MatExpr& expr) -{ init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr); } - inline _InputArray::_InputArray(const cuda::GpuMat& d_mat) { init(CUDA_GPU_MAT + ACCESS_READ, &d_mat); } @@ -4054,6 +4051,9 @@ inline void UMatData::markDeviceCopyObsolete(bool flag) //! @endcond +static inline +void swap(MatExpr& a, MatExpr& b) { a.swap(b); } + } //cv #ifdef _MSC_VER diff --git a/modules/core/src/matrix_expressions.cpp b/modules/core/src/matrix_expressions.cpp index 57beb68e71..d4f8b743cf 100644 --- a/modules/core/src/matrix_expressions.cpp +++ b/modules/core/src/matrix_expressions.cpp @@ -1821,4 +1821,37 @@ MatExpr Mat::eye(Size size, int type) return e; } +void MatExpr::swap(MatExpr& other) +{ + using std::swap; + + swap(op, other.op); + swap(flags, other.flags); + + swap(a, other.a); + swap(b, other.b); + swap(c, other.c); + + swap(alpha, other.alpha); + swap(beta, other.beta); + + swap(s, other.s); +} + +_InputArray::_InputArray(const MatExpr& expr) +{ +#if 1 + if (!isIdentity(expr)) + { + Mat result = expr; // TODO improve through refcount == 1 of expr.a (inplace operation is possible - except gemm?) + MatExpr result_expr(result); + swap(const_cast(expr), result_expr); + } + CV_Assert(isIdentity(expr)); + init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_READ, &expr.a); +#else + init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr); +#endif +} + } // cv:: From 4e75f31c559c4bf1f50a66a99fccbfd69f5fe67c Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Fri, 10 Apr 2020 06:15:16 +0900 Subject: [PATCH 02/10] fix test failure on Jetson Nano/TX1/TX2 --- modules/photo/test/test_denoising.cuda.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/photo/test/test_denoising.cuda.cpp b/modules/photo/test/test_denoising.cuda.cpp index 066805de93..c434274796 100644 --- a/modules/photo/test/test_denoising.cuda.cpp +++ b/modules/photo/test/test_denoising.cuda.cpp @@ -82,7 +82,7 @@ TEST(CUDA_BruteForceNonLocalMeans, Regression) cv::resize(gray_gold, gray_gold, cv::Size(256, 256)); EXPECT_MAT_NEAR(bgr_gold, dbgr, 1); - EXPECT_MAT_NEAR(gray_gold, dgray, 1e-4); + EXPECT_MAT_NEAR(gray_gold, dgray, 1); } //////////////////////////////////////////////////////// From d7abb641ca06af6f30c9fd85710082ea60335dcb Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sat, 7 Mar 2020 17:16:06 +0000 Subject: [PATCH 03/10] core(test): add InputArray(MatExpr) fetch test --- modules/core/test/test_mat.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index efb433dc79..58eafd0748 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -1969,6 +1969,21 @@ TEST(Core_InputArray, support_CustomType) } } + +TEST(Core_InputArray, fetch_MatExpr) +{ + Mat a(Size(10, 5), CV_32FC1, 5); + Mat b(Size(10, 5), CV_32FC1, 2); + MatExpr expr = a * b.t(); // gemm expression + Mat dst; + cv::add(expr, Scalar(1), dst); // invoke gemm() here + void* expr_data = expr.a.data; + Mat result = expr; // should not call gemm() here again + EXPECT_EQ(expr_data, result.data); // expr data is reused + EXPECT_EQ(dst.size(), result.size()); +} + + TEST(Core_Vectors, issue_13078) { float floats_[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; From 5c7c80dd27abb24051097653823f7b8f22d8ac33 Mon Sep 17 00:00:00 2001 From: Xiping Yan Date: Fri, 10 Apr 2020 20:23:13 +0800 Subject: [PATCH 04/10] Merge pull request #17028 from xipingyan:patch-1 * Update OpenCVFindVA_INTEL.cmake When set env VA_INTEL_IOCL_ROOT, "if($ENV{VA_INTEL_IOCL_ROOT})" don't work. My modification as follow. - if($ENV{VA_INTEL_IOCL_ROOT}) + if(DEFINED ENV{VA_INTEL_IOCL_ROOT}) Refer: https://cmake.org/cmake/help/latest/variable/ENV.html * based on merge comment, update code --- cmake/OpenCVFindVA_INTEL.cmake | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cmake/OpenCVFindVA_INTEL.cmake b/cmake/OpenCVFindVA_INTEL.cmake index 63d0f15a36..fcee37eb89 100644 --- a/cmake/OpenCVFindVA_INTEL.cmake +++ b/cmake/OpenCVFindVA_INTEL.cmake @@ -5,10 +5,9 @@ # VA_INTEL_IOCL_ROOT - root of Intel OCL installation if(UNIX AND NOT ANDROID) - if($ENV{VA_INTEL_IOCL_ROOT}) - set(VA_INTEL_IOCL_ROOT $ENV{VA_INTEL_IOCL_ROOT}) - else() - set(VA_INTEL_IOCL_ROOT "/opt/intel/opencl") + ocv_check_environment_variables(VA_INTEL_IOCL_ROOT) + if(NOT DEFINED VA_INTEL_IOCL_ROOT) + set(VA_INTEL_IOCL_ROOT "/opt/intel/opencl") endif() find_path( From b77fe9d624ef36023371be4d93c168aa5c18d766 Mon Sep 17 00:00:00 2001 From: Conrad Poelman Date: Thu, 9 Apr 2020 05:19:23 -0400 Subject: [PATCH 05/10] Remove std::binary_function as it's invalid C++ std::binary_function was deprecated with C++11 and removed in C++17. It provided just two typedefs which in this case were unused. --- 3rdparty/openexr/IlmImf/ImfAttribute.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/openexr/IlmImf/ImfAttribute.cpp b/3rdparty/openexr/IlmImf/ImfAttribute.cpp index 7ac146e015..02738c2679 100644 --- a/3rdparty/openexr/IlmImf/ImfAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfAttribute.cpp @@ -63,7 +63,7 @@ Attribute::~Attribute () {} namespace { -struct NameCompare: std::binary_function +struct NameCompare { bool operator () (const char *x, const char *y) const From bef6b6282ce91f7dbec25142b76fa4dfdbb958c0 Mon Sep 17 00:00:00 2001 From: AshihsKrShrivastava Date: Sun, 5 Apr 2020 11:02:12 +0530 Subject: [PATCH 06/10] ReflecitonPad2d and ZeroPad2d Subgraph fusion added --- modules/dnn/src/layers/permute_layer.cpp | 2 +- .../dnn/src/onnx/onnx_graph_simplifier.hpp | 6 +- modules/dnn/src/onnx/onnx_importer.cpp | 84 ++++++++++++++----- modules/dnn/test/test_onnx_importer.cpp | 6 ++ 4 files changed, 72 insertions(+), 26 deletions(-) diff --git a/modules/dnn/src/layers/permute_layer.cpp b/modules/dnn/src/layers/permute_layer.cpp index 1931a01b5f..d8e5f66678 100644 --- a/modules/dnn/src/layers/permute_layer.cpp +++ b/modules/dnn/src/layers/permute_layer.cpp @@ -342,7 +342,7 @@ public: CV_Assert(out.dims == numAxes && out.size == outputs[0].size); CV_Assert(inp.isContinuous() && out.isContinuous()); - CV_Assert(inp.type() == CV_32F && out.type() == CV_32F); + // CV_Assert(inp.type() == CV_32F && out.type() == CV_32F); if( numAxes == 4 ) { diff --git a/modules/dnn/src/onnx/onnx_graph_simplifier.hpp b/modules/dnn/src/onnx/onnx_graph_simplifier.hpp index 34924164e5..b4497adb75 100644 --- a/modules/dnn/src/onnx/onnx_graph_simplifier.hpp +++ b/modules/dnn/src/onnx/onnx_graph_simplifier.hpp @@ -27,10 +27,8 @@ void simplifySubgraphs(opencv_onnx::GraphProto& net); template void convertInt64ToInt32(const T1& src, T2& dst, int size) { - for (int i = 0; i < size; i++) { - if (src[i] < std::numeric_limits::min() || src[i] > std::numeric_limits::max()) { - CV_Error(Error::StsOutOfRange, "Input is out of OpenCV 32S range"); - } + for (int i = 0; i < size; i++) + { dst[i] = saturate_cast(src[i]); } } diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index 1beea181f2..9c60dcaae9 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -39,7 +39,7 @@ class ONNXImporter struct LayerInfo { int layerId; int outputId; - LayerInfo(int _layerId, int _outputId) : layerId(_layerId), outputId(_outputId) {} + LayerInfo(int _layerId = 0, int _outputId = 0) : layerId(_layerId), outputId(_outputId) {} }; std::map getGraphTensors( @@ -300,6 +300,15 @@ void ONNXImporter::addLayer(Net& dstNet, LayerParams& layerParams, } } +static void addConstant(const std::string& name, + const Mat& blob, + std::map& constBlobs, + std::map& outShapes) +{ + constBlobs.insert(std::make_pair(name, blob)); + outShapes.insert(std::make_pair(name, shape(blob))); +} + void ONNXImporter::populateNet(Net dstNet) { CV_Assert(model_proto.has_graph()); @@ -533,6 +542,23 @@ void ONNXImporter::populateNet(Net dstNet) if (inp_size == 5) { CV_Assert(constBlobs.find(node_proto.input(4)) != constBlobs.end()); Mat step_blob = getBlob(node_proto, constBlobs, 4); + + // Very strange application for Slice op with tensor reversing. + // We just workaround it for 2d constants. + if (constBlobs.find(node_proto.input(0)) != constBlobs.end() && + axis == 0 && + start_blob.at(0) == -1 && step_blob.at(0) == -1 && + end_blob.at(0) == std::numeric_limits::min()) + { + Mat inp = getBlob(node_proto, constBlobs, 0); + if (inp.dims == 2) + { + Mat flipped; + flip(inp, flipped, 0); + addConstant(layerParams.name, flipped, constBlobs, outShapes); + continue; + } + } CV_CheckEQ(countNonZero(step_blob != 1), 0, "Slice layer only supports steps = 1"); } } @@ -547,8 +573,7 @@ void ONNXImporter::populateNet(Net dstNet) inputs.push_back(inp); runLayer(layerParams, inputs, sliced); CV_Assert(sliced.size() == 1); - constBlobs.insert(std::make_pair(layerParams.name, sliced[0])); - outShapes[layerParams.name] = shape(sliced[0]); + addConstant(layerParams.name, sliced[0], constBlobs, outShapes); continue; } } @@ -585,7 +610,7 @@ void ONNXImporter::populateNet(Net dstNet) Mat blob_1 = getBlob(node_proto, constBlobs, 1); CV_Assert(blob_0.size == blob_1.size); Mat output = isSub ? (blob_0 - blob_1) : (blob_0 + blob_1); - constBlobs.insert(std::make_pair(layerParams.name, output)); + addConstant(layerParams.name, output, constBlobs, outShapes); continue; } else if (is_const_0 || is_const_1) @@ -670,7 +695,7 @@ void ONNXImporter::populateNet(Net dstNet) { CV_Assert(node_proto.input_size() == 0); CV_Assert(layerParams.blobs.size() == 1); - constBlobs.insert(std::make_pair(layerParams.name, layerParams.blobs[0])); + addConstant(layerParams.name, layerParams.blobs[0], constBlobs, outShapes); continue; } else if (layer_type == "LSTM") @@ -965,7 +990,7 @@ void ONNXImporter::populateNet(Net dstNet) out = out.reshape(1, inp0.dims, inp0.size); out.dims = inp0.dims; // to workaround dims == 1 - constBlobs.insert(std::make_pair(layerParams.name, out)); + addConstant(layerParams.name, out, constBlobs, outShapes); continue; } } @@ -1033,7 +1058,7 @@ void ONNXImporter::populateNet(Net dstNet) std::vector inputs(1, getBlob(node_proto, constBlobs, 0)), transposed; runLayer(layerParams, inputs, transposed); CV_Assert(transposed.size() == 1); - constBlobs.insert(std::make_pair(layerParams.name, transposed[0])); + addConstant(layerParams.name, transposed[0], constBlobs, outShapes); continue; } } @@ -1069,8 +1094,7 @@ void ONNXImporter::populateNet(Net dstNet) Mat inp = getBlob(node_proto, constBlobs, 0); Mat out = inp.reshape(1, outShape); out.dims = outShape.size(); // to workaround dims == 1 - constBlobs.insert(std::make_pair(layerParams.name, out)); - outShapes[layerParams.name] = shape(out); + addConstant(layerParams.name, out, constBlobs, outShapes); continue; } } @@ -1085,7 +1109,7 @@ void ONNXImporter::populateNet(Net dstNet) std::vector out_size(&input.size[0], &input.size[0] + axis); out_size.push_back(input.total(axis)); Mat output = input.reshape(1, out_size); - constBlobs.insert(std::make_pair(layerParams.name, output)); + addConstant(layerParams.name, output, constBlobs, outShapes); continue; } } @@ -1108,7 +1132,7 @@ void ONNXImporter::populateNet(Net dstNet) } Mat out = input.reshape(0, dims); - constBlobs.insert(std::make_pair(layerParams.name, out)); + addConstant(layerParams.name, out, constBlobs, outShapes); continue; } @@ -1210,7 +1234,7 @@ void ONNXImporter::populateNet(Net dstNet) if (layer_id.find(node_proto.input(0)) == layer_id.end()) { std::vector inputs(1, getBlob(node_proto, constBlobs, 0)), outputs; runLayer(layerParams, inputs, outputs); - constBlobs.insert(std::make_pair(layerParams.name, outputs[0])); + addConstant(layerParams.name, outputs[0], constBlobs, outShapes); continue; } } @@ -1224,7 +1248,7 @@ void ONNXImporter::populateNet(Net dstNet) if (layer_id.find(node_proto.input(0)) == layer_id.end()) { Mat input = getBlob(node_proto, constBlobs, 0); Mat out = input.reshape(0, dim); - constBlobs.insert(std::make_pair(layerParams.name, out)); + addConstant(layerParams.name, out, constBlobs, outShapes); continue; } replaceLayerParam(layerParams, "shape", "dim"); @@ -1233,6 +1257,21 @@ void ONNXImporter::populateNet(Net dstNet) else if (layer_type == "Pad") { layerParams.type = "Padding"; + replaceLayerParam(layerParams, "mode", "type"); + if (node_proto.input_size() == 3 || node_proto.input_size() == 2) + { + // Paddings are in order begin0, begin1, .. beginN, end0, end1, ..., endN. + // We need to shuffle it to begin0, end0, begin1, end1, ... + Mat paddings = getBlob(node_proto, constBlobs, 1).reshape(1, 2); + paddings = paddings.t(); + layerParams.set("paddings", DictValue::arrayInt(paddings.ptr(), paddings.total())); + + if (node_proto.input_size() == 3) + { + Mat value = getBlob(node_proto, constBlobs, 2); + layerParams.set("value", value.at(0)); + } + } } else if (layer_type == "Shape") { @@ -1246,7 +1285,7 @@ void ONNXImporter::populateNet(Net dstNet) shapeMat.at(j) = inpShape[j]; shapeMat.dims = 1; - constBlobs.insert(std::make_pair(layerParams.name, shapeMat)); + addConstant(layerParams.name, shapeMat, constBlobs, outShapes); continue; } else if (layer_type == "Cast") @@ -1268,7 +1307,7 @@ void ONNXImporter::populateNet(Net dstNet) default: type = blob.type(); } blob.convertTo(blob, type); - constBlobs.insert(std::make_pair(layerParams.name, blob)); + addConstant(layerParams.name, blob, constBlobs, outShapes); continue; } else @@ -1276,11 +1315,15 @@ void ONNXImporter::populateNet(Net dstNet) } else if (layer_type == "ConstantOfShape" || layer_type == "ConstantFill") { + int depth = CV_32F; float fill_value; if (!layerParams.blobs.empty()) { CV_Assert(!layerParams.has("value")); - fill_value = layerParams.blobs[0].at(0, 0); + depth = layerParams.blobs[0].depth(); + Mat floats; + layerParams.blobs[0].convertTo(floats, CV_32F); + fill_value = floats.at(0, 0); } else fill_value = layerParams.get("value", 0); @@ -1288,9 +1331,8 @@ void ONNXImporter::populateNet(Net dstNet) MatShape inpShape = getBlob(node_proto, constBlobs, 0); for (int i = 0; i < inpShape.size(); i++) CV_CheckGT(inpShape[i], 0, ""); - Mat tensor(inpShape.size(), &inpShape[0], CV_32F, Scalar(fill_value)); - constBlobs.insert(std::make_pair(layerParams.name, tensor)); - outShapes[node_proto.output(0)] = shape(tensor); + Mat tensor(inpShape.size(), &inpShape[0], depth, Scalar(fill_value)); + addConstant(layerParams.name, tensor, constBlobs, outShapes); continue; } else if (layer_type == "Gather") @@ -1320,7 +1362,7 @@ void ONNXImporter::populateNet(Net dstNet) out = input.reshape(1, 1).colRange(index, index + 1); out.dims = dims; } - constBlobs.insert(std::make_pair(layerParams.name, out)); + addConstant(layerParams.name, out, constBlobs, outShapes); continue; } else if (layer_type == "Concat") @@ -1345,7 +1387,7 @@ void ONNXImporter::populateNet(Net dstNet) runLayer(layerParams, inputs, concatenated); CV_Assert(concatenated.size() == 1); - constBlobs.insert(std::make_pair(layerParams.name, concatenated[0])); + addConstant(layerParams.name, concatenated[0], constBlobs, outShapes); continue; } } diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 9743f5d2a1..6f36f8d3d1 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -490,6 +490,12 @@ TEST_P(Test_ONNX_layers, LSTM_bidirectional) testONNXModels("lstm_bidirectional", npy, 0, 0, false, false); } +TEST_P(Test_ONNX_layers, Pad2d_Unfused) +{ + testONNXModels("ReflectionPad2d"); + testONNXModels("ZeroPad2d"); +} + INSTANTIATE_TEST_CASE_P(/*nothing*/, Test_ONNX_layers, dnnBackendsAndTargets()); class Test_ONNX_nets : public Test_ONNX_layers From b11a3a08203b386111e03d29f47f9e3d307910b9 Mon Sep 17 00:00:00 2001 From: tpoisonooo Date: Tue, 7 Apr 2020 17:01:45 +0800 Subject: [PATCH 07/10] Update grfmt_pxm.cpp remove comment in .ppm --- modules/imgcodecs/src/grfmt_pxm.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/imgcodecs/src/grfmt_pxm.cpp b/modules/imgcodecs/src/grfmt_pxm.cpp index c10f6fc2ac..61252a9fee 100644 --- a/modules/imgcodecs/src/grfmt_pxm.cpp +++ b/modules/imgcodecs/src/grfmt_pxm.cpp @@ -466,11 +466,9 @@ bool PxMEncoder::write(const Mat& img, const std::vector& params) // write header; const int code = ((mode == PXM_TYPE_PBM) ? 1 : (mode == PXM_TYPE_PGM) ? 2 : 3) + (isBinary ? 3 : 0); - const char* comment = "# Generated by OpenCV " CV_VERSION "\n"; - int header_sz = sprintf(buffer, "P%c\n%s%d %d\n", - (char)('0' + code), comment, - width, height); + int header_sz = sprintf(buffer, "P%c\n%d %d\n", + (char)('0' + code), width, height); CV_Assert(header_sz > 0); if (mode != PXM_TYPE_PBM) { From 1eb63cfc42a072f4ff8852b6b7a0d7819015005b Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Sun, 12 Apr 2020 23:58:53 +0900 Subject: [PATCH 08/10] fix test failure on Jetson TX1/TX2/Nano --- modules/cudaimgproc/test/test_color.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/cudaimgproc/test/test_color.cpp b/modules/cudaimgproc/test/test_color.cpp index 3016bfa622..97be36a121 100644 --- a/modules/cudaimgproc/test/test_color.cpp +++ b/modules/cudaimgproc/test/test_color.cpp @@ -1666,7 +1666,7 @@ CUDA_TEST_P(CvtColor, BGRA2Lab4) cv::split(h_dst, channels); cv::merge(channels, 3, h_dst); - EXPECT_MAT_NEAR(dst_gold, h_dst, depth == CV_8U ? 1 : 6e-1); + EXPECT_MAT_NEAR(dst_gold, h_dst, depth == CV_8U ? 1 : 7e-1); } CUDA_TEST_P(CvtColor, LBGR2Lab) @@ -1682,7 +1682,7 @@ CUDA_TEST_P(CvtColor, LBGR2Lab) cv::Mat dst_gold; cv::cvtColor(src, dst_gold, cv::COLOR_LBGR2Lab); - EXPECT_MAT_NEAR(dst_gold, dst, depth == CV_8U ? 1 : 1e-3); + EXPECT_MAT_NEAR(dst_gold, dst, depth == CV_8U ? 1 : 5e-2); } CUDA_TEST_P(CvtColor, LRGB2Lab) @@ -1698,7 +1698,7 @@ CUDA_TEST_P(CvtColor, LRGB2Lab) cv::Mat dst_gold; cv::cvtColor(src, dst_gold, cv::COLOR_LRGB2Lab); - EXPECT_MAT_NEAR(dst_gold, dst, depth == CV_8U ? 1 : 1e-3); + EXPECT_MAT_NEAR(dst_gold, dst, depth == CV_8U ? 1 : 4e-2); } CUDA_TEST_P(CvtColor, LBGRA2Lab4) @@ -1723,7 +1723,7 @@ CUDA_TEST_P(CvtColor, LBGRA2Lab4) cv::split(h_dst, channels); cv::merge(channels, 3, h_dst); - EXPECT_MAT_NEAR(dst_gold, h_dst, depth == CV_8U ? 1 : 1e-3); + EXPECT_MAT_NEAR(dst_gold, h_dst, depth == CV_8U ? 1 : 4e-2); } CUDA_TEST_P(CvtColor, Lab2BGR) From f0ffc524353152ab6ac9bff7bebaffc76b434444 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 13 Apr 2020 04:29:55 +0000 Subject: [PATCH 09/10] fix files permissions --- 3rdparty/libpng/mips/filter_msa_intrinsics.c | 0 3rdparty/protobuf/src/google/protobuf/arena.cc | 0 3rdparty/protobuf/src/google/protobuf/arenastring.h | 0 3rdparty/protobuf/src/google/protobuf/reflection.h | 0 .../protobuf/src/google/protobuf/stubs/common.cc | 0 cmake/checks/cpu_msa.cpp | 0 data/haarcascades/haarcascade_frontalcatface.xml | 0 .../haarcascade_frontalcatface_extended.xml | 0 data/lbpcascades/lbpcascade_profileface.xml | 0 data/lbpcascades/lbpcascade_silverware.xml | 0 data/vec_files/trainingfaces_24-24.vec | Bin .../images/AKAZE_Match_Tutorial_Cover.png | Bin .../anisotropic_image_segmentation.markdown | 0 .../images/gst_coherency.jpg | Bin .../images/gst_input.jpg | Bin .../images/gst_orientation.jpg | Bin .../images/gst_result.jpg | Bin .../motion_deblur_filter/images/black_car.jpg | Bin .../motion_deblur_filter/images/motion_original.jpg | Bin .../motion_deblur_filter/images/motion_psf.png | Bin .../motion_deblur_filter/images/white_car.jpg | Bin .../motion_deblur_filter.markdown | 0 .../out_of_focus_deblur_filter/images/original.jpg | Bin .../out_of_focus_deblur_filter/images/psf.png | Bin .../out_of_focus_deblur_filter/images/recovered.jpg | Bin .../out_of_focus_deblur_filter.markdown | 0 .../images/period_filter.jpg | Bin .../images/period_input.jpg | Bin .../images/period_output.jpg | Bin .../images/period_psd.jpg | Bin .../periodic_noise_removing_filter.markdown | 0 .../images/visual_studio_image_watch.png | Bin .../images/breakpoint.png | Bin .../images/edges_zoom.png | Bin .../images/input_zoom.png | Bin .../images/viewer_context_menu.png | Bin .../images/visual_studio_image_watch.png | Bin .../images/vs_locals.png | Bin .../core/include/opencv2/core/hal/intrin_msa.hpp | 0 modules/core/include/opencv2/core/hal/msa_macros.h | 0 modules/features2d/src/mser.cpp | 0 modules/imgproc/src/opencl/filter2DSmall.cl | 0 modules/imgproc/src/opencl/filterSmall.cl | 0 modules/imgproc/src/sumpixels.dispatch.cpp | 0 modules/photo/test/test_npr.cpp | 0 modules/video/src/bgfg_KNN.cpp | 0 platforms/linux/mips.toolchain.cmake | 0 platforms/linux/mips32r5el-gnu.toolchain.cmake | 0 platforms/linux/mips64r6el-gnu.toolchain.cmake | 0 .../anisotropic_image_segmentation.cpp | 0 .../motion_deblur_filter/motion_deblur_filter.cpp | 0 .../out_of_focus_deblur_filter.cpp | 0 .../periodic_noise_removing_filter.cpp | 0 .../cpp/tutorial_code/features2D/AKAZE_match.cpp | 0 .../features2D/AKAZE_tracking/planar_tracking.cpp | 0 .../panorama_stitching_rotating_camera.cpp | 0 .../feature_description/SURF_matching_Demo.cpp | 0 .../feature_detection/SURF_detection_Demo.cpp | 0 .../SURF_FLANN_matching_Demo.cpp | 0 .../SURF_FLANN_matching_homography_Demo.cpp | 0 samples/data/H1to3p.xml | 0 samples/data/LinuxLogo.jpg | Bin samples/data/WindowsLogo.jpg | Bin samples/data/graf1.png | Bin samples/data/graf3.png | Bin 65 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 3rdparty/libpng/mips/filter_msa_intrinsics.c mode change 100755 => 100644 3rdparty/protobuf/src/google/protobuf/arena.cc mode change 100755 => 100644 3rdparty/protobuf/src/google/protobuf/arenastring.h mode change 100755 => 100644 3rdparty/protobuf/src/google/protobuf/reflection.h mode change 100755 => 100644 3rdparty/protobuf/src/google/protobuf/stubs/common.cc mode change 100755 => 100644 cmake/checks/cpu_msa.cpp mode change 100755 => 100644 data/haarcascades/haarcascade_frontalcatface.xml mode change 100755 => 100644 data/haarcascades/haarcascade_frontalcatface_extended.xml mode change 100755 => 100644 data/lbpcascades/lbpcascade_profileface.xml mode change 100755 => 100644 data/lbpcascades/lbpcascade_silverware.xml mode change 100755 => 100644 data/vec_files/trainingfaces_24-24.vec mode change 100755 => 100644 doc/tutorials/features2d/images/AKAZE_Match_Tutorial_Cover.png mode change 100755 => 100644 doc/tutorials/imgproc/anisotropic_image_segmentation/anisotropic_image_segmentation.markdown mode change 100755 => 100644 doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_coherency.jpg mode change 100755 => 100644 doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_input.jpg mode change 100755 => 100644 doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_orientation.jpg mode change 100755 => 100644 doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_result.jpg mode change 100755 => 100644 doc/tutorials/imgproc/motion_deblur_filter/images/black_car.jpg mode change 100755 => 100644 doc/tutorials/imgproc/motion_deblur_filter/images/motion_original.jpg mode change 100755 => 100644 doc/tutorials/imgproc/motion_deblur_filter/images/motion_psf.png mode change 100755 => 100644 doc/tutorials/imgproc/motion_deblur_filter/images/white_car.jpg mode change 100755 => 100644 doc/tutorials/imgproc/motion_deblur_filter/motion_deblur_filter.markdown mode change 100755 => 100644 doc/tutorials/imgproc/out_of_focus_deblur_filter/images/original.jpg mode change 100755 => 100644 doc/tutorials/imgproc/out_of_focus_deblur_filter/images/psf.png mode change 100755 => 100644 doc/tutorials/imgproc/out_of_focus_deblur_filter/images/recovered.jpg mode change 100755 => 100644 doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown mode change 100755 => 100644 doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_filter.jpg mode change 100755 => 100644 doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_input.jpg mode change 100755 => 100644 doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_output.jpg mode change 100755 => 100644 doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_psd.jpg mode change 100755 => 100644 doc/tutorials/imgproc/periodic_noise_removing_filter/periodic_noise_removing_filter.markdown mode change 100755 => 100644 doc/tutorials/introduction/images/visual_studio_image_watch.png mode change 100755 => 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/breakpoint.png mode change 100755 => 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/edges_zoom.png mode change 100755 => 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/input_zoom.png mode change 100755 => 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer_context_menu.png mode change 100755 => 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/visual_studio_image_watch.png mode change 100755 => 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/vs_locals.png mode change 100755 => 100644 modules/core/include/opencv2/core/hal/intrin_msa.hpp mode change 100755 => 100644 modules/core/include/opencv2/core/hal/msa_macros.h mode change 100755 => 100644 modules/features2d/src/mser.cpp mode change 100755 => 100644 modules/imgproc/src/opencl/filter2DSmall.cl mode change 100755 => 100644 modules/imgproc/src/opencl/filterSmall.cl mode change 100755 => 100644 modules/imgproc/src/sumpixels.dispatch.cpp mode change 100755 => 100644 modules/photo/test/test_npr.cpp mode change 100755 => 100644 modules/video/src/bgfg_KNN.cpp mode change 100755 => 100644 platforms/linux/mips.toolchain.cmake mode change 100755 => 100644 platforms/linux/mips32r5el-gnu.toolchain.cmake mode change 100755 => 100644 platforms/linux/mips64r6el-gnu.toolchain.cmake mode change 100755 => 100644 samples/cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/ImgProc/motion_deblur_filter/motion_deblur_filter.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/ImgProc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/ImgProc/periodic_noise_removing_filter/periodic_noise_removing_filter.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/AKAZE_match.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/AKAZE_tracking/planar_tracking.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/Homography/panorama_stitching_rotating_camera.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/feature_description/SURF_matching_Demo.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/feature_detection/SURF_detection_Demo.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/feature_flann_matcher/SURF_FLANN_matching_Demo.cpp mode change 100755 => 100644 samples/cpp/tutorial_code/features2D/feature_homography/SURF_FLANN_matching_homography_Demo.cpp mode change 100755 => 100644 samples/data/H1to3p.xml mode change 100755 => 100644 samples/data/LinuxLogo.jpg mode change 100755 => 100644 samples/data/WindowsLogo.jpg mode change 100755 => 100644 samples/data/graf1.png mode change 100755 => 100644 samples/data/graf3.png diff --git a/3rdparty/libpng/mips/filter_msa_intrinsics.c b/3rdparty/libpng/mips/filter_msa_intrinsics.c old mode 100755 new mode 100644 diff --git a/3rdparty/protobuf/src/google/protobuf/arena.cc b/3rdparty/protobuf/src/google/protobuf/arena.cc old mode 100755 new mode 100644 diff --git a/3rdparty/protobuf/src/google/protobuf/arenastring.h b/3rdparty/protobuf/src/google/protobuf/arenastring.h old mode 100755 new mode 100644 diff --git a/3rdparty/protobuf/src/google/protobuf/reflection.h b/3rdparty/protobuf/src/google/protobuf/reflection.h old mode 100755 new mode 100644 diff --git a/3rdparty/protobuf/src/google/protobuf/stubs/common.cc b/3rdparty/protobuf/src/google/protobuf/stubs/common.cc old mode 100755 new mode 100644 diff --git a/cmake/checks/cpu_msa.cpp b/cmake/checks/cpu_msa.cpp old mode 100755 new mode 100644 diff --git a/data/haarcascades/haarcascade_frontalcatface.xml b/data/haarcascades/haarcascade_frontalcatface.xml old mode 100755 new mode 100644 diff --git a/data/haarcascades/haarcascade_frontalcatface_extended.xml b/data/haarcascades/haarcascade_frontalcatface_extended.xml old mode 100755 new mode 100644 diff --git a/data/lbpcascades/lbpcascade_profileface.xml b/data/lbpcascades/lbpcascade_profileface.xml old mode 100755 new mode 100644 diff --git a/data/lbpcascades/lbpcascade_silverware.xml b/data/lbpcascades/lbpcascade_silverware.xml old mode 100755 new mode 100644 diff --git a/data/vec_files/trainingfaces_24-24.vec b/data/vec_files/trainingfaces_24-24.vec old mode 100755 new mode 100644 diff --git a/doc/tutorials/features2d/images/AKAZE_Match_Tutorial_Cover.png b/doc/tutorials/features2d/images/AKAZE_Match_Tutorial_Cover.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/anisotropic_image_segmentation/anisotropic_image_segmentation.markdown b/doc/tutorials/imgproc/anisotropic_image_segmentation/anisotropic_image_segmentation.markdown old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_coherency.jpg b/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_coherency.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_input.jpg b/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_input.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_orientation.jpg b/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_orientation.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_result.jpg b/doc/tutorials/imgproc/anisotropic_image_segmentation/images/gst_result.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/motion_deblur_filter/images/black_car.jpg b/doc/tutorials/imgproc/motion_deblur_filter/images/black_car.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/motion_deblur_filter/images/motion_original.jpg b/doc/tutorials/imgproc/motion_deblur_filter/images/motion_original.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/motion_deblur_filter/images/motion_psf.png b/doc/tutorials/imgproc/motion_deblur_filter/images/motion_psf.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/motion_deblur_filter/images/white_car.jpg b/doc/tutorials/imgproc/motion_deblur_filter/images/white_car.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/motion_deblur_filter/motion_deblur_filter.markdown b/doc/tutorials/imgproc/motion_deblur_filter/motion_deblur_filter.markdown old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/out_of_focus_deblur_filter/images/original.jpg b/doc/tutorials/imgproc/out_of_focus_deblur_filter/images/original.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/out_of_focus_deblur_filter/images/psf.png b/doc/tutorials/imgproc/out_of_focus_deblur_filter/images/psf.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/out_of_focus_deblur_filter/images/recovered.jpg b/doc/tutorials/imgproc/out_of_focus_deblur_filter/images/recovered.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown b/doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_filter.jpg b/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_filter.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_input.jpg b/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_input.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_output.jpg b/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_output.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_psd.jpg b/doc/tutorials/imgproc/periodic_noise_removing_filter/images/period_psd.jpg old mode 100755 new mode 100644 diff --git a/doc/tutorials/imgproc/periodic_noise_removing_filter/periodic_noise_removing_filter.markdown b/doc/tutorials/imgproc/periodic_noise_removing_filter/periodic_noise_removing_filter.markdown old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/images/visual_studio_image_watch.png b/doc/tutorials/introduction/images/visual_studio_image_watch.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/breakpoint.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/breakpoint.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/edges_zoom.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/edges_zoom.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/input_zoom.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/input_zoom.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer_context_menu.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer_context_menu.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/visual_studio_image_watch.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/visual_studio_image_watch.png old mode 100755 new mode 100644 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/vs_locals.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/vs_locals.png old mode 100755 new mode 100644 diff --git a/modules/core/include/opencv2/core/hal/intrin_msa.hpp b/modules/core/include/opencv2/core/hal/intrin_msa.hpp old mode 100755 new mode 100644 diff --git a/modules/core/include/opencv2/core/hal/msa_macros.h b/modules/core/include/opencv2/core/hal/msa_macros.h old mode 100755 new mode 100644 diff --git a/modules/features2d/src/mser.cpp b/modules/features2d/src/mser.cpp old mode 100755 new mode 100644 diff --git a/modules/imgproc/src/opencl/filter2DSmall.cl b/modules/imgproc/src/opencl/filter2DSmall.cl old mode 100755 new mode 100644 diff --git a/modules/imgproc/src/opencl/filterSmall.cl b/modules/imgproc/src/opencl/filterSmall.cl old mode 100755 new mode 100644 diff --git a/modules/imgproc/src/sumpixels.dispatch.cpp b/modules/imgproc/src/sumpixels.dispatch.cpp old mode 100755 new mode 100644 diff --git a/modules/photo/test/test_npr.cpp b/modules/photo/test/test_npr.cpp old mode 100755 new mode 100644 diff --git a/modules/video/src/bgfg_KNN.cpp b/modules/video/src/bgfg_KNN.cpp old mode 100755 new mode 100644 diff --git a/platforms/linux/mips.toolchain.cmake b/platforms/linux/mips.toolchain.cmake old mode 100755 new mode 100644 diff --git a/platforms/linux/mips32r5el-gnu.toolchain.cmake b/platforms/linux/mips32r5el-gnu.toolchain.cmake old mode 100755 new mode 100644 diff --git a/platforms/linux/mips64r6el-gnu.toolchain.cmake b/platforms/linux/mips64r6el-gnu.toolchain.cmake old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp b/samples/cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/ImgProc/motion_deblur_filter/motion_deblur_filter.cpp b/samples/cpp/tutorial_code/ImgProc/motion_deblur_filter/motion_deblur_filter.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/ImgProc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.cpp b/samples/cpp/tutorial_code/ImgProc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/ImgProc/periodic_noise_removing_filter/periodic_noise_removing_filter.cpp b/samples/cpp/tutorial_code/ImgProc/periodic_noise_removing_filter/periodic_noise_removing_filter.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/AKAZE_match.cpp b/samples/cpp/tutorial_code/features2D/AKAZE_match.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/AKAZE_tracking/planar_tracking.cpp b/samples/cpp/tutorial_code/features2D/AKAZE_tracking/planar_tracking.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/Homography/panorama_stitching_rotating_camera.cpp b/samples/cpp/tutorial_code/features2D/Homography/panorama_stitching_rotating_camera.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/feature_description/SURF_matching_Demo.cpp b/samples/cpp/tutorial_code/features2D/feature_description/SURF_matching_Demo.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/feature_detection/SURF_detection_Demo.cpp b/samples/cpp/tutorial_code/features2D/feature_detection/SURF_detection_Demo.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/feature_flann_matcher/SURF_FLANN_matching_Demo.cpp b/samples/cpp/tutorial_code/features2D/feature_flann_matcher/SURF_FLANN_matching_Demo.cpp old mode 100755 new mode 100644 diff --git a/samples/cpp/tutorial_code/features2D/feature_homography/SURF_FLANN_matching_homography_Demo.cpp b/samples/cpp/tutorial_code/features2D/feature_homography/SURF_FLANN_matching_homography_Demo.cpp old mode 100755 new mode 100644 diff --git a/samples/data/H1to3p.xml b/samples/data/H1to3p.xml old mode 100755 new mode 100644 diff --git a/samples/data/LinuxLogo.jpg b/samples/data/LinuxLogo.jpg old mode 100755 new mode 100644 diff --git a/samples/data/WindowsLogo.jpg b/samples/data/WindowsLogo.jpg old mode 100755 new mode 100644 diff --git a/samples/data/graf1.png b/samples/data/graf1.png old mode 100755 new mode 100644 diff --git a/samples/data/graf3.png b/samples/data/graf3.png old mode 100755 new mode 100644 From d3f9ad11459bfc63f04246771dfc42f6d275700a Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Sat, 28 Mar 2020 18:53:57 +0300 Subject: [PATCH 10/10] Enable ONNX SSD from https://github.com/amdegroot/ssd.pytorch --- .../dnn/src/onnx/onnx_graph_simplifier.cpp | 54 ++++++++++++++----- modules/dnn/src/onnx/onnx_importer.cpp | 19 +++++++ modules/dnn/test/test_onnx_importer.cpp | 1 + 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/modules/dnn/src/onnx/onnx_graph_simplifier.cpp b/modules/dnn/src/onnx/onnx_graph_simplifier.cpp index ff474224cc..bf992feb2c 100644 --- a/modules/dnn/src/onnx/onnx_graph_simplifier.cpp +++ b/modules/dnn/src/onnx/onnx_graph_simplifier.cpp @@ -154,16 +154,10 @@ private: int axis; }; -class NormalizeSubgraph1 : public Subgraph +class NormalizeSubgraphBase : public Subgraph { public: - NormalizeSubgraph1() : axis(1) - { - input = addNodeToMatch(""); - norm = addNodeToMatch("ReduceL2", input); - addNodeToMatch("Div", input, norm); - setFusedNode("Normalize", input); - } + NormalizeSubgraphBase(int _normNodeOrder = 0) : axis(1), normNodeOrder(_normNodeOrder) {} virtual bool match(const Ptr& net, int nodeId, std::vector& matchedNodesIds, @@ -171,7 +165,7 @@ public: { if (Subgraph::match(net, nodeId, matchedNodesIds, targetNodesIds)) { - Ptr norm = net->getNode(matchedNodesIds[0]); + Ptr norm = net->getNode(matchedNodesIds[normNodeOrder]); opencv_onnx::NodeProto* node = norm.dynamicCast()->node; for (int i = 0; i < node->attribute_size(); i++) @@ -204,20 +198,51 @@ public: } protected: - int input, norm; - int axis; + int axis, normNodeOrder; }; - -class NormalizeSubgraph2 : public NormalizeSubgraph1 +class NormalizeSubgraph1 : public NormalizeSubgraphBase { public: - NormalizeSubgraph2() : NormalizeSubgraph1() + NormalizeSubgraph1() { + int input = addNodeToMatch(""); + int norm = addNodeToMatch("ReduceL2", input); + addNodeToMatch("Div", input, norm); + setFusedNode("Normalize", input); + } +}; + +class NormalizeSubgraph2 : public NormalizeSubgraphBase +{ +public: + NormalizeSubgraph2() + { + int input = addNodeToMatch(""); + int norm = addNodeToMatch("ReduceL2", input); int clip = addNodeToMatch("Clip", norm); int shape = addNodeToMatch("Shape", input); int expand = addNodeToMatch("Expand", clip, shape); addNodeToMatch("Div", input, expand); + setFusedNode("Normalize", input); + } +}; + +class NormalizeSubgraph3 : public NormalizeSubgraphBase +{ +public: + NormalizeSubgraph3() : NormalizeSubgraphBase(1) + { + int input = addNodeToMatch(""); + int power = addNodeToMatch("Constant"); + int squared = addNodeToMatch("Pow", input, power); + int sum = addNodeToMatch("ReduceSum", squared); + int sqrtNode = addNodeToMatch("Sqrt", sum); + int eps = addNodeToMatch("Constant"); + int add = addNodeToMatch("Add", sqrtNode, eps); + + addNodeToMatch("Div", input, add); + setFusedNode("Normalize", input); } }; @@ -368,6 +393,7 @@ void simplifySubgraphs(opencv_onnx::GraphProto& net) subgraphs.push_back(makePtr()); subgraphs.push_back(makePtr()); subgraphs.push_back(makePtr()); + subgraphs.push_back(makePtr()); simplifySubgraphs(Ptr(new ONNXGraphWrapper(net)), subgraphs); } diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index 9c60dcaae9..716c9ad39c 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -1457,6 +1457,25 @@ void ONNXImporter::populateNet(Net dstNet) layerParams.type = "Softmax"; layerParams.set("log_softmax", layer_type == "LogSoftmax"); } + else if (layer_type == "DetectionOutput") + { + CV_CheckEQ(node_proto.input_size(), 3, ""); + if (constBlobs.find(node_proto.input(2)) != constBlobs.end()) + { + Mat priors = getBlob(node_proto, constBlobs, 2); + + LayerParams constParams; + constParams.name = layerParams.name + "/priors"; + constParams.type = "Const"; + constParams.blobs.push_back(priors); + + opencv_onnx::NodeProto priorsProto; + priorsProto.add_output(constParams.name); + addLayer(dstNet, constParams, priorsProto, layer_id, outShapes); + + node_proto.set_input(2, constParams.name); + } + } else { for (int j = 0; j < node_proto.input_size(); j++) { diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 6f36f8d3d1..6e47a86631 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -440,6 +440,7 @@ TEST_P(Test_ONNX_layers, ReduceL2) { testONNXModels("reduceL2"); testONNXModels("reduceL2_subgraph"); + testONNXModels("reduceL2_subgraph_2"); } TEST_P(Test_ONNX_layers, Split)