Add new layer forward interface
Add layer forward interface with InputArrayOfArrays and OutputArrayOfArrays parameters, it allows UMat buffer to be processed and transferred in the layers. Signed-off-by: Li Peng <peng.li@intel.com>
This commit is contained in:
@@ -94,8 +94,14 @@ public:
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
bool forward_ocl(std::vector<Mat*> &inputs, std::vector<Mat> &outputs, std::vector<Mat> &internals)
|
||||
bool forward_ocl(InputArrayOfArrays inps, OutputArrayOfArrays outs, OutputArrayOfArrays internals)
|
||||
{
|
||||
std::vector<UMat> inputs;
|
||||
std::vector<UMat> outputs;
|
||||
|
||||
inps.getUMatVector(inputs);
|
||||
outs.getUMatVector(outputs);
|
||||
|
||||
if (lrnOp.empty())
|
||||
{
|
||||
OCL4DNNLRNConfig config;
|
||||
@@ -108,28 +114,38 @@ public:
|
||||
config.alpha = alpha;
|
||||
config.beta = beta;
|
||||
config.k = bias;
|
||||
CHECK_EQ(4, inputs[0]->dims) << "Input must have 4 axes, "
|
||||
CHECK_EQ(4, inputs[0].dims) << "Input must have 4 axes, "
|
||||
<< "corresponding to (num, channels, height, width)";
|
||||
config.batch_size = inputs[0]->size[0];
|
||||
config.channels = inputs[0]->size[1];
|
||||
config.height = inputs[0]->size[2];
|
||||
config.width = inputs[0]->size[3];
|
||||
config.batch_size = inputs[0].size[0];
|
||||
config.channels = inputs[0].size[1];
|
||||
config.height = inputs[0].size[2];
|
||||
config.width = inputs[0].size[3];
|
||||
config.norm_by_size = normBySize;
|
||||
|
||||
lrnOp = Ptr<OCL4DNNLRN<float> >(new OCL4DNNLRN<float>(config));
|
||||
}
|
||||
|
||||
UMat inpMat, outMat;
|
||||
inpMat = inputs[0]->getUMat(ACCESS_READ);
|
||||
outMat = outputs[0].getUMat(ACCESS_WRITE);
|
||||
|
||||
if (!lrnOp->Forward(inpMat, outMat))
|
||||
if (!lrnOp->Forward(inputs[0], outputs[0]))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr)
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
CV_TRACE_ARG_VALUE(name, "name", name.c_str());
|
||||
|
||||
CV_Assert(inputs_arr.total() == outputs_arr.total());
|
||||
|
||||
CV_OCL_RUN((preferableTarget == DNN_TARGET_OPENCL) &&
|
||||
OCL_PERFORMANCE_CHECK(ocl::Device::getDefault().isIntel()),
|
||||
forward_ocl(inputs_arr, outputs_arr, internals_arr))
|
||||
|
||||
Layer::forward_fallback(inputs_arr, outputs_arr, internals_arr);
|
||||
}
|
||||
|
||||
void forward(std::vector<Mat*> &inputs, std::vector<Mat> &outputs, std::vector<Mat> &internals)
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
@@ -137,10 +153,6 @@ public:
|
||||
|
||||
CV_Assert(inputs.size() == outputs.size());
|
||||
|
||||
CV_OCL_RUN((preferableTarget == DNN_TARGET_OPENCL) &&
|
||||
OCL_PERFORMANCE_CHECK(ocl::Device::getDefault().isIntel()),
|
||||
forward_ocl(inputs, outputs, internals))
|
||||
|
||||
for (int i = 0; i < inputs.size(); i++)
|
||||
{
|
||||
CV_Assert(inputs[i]->dims == 4);
|
||||
|
||||
Reference in New Issue
Block a user