1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
5 #ifndef OPENCV_DNN_SRC_CUDA4DNN_PRIMITIVES_ACTIVATION_HPP
6 #define OPENCV_DNN_SRC_CUDA4DNN_PRIMITIVES_ACTIVATION_HPP
8 #include "../../op_cuda.hpp"
10 #include "../csl/stream.hpp"
11 #include "../csl/tensor.hpp"
13 #include "../kernels/activations.hpp"
15 #include <opencv2/core.hpp>
19 namespace cv { namespace dnn { namespace cuda4dnn {
22 class ReLUOp final : public CUDABackendNode {
24 using wrapper_type = GetCUDABackendWrapperType<T>;
26 ReLUOp(csl::Stream stream_, T slope_)
27 : stream(std::move(stream_)), slope{ slope_ } { }
30 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
31 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
32 csl::Workspace& workspace) override
34 for (int i = 0; i < inputs.size(); i++)
36 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
37 auto input = input_wrapper->getView();
39 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
40 auto output = output_wrapper->getSpan();
42 kernels::relu<T>(stream, output, input, slope);
52 class ClippedReLUOp final : public CUDABackendNode {
54 using wrapper_type = GetCUDABackendWrapperType<T>;
56 ClippedReLUOp(csl::Stream stream_, T min_, T max_)
57 : stream(std::move(stream_)), min{ min_ }, max{ max_ } { }
60 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
61 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
62 csl::Workspace& workspace) override
64 for (int i = 0; i < inputs.size(); i++)
66 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
67 auto input = input_wrapper->getView();
69 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
70 auto output = output_wrapper->getSpan();
72 kernels::clipped_relu<T>(stream, output, input, min, max);
82 class ChannelwiseReLUOp final : public CUDABackendNode {
84 using wrapper_type = GetCUDABackendWrapperType<T>;
86 ChannelwiseReLUOp(csl::Stream stream_, const Mat& slope)
87 : stream(std::move(stream_))
89 CV_Assert(!slope.empty());
90 slopeTensor = csl::makeTensorHeader<T>(slope);
91 csl::copyMatToTensor<T>(slope, slopeTensor, stream);
95 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
96 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
97 csl::Workspace& workspace) override
99 for (int i = 0; i < inputs.size(); i++)
101 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
102 auto input = input_wrapper->getView();
104 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
105 auto output = output_wrapper->getSpan();
107 CV_Assert(input.get_axis_size(1) == slopeTensor.size());
108 std::size_t inner_size = input.size_range(2, input.rank());
109 kernels::axiswise_relu<T>(stream, output, input, inner_size, slopeTensor);
115 csl::Tensor<T> slopeTensor;
119 class TanHOp final : public CUDABackendNode {
121 using wrapper_type = GetCUDABackendWrapperType<T>;
123 TanHOp(csl::Stream stream_) : stream(std::move(stream_)) { }
126 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
127 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
128 csl::Workspace& workspace) override
130 for (int i = 0; i < inputs.size(); i++)
132 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
133 auto input = input_wrapper->getView();
135 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
136 auto output = output_wrapper->getSpan();
138 kernels::tanh<T>(stream, output, input);
147 class SigmoidOp final : public CUDABackendNode {
149 using wrapper_type = GetCUDABackendWrapperType<T>;
151 SigmoidOp(csl::Stream stream_) : stream(std::move(stream_)) { }
154 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
155 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
156 csl::Workspace& workspace) override
158 for (int i = 0; i < inputs.size(); i++)
160 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
161 auto input = input_wrapper->getView();
163 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
164 auto output = output_wrapper->getSpan();
166 kernels::sigmoid<T>(stream, output, input);
175 class ELUOp final : public CUDABackendNode {
177 using wrapper_type = GetCUDABackendWrapperType<T>;
179 ELUOp(csl::Stream stream_) : stream(std::move(stream_)) { }
182 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
183 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
184 csl::Workspace& workspace) override
186 for (int i = 0; i < inputs.size(); i++)
188 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
189 auto input = input_wrapper->getView();
191 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
192 auto output = output_wrapper->getSpan();
194 kernels::elu<T>(stream, output, input);
203 class AbsValOp final : public CUDABackendNode {
205 using wrapper_type = GetCUDABackendWrapperType<T>;
207 AbsValOp(csl::Stream stream_) : stream(std::move(stream_)) { }
210 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
211 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
212 csl::Workspace& workspace) override
214 for (int i = 0; i < inputs.size(); i++)
216 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
217 auto input = input_wrapper->getView();
219 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
220 auto output = output_wrapper->getSpan();
222 kernels::abs<T>(stream, output, input);
231 class BNLLOp final : public CUDABackendNode {
233 using wrapper_type = GetCUDABackendWrapperType<T>;
235 BNLLOp(csl::Stream stream_) : stream(std::move(stream_)) { }
238 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
239 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
240 csl::Workspace& workspace) override
242 for (int i = 0; i < inputs.size(); i++)
244 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
245 auto input = input_wrapper->getView();
247 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
248 auto output = output_wrapper->getSpan();
250 kernels::bnll<T>(stream, output, input);
259 class PowerOp final : public CUDABackendNode {
261 using wrapper_type = GetCUDABackendWrapperType<T>;
263 PowerOp(csl::Stream stream_, T exp_, T scale_, T shift_)
264 : stream(std::move(stream_)), exp{ exp_ }, scale{ scale_ }, shift{ shift_ } { }
267 const std::vector<cv::Ptr<BackendWrapper>>& inputs,
268 const std::vector<cv::Ptr<BackendWrapper>>& outputs,
269 csl::Workspace& workspace) override
271 for (int i = 0; i < inputs.size(); i++)
273 auto input_wrapper = inputs[i].dynamicCast<wrapper_type>();
274 auto input = input_wrapper->getView();
276 auto output_wrapper = outputs[i].dynamicCast<wrapper_type>();
277 auto output = output_wrapper->getSpan();
279 kernels::power<T>(stream, output, input, exp, scale, shift);
285 const T exp, scale, shift;
288 }}} /* namespace cv::dnn::cuda4dnn */
290 #endif /* OPENCV_DNN_SRC_CUDA4DNN_PRIMITIVES_ACTIVATION_HPP */