1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
10 #include <unordered_map>
11 #include <unordered_set>
15 #include <cpp/ie_cnn_network.h>
16 #include <details/caseless.hpp>
18 #include <vpu/frontend/stage_builder.hpp>
19 #include <vpu/frontend/parse_network.hpp>
20 #include <vpu/model/model.hpp>
21 #include <vpu/custom_layer.hpp>
22 #include <vpu/utils/enums.hpp>
26 namespace ie = InferenceEngine;
29 class FrontEnd final : public std::enable_shared_from_this<FrontEnd> {
35 using Ptr = std::shared_ptr<FrontEnd>;
37 explicit FrontEnd(const StageBuilder::Ptr& stageBuilder) : _stageBuilder(stageBuilder) {}
39 Model::Ptr buildInitialModel(const ie::ICNNNetwork& network);
41 std::set<std::string> checkSupportedLayers(const ie::ICNNNetwork& network);
43 const std::vector<ie::CNNLayerPtr>& allLayers() const { return _ieNetworkParser.orderedLayers; }
50 Model::Ptr runCommonPasses(
51 const ie::ICNNNetwork& network,
54 ie::CNNNetwork detectNetworkBatch(
55 const ie::ICNNNetwork& network,
56 const Model::Ptr& model);
58 void RemoveConstLayers(ie::ICNNNetwork& network);
60 void parseInputAndOutputData(const Model::Ptr& model);
61 void addDataTypeConvertStages(const Model::Ptr& model);
62 void addPreProcessStages(const Model::Ptr& model);
64 void eliminatePriorBoxData(const Model::Ptr& model);
72 // Layers, that might be both SW and HW
75 void parseConvolution(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
76 void parsePooling(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
77 void parseFullyConnected(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
83 void parseReLU(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
84 void parseSoftMax(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
85 void parseGRN(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
86 void parseMVN(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
87 void parseNorm(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
88 void parsePower(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
89 void parseScale(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
90 void parsePermute(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
91 void parseDetectionOutput(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
92 void parseEltwise(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
93 void parseSigmoid(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
94 void parseTanH(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
95 void parsePReLU(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
96 void parseBatchNorm(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
97 void parseDeconvolution(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
98 void parseCopy(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
99 void parseELU(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
100 void parseCrop(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
101 void parseTile(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
102 void parseNormalize(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
103 void parseRegionYolo(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
104 void parseReorgYolo(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
105 void parseBias(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
106 void parseCTCDecoder(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
107 void parseInterp(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
108 void parseClamp(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
109 void parseProposal(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
110 void parseROIPooling(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
111 void parsePSROIPooling(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
112 void parseCustom(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
113 void parseMTCNN(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
114 void parseLSTMCell(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
115 void parsePad(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
116 void parseResample(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
117 void parseArgMax(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
118 void parseRNN(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
119 void parseGEMM(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
120 void parseLog(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
121 void parseExp(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
122 void parseReverseSequence(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
123 void parseGather(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
124 void parseReduce(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
125 void parseFloor(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
126 void parseTopK(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
127 void parseSelect(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
133 void parsePriorBox(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
134 void parsePriorBoxClustered(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
135 void parseReshape(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
136 void parseConcat(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
137 void parseSplit(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
138 void parseStridedSlice(const Model::Ptr& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs);
145 Data getVpuData(const ie::DataPtr& ieData);
146 void bindData(const Data& data, const ie::DataPtr& ieData);
148 void getInputAndOutputData(
149 const Model::Ptr& model,
150 const ie::CNNLayerPtr& layer,
152 DataVector& outputs);
154 std::tuple<Data, Data> getWeightsAndBiases(
155 const Model::Ptr& model,
156 const ie::CNNLayerPtr& layer);
163 StageBuilder::Ptr _stageBuilder;
165 std::unordered_set<ie::DataPtr> _unbatchedOutputs;
166 std::unordered_map<ie::DataPtr, Data> _ieToVpuMap;
168 ie::details::caseless_map<std::string, std::vector<CustomLayer::Ptr>> _customLayers;
169 ie::details::caseless_map<std::string, vpu::Data> kernelNodes;
170 std::unordered_map<ie::Blob::Ptr, vpu::Data> lstmWeights;
171 std::unordered_map<ie::Blob::Ptr, vpu::Data> lstmBiases;
172 vpu::IeNetworkParser _ieNetworkParser;