From: Li Peng Date: Thu, 16 Nov 2017 03:20:08 +0000 (+0800) Subject: use OutputArrayOfArrays in net forward interface X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~376^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=636d6368ee254708dd0f1ec00b84c2173862d8fd;p=platform%2Fupstream%2Fopencv.git use OutputArrayOfArrays in net forward interface It allows umat buffers used in net forward interface Signed-off-by: Li Peng --- diff --git a/modules/dnn/include/opencv2/dnn/dnn.hpp b/modules/dnn/include/opencv2/dnn/dnn.hpp index a30171d..d0d5980 100644 --- a/modules/dnn/include/opencv2/dnn/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn/dnn.hpp @@ -410,13 +410,13 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN * @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& 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& outputBlobs, + CV_WRAP void forward(OutputArrayOfArrays outputBlobs, const std::vector& outBlobNames); /** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames. diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 24f29a0..8e4ecb7 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -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& outputBlobs, const String& outputName) +void Net::forward(OutputArrayOfArrays outputBlobs, const String& outputName) { CV_TRACE_FUNCTION(); @@ -1658,16 +1683,40 @@ void Net::forward(std::vector& 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 & outputvec = *(std::vector *)outputBlobs.getObj(); + outputvec = ld.outputBlobs; + } + else if (outputBlobs.isUMatVector()) + { + if (ld.umat_outputBlobs.size() > 0) + { + std::vector & outputvec = *(std::vector *)outputBlobs.getObj(); + outputvec = ld.umat_outputBlobs; + } } - - outputBlobs = ld.outputBlobs; } -void Net::forward(std::vector& outputBlobs, +void Net::forward(OutputArrayOfArrays outputBlobs, const std::vector& outBlobNames) { CV_TRACE_FUNCTION(); @@ -1675,7 +1724,7 @@ void Net::forward(std::vector& outputBlobs, std::vector 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& outputBlobs, impl->forwardToLayer(impl->getLayerData(out.lid)); - outputBlobs.clear(); + std::vector 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 & outputvec = *(std::vector *)outputBlobs.getObj(); + outputvec = matvec; } void Net::forward(std::vector >& outputBlobs,