1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <builders/ie_crop_layer.hpp>
6 #include <ie_cnn_layer_builder.h>
11 using namespace InferenceEngine;
13 Builder::CropLayer::CropLayer(const std::string& name): LayerDecorator("Crop", name) {
14 getLayer()->getOutputPorts().resize(1);
15 getLayer()->getInputPorts().resize(2);
18 Builder::CropLayer::CropLayer(const Layer::Ptr& layer): LayerDecorator(layer) {
22 Builder::CropLayer::CropLayer(const Layer::CPtr& layer): LayerDecorator(layer) {
26 Builder::CropLayer& Builder::CropLayer::setName(const std::string& name) {
27 getLayer()->setName(name);
31 const std::vector<Port>& Builder::CropLayer::getInputPorts() const {
32 return getLayer()->getInputPorts();
35 Builder::CropLayer& Builder::CropLayer::setInputPorts(const std::vector<Port>& ports) {
36 getLayer()->getInputPorts() = ports;
40 const Port& Builder::CropLayer::getOutputPort() const {
41 return getLayer()->getOutputPorts()[0];
44 Builder::CropLayer& Builder::CropLayer::setOutputPort(const Port &port) {
45 getLayer()->getOutputPorts()[0] = port;
49 const std::vector<size_t> Builder::CropLayer::getAxis() const {
50 return getLayer()->getParameters().at("axis");
53 Builder::CropLayer& Builder::CropLayer::setAxis(const std::vector<size_t>& axis) {
54 getLayer()->getParameters()["axis"] = axis;
58 const std::vector<size_t> Builder::CropLayer::getOffset() const {
59 return getLayer()->getParameters().at("offset");
62 Builder::CropLayer& Builder::CropLayer::setOffset(const std::vector<size_t>& offsets) {
63 getLayer()->getParameters()["offset"] = offsets;
67 REG_VALIDATOR_FOR(Crop, [] (const InferenceEngine::Builder::Layer::CPtr& input_layer, bool partial) {
68 if (input_layer->getInputPorts().size() != 2) {
69 THROW_IE_EXCEPTION << "Incorrect parameters for getLayer() " << input_layer->getName()
70 << " should have 2 input ports.";
72 if (input_layer->getOutputPorts().size() != 1) {
73 THROW_IE_EXCEPTION << "Incorrect parameters for getLayer() " << input_layer->getName()
74 << " should have 1 output port";
76 Builder::CropLayer layer(input_layer);
77 if (layer.getAxis().size() != layer.getOffset().size()) {
78 THROW_IE_EXCEPTION << "Incorrect parameters for getLayer() " << input_layer->getName()
79 << ". Axis size must be equal to the size of Offset";
81 for (size_t i = 0; i < layer.getAxis().size(); ++i) {
82 const size_t index = layer.getAxis()[i];
83 if (index >= layer.getInputPorts()[0].shape().size()) {
84 THROW_IE_EXCEPTION << "Incorrect parameters for getLayer() " << input_layer->getName()
85 << ". Each element of Axis should be less than input shape length";
87 if (layer.getOutputPort().shape()[index] != layer.getInputPorts()[1].shape()[index]) {
88 THROW_IE_EXCEPTION << "Incorrect parameters for getLayer() " << input_layer->getName()
89 << ". The second input shapes should have the same value as the output shapes in the indexes contained in Axis";
91 if (layer.getInputPorts()[0].shape()[index] < layer.getOutputPort().shape()[index] + layer.getOffset()[i]) {
92 THROW_IE_EXCEPTION << "Incorrect parameters for getLayer() " << input_layer->getName()
93 << ". The sum of offset and output shape in the " << i + 1 << " dimension is bigger then input shape size";
98 REG_CONVERTER_FOR(Crop, [](const CNNLayerPtr& cnnLayer, Builder::Layer& layer) {
99 std::vector<unsigned int> tmp = cnnLayer->GetParamAsUInts("axis");
100 layer.getParameters()["axis"] = std::vector<size_t>(tmp.size());
101 for (size_t i = 0; i < tmp.size(); ++i) {
102 layer.getParameters()["axis"].as<std::vector<size_t>>()[i] = static_cast<size_t>(tmp[i]);
105 tmp = cnnLayer->GetParamAsUInts("offset");
106 layer.getParameters()["offset"] = std::vector<size_t>(tmp.size());
107 for (size_t i = 0; i < tmp.size(); ++i) {
108 layer.getParameters()["offset"].as<std::vector<size_t>>()[i] = static_cast<size_t>(tmp[i]);