-// Copyright (C) 2018 Intel Corporation
+// Copyright (C) 2018-2019 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include <builders/ie_detection_output_layer.hpp>
-#include <details/caseless.hpp>
+#include <ie_cnn_layer_builder.h>
+#include <cfloat>
#include <vector>
#include <string>
using namespace InferenceEngine;
-Builder::DetectionOutputLayer::DetectionOutputLayer(const std::string& name): LayerFragment("DetectionOutput", name) {
- getLayer().getOutputPorts().resize(1);
- getLayer().getInputPorts().resize(2);
+Builder::DetectionOutputLayer::DetectionOutputLayer(const std::string& name): LayerDecorator("DetectionOutput", name) {
+ getLayer()->getOutputPorts().resize(1);
+ getLayer()->getInputPorts().resize(2);
+ setBackgroudLabelId(-1);
}
-Builder::DetectionOutputLayer::DetectionOutputLayer(Layer& genLayer): LayerFragment(genLayer) {
- if (!details::CaselessEq<std::string>()(getLayer().getType(), "DetectionOutput"))
- THROW_IE_EXCEPTION << "Cannot create DetectionOutputLayer decorator for layer " << getLayer().getType();
+Builder::DetectionOutputLayer::DetectionOutputLayer(const Layer::Ptr& layer): LayerDecorator(layer) {
+ checkType("DetectionOutput");
+}
+
+Builder::DetectionOutputLayer::DetectionOutputLayer(const Layer::CPtr& layer): LayerDecorator(layer) {
+ checkType("DetectionOutput");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setName(const std::string& name) {
- getLayer().getName() = name;
+ getLayer()->setName(name);
return *this;
}
const std::vector<Port>& Builder::DetectionOutputLayer::getInputPorts() const {
- return getLayer().getInputPorts();
+ return getLayer()->getInputPorts();
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setInputPorts(const std::vector<Port> &ports) {
if (ports.size() != 3)
- THROW_IE_EXCEPTION << "Incorrect number of inputs for DetectionOutput layer.";
- getLayer().getInputPorts() = ports;
+ THROW_IE_EXCEPTION << "Incorrect number of inputs for DetectionOutput getLayer().";
+ getLayer()->getInputPorts() = ports;
return *this;
}
const Port& Builder::DetectionOutputLayer::getOutputPort() const {
- return getLayer().getOutputPorts()[0];
+ return getLayer()->getOutputPorts()[0];
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setOutputPort(const Port &port) {
- getLayer().getOutputPorts()[0] = port;
+ getLayer()->getOutputPorts()[0] = port;
return *this;
}
size_t Builder::DetectionOutputLayer::getNumClasses() const {
- return getLayer().getParameters()["num_classes"].asUInt();
+ return getLayer()->getParameters().at("num_classes");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setNumClasses(size_t num) {
- getLayer().getParameters()["num_classes"] = num;
+ getLayer()->getParameters()["num_classes"] = num;
return *this;
}
int Builder::DetectionOutputLayer::getBackgroudLabelId() const {
- return getLayer().getParameters()["background_label_id"].asInt(-1);
+ return getLayer()->getParameters().at("background_label_id");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setBackgroudLabelId(int labelId) {
- getLayer().getParameters()["background_label_id"] = labelId;
+ getLayer()->getParameters()["background_label_id"] = labelId;
return *this;
}
int Builder::DetectionOutputLayer::getTopK() const {
- return getLayer().getParameters()["top_k"].asInt();
+ return getLayer()->getParameters().at("top_k");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setTopK(int topK) {
- getLayer().getParameters()["top_k"] = topK;
+ getLayer()->getParameters()["top_k"] = topK;
return *this;
}
int Builder::DetectionOutputLayer::getKeepTopK() const {
- return getLayer().getParameters()["keep_top_k"].asInt();
+ return getLayer()->getParameters().at("keep_top_k");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setKeepTopK(int topK) {
- getLayer().getParameters()["keep_top_k"] = topK;
+ getLayer()->getParameters()["keep_top_k"] = topK;
return *this;
}
int Builder::DetectionOutputLayer::getNumOrientClasses() const {
- return getLayer().getParameters()["num_orient_classes"].asInt();
+ return getLayer()->getParameters().at("num_orient_classes");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setNumOrientClasses(int numClasses) {
- getLayer().getParameters()["num_orient_classes"] = numClasses;
+ getLayer()->getParameters()["num_orient_classes"] = numClasses;
return *this;
}
std::string Builder::DetectionOutputLayer::getCodeType() const {
- return getLayer().getParameters()["code_type"];
+ return getLayer()->getParameters().at("code_type");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setCodeType(std::string type) {
- getLayer().getParameters()["code_type"] = type;
+ getLayer()->getParameters()["code_type"] = type;
return *this;
}
int Builder::DetectionOutputLayer::getInterpolateOrientation() const {
- return getLayer().getParameters()["interpolate_orientation"].asInt();
+ return getLayer()->getParameters().at("interpolate_orientation");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setInterpolateOrientation(int orient) {
- getLayer().getParameters()["interpolate_orientation"] = orient;
+ getLayer()->getParameters()["interpolate_orientation"] = orient;
return *this;
}
float Builder::DetectionOutputLayer::getNMSThreshold() const {
- return getLayer().getParameters()["nms_threshold"].asFloat();
+ return getLayer()->getParameters().at("nms_threshold");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setNMSThreshold(float threshold) {
- getLayer().getParameters()["nms_threshold"] = threshold;
+ getLayer()->getParameters()["nms_threshold"] = threshold;
return *this;
}
float Builder::DetectionOutputLayer::getConfidenceThreshold() const {
- return getLayer().getParameters()["confidence_threshold"].asFloat();
+ return getLayer()->getParameters().at("confidence_threshold");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setConfidenceThreshold(float threshold) {
- getLayer().getParameters()["confidence_threshold"] = threshold;
+ getLayer()->getParameters()["confidence_threshold"] = threshold;
return *this;
}
bool Builder::DetectionOutputLayer::getShareLocation() const {
- return getLayer().getParameters()["share_location"].asBool();
+ return getLayer()->getParameters().at("share_location");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setShareLocation(bool flag) {
- getLayer().getParameters()["share_location"] = flag;
+ getLayer()->getParameters()["share_location"] = flag;
return *this;
}
bool Builder::DetectionOutputLayer::getVariantEncodedInTarget() const {
- return getLayer().getParameters()["variance_encoded_in_target"].asBool();
+ return getLayer()->getParameters().at("variance_encoded_in_target");
}
Builder::DetectionOutputLayer& Builder::DetectionOutputLayer::setVariantEncodedInTarget(bool flag) {
- getLayer().getParameters()["variance_encoded_in_target"] = flag;
+ getLayer()->getParameters()["variance_encoded_in_target"] = flag;
return *this;
}
+
+REG_VALIDATOR_FOR(DetectionOutput, [](const InferenceEngine::Builder::Layer::CPtr& input_layer, bool partial) {
+ Builder::DetectionOutputLayer layer(input_layer);
+ if (layer.getNumClasses() == 0) {
+ THROW_IE_EXCEPTION << "NumClasses parameter is wrong in layer " << layer.getName() <<
+ ". It should be > 0.";
+ }
+ if (layer.getCodeType() != "caffe.PriorBoxParameter.CENTER_SIZE" &&
+ layer.getCodeType() != "caffe.PriorBoxParameter.CORNER") {
+ THROW_IE_EXCEPTION << "CodeType parameter is wrong in layer " << layer.getName() <<
+ ". It should be equal to 'caffe.PriorBoxParameter.CORNER' or 'caffe.PriorBoxParameter.CENTER_SIZE'";
+ }
+ if (layer.getBackgroudLabelId() < -1) {
+ THROW_IE_EXCEPTION << "BackgroundLabelId parameter is wrong in layer " << layer.getName() <<
+ ". It should be >= 0 if this one is an Id of existing label else it should be equal to -1";
+ }
+ if (layer.getNMSThreshold() <= 0) {
+ THROW_IE_EXCEPTION << "NMSThreshold parameter is wrong in layer " << layer.getName() <<
+ ". It should be > 0.";
+ }
+ if (layer.getConfidenceThreshold() <= 0) {
+ THROW_IE_EXCEPTION << "ConfidenceThreshold parameter is wrong in layer " << layer.getName() <<
+ ". It should be > 0.";
+ }
+});
+
+REG_CONVERTER_FOR(DetectionOutput, [](const CNNLayerPtr& cnnLayer, Builder::Layer& layer) {
+ layer.getParameters()["num_classes"] = static_cast<size_t>(cnnLayer->GetParamAsUInt("num_classes"));
+ layer.getParameters()["background_label_id"] = cnnLayer->GetParamAsInt("background_label_id", 0);
+ layer.getParameters()["top_k"] = cnnLayer->GetParamAsInt("top_k", -1);
+ layer.getParameters()["keep_top_k"] = cnnLayer->GetParamAsInt("keep_top_k", -1);
+ layer.getParameters()["num_orient_classes"] = cnnLayer->GetParamAsInt("num_orient_classes", 0);
+ layer.getParameters()["code_type"] = cnnLayer->GetParamAsString("code_type", "caffe.PriorBoxParameter.CORNER");
+ layer.getParameters()["interpolate_orientation"] = cnnLayer->GetParamAsInt("interpolate_orientation", 1);
+ layer.getParameters()["nms_threshold"] = cnnLayer->GetParamAsFloat("nms_threshold");
+ layer.getParameters()["confidence_threshold"] = cnnLayer->GetParamAsFloat("confidence_threshold", -FLT_MAX);
+ layer.getParameters()["share_location"] = cnnLayer->GetParamsAsBool("share_location", true);
+ layer.getParameters()["variance_encoded_in_target"] = cnnLayer->GetParamsAsBool("variance_encoded_in_target", false);
+});