|
|
|
@ -1545,7 +1545,7 @@ struct Net::Impl |
|
|
|
|
CV_Error(Error::StsOutOfRange, "Layer \"" + ld.name + "\" produce only " + toString(ld.outputBlobs.size()) + |
|
|
|
|
" outputs, the #" + toString(pin.oid) + " was requsted"); |
|
|
|
|
} |
|
|
|
|
if (preferableBackend != DNN_TARGET_CPU) |
|
|
|
|
if (preferableBackend != DNN_BACKEND_DEFAULT) |
|
|
|
|
{ |
|
|
|
|
// Transfer data to CPU if it's require.
|
|
|
|
|
ld.outputBlobsWrappers[pin.oid]->copyToHost(); |
|
|
|
@ -1561,10 +1561,35 @@ struct Net::Impl |
|
|
|
|
return ld.outputBlobs[pin.oid]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void getBlob(UMat& umat, const LayerPin& pin) |
|
|
|
|
{ |
|
|
|
|
CV_TRACE_FUNCTION(); |
|
|
|
|
|
|
|
|
|
if (!pin.valid()) |
|
|
|
|
CV_Error(Error::StsObjectNotFound, "Requested blob not found"); |
|
|
|
|
|
|
|
|
|
LayerData &ld = layers[pin.lid]; |
|
|
|
|
if ((size_t)pin.oid >= ld.outputBlobs.size()) |
|
|
|
|
{ |
|
|
|
|
CV_Error(Error::StsOutOfRange, "Layer \"" + ld.name + "\" produce only " + toString(ld.outputBlobs.size()) + |
|
|
|
|
" outputs, the #" + toString(pin.oid) + " was requsted"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (ld.umat_outputBlobs.size() > 0 && !ld.umat_outputBlobs[pin.oid].empty()) |
|
|
|
|
umat = ld.umat_outputBlobs[pin.oid]; |
|
|
|
|
else |
|
|
|
|
umat = UMat(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Mat getBlob(String outputName) |
|
|
|
|
{ |
|
|
|
|
return getBlob(getPinByAlias(outputName)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void getBlob(UMat& umat, String outputName) |
|
|
|
|
{ |
|
|
|
|
getBlob(umat, getPinByAlias(outputName)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Net::Net() : impl(new Net::Impl) |
|
|
|
@ -1642,7 +1667,7 @@ Mat Net::forward(const String& outputName) |
|
|
|
|
return impl->getBlob(layerName); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Net::forward(std::vector<Mat>& outputBlobs, const String& outputName) |
|
|
|
|
void Net::forward(OutputArrayOfArrays outputBlobs, const String& outputName) |
|
|
|
|
{ |
|
|
|
|
CV_TRACE_FUNCTION(); |
|
|
|
|
|
|
|
|
@ -1658,16 +1683,40 @@ void Net::forward(std::vector<Mat>& outputBlobs, const String& outputName) |
|
|
|
|
LayerPin pin = impl->getPinByAlias(layerName); |
|
|
|
|
LayerData &ld = impl->layers[pin.lid]; |
|
|
|
|
|
|
|
|
|
if (ld.umat_outputBlobs.size() > 0) |
|
|
|
|
if (outputBlobs.isUMat()) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < ld.umat_outputBlobs.size(); i++) |
|
|
|
|
ld.umat_outputBlobs[i].copyTo(ld.outputBlobs[i]); |
|
|
|
|
if (ld.umat_outputBlobs.size() > 0) |
|
|
|
|
{ |
|
|
|
|
UMat umat; |
|
|
|
|
impl->getBlob(umat, layerName); |
|
|
|
|
outputBlobs.assign(umat); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (outputBlobs.isMat()) |
|
|
|
|
{ |
|
|
|
|
outputBlobs.assign(impl->getBlob(layerName)); |
|
|
|
|
} |
|
|
|
|
else if (outputBlobs.isMatVector()) |
|
|
|
|
{ |
|
|
|
|
if (ld.umat_outputBlobs.size() > 0) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < ld.umat_outputBlobs.size(); i++) |
|
|
|
|
ld.umat_outputBlobs[i].copyTo(ld.outputBlobs[i]); |
|
|
|
|
} |
|
|
|
|
std::vector<Mat> & outputvec = *(std::vector<Mat> *)outputBlobs.getObj(); |
|
|
|
|
outputvec = ld.outputBlobs; |
|
|
|
|
} |
|
|
|
|
else if (outputBlobs.isUMatVector()) |
|
|
|
|
{ |
|
|
|
|
if (ld.umat_outputBlobs.size() > 0) |
|
|
|
|
{ |
|
|
|
|
std::vector<UMat> & outputvec = *(std::vector<UMat> *)outputBlobs.getObj(); |
|
|
|
|
outputvec = ld.umat_outputBlobs; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
outputBlobs = ld.outputBlobs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Net::forward(std::vector<Mat>& outputBlobs, |
|
|
|
|
void Net::forward(OutputArrayOfArrays outputBlobs, |
|
|
|
|
const std::vector<String>& outBlobNames) |
|
|
|
|
{ |
|
|
|
|
CV_TRACE_FUNCTION(); |
|
|
|
@ -1675,7 +1724,7 @@ void Net::forward(std::vector<Mat>& outputBlobs, |
|
|
|
|
std::vector<LayerPin> pins; |
|
|
|
|
for (int i = 0; i < outBlobNames.size(); i++) |
|
|
|
|
{ |
|
|
|
|
pins.push_back(impl->getPinByAlias(outBlobNames[i])); |
|
|
|
|
pins.push_back(impl->getPinByAlias(outBlobNames[i])); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl->setUpNet(pins); |
|
|
|
@ -1684,11 +1733,14 @@ void Net::forward(std::vector<Mat>& outputBlobs, |
|
|
|
|
|
|
|
|
|
impl->forwardToLayer(impl->getLayerData(out.lid)); |
|
|
|
|
|
|
|
|
|
outputBlobs.clear(); |
|
|
|
|
std::vector<Mat> matvec; |
|
|
|
|
for (int i = 0; i < pins.size(); i++) |
|
|
|
|
{ |
|
|
|
|
outputBlobs.push_back(impl->getBlob(pins[i])); |
|
|
|
|
matvec.push_back(impl->getBlob(pins[i])); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::vector<Mat> & outputvec = *(std::vector<Mat> *)outputBlobs.getObj(); |
|
|
|
|
outputvec = matvec; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Net::forward(std::vector<std::vector<Mat> >& outputBlobs, |
|
|
|
|