From 8c97127aa7b795f7e70746725c379b9f2c7b0ffd Mon Sep 17 00:00:00 2001 From: Alexey Ershov Date: Fri, 23 Oct 2020 15:19:20 +0300 Subject: [PATCH] [IE][VPU]: Proposal: Implemented support for optional 2nd output (scores) (#2762) * Proposal stage: added support for optional 2nd output * firmware updated --- inference-engine/cmake/vpu_dependencies.cmake | 2 +- .../graph_transformer/src/stages/proposal.cpp | 29 +++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/inference-engine/cmake/vpu_dependencies.cmake b/inference-engine/cmake/vpu_dependencies.cmake index be860581434..3ca64683e75 100644 --- a/inference-engine/cmake/vpu_dependencies.cmake +++ b/inference-engine/cmake/vpu_dependencies.cmake @@ -19,7 +19,7 @@ set(VPU_SUPPORTED_FIRMWARES usb-ma2450 usb-ma2x8x pcie-ma248x) # Default packages # -set(FIRMWARE_PACKAGE_VERSION 1404) +set(FIRMWARE_PACKAGE_VERSION 1419) set(VPU_CLC_MA2X8X_VERSION "movi-cltools-20.09.1") # diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/proposal.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/proposal.cpp index 103363dea89..5237c7b1f2f 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/proposal.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/proposal.cpp @@ -40,6 +40,7 @@ private: stridesInfo.setInput(inputEdge(1), StridesRequirement::compact()); stridesInfo.setInput(inputEdge(2), StridesRequirement::compact()); stridesInfo.setOutput(outputEdge(0), StridesRequirement::compact()); + stridesInfo.setOutput(outputEdge(1), StridesRequirement::compact()); } void finalizeDataLayoutImpl() override { @@ -49,7 +50,7 @@ private: } void initialCheckImpl() const override { - assertInputsOutputsTypes(this, {{DataType::FP16}, {DataType::FP16}, {DataType::FP16}}, {{DataType::FP16}}); + assertInputsOutputsTypes(this, {{DataType::FP16}, {DataType::FP16}, {DataType::FP16}}, {{DataType::FP16}, {DataType::FP16}}); } void serializeParamsImpl(BlobSerializer& serializer) const override { @@ -107,10 +108,12 @@ private: auto input0 = inputEdge(0)->input(); auto input1 = inputEdge(1)->input(); auto input2 = inputEdge(2)->input(); - auto output = outputEdge(0)->output(); + auto output0 = outputEdge(0)->output(); + auto output1 = outputEdge(1)->output(); input0->serializeBuffer(serializer); - output->serializeBuffer(serializer); + output0->serializeBuffer(serializer); + output1->serializeBuffer(serializer); input1->serializeBuffer(serializer); input2->serializeBuffer(serializer); tempBuffer(0)->serializeBuffer(serializer); @@ -122,14 +125,22 @@ private: void FrontEnd::parseProposal(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const { ie::details::CaselessEq cmp; - IE_ASSERT(inputs.size() == 3); + VPU_THROW_UNLESS((inputs.size() == 3), + "Proposal stage with name %s must have 3 inputs, " + "actually provided %d", layer->name, inputs.size()); + VPU_THROW_UNLESS((outputs.size() == 1) || (outputs.size() == 2), + "Proposal stage with name %s must have only 1 or 2 outputs, " + "actually provided %d", layer->name, outputs.size()); - // TODO: implement 2nd output, see: - // #-37327: Several models Failed to compile layer "proposals" - IE_ASSERT(outputs.size() == 1 || outputs.size() == 2); + DataVector tempOutputs(2); + tempOutputs[0] = outputs[0]; - const DataVector outputs1 = { outputs[0] }; // ignore 2nd output - auto stage = model->addNewStage(layer->name, StageType::Proposal, layer, inputs, outputs1); + if (outputs.size() < 2) + tempOutputs[1] = model->addFakeData(); + else + tempOutputs[1] = outputs[1]; + + auto stage = model->addNewStage(layer->name, StageType::Proposal, layer, inputs, tempOutputs); stage->attrs().set("feat_stride", layer->GetParamAsInt("feat_stride", 16)); stage->attrs().set("base_size", layer->GetParamAsInt("base_size", 16));