* @param outputName name for layer which output is needed to get
* @details If @p outputName is empty, runs forward pass for the whole network.
*/
- CV_WRAP void forward(std::vector<Mat>& outputBlobs, const String& outputName = String());
+ CV_WRAP void forward(OutputArrayOfArrays outputBlobs, const String& outputName = String());
/** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames.
* @param outputBlobs contains blobs for first outputs of specified layers.
* @param outBlobNames names for layers which outputs are needed to get
*/
- CV_WRAP void forward(std::vector<Mat>& outputBlobs,
+ CV_WRAP void forward(OutputArrayOfArrays outputBlobs,
const std::vector<String>& outBlobNames);
/** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames.
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();
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)
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();
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();
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);
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,