addLayer(layerParams, node_proto);
}
-void ONNXImporter::parseMatMul(LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto)
+void ONNXImporter::parseMatMul(LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto_)
{
+ opencv_onnx::NodeProto node_proto = node_proto_;
CV_Assert(node_proto.input_size() == 2);
layerParams.type = "InnerProduct";
layerParams.set("bias_term", false);
{
Mat blob = getBlob(node_proto, 1);
secondInpDims = blob.dims;
- layerParams.blobs.push_back(blob.t());
- layerParams.set("num_output", layerParams.blobs[0].size[0]);
+ if (secondInpDims == 2)
+ {
+ layerParams.blobs.push_back(blob.t());
+ layerParams.set("num_output", layerParams.blobs[0].size[0]);
+ }
+ else
+ {
+ LayerParams constParams;
+ constParams.name = layerParams.name + "/const";
+ constParams.type = "Const";
+ constParams.blobs.push_back(blob);
+
+ opencv_onnx::NodeProto tmpProto;
+ tmpProto.add_output(constParams.name);
+ addLayer(constParams, tmpProto);
+
+ node_proto.set_input(1, constParams.name);
+ }
} else {
secondInpDims = outShapes[node_proto.input(1)].size();
}
testONNXModels("matmul_4d");
}
+TEST_P(Test_ONNX_layers, MatMul_init)
+{
+ testONNXModels("matmul_2d_init");
+ testONNXModels("matmul_3d_init");
+ testONNXModels("matmul_4d_init");
+}
+
TEST_P(Test_ONNX_layers, MatMulAdd)
{
#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_EQ(2022010000)