mirror of https://github.com/opencv/opencv.git
parent
af8ed9d09f
commit
905a9dada2
5 changed files with 72 additions and 218 deletions
@ -1,78 +0,0 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
//
|
||||
// Copyright (C) 2017, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
|
||||
#include "../precomp.hpp" |
||||
#include "layers_common.hpp" |
||||
#include <iostream> |
||||
namespace cv { namespace dnn { |
||||
|
||||
class LPNormalizeLayerImpl : public LPNormalizeLayer |
||||
{ |
||||
public: |
||||
|
||||
LPNormalizeLayerImpl(const LayerParams& params) |
||||
{ |
||||
setParamsFrom(params); |
||||
pnorm = params.get<float>("p", 2); |
||||
epsilon = params.get<float>("eps", 1e-10f); |
||||
CV_Assert(pnorm > 0); |
||||
} |
||||
|
||||
bool getMemoryShapes(const std::vector<MatShape> &inputs, |
||||
const int requiredOutputs, |
||||
std::vector<MatShape> &outputs, |
||||
std::vector<MatShape> &internals) const |
||||
{ |
||||
Layer::getMemoryShapes(inputs, requiredOutputs, outputs, internals); |
||||
if (pnorm != 1 && pnorm != 2) |
||||
{ |
||||
internals.resize(1, inputs[0]); |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
virtual bool supportBackend(int backendId) |
||||
{ |
||||
return backendId == DNN_BACKEND_DEFAULT; |
||||
} |
||||
|
||||
void forward(std::vector<Mat*> &inputs, std::vector<Mat> &outputs, std::vector<Mat> &internals) |
||||
{ |
||||
CV_TRACE_FUNCTION(); |
||||
CV_TRACE_ARG_VALUE(name, "name", name.c_str()); |
||||
|
||||
CV_Assert(inputs[0]->total() == outputs[0].total()); |
||||
float norm; |
||||
if (pnorm == 1) |
||||
norm = cv::norm(*inputs[0], NORM_L1); |
||||
else if (pnorm == 2) |
||||
norm = cv::norm(*inputs[0], NORM_L2); |
||||
else |
||||
{ |
||||
cv::pow(abs(*inputs[0]), pnorm, internals[0]); |
||||
norm = pow((float)sum(internals[0])[0], 1.0f / pnorm); |
||||
} |
||||
multiply(*inputs[0], 1.0f / (norm + epsilon), outputs[0]); |
||||
} |
||||
|
||||
int64 getFLOPS(const std::vector<MatShape> &inputs, |
||||
const std::vector<MatShape> &) const |
||||
{ |
||||
int64 flops = 0; |
||||
for (int i = 0; i < inputs.size(); i++) |
||||
flops += 3 * total(inputs[i]); |
||||
return flops; |
||||
} |
||||
}; |
||||
|
||||
Ptr<LPNormalizeLayer> LPNormalizeLayer::create(const LayerParams& params) |
||||
{ |
||||
return Ptr<LPNormalizeLayer>(new LPNormalizeLayerImpl(params)); |
||||
} |
||||
|
||||
} // namespace dnn
|
||||
} // namespace cv
|
Loading…
Reference in new issue