Commit 636d6368 authored by Li Peng's avatar Li Peng

use OutputArrayOfArrays in net forward interface

It allows umat buffers used in net forward interface
Signed-off-by: 's avatarLi Peng <peng.li@intel.com>
parent 04edc8fe
...@@ -410,13 +410,13 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN ...@@ -410,13 +410,13 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
* @param outputName name for layer which output is needed to get * @param outputName name for layer which output is needed to get
* @details If @p outputName is empty, runs forward pass for the whole network. * @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. /** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames.
* @param outputBlobs contains blobs for first outputs of specified layers. * @param outputBlobs contains blobs for first outputs of specified layers.
* @param outBlobNames names for layers which outputs are needed to get * @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); const std::vector<String>& outBlobNames);
/** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames. /** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames.
......
...@@ -1545,7 +1545,7 @@ struct Net::Impl ...@@ -1545,7 +1545,7 @@ struct Net::Impl
CV_Error(Error::StsOutOfRange, "Layer \"" + ld.name + "\" produce only " + toString(ld.outputBlobs.size()) + CV_Error(Error::StsOutOfRange, "Layer \"" + ld.name + "\" produce only " + toString(ld.outputBlobs.size()) +
" outputs, the #" + toString(pin.oid) + " was requsted"); " 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. // Transfer data to CPU if it's require.
ld.outputBlobsWrappers[pin.oid]->copyToHost(); ld.outputBlobsWrappers[pin.oid]->copyToHost();
...@@ -1561,10 +1561,35 @@ struct Net::Impl ...@@ -1561,10 +1561,35 @@ struct Net::Impl
return ld.outputBlobs[pin.oid]; 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) Mat getBlob(String outputName)
{ {
return getBlob(getPinByAlias(outputName)); return getBlob(getPinByAlias(outputName));
} }
void getBlob(UMat& umat, String outputName)
{
getBlob(umat, getPinByAlias(outputName));
}
}; };
Net::Net() : impl(new Net::Impl) Net::Net() : impl(new Net::Impl)
...@@ -1642,7 +1667,7 @@ Mat Net::forward(const String& outputName) ...@@ -1642,7 +1667,7 @@ Mat Net::forward(const String& outputName)
return impl->getBlob(layerName); 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(); CV_TRACE_FUNCTION();
...@@ -1658,16 +1683,40 @@ void Net::forward(std::vector<Mat>& outputBlobs, const String& outputName) ...@@ -1658,16 +1683,40 @@ void Net::forward(std::vector<Mat>& outputBlobs, const String& outputName)
LayerPin pin = impl->getPinByAlias(layerName); LayerPin pin = impl->getPinByAlias(layerName);
LayerData &ld = impl->layers[pin.lid]; 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++) if (ld.umat_outputBlobs.size() > 0)
ld.umat_outputBlobs[i].copyTo(ld.outputBlobs[i]); {
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) const std::vector<String>& outBlobNames)
{ {
CV_TRACE_FUNCTION(); CV_TRACE_FUNCTION();
...@@ -1675,7 +1724,7 @@ void Net::forward(std::vector<Mat>& outputBlobs, ...@@ -1675,7 +1724,7 @@ void Net::forward(std::vector<Mat>& outputBlobs,
std::vector<LayerPin> pins; std::vector<LayerPin> pins;
for (int i = 0; i < outBlobNames.size(); i++) 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->setUpNet(pins);
...@@ -1684,11 +1733,14 @@ void Net::forward(std::vector<Mat>& outputBlobs, ...@@ -1684,11 +1733,14 @@ void Net::forward(std::vector<Mat>& outputBlobs,
impl->forwardToLayer(impl->getLayerData(out.lid)); impl->forwardToLayer(impl->getLayerData(out.lid));
outputBlobs.clear(); std::vector<Mat> matvec;
for (int i = 0; i < pins.size(); i++) 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, void Net::forward(std::vector<std::vector<Mat> >& outputBlobs,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment