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:
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user