#include "../precomp.hpp" #include "elementwise_layers.hpp" #include "opencv2/imgproc.hpp" namespace cv { namespace dnn { #define ACTIVATION_CREATOR_FOR(_Layer, _Functor, ...) \ Ptr<_Layer> _Layer::create() { \ return return Ptr<_Layer>( new ElementWiseLayer<_Functor>(_Functor()) ); } Ptr ReLULayer::create(double negativeSlope) { Ptr layer(new ElementWiseLayer(ReLUFunctor(negativeSlope))); layer->negativeSlope = negativeSlope; return layer; } Ptr TanHLayer::create() { return Ptr(new ElementWiseLayer()); } Ptr SigmoidLayer::create() { return Ptr(new ElementWiseLayer()); } Ptr AbsLayer::create() { return Ptr(new ElementWiseLayer()); } Ptr BNLLLayer::create() { return Ptr(new ElementWiseLayer()); } Ptr PowerLayer::create(double power /*= 1*/, double scale /*= 1*/, double shift /*= 0*/) { const PowerFunctor f(power, scale, shift); Ptr layer(new ElementWiseLayer(f)); layer->power = power; layer->scale = scale; layer->shift = shift; return layer; } //////////////////////////////////////////////////////////////////////////// void ChannelsPReLULayerImpl::allocate(const std::vector &inputs, std::vector &outputs) { CV_Assert(blobs.size() == 1); outputs.resize(inputs.size()); for (size_t i = 0; i < inputs.size(); i++) { outputs[i].create(inputs[i]->shape()); } } void ChannelsPReLULayerImpl::forward(std::vector &inputs, std::vector &outputs) { CV_Assert(inputs.size() == 1); Blob &inpBlob = *inputs[0]; for (size_t ii = 0; ii < outputs.size(); ii++) { Blob &outBlob = outputs[ii]; CV_Assert(blobs[0].total() == inpBlob.channels()); for (int n = 0; n < inpBlob.channels(); n++) { float slopeWeight = blobs[0].matRefConst().at(n); cv::threshold(inpBlob.getPlane(0, n), outBlob.getPlane(0, n), 0, 0, cv::THRESH_TOZERO_INV); outBlob.getPlane(0, n) = inpBlob.getPlane(0, n) + (slopeWeight - 1)*outBlob.getPlane(0, n); } } } Ptr ChannelsPReLULayer::create() { return Ptr(new ChannelsPReLULayerImpl()); } } }