@ -79,49 +79,24 @@ public:
adjustPad . height < stride . height ) ;
}
virtual bool supportBackend ( int backendId ) CV_OVERRIDE
void finalize ( InputArrayOfArrays inputs_arr , OutputArrayOfArrays outputs_arr ) CV_OVERRIDE
{
# ifdef HAVE_INF_ENGINE
if ( backendId = = DNN_BACKEND_INFERENCE_ENGINE )
{
if ( type = = " Convolution " )
return preferableTarget ! = DNN_TARGET_MYRIAD | | dilation . width = = dilation . height ;
else
{
CV_Assert ( type = = " Deconvolution " ) ;
const int outGroupCn = blobs [ 0 ] . size [ 1 ] ; // Weights are in IOHW layout
const int group = numOutput / outGroupCn ;
if ( group ! = 1 )
{
# if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2018R3)
return preferableTarget = = DNN_TARGET_CPU ;
# endif
return false ;
}
if ( preferableTarget = = DNN_TARGET_OPENCL | | preferableTarget = = DNN_TARGET_OPENCL_FP16 )
return dilation . width = = 1 & & dilation . height = = 1 ;
return true ;
}
}
else
# endif // HAVE_INF_ENGINE
return backendId = = DNN_BACKEND_OPENCV | | backendId = = DNN_BACKEND_HALIDE ;
}
std : : vector < Mat > inputs , outputs ;
inputs_arr . getMatVector ( inputs ) ;
outputs_arr . getMatVector ( outputs ) ;
void finalize ( const std : : vector < Mat * > & inputs , std : : vector < Mat > & outputs ) CV_OVERRIDE
{
CV_Assert ( inputs . size ( ) > 0 ) ;
CV_Assert ( blobs . size ( ) > = 1 & & blobs . size ( ) < = 2 ) ;
CV_Assert ( blobs [ 0 ] . dims = = 4 & & blobs [ 0 ] . size [ 3 ] = = kernel . width & & blobs [ 0 ] . size [ 2 ] = = kernel . height ) ;
const Mat & input = * inputs [ 0 ] ;
const Mat & input = inputs [ 0 ] ;
CV_Assert ( input . dims = = 4 & & ( input . type ( ) = = CV_32F | | input . type ( ) = = CV_64F | | input . type ( ) = = CV_16S ) ) ;
for ( size_t i = 0 ; i < inputs . size ( ) ; i + + )
{
CV_Assert ( inputs [ i ] - > type ( ) = = input . type ( ) ) ;
CV_Assert ( inputs [ i ] - > dims = = 4 & & inputs [ i ] - > size [ 1 ] = = input . size [ 1 ] ) ;
CV_Assert ( inputs [ i ] - > size [ 2 ] = = input . size [ 2 ] & & inputs [ i ] - > size [ 3 ] = = input . size [ 3 ] ) ;
CV_Assert ( inputs [ i ] . type ( ) = = input . type ( ) ) ;
CV_Assert ( inputs [ i ] . dims = = 4 & & inputs [ i ] . size [ 1 ] = = input . size [ 1 ] ) ;
CV_Assert ( inputs [ i ] . size [ 2 ] = = input . size [ 2 ] & & inputs [ i ] . size [ 3 ] = = input . size [ 3 ] ) ;
}
Size outSize = Size ( outputs [ 0 ] . size [ 3 ] , outputs [ 0 ] . size [ 2 ] ) ;
@ -225,6 +200,14 @@ public:
return shape ( out . area ( ) , ksize ) ;
}
virtual bool supportBackend ( int backendId ) CV_OVERRIDE
{
if ( backendId = = DNN_BACKEND_INFERENCE_ENGINE )
return preferableTarget ! = DNN_TARGET_MYRIAD | | dilation . width = = dilation . height ;
else
return backendId = = DNN_BACKEND_OPENCV | | backendId = = DNN_BACKEND_HALIDE ;
}
bool getMemoryShapes ( const std : : vector < MatShape > & inputs ,
const int requiredOutputs ,
std : : vector < MatShape > & outputs ,
@ -262,9 +245,9 @@ public:
return false ;
}
virtual void finalize ( const std : : vector < Mat * > & inputs , std : : vector < Mat > & outputs ) CV_OVERRIDE
virtual void finalize ( InputArrayOfArrays inputs_arr , OutputArrayOfArrays outputs_arr ) CV_OVERRIDE
{
BaseConvolutionLayerImpl : : finalize ( inputs , outputs ) ;
BaseConvolutionLayerImpl : : finalize ( inputs_arr , outputs_arr ) ;
CV_Assert ( ! blobs . empty ( ) ) ;
const int outCn = blobs [ 0 ] . size [ 0 ] ;
@ -1007,22 +990,24 @@ public:
CV_OCL_RUN ( IS_DNN_OPENCL_TARGET ( preferableTarget ) ,
forward_ocl ( inputs_arr , outputs_arr , internals_arr ) )
Layer : : forward_fallback ( inputs_arr , outputs_arr , internals_arr ) ;
}
if ( inputs_arr . depth ( ) = = CV_16S )
{
forward_fallback ( inputs_arr , outputs_arr , internals_arr ) ;
return ;
}
void forward ( std : : vector < Mat * > & inputs , std : : vector < Mat > & outputs , std : : vector < Mat > & internals ) CV_OVERRIDE
{
CV_TRACE_FUNCTION ( ) ;
CV_TRACE_ARG_VALUE ( name , " name " , name . c_str ( ) ) ;
std : : vector < Mat > inputs , outputs ;
inputs_arr . getMatVector ( inputs ) ;
outputs_arr . getMatVector ( outputs ) ;
/*printf("conv %s: input (%d x %d x %d x %d), kernel (%d x %d), pad (%d x %d), stride (%d x %d), dilation (%d x %d)\n",
name . c_str ( ) , inputs [ 0 ] - > size [ 0 ] , inputs [ 0 ] - > size [ 1 ] , inputs [ 0 ] - > size [ 2 ] , inputs [ 0 ] - > size [ 3 ] ,
name . c_str ( ) , inputs [ 0 ] . size [ 0 ] , inputs [ 0 ] . size [ 1 ] , inputs [ 0 ] . size [ 2 ] , inputs [ 0 ] . size [ 3 ] ,
kernel . width , kernel . height , pad . width , pad . height ,
stride . width , stride . height , dilation . width , dilation . height ) ; */
CV_Assert_N ( inputs . size ( ) = = ( size_t ) 1 , inputs [ 0 ] - > size [ 1 ] % blobs [ 0 ] . size [ 1 ] = = 0 ,
outputs . size ( ) = = 1 , inputs [ 0 ] - > data ! = outputs [ 0 ] . data ) ;
CV_Assert_N ( inputs . size ( ) = = ( size_t ) 1 , inputs [ 0 ] . size [ 1 ] % blobs [ 0 ] . size [ 1 ] = = 0 ,
outputs . size ( ) = = 1 , inputs [ 0 ] . data ! = outputs [ 0 ] . data ) ;
int ngroups = inputs [ 0 ] - > size [ 1 ] / blobs [ 0 ] . size [ 1 ] ;
int ngroups = inputs [ 0 ] . size [ 1 ] / blobs [ 0 ] . size [ 1 ] ;
CV_Assert ( outputs [ 0 ] . size [ 1 ] % ngroups = = 0 ) ;
int outCn = blobs [ 0 ] . size [ 0 ] ;
@ -1049,7 +1034,7 @@ public:
int nstripes = std : : max ( getNumThreads ( ) , 1 ) ;
ParallelConv : : run ( * inputs [ 0 ] , outputs [ 0 ] , weightsMat , biasvec , reluslope ,
ParallelConv : : run ( inputs [ 0 ] , outputs [ 0 ] , weightsMat , biasvec , reluslope ,
kernel , pad , stride , dilation , activ . get ( ) , ngroups , nstripes ) ;
}
@ -1089,6 +1074,29 @@ public:
return shape ( ksize , inpH * inpW ) ;
}
virtual bool supportBackend ( int backendId ) CV_OVERRIDE
{
# ifdef HAVE_INF_ENGINE
if ( backendId = = DNN_BACKEND_INFERENCE_ENGINE )
{
const int outGroupCn = blobs [ 0 ] . size [ 1 ] ; // Weights are in IOHW layout
const int group = numOutput / outGroupCn ;
if ( group ! = 1 )
{
# if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2018R3)
return preferableTarget = = DNN_TARGET_CPU ;
# endif
return false ;
}
if ( preferableTarget = = DNN_TARGET_OPENCL | | preferableTarget = = DNN_TARGET_OPENCL_FP16 )
return dilation . width = = 1 & & dilation . height = = 1 ;
return true ;
}
else
# endif // HAVE_INF_ENGINE
return backendId = = DNN_BACKEND_OPENCV | | backendId = = DNN_BACKEND_HALIDE ;
}
bool getMemoryShapes ( const std : : vector < MatShape > & inputs ,
const int requiredOutputs ,
std : : vector < MatShape > & outputs ,
@ -1141,11 +1149,15 @@ public:
return false ;
}
void finalize ( const std : : vector < Mat * > & inputs , std : : vector < Mat > & outputs ) CV_OVERRIDE
void finalize ( InputArrayOfArrays inputs_arr , OutputArrayOfArrays outputs_arr ) CV_OVERRIDE
{
BaseConvolutionLayerImpl : : finalize ( inputs , outputs ) ;
BaseConvolutionLayerImpl : : finalize ( inputs_arr , outputs_arr ) ;
std : : vector < Mat > inputs , outputs ;
inputs_arr . getMatVector ( inputs ) ;
outputs_arr . getMatVector ( outputs ) ;
getConvPoolPaddings ( Size ( outputs [ 0 ] . size [ 3 ] , outputs [ 0 ] . size [ 2 ] ) ,
Size ( inputs [ 0 ] - > size [ 3 ] , inputs [ 0 ] - > size [ 2 ] ) ,
Size ( inputs [ 0 ] . size [ 3 ] , inputs [ 0 ] . size [ 2 ] ) ,
kernel , stride , padMode , dilation , pad ) ;
}
@ -1494,18 +1506,21 @@ public:
CV_OCL_RUN ( IS_DNN_OPENCL_TARGET ( preferableTarget ) & &
OCL_PERFORMANCE_CHECK ( ocl : : Device : : getDefault ( ) . isIntel ( ) ) ,
forward_ocl ( inputs_arr , outputs_arr , internals_arr ) )
forward_ocl ( inputs_arr , outputs_arr , internals_arr ) ) ;
Layer : : forward_fallback ( inputs_arr , outputs_arr , internals_arr ) ;
}
if ( inputs_arr . depth ( ) = = CV_16S )
{
forward_fallback ( inputs_arr , outputs_arr , internals_arr ) ;
return ;
}
void forward ( std : : vector < Mat * > & inputs , std : : vector < Mat > & outputs , std : : vector < Mat > & internals ) CV_OVERRIDE
{
CV_TRACE_FUNCTION ( ) ;
CV_TRACE_ARG_VALUE ( name , " name " , name . c_str ( ) ) ;
std : : vector < Mat > inputs , outputs , internals ;
inputs_arr . getMatVector ( inputs ) ;
outputs_arr . getMatVector ( outputs ) ;
internals_arr . getMatVector ( internals ) ;
int outCn = numOutput ;
int inpCn = inputs [ 0 ] - > size [ 1 ] ;
int inpCn = inputs [ 0 ] . size [ 1 ] ;
bool is1x1flag = is1x1 ( ) ;
int nstripes = getNumThreads ( ) ;
@ -1520,13 +1535,13 @@ public:
int ngroups = outCn / blobs [ 0 ] . size [ 1 ] ;
int inpGroupCn = inpCn / ngroups ;
int outGroupCn = blobs [ 0 ] . size [ 1 ] ;
const Mat & inp = * inputs [ ii ] ;
const Mat & inp = inputs [ ii ] ;
Mat & out = outputs [ ii ] ;
int numImg = inp . size [ 0 ] ;
int inpH = inp . size [ 2 ] , inpW = inp . size [ 3 ] ;
int outH = out . size [ 2 ] , outW = out . size [ 3 ] ;
Mat convBlob = inputs [ ii ] - > reshape ( 1 , numImg * inpCn ) ;
Mat convBlob = inputs [ ii ] . reshape ( 1 , numImg * inpCn ) ;
Mat decnBlob = out . reshape ( 1 , numImg * outCn ) ;
for ( int n = 0 ; n < numImg ; n + + )