ef44ed79c4f5f2ef3adf0a368b265dc1595ef726
[platform/upstream/opencv.git] / modules / dnn / src / layers / blank_layer.cpp
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
14 // Copyright (C) 2017, Intel Corporation, all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // Redistribution and use in source and binary forms, with or without modification,
18 // are permitted provided that the following conditions are met:
19 //
20 //   * Redistribution's of source code must retain the above copyright notice,
21 //     this list of conditions and the following disclaimer.
22 //
23 //   * Redistribution's in binary form must reproduce the above copyright notice,
24 //     this list of conditions and the following disclaimer in the documentation
25 //     and/or other materials provided with the distribution.
26 //
27 //   * The name of the copyright holders may not be used to endorse or promote products
28 //     derived from this software without specific prior written permission.
29 //
30 // This software is provided by the copyright holders and contributors "as is" and
31 // any express or implied warranties, including, but not limited to, the implied
32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
33 // In no event shall the Intel Corporation or contributors be liable for any direct,
34 // indirect, incidental, special, exemplary, or consequential damages
35 // (including, but not limited to, procurement of substitute goods or services;
36 // loss of use, data, or profits; or business interruption) however caused
37 // and on any theory of liability, whether in contract, strict liability,
38 // or tort (including negligence or otherwise) arising in any way out of
39 // the use of this software, even if advised of the possibility of such damage.
40 //
41 //M*/
42 #include "../precomp.hpp"
43 #include "../op_inf_engine.hpp"
44
45 namespace cv
46 {
47 namespace dnn
48 {
49 class BlankLayerImpl CV_FINAL : public BlankLayer
50 {
51 public:
52     BlankLayerImpl(const LayerParams& params)
53     {
54         setParamsFrom(params);
55     }
56
57     virtual bool supportBackend(int backendId) CV_OVERRIDE
58     {
59         return backendId == DNN_BACKEND_OPENCV ||
60                (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine());
61     }
62
63     bool getMemoryShapes(const std::vector<MatShape> &inputs,
64                          const int requiredOutputs,
65                          std::vector<MatShape> &outputs,
66                          std::vector<MatShape> &internals) const CV_OVERRIDE
67     {
68         Layer::getMemoryShapes(inputs, requiredOutputs, outputs, internals);
69         return true;
70     }
71
72 #ifdef HAVE_OPENCL
73     bool forward_ocl(InputArrayOfArrays inputs_, OutputArrayOfArrays outputs_, OutputArrayOfArrays internals_)
74     {
75         std::vector<UMat> inputs;
76         std::vector<UMat> outputs;
77
78         inputs_.getUMatVector(inputs);
79         outputs_.getUMatVector(outputs);
80
81         for (int i = 0, n = outputs.size(); i < n; ++i)
82         {
83             void *src_handle = inputs[i].handle(ACCESS_READ);
84             void *dst_handle = outputs[i].handle(ACCESS_WRITE);
85             if (src_handle != dst_handle)
86                 inputs[i].copyTo(outputs[i]);
87         }
88
89         return true;
90     }
91 #endif
92
93     void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr) CV_OVERRIDE
94     {
95         CV_TRACE_FUNCTION();
96         CV_TRACE_ARG_VALUE(name, "name", name.c_str());
97
98         CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget),
99                    forward_ocl(inputs_arr, outputs_arr, internals_arr))
100
101         std::vector<Mat> inputs, outputs;
102         inputs_arr.getMatVector(inputs);
103         outputs_arr.getMatVector(outputs);
104
105         for (int i = 0, n = outputs.size(); i < n; ++i)
106             if (outputs[i].data != inputs[i].data)
107                 inputs[i].copyTo(outputs[i]);
108     }
109
110 #ifdef HAVE_INF_ENGINE
111     virtual Ptr<BackendNode> initInfEngine(const std::vector<Ptr<BackendWrapper> >& inputs) CV_OVERRIDE
112     {
113         InferenceEngine::DataPtr input = infEngineDataNode(inputs[0]);
114         std::vector<size_t> dims = input->getDims();
115         CV_Assert(!dims.empty());
116
117         InferenceEngine::Builder::Layer ieLayer(name);
118         ieLayer.setName(name);
119         if (preferableTarget == DNN_TARGET_MYRIAD)
120         {
121             ieLayer.setType("Copy");
122         }
123         else
124         {
125             ieLayer.setType("Split");
126             ieLayer.getParameters()["axis"] = dims.size() - 1;
127             ieLayer.getParameters()["out_sizes"] = dims[0];
128         }
129         ieLayer.setInputPorts({InferenceEngine::Port(dims)});
130         ieLayer.setOutputPorts(std::vector<InferenceEngine::Port>(1));
131         return Ptr<BackendNode>(new InfEngineBackendNode(ieLayer));
132     }
133 #endif  // HAVE_INF_ENGINE
134 };
135
136 Ptr<Layer> BlankLayer::create(const LayerParams& params)
137 {
138     // In case of Caffe's Dropout layer from Faster-RCNN framework,
139     // https://github.com/rbgirshick/caffe-fast-rcnn/tree/faster-rcnn
140     // return Power layer.
141     if (!params.get<bool>("scale_train", true))
142     {
143         float scale = 1 - params.get<float>("dropout_ratio", 0.5f);
144         CV_Assert(scale > 0);
145
146         LayerParams powerParams;
147         powerParams.name = params.name;
148         powerParams.type = "Power";
149         powerParams.set("scale", scale);
150
151         return PowerLayer::create(powerParams);
152     }
153     else
154         return Ptr<BlankLayer>(new BlankLayerImpl(params));
155 }
156
157 }
158 }