[IE][VPU]: Proposal: Implemented support for optional 2nd output (scores) (#2762)
authorAlexey Ershov <alexey.ershov@intel.com>
Fri, 23 Oct 2020 12:19:20 +0000 (15:19 +0300)
committerGitHub <noreply@github.com>
Fri, 23 Oct 2020 12:19:20 +0000 (15:19 +0300)
* Proposal stage: added support for optional 2nd output
* firmware updated

inference-engine/cmake/vpu_dependencies.cmake
inference-engine/src/vpu/graph_transformer/src/stages/proposal.cpp

index be86058..3ca6468 100644 (file)
@@ -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")
 
 #
index 103363d..5237c7b 100644 (file)
@@ -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<std::string> 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<ProposalStage>(layer->name, StageType::Proposal, layer, inputs, outputs1);
+    if (outputs.size() < 2)
+        tempOutputs[1] = model->addFakeData();
+    else
+        tempOutputs[1] = outputs[1];
+
+    auto stage = model->addNewStage<ProposalStage>(layer->name, StageType::Proposal, layer, inputs, tempOutputs);
 
     stage->attrs().set<int>("feat_stride", layer->GetParamAsInt("feat_stride", 16));
     stage->attrs().set<int>("base_size", layer->GetParamAsInt("base_size", 16));