Merge pull request #16580 from dkurt:fix_14566

pull/16585/head^2
Alexander Alekhin 5 years ago
commit a8c257cecb
  1. 100
      modules/dnn/src/layers/elementwise_layers.cpp

@ -112,13 +112,18 @@ public:
}
};
ElementWiseLayer(const Func &f=Func()) : run_parallel(false) { func = f; }
ElementWiseLayer(const Func &f=Func()) { func = f; }
virtual bool supportBackend(int backendId) CV_OVERRIDE
{
return func.supportBackend(backendId, this->preferableTarget);
}
virtual void finalize(InputArrayOfArrays, OutputArrayOfArrays) CV_OVERRIDE
{
func.finalize();
}
virtual Ptr<BackendNode> tryAttach(const Ptr<BackendNode>& node) CV_OVERRIDE
{
switch (node->backendId)
@ -235,7 +240,6 @@ public:
}
Func func;
bool run_parallel;
};
#ifdef HAVE_OPENCL
@ -250,7 +254,16 @@ static String oclGetTMacro(const UMat &m)
}
#endif
struct ReLUFunctor
struct BaseFunctor
{
void finalize() {}
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
};
struct ReLUFunctor : public BaseFunctor
{
typedef ReLULayer Layer;
float slope;
@ -376,14 +389,10 @@ struct ReLUFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 1; }
};
struct ReLU6Functor
struct ReLU6Functor : public BaseFunctor
{
typedef ReLU6Layer Layer;
float minValue, maxValue;
@ -486,14 +495,10 @@ struct ReLU6Functor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 2; }
};
struct TanHFunctor
struct TanHFunctor : public BaseFunctor
{
typedef TanHLayer Layer;
@ -565,14 +570,10 @@ struct TanHFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 1; }
};
struct SwishFunctor
struct SwishFunctor : public BaseFunctor
{
typedef SwishLayer Layer;
@ -645,15 +646,10 @@ struct SwishFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 3; }
};
struct MishFunctor
struct MishFunctor : public BaseFunctor
{
typedef MishLayer Layer;
@ -731,15 +727,10 @@ struct MishFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 3; }
};
struct SigmoidFunctor
struct SigmoidFunctor : public BaseFunctor
{
typedef SigmoidLayer Layer;
@ -811,19 +802,13 @@ struct SigmoidFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 3; }
};
struct ELUFunctor
struct ELUFunctor : public BaseFunctor
{
typedef ELULayer Layer;
explicit ELUFunctor() {}
bool supportBackend(int backendId, int)
{
return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE ||
@ -892,14 +877,10 @@ struct ELUFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 2; }
};
struct AbsValFunctor
struct AbsValFunctor : public BaseFunctor
{
typedef AbsLayer Layer;
@ -977,14 +958,10 @@ struct AbsValFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 1; }
};
struct BNLLFunctor
struct BNLLFunctor : public BaseFunctor
{
typedef BNLLLayer Layer;
@ -1057,23 +1034,19 @@ struct BNLLFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 5; }
};
struct PowerFunctor
struct PowerFunctor : public BaseFunctor
{
typedef PowerLayer Layer;
float power;
float scale;
float shift;
float power, scale, shift;
float originPower, originScale, originShift;
explicit PowerFunctor(float power_ = 1.f, float scale_ = 1.f, float shift_ = 0.f)
: power(power_), scale(scale_), shift(shift_) {}
: power(power_), scale(scale_), shift(shift_),
originPower(power_), originScale(scale_), originShift(shift_) {}
bool supportBackend(int backendId, int targetId)
{
@ -1083,6 +1056,13 @@ struct PowerFunctor
return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE || backendId == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH;
}
void finalize()
{
power = originPower;
scale = originScale;
shift = originShift;
}
void apply(const float* srcptr, float* dstptr, int len, size_t planeSize, int cn0, int cn1) const
{
float a = scale, b = shift, p = power;
@ -1212,8 +1192,7 @@ struct PowerFunctor
int64 getFLOPSPerElement() const { return power == 1 ? 2 : 10; }
};
struct ChannelsPReLUFunctor
struct ChannelsPReLUFunctor : public BaseFunctor
{
typedef ChannelsPReLULayer Layer;
Mat scale;
@ -1330,11 +1309,6 @@ struct ChannelsPReLUFunctor
}
#endif // HAVE_DNN_NGRAPH
bool tryFuse(Ptr<dnn::Layer>&) { return false; }
void getScaleShift(Mat&, Mat&) const {}
int64 getFLOPSPerElement() const { return 1; }
};

Loading…
Cancel
Save