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/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 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/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( 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/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index adabeca25b..7766463edf 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -3542,6 +3542,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 5066fb1b89..8a7eebbe22 100644 --- a/modules/core/include/opencv2/core/mat.inl.hpp +++ b/modules/core/include/opencv2/core/mat.inl.hpp @@ -144,9 +144,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); } @@ -4000,6 +3997,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:: diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index 5ee56c94dc..92c6fb2eed 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -1959,6 +1959,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 }; diff --git a/modules/dnn/src/layers/permute_layer.cpp b/modules/dnn/src/layers/permute_layer.cpp index eac279f06d..943e347ff6 100644 --- a/modules/dnn/src/layers/permute_layer.cpp +++ b/modules/dnn/src/layers/permute_layer.cpp @@ -352,7 +352,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.cpp b/modules/dnn/src/onnx/onnx_graph_simplifier.cpp index 275c82738b..d5f2443f22 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_graph_simplifier.hpp b/modules/dnn/src/onnx/onnx_graph_simplifier.hpp index 714df587ee..836b8ed4b7 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 f1ae16ed8b..04c3a2f75f 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; } } @@ -1415,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 6cab54b9a0..df38b23140 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -465,6 +465,7 @@ TEST_P(Test_ONNX_layers, ReduceL2) { testONNXModels("reduceL2"); testONNXModels("reduceL2_subgraph"); + testONNXModels("reduceL2_subgraph_2"); } TEST_P(Test_ONNX_layers, Split) @@ -515,6 +516,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 diff --git a/modules/features2d/src/mser.cpp b/modules/features2d/src/mser.cpp old mode 100755 new mode 100644 diff --git a/modules/imgcodecs/src/grfmt_pxm.cpp b/modules/imgcodecs/src/grfmt_pxm.cpp index 055198ced3..c18ac7a1e2 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) { 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_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); } //////////////////////////////////////////////////////// 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