1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-31 00:03:03 +04:00

Fix multiple inputs models from Caffe.

Fixed Concat optimization.
This commit is contained in:
Dmitry Kurtaev
2017-11-02 16:21:06 +03:00
parent bc348eb8ab
commit 20a2dc6ac5
4 changed files with 97 additions and 4 deletions
+6 -2
View File
@@ -318,8 +318,12 @@ public:
if (type == "Input")
{
addedBlobs.push_back(BlobNote(name, 0, netInputs.size()));
netInputs.push_back(name);
for (int outNum = 0; outNum < layer.top_size(); outNum++)
{
addOutput(layer, 0, outNum);
addedBlobs.back().outNum = netInputs.size();
netInputs.push_back(addedBlobs.back().name);
}
continue;
}
+22 -2
View File
@@ -275,6 +275,16 @@ struct DataLayer : public Layer
outNames.assign(names.begin(), names.end());
}
bool getMemoryShapes(const std::vector<MatShape> &inputs,
const int requiredOutputs,
std::vector<MatShape> &outputs,
std::vector<MatShape> &internals) const
{
CV_Assert(inputs.size() == requiredOutputs);
outputs.assign(inputs.begin(), inputs.end());
return false;
}
private:
std::vector<String> outNames;
};
@@ -1184,7 +1194,7 @@ struct Net::Impl
layers[ld.inputBlobsId[i].lid].getLayerInstance()->name.c_str(),
inp_i_data->getLayerInstance()->name.c_str()));
if(inp_i_data->skipFlags[DNN_BACKEND_DEFAULT])
if(inp_i_data->skipFlags[DNN_BACKEND_DEFAULT] || inp_i_data->consumers.size() != 1)
break;
realinputs[i] = pin;
}
@@ -1206,6 +1216,14 @@ struct Net::Impl
Mat& curr_output = inp_i_data->outputBlobs[pin.oid];
CV_Assert(output_slice.isContinuous() && output_slice.size == curr_output.size);
curr_output = output_slice;
pin = ld.inputBlobsId[i];
inp_i_data = &layers[pin.lid];
for (int j = 0; j < inp_i_data->consumers.size(); ++j)
{
LayerPin consumer = inp_i_data->consumers[j];
layers[consumer.lid].inputBlobs[consumer.oid] = &curr_output;
}
}
ld.skipFlags[DNN_BACKEND_DEFAULT] = true;
printf_(("\toptimized out Concat layer %s\n", concatLayer->name.c_str()));
@@ -1235,7 +1253,9 @@ struct Net::Impl
blobManager.reset();
backendWrappers.clear();
blobManager.addReference(LayerPin(0, 0));
// Fake references to input blobs.
for (int i = 0; i < layers[0].outputBlobs.size(); ++i)
blobManager.addReference(LayerPin(0, i));
for (it = layers.begin(); it != layers.end(); ++it)
{
const LayerData& ld = it->second;