mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-23 18:09:25 +08:00
94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
#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> ReLULayer::create(double negativeSlope)
|
|
{
|
|
Ptr<ReLULayer> layer(new ElementWiseLayer<ReLUFunctor>(ReLUFunctor(negativeSlope)));
|
|
layer->negativeSlope = negativeSlope;
|
|
return layer;
|
|
}
|
|
|
|
Ptr<TanHLayer> TanHLayer::create()
|
|
{
|
|
return Ptr<TanHLayer>(new ElementWiseLayer<TanHFunctor>());
|
|
}
|
|
|
|
Ptr<SigmoidLayer> SigmoidLayer::create()
|
|
{
|
|
return Ptr<SigmoidLayer>(new ElementWiseLayer<SigmoidFunctor>());
|
|
}
|
|
|
|
Ptr<AbsLayer> AbsLayer::create()
|
|
{
|
|
return Ptr<AbsLayer>(new ElementWiseLayer<AbsValFunctor>());
|
|
}
|
|
|
|
Ptr<BNLLLayer> BNLLLayer::create()
|
|
{
|
|
return Ptr<BNLLLayer>(new ElementWiseLayer<BNLLFunctor>());
|
|
}
|
|
|
|
Ptr<PowerLayer> PowerLayer::create(double power /*= 1*/, double scale /*= 1*/, double shift /*= 0*/)
|
|
{
|
|
const PowerFunctor f(power, scale, shift);
|
|
Ptr<PowerLayer> layer(new ElementWiseLayer<PowerFunctor>(f));
|
|
layer->power = power;
|
|
layer->scale = scale;
|
|
layer->shift = shift;
|
|
return layer;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
void ChannelsPReLULayerImpl::allocate(const std::vector<Blob*> &inputs, std::vector<Blob> &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<Blob*> &inputs, std::vector<Blob> &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<float>(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> ChannelsPReLULayer::create()
|
|
{
|
|
return Ptr<ChannelsPReLULayer>(new ChannelsPReLULayerImpl());
|
|
}
|
|
|
|
}
|
|
}
|