mirror of
https://github.com/opencv/opencv.git
synced 2025-06-07 09:25:45 +08:00
use OutputArrayOfArrays in net forward interface
It allows umat buffers used in net forward interface Signed-off-by: Li Peng <peng.li@intel.com>
This commit is contained in:
parent
04edc8fe3a
commit
636d6368ee
@ -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<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.
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user