diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index f20f56547b..742ea7c8a2 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -140,9 +140,10 @@ Mat getMatFromTensor(opencv_onnx::TensorProto& tensor_proto) return blob; } -void runLayer(Ptr layer, const std::vector& inputs, +void runLayer(LayerParams& params, const std::vector& inputs, std::vector& outputs) { + Ptr layer = LayerFactory::createLayerInstance(params.type, params); std::vector inpShapes(inputs.size()); int ddepth = CV_32F; for (size_t i = 0; i < inputs.size(); ++i) @@ -669,14 +670,15 @@ void ONNXImporter::populateNet(Net dstNet) Mat blob = getBlob(node_proto, constBlobs, 1); CV_Assert(blob.type() == CV_32SC1); - if (layer_id.find(node_proto.input(0)) == layer_id.end()) { - Mat input = getBlob(node_proto, constBlobs, 0); - Mat out = input.reshape(0, static_cast >(blob)); - constBlobs.insert(std::make_pair(layerParams.name, out)); - continue; - } layerParams.set("dim", DictValue::arrayInt( blob.ptr(), blob.total() )); + + 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])); + continue; + } } else { DictValue shape = layerParams.get("shape"); @@ -749,8 +751,7 @@ void ONNXImporter::populateNet(Net dstNet) { inputs[i] = getBlob(node_proto, constBlobs, i); } - Ptr concat = ConcatLayer::create(layerParams); - runLayer(concat, inputs, concatenated); + runLayer(layerParams, inputs, concatenated); CV_Assert(concatenated.size() == 1); constBlobs.insert(std::make_pair(layerParams.name, concatenated[0]));