@@ -1638,7 +1638,7 @@ struct Net::Impl
1638
1638
CV_Error (Error::StsOutOfRange, " Layer \" " + ld.name + " \" produce only " + toString (ld.outputBlobs .size ()) +
1639
1639
" outputs, the #" + toString (pin.oid ) + " was requsted" );
1640
1640
}
1641
- if (preferableBackend != DNN_TARGET_CPU )
1641
+ if (preferableBackend != DNN_BACKEND_DEFAULT )
1642
1642
{
1643
1643
// Transfer data to CPU if it's require.
1644
1644
ld.outputBlobsWrappers [pin.oid ]->copyToHost ();
@@ -1654,10 +1654,35 @@ struct Net::Impl
1654
1654
return ld.outputBlobs [pin.oid ];
1655
1655
}
1656
1656
1657
+ void getBlob (UMat& umat, const LayerPin& pin)
1658
+ {
1659
+ CV_TRACE_FUNCTION ();
1660
+
1661
+ if (!pin.valid ())
1662
+ CV_Error (Error::StsObjectNotFound, " Requested blob not found" );
1663
+
1664
+ LayerData &ld = layers[pin.lid ];
1665
+ if ((size_t )pin.oid >= ld.outputBlobs .size ())
1666
+ {
1667
+ CV_Error (Error::StsOutOfRange, " Layer \" " + ld.name + " \" produce only " + toString (ld.outputBlobs .size ()) +
1668
+ " outputs, the #" + toString (pin.oid ) + " was requsted" );
1669
+ }
1670
+
1671
+ if (ld.umat_outputBlobs .size () > 0 && !ld.umat_outputBlobs [pin.oid ].empty ())
1672
+ umat = ld.umat_outputBlobs [pin.oid ];
1673
+ else
1674
+ umat = UMat ();
1675
+ }
1676
+
1657
1677
Mat getBlob (String outputName)
1658
1678
{
1659
1679
return getBlob (getPinByAlias (outputName));
1660
1680
}
1681
+
1682
+ void getBlob (UMat& umat, String outputName)
1683
+ {
1684
+ getBlob (umat, getPinByAlias (outputName));
1685
+ }
1661
1686
};
1662
1687
1663
1688
Net::Net () : impl(new Net::Impl)
@@ -1735,7 +1760,7 @@ Mat Net::forward(const String& outputName)
1735
1760
return impl->getBlob (layerName);
1736
1761
}
1737
1762
1738
- void Net::forward (std::vector<Mat>& outputBlobs, const String& outputName)
1763
+ void Net::forward (OutputArrayOfArrays outputBlobs, const String& outputName)
1739
1764
{
1740
1765
CV_TRACE_FUNCTION ();
1741
1766
@@ -1751,24 +1776,48 @@ void Net::forward(std::vector<Mat>& outputBlobs, const String& outputName)
1751
1776
LayerPin pin = impl->getPinByAlias (layerName);
1752
1777
LayerData &ld = impl->layers [pin.lid ];
1753
1778
1754
- if (ld. umat_outputBlobs . size () > 0 )
1779
+ if (outputBlobs. isUMat () )
1755
1780
{
1756
- for (int i = 0 ; i < ld.umat_outputBlobs .size (); i++)
1757
- ld.umat_outputBlobs [i].copyTo (ld.outputBlobs [i]);
1781
+ if (ld.umat_outputBlobs .size () > 0 )
1782
+ {
1783
+ UMat umat;
1784
+ impl->getBlob (umat, layerName);
1785
+ outputBlobs.assign (umat);
1786
+ }
1787
+ }
1788
+ else if (outputBlobs.isMat ())
1789
+ {
1790
+ outputBlobs.assign (impl->getBlob (layerName));
1791
+ }
1792
+ else if (outputBlobs.isMatVector ())
1793
+ {
1794
+ if (ld.umat_outputBlobs .size () > 0 )
1795
+ {
1796
+ for (int i = 0 ; i < ld.umat_outputBlobs .size (); i++)
1797
+ ld.umat_outputBlobs [i].copyTo (ld.outputBlobs [i]);
1798
+ }
1799
+ std::vector<Mat> & outputvec = *(std::vector<Mat> *)outputBlobs.getObj ();
1800
+ outputvec = ld.outputBlobs ;
1801
+ }
1802
+ else if (outputBlobs.isUMatVector ())
1803
+ {
1804
+ if (ld.umat_outputBlobs .size () > 0 )
1805
+ {
1806
+ std::vector<UMat> & outputvec = *(std::vector<UMat> *)outputBlobs.getObj ();
1807
+ outputvec = ld.umat_outputBlobs ;
1808
+ }
1758
1809
}
1759
-
1760
- outputBlobs = ld.outputBlobs ;
1761
1810
}
1762
1811
1763
- void Net::forward (std::vector<Mat>& outputBlobs,
1812
+ void Net::forward (OutputArrayOfArrays outputBlobs,
1764
1813
const std::vector<String>& outBlobNames)
1765
1814
{
1766
1815
CV_TRACE_FUNCTION ();
1767
1816
1768
1817
std::vector<LayerPin> pins;
1769
1818
for (int i = 0 ; i < outBlobNames.size (); i++)
1770
1819
{
1771
- pins.push_back (impl->getPinByAlias (outBlobNames[i]));
1820
+ pins.push_back (impl->getPinByAlias (outBlobNames[i]));
1772
1821
}
1773
1822
1774
1823
impl->setUpNet (pins);
@@ -1777,11 +1826,14 @@ void Net::forward(std::vector<Mat>& outputBlobs,
1777
1826
1778
1827
impl->forwardToLayer (impl->getLayerData (out.lid ));
1779
1828
1780
- outputBlobs. clear () ;
1829
+ std::vector<Mat> matvec ;
1781
1830
for (int i = 0 ; i < pins.size (); i++)
1782
1831
{
1783
- outputBlobs .push_back (impl->getBlob (pins[i]));
1832
+ matvec .push_back (impl->getBlob (pins[i]));
1784
1833
}
1834
+
1835
+ std::vector<Mat> & outputvec = *(std::vector<Mat> *)outputBlobs.getObj ();
1836
+ outputvec = matvec;
1785
1837
}
1786
1838
1787
1839
void Net::forward (std::vector<std::vector<Mat> >& outputBlobs,
0 commit comments