@ -15,6 +15,7 @@ Implementation of Scale layer.
# include "../op_inf_engine.hpp"
# include "../ie_ngraph.hpp"
# include <opencv2/imgproc.hpp>
# include <opencv2/dnn/shape_utils.hpp>
namespace cv
@ -324,7 +325,7 @@ public:
std : : vector < MatShape > & internals ) const CV_OVERRIDE
{
CV_Assert_N ( inputs . size ( ) = = 1 , blobs . size ( ) = = 3 ) ;
CV_Assert_N ( blobs [ 0 ] . total ( ) = = 1 , blobs [ 1 ] . total ( ) = = total ( inputs [ 0 ] , 1 ) ,
CV_Assert_N ( blobs [ 0 ] . total ( ) = = 1 ,
blobs [ 2 ] . total ( ) = = inputs [ 0 ] [ 1 ] ) ;
outputs . assign ( 1 , inputs [ 0 ] ) ;
@ -347,15 +348,20 @@ public:
float * outData = outputs [ 0 ] . ptr < float > ( ) ;
Mat data_mean_cpu = blobs [ 1 ] . clone ( ) ;
Mat mean_resize = Mat ( inputs [ 0 ] . size [ 3 ] , inputs [ 0 ] . size [ 2 ] , CV_32FC3 ) ;
Mat mean_3d = Mat ( data_mean_cpu . size [ 3 ] , data_mean_cpu . size [ 2 ] , CV_32FC3 , data_mean_cpu . ptr < float > ( 0 ) ) ;
resize ( mean_3d , mean_resize , Size ( inputs [ 0 ] . size [ 3 ] , inputs [ 0 ] . size [ 2 ] ) ) ;
int new_size [ ] = { 1 , mean_resize . channels ( ) , mean_resize . cols , mean_resize . rows } ;
Mat data_mean_cpu_resize = mean_resize . reshape ( 1 , * new_size ) ;
Mat data_mean_per_channel_cpu = blobs [ 2 ] . clone ( ) ;
const int numWeights = data_mean_cpu . total ( ) ;
const int numWeights = data_mean_cpu_resize . total ( ) ;
CV_Assert ( numWeights ! = 0 ) ;
+ + num_iter ;
if ( num_iter < = recompute_mean )
{
data_mean_cpu * = ( num_iter - 1 ) ;
data_mean_cpu_resize * = ( num_iter - 1 ) ;
const int batch = inputs [ 0 ] . size [ 0 ] ;
float alpha = 1.0 / batch ;
@ -364,15 +370,15 @@ public:
Mat inpSlice ( 1 , numWeights , CV_32F , inpData ) ;
inpSlice = alpha * inpSlice ;
add ( data_mean_cpu . reshape ( 1 , 1 ) , inpSlice , data_mean_cpu . reshape ( 1 , 1 ) ) ;
add ( data_mean_cpu_resize . reshape ( 1 , 1 ) , inpSlice , data_mean_cpu_resize . reshape ( 1 , 1 ) ) ;
inpData + = numWeights ;
}
data_mean_cpu * = ( 1.0 / num_iter ) ;
data_mean_cpu_resize * = ( 1.0 / num_iter ) ;
int newsize [ ] = { blobs [ 1 ] . size [ 1 ] , ( int ) blobs [ 1 ] . total ( 2 ) } ;
reduce ( data_mean_cpu . reshape ( 1 , 2 , & newsize [ 0 ] ) , data_mean_per_channel_cpu , 1 , REDUCE_SUM , CV_32F ) ;
int newsize [ ] = { inputs [ 0 ] . size [ 1 ] , ( int ) inputs [ 0 ] . total ( 2 ) } ;
reduce ( data_mean_cpu_resize . reshape ( 1 , 2 , & newsize [ 0 ] ) , data_mean_per_channel_cpu , 1 , REDUCE_SUM , CV_32F ) ;
int area = blobs [ 1 ] . total ( 2 ) ;
int area = inputs [ 0 ] . total ( 2 ) ;
data_mean_per_channel_cpu * = ( 1.0 / area ) ;
}
@ -387,7 +393,7 @@ public:
Mat inpSlice ( 1 , numWeights , CV_32F , inpData ) ;
Mat outSlice ( 1 , numWeights , CV_32F , outData ) ;
add ( inpSlice , ( - 1 ) * data_mean_cpu , outSlice ) ;
add ( inpSlice , ( - 1 ) * data_mean_cpu_resize , outSlice ) ;
inpData + = numWeights ;
outData + = numWeights ;
}