diff --git a/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp b/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp index 9b9e2517fcc..fecb8d8a5a8 100644 --- a/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp +++ b/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp @@ -1291,6 +1291,15 @@ InferenceEngine::details::CNNLayerCreator::CNNLayerCreator(const std::shared_ptr } return res; }); + + addSpecificCreator({"CTCGreedyDecoder"}, [](const std::shared_ptr<::ngraph::Node>& node, + const std::map& params) -> CNNLayerPtr { + LayerParams attrs = {node->get_friendly_name(), "CTCGreedyDecoder", details::convertPrecision(node->get_output_element_type(0))}; + auto res = std::make_shared(attrs); + res->params = params; + res->params["ctc_merge_repeated"] = res->getBoolStrParamAsIntStr("ctc_merge_repeated"); + return res; + }); } CNNLayerPtr InferenceEngine::details::CNNLayerCreator::create() { @@ -1318,9 +1327,7 @@ void convertFunctionToICNNNetwork(const std::shared_ptr> convertors = { - std::make_shared>(), std::make_shared>(), - std::make_shared>(), std::make_shared>(), std::make_shared>(), std::make_shared>(), diff --git a/inference-engine/src/legacy_api/src/ie_cnn_layer_builder_ngraph.cpp b/inference-engine/src/legacy_api/src/ie_cnn_layer_builder_ngraph.cpp index f27a22067c4..79559f8a54b 100644 --- a/inference-engine/src/legacy_api/src/ie_cnn_layer_builder_ngraph.cpp +++ b/inference-engine/src/legacy_api/src/ie_cnn_layer_builder_ngraph.cpp @@ -550,72 +550,6 @@ CNNLayer::Ptr NodeConverter::createLayer( return res; } -template <> -CNNLayer::Ptr NodeConverter::createLayer(const std::shared_ptr& layer) const { - LayerParams params = {layer->get_friendly_name(), "Pooling", - details::convertPrecision(layer->get_output_element_type(0))}; - auto res = std::make_shared(params); - auto castedLayer = ngraph::as_type_ptr(layer); - if (castedLayer == nullptr) THROW_IE_EXCEPTION << "Cannot get " << params.type << " layer " << params.name; - - std::string value; - for (const auto& val : castedLayer->get_pads_begin()) { - if (!value.empty()) value += ","; - value += asString(val); - } - res->params["pads_begin"] = value; - - value.clear(); - for (const auto& val : castedLayer->get_pads_end()) { - if (!value.empty()) value += ","; - value += asString(val); - } - res->params["pads_end"] = value; - - value.clear(); - for (const auto& val : castedLayer->get_strides()) { - if (!value.empty()) value += ","; - value += asString(val); - } - res->params["strides"] = value; - - value.clear(); - for (const auto& val : castedLayer->get_kernel()) { - if (!value.empty()) value += ","; - value += asString(val); - } - res->params["kernel"] = value; - - switch (castedLayer->get_auto_pad()) { - case ngraph::op::PadType::VALID: - res->params["auto_pad"] = "valid"; - break; - case ngraph::op::PadType::SAME_UPPER: - res->params["auto_pad"] = "same_upper"; - break; - case ngraph::op::PadType::SAME_LOWER: - res->params["auto_pad"] = "same_lower"; - break; - default: - break; - } - - auto exclude_pad = castedLayer->get_exclude_pad(); - res->params["exclude-pad"] = exclude_pad ? "true" : "false"; - res->params["pool-method"] = "avg"; - switch (castedLayer->get_rounding_type()) { - case ngraph::op::RoundingType::CEIL: - res->params["rounding_type"] = "ceil"; - break; - case ngraph::op::RoundingType::FLOOR: - res->params["rounding_type"] = "floor"; - break; - default: - THROW_IE_EXCEPTION << "Unsupported ngraph rounding type."; - } - return res; -} - template <> CNNLayer::Ptr NodeConverter::createLayer(const std::shared_ptr& layer) const { LayerParams params = {layer->get_friendly_name(), "Pooling", @@ -1162,19 +1096,6 @@ CNNLayer::Ptr NodeConverter::createLayer(const std::sha return res; } -template <> -CNNLayer::Ptr NodeConverter::createLayer( - const std::shared_ptr& layer) const { - LayerParams params = {layer->get_friendly_name(), "CTCGreedyDecoder", - details::convertPrecision(layer->get_output_element_type(0))}; - auto res = std::make_shared(params); - auto castedLayer = ngraph::as_type_ptr(layer); - if (castedLayer == nullptr) THROW_IE_EXCEPTION << "Cannot get " << params.type << " layer " << params.name; - - res->params["ctc_merge_repeated"] = castedLayer->get_ctc_merge_repeated() ? "1" : "0"; - return res; -} - template <> CNNLayer::Ptr NodeConverter::createLayer(const std::shared_ptr& layer) const { LayerParams params = {layer->get_friendly_name(), "Erf", diff --git a/inference-engine/src/readers/ir_reader/ie_ir_parser.cpp b/inference-engine/src/readers/ir_reader/ie_ir_parser.cpp index b2db09a4676..4a970130fbf 100644 --- a/inference-engine/src/readers/ir_reader/ie_ir_parser.cpp +++ b/inference-engine/src/readers/ir_reader/ie_ir_parser.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -397,17 +396,11 @@ std::shared_ptr V10Parser::createNode(const std::vector> creators = { - std::make_shared>("AvgPool"), - std::make_shared>("CTCGreedyDecoder"), std::make_shared>("DeformableConvolution"), std::make_shared>("DeformablePSROIPooling"), - std::make_shared>("Broadcast"), - std::make_shared>("StridedSlice"), std::make_shared>("GreaterEqual"), std::make_shared>("GroupConvolution"), - std::make_shared>("ConvolutionBackpropData"), std::make_shared>("GroupConvolutionBackpropData"), - std::make_shared>("BinaryConvolution"), std::make_shared>("SquaredDifference"), std::make_shared>("LessEqual"), std::make_shared>("Equal"), @@ -775,20 +768,6 @@ std::shared_ptr V10Parser::LayerCreator: activations, activations_alpha, activations_beta, clip); } -// CTCGreedyDecoder layer -template <> -std::shared_ptr V10Parser::LayerCreator::createLayer( - const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, - const GenericLayerParams& layerParsePrms) { - checkParameters(inputs, layerParsePrms, 2); - pugi::xml_node dn = node.child("data"); - if (dn.empty()) - THROW_IE_EXCEPTION << "Cannot read parameter for " << getType() << " layer with name: " << layerParsePrms.name; - - return std::make_shared(inputs[0], inputs[1], - GetBoolAttr(dn, "ctc_merge_repeated", true)); -} - // SquaredDifference layer template <> std::shared_ptr V10Parser::LayerCreator::createLayer( @@ -857,44 +836,6 @@ std::shared_ptr V10Parser::LayerCreator::creat return std::make_shared(inputs[0]); } -// StridedSlice layer -template <> -std::shared_ptr V10Parser::LayerCreator::createLayer( - const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, - const GenericLayerParams& layerParsePrms) { - - pugi::xml_node dn = node.child("data"); - - std::vector begin_mask = getParameters(dn, "begin_mask"); - std::vector end_mask = getParameters(dn, "end_mask"); - std::vector new_axis = getParameters(dn, "new_axis_mask"); - std::vector shrink_axis = getParameters(dn, "shrink_axis_mask"); - std::vector ellipsis_mask = getParameters(dn, "ellipsis_mask"); - - if (inputs.size() == 3) { - return std::make_shared(inputs[0], inputs[1], inputs[2], begin_mask, - end_mask, new_axis, shrink_axis, ellipsis_mask); - } else if (inputs.size() == 4) { - return std::make_shared(inputs[0], inputs[1], inputs[2], inputs[3], begin_mask, - end_mask, new_axis, shrink_axis, ellipsis_mask); - } else { - THROW_IE_EXCEPTION << "Incorrect number of inputs " << inputs.size() << " for " << getType() << " layer with name: " << layerParsePrms.name; - } -} - -// Broadcast layer -template <> -std::shared_ptr V10Parser::LayerCreator::createLayer( - const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, - const GenericLayerParams& layerParsePrms) { - if (inputs.size() == 2) { - return std::make_shared(inputs[0], inputs[1]); - } else if (layerParsePrms.inputPorts.size() == 3) { - return std::make_shared(inputs[0], inputs[1], inputs[2]); - } - THROW_IE_EXCEPTION << "Invalid number of inputs: " << layerParsePrms.inputPorts.size(); -} - // RegionYolo layer template <> std::shared_ptr V10Parser::LayerCreator::createLayer( @@ -934,41 +875,6 @@ std::shared_ptr V10Parser::LayerCreator::cr return std::make_shared(inputs[0], ngraph::Strides {stride}); } -// BinaryConvolution layer -template <> -std::shared_ptr V10Parser::LayerCreator::createLayer( - const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, - const GenericLayerParams& layerParsePrms) { - checkParameters(inputs, layerParsePrms, 2); - pugi::xml_node dn = node.child("data"); - - if (dn.empty()) - THROW_IE_EXCEPTION << "Cannot read parameter for " << getType() << " layer with name: " << layerParsePrms.name; - - size_t group = GetUIntAttr(dn, "group", 1); - if (group != 1) THROW_IE_EXCEPTION << "Cannot create grouped BinaryConvolution layer " << layerParsePrms.name; - - ngraph::op::PadType pad_type = ngraph::op::PadType::EXPLICIT; - std::string auto_pad = GetStrAttr(dn, "auto_pad", ""); - if (auto_pad == "same_lower") { - pad_type = ngraph::op::PadType::SAME_LOWER; - } else if (auto_pad == "same_upper") { - pad_type = ngraph::op::PadType::SAME_UPPER; - } else if (auto_pad == "valid") { - pad_type = ngraph::op::PadType::VALID; - } - - auto strides = ngraph::Strides(getParameters(dn, "strides")); - auto dilations = ngraph::Strides(getParameters(dn, "dilations")); - auto pads_begin = ngraph::CoordinateDiff(getParameters(dn, "pads_begin")); - auto pads_end = ngraph::CoordinateDiff(getParameters(dn, "pads_end")); - auto mode = GetStrAttr(dn, "mode"); - auto pad_value = GetFloatAttr(dn, "pad_value"); - - return std::make_shared(inputs[0], inputs[1], strides, pads_begin, pads_end, - dilations, mode, pad_value, pad_type); -} - // GroupConvolution layer template <> std::shared_ptr V10Parser::LayerCreator::createLayer( @@ -1032,44 +938,6 @@ std::shared_ptr V10Parser::LayerCreator -std::shared_ptr V10Parser::LayerCreator::createLayer( - const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, - const GenericLayerParams& layerParsePrms) { - pugi::xml_node dn = node.child("data"); - - if (dn.empty()) - THROW_IE_EXCEPTION << "Cannot read parameter for " << getType() << " layer with name: " << layerParsePrms.name; - - ngraph::op::PadType pad_type = ngraph::op::PadType::EXPLICIT; - std::string auto_pad = GetStrAttr(dn, "auto_pad", ""); - if (auto_pad == "same_lower") { - pad_type = ngraph::op::PadType::SAME_LOWER; - } else if (auto_pad == "same_upper") { - pad_type = ngraph::op::PadType::SAME_UPPER; - } else if (auto_pad == "valid") { - pad_type = ngraph::op::PadType::VALID; - } - - auto strides = ngraph::Strides(getParameters(dn, "strides")); - auto dilations = ngraph::Strides(getParameters(dn, "dilations")); - auto pads_begin = ngraph::CoordinateDiff(getParameters(dn, "pads_begin", {})); - auto pads_end = ngraph::CoordinateDiff(getParameters(dn, "pads_end", {})); - auto output_padding = ngraph::CoordinateDiff(getParameters(dn, "output_padding", {})); - if (inputs.size() != 3 && inputs.size() != 2) { - THROW_IE_EXCEPTION << layerParsePrms.type << " layer " << layerParsePrms.name << " has incorrect number of input ports!"; - } - - if (inputs.size() == 3) { - return std::make_shared(inputs[0], inputs[1], inputs[2], strides, pads_begin, pads_end, - dilations, pad_type, output_padding); - } else { - return std::make_shared(inputs[0], inputs[1], strides, pads_begin, pads_end, - dilations, pad_type, output_padding); - } -} - // GroupConvolutionBackpropData layer template <> std::shared_ptr V10Parser::LayerCreator::createLayer( @@ -1109,47 +977,6 @@ std::shared_ptr V10Parser::LayerCreator -std::shared_ptr V10Parser::LayerCreator::createLayer( - const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, - const GenericLayerParams& layerParsePrms) { - checkParameters(inputs, layerParsePrms, 1); - pugi::xml_node dn = node.child("data"); - - if (dn.empty()) - THROW_IE_EXCEPTION << "Cannot read parameter for " << getType() << " layer with name: " << layerParsePrms.name; - - auto exclude_pad = GetStrAttr(dn, "exclude-pad") == "true"; - auto strides = ngraph::Strides(getParameters(dn, "strides")); - auto kernel = ngraph::Shape(getParameters(dn, "kernel")); - auto pads_begin = ngraph::Shape(getParameters(dn, "pads_begin")); - auto pads_end = ngraph::Shape(getParameters(dn, "pads_end")); - auto pad_type = ngraph::op::PadType::EXPLICIT; - - auto pad_type_str = GetStrAttr(dn, "auto_pad", ""); - if (pad_type_str == "same_lower") { - pad_type = ngraph::op::PadType::SAME_LOWER; - } else if (pad_type_str == "same_upper") { - pad_type = ngraph::op::PadType::SAME_UPPER; - } else if (pad_type_str == "valid") { - pad_type = ngraph::op::PadType::VALID; - } - - ngraph::op::RoundingType rounding_type; - auto str_rounding_type = GetStrAttr(dn, "rounding_type", "floor"); - if (str_rounding_type == "floor") { - rounding_type = ngraph::op::RoundingType::FLOOR; - } else if (str_rounding_type == "ceil") { - rounding_type = ngraph::op::RoundingType::CEIL; - } else { - THROW_IE_EXCEPTION << "Unsuppored rounding type: " << str_rounding_type; - } - - return std::make_shared(inputs[0], strides, pads_begin, pads_end, kernel, exclude_pad, - rounding_type, pad_type); -} - // MaxPool layer template <> std::shared_ptr V10Parser::LayerCreator::createLayer( diff --git a/inference-engine/src/readers/ir_reader/ie_ir_parser.hpp b/inference-engine/src/readers/ir_reader/ie_ir_parser.hpp index c103eadc684..689881bf90c 100644 --- a/inference-engine/src/readers/ir_reader/ie_ir_parser.hpp +++ b/inference-engine/src/readers/ir_reader/ie_ir_parser.hpp @@ -313,6 +313,12 @@ private: adapter.set(value); } + void on_adapter(const std::string& name, ngraph::ValueAccessor>& adapter) override { + std::vector value; + if (!getParameters(node.child("data"), name, value)) return; + adapter.set(value); + } + void on_adapter(const std::string& name, ngraph::ValueAccessor>& adapter) override { std::vector value; if (!getParameters(node.child("data"), name, value)) return; diff --git a/ngraph/core/src/op/broadcast.cpp b/ngraph/core/src/op/broadcast.cpp index 4f91709a846..a006797a568 100644 --- a/ngraph/core/src/op/broadcast.cpp +++ b/ngraph/core/src/op/broadcast.cpp @@ -269,8 +269,28 @@ op::v1::Broadcast::Broadcast(const Output& arg, void op::v1::Broadcast::validate_and_infer_types() { - util::BroadcastBase::validate_and_infer_types(); + // m_type is deduced and not always explicitly stated, for cases where broadcast + // has 2 inputs its always NUMPY mode + if (m_broadcast_spec.m_type == AutoBroadcastType::NONE && get_input_size() < 3) + { + m_broadcast_spec.m_type = AutoBroadcastType::NUMPY; + } + // Mocking axes_mapping input for cases that don't require it + if (m_broadcast_spec.m_type == AutoBroadcastType::NUMPY && get_input_size() < 3) + { + auto output = op::v0::Constant::create(element::u8, Shape{}, {0})->output(0); + set_argument(2, output); + } + + // update the base class' mode spec + auto base_spec = to_broadcast_mode(m_broadcast_spec); + if (util::BroadcastBase::m_mode.m_type != base_spec.m_type) + { + util::BroadcastBase::m_mode = base_spec; + } + + util::BroadcastBase::validate_and_infer_types(); set_input_is_relevant_to_shape(0); // arg - Result element type set_input_is_relevant_to_shape(1); // target_shape - Result shape set_input_is_relevant_to_shape(2); // axes_mapping - Broadcast type diff --git a/ngraph/core/src/op/strided_slice.cpp b/ngraph/core/src/op/strided_slice.cpp index 8dc5ca05b97..6823acfb09d 100644 --- a/ngraph/core/src/op/strided_slice.cpp +++ b/ngraph/core/src/op/strided_slice.cpp @@ -172,6 +172,14 @@ void op::v1::StridedSlice::validate_and_infer_types() ")."); } + // Fill up strides input with default strides if not set by this point. + if (get_input_size() < 4) + { + set_argument(3, + calculate_default_strides(get_input_node_ptr(1)->output(0), + get_input_node_ptr(2)->output(0))); + } + set_input_is_relevant_to_shape(1); set_input_is_relevant_to_shape(2); set_input_is_relevant_to_shape(3);