11 #include <schema_generated.h> 13 #include <unordered_map> 16 #include <tensorflow/lite/version.h> 18 #if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 3) 19 #define ARMNN_POST_TFLITE_2_3 29 using ModelPtr = std::unique_ptr<tflite::ModelT>;
52 const std::string& name)
const;
57 const std::string& name)
const;
90 const std::vector<int32_t>& targetDimsIn);
105 using OperatorParsingFunction = void(
TfLiteParserImpl::*)(
size_t subgraphIndex,
size_t operatorIndex);
107 void ParseCustomOperator(
size_t subgraphIndex,
size_t operatorIndex);
108 void ParseUnsupportedOperator(
size_t subgraphIndex,
size_t operatorIndex);
110 void ParseAbs(
size_t subgraphIndex,
size_t operatorIndex);
112 void ParseAdd(
size_t subgraphIndex,
size_t operatorIndex);
114 void ParseArgMin(
size_t subgraphIndex,
size_t operatorIndex);
115 void ParseArgMax(
size_t subgraphIndex,
size_t operatorIndex);
116 void ParseAveragePool2D(
size_t subgraphIndex,
size_t operatorIndex);
117 void ParseBatchMatMul(
size_t subgraphIndex,
size_t operatorIndex);
118 void ParseBatchToSpaceND(
size_t subgraphIndex,
size_t operatorIndex);
119 void ParseCast(
size_t subgraphIndex,
size_t operatorIndex);
121 void ParseConcatenation(
size_t subgraphIndex,
size_t operatorIndex);
122 void ParseConv2D(
size_t subgraphIndex,
size_t operatorIndex);
124 #if defined(ARMNN_POST_TFLITE_2_4) 125 void ParseConv3D(
size_t subgraphIndex,
size_t operatorIndex);
127 void ParseDepthToSpace(
size_t subgraphIndex,
size_t operatorIndex);
128 void ParseDepthwiseConv2D(
size_t subgraphIndex,
size_t operatorIndex);
129 void ParseDequantize(
size_t subgraphIndex,
size_t operatorIndex);
130 void ParseDetectionPostProcess(
size_t subgraphIndex,
size_t operatorIndex);
131 void ParseDiv(
size_t subgraphIndex,
size_t operatorIndex);
132 void ParseElementwiseUnary(
size_t subgraphIndex,
size_t operatorIndex,
armnn::UnaryOperation unaryOperation);
133 void ParseElu(
size_t subgraphIndex,
size_t operatorIndex);
134 void ParseEqual(
size_t subgraphIndex,
size_t operatorIndex);
135 void ParseExp(
size_t subgraphIndex,
size_t operatorIndex);
136 void ParseExpandDims(
size_t subgraphIndex,
size_t operatorIndex);
137 void ParseFloorDiv(
size_t subgraphIndex,
size_t operatorIndex);
138 void ParseFullyConnected(
size_t subgraphIndex,
size_t operatorIndex);
139 void ParseGather(
size_t subgraphIndex,
size_t operatorIndex);
140 void ParseGatherNd(
size_t subgraphIndex,
size_t operatorIndex);
141 void ParseGreater(
size_t subgraphIndex,
size_t operatorIndex);
142 void ParseGreaterOrEqual(
size_t subgraphIndex,
size_t operatorIndex);
143 void ParseHardSwish(
size_t subgraphIndex,
size_t operatorIndex);
144 void ParseLeakyRelu(
size_t subgraphIndex,
size_t operatorIndex);
145 void ParseLess(
size_t subgraphIndex,
size_t operatorIndex);
146 void ParseLessOrEqual(
size_t subgraphIndex,
size_t operatorIndex);
147 void ParseLog(
size_t subgraphIndex,
size_t operatorIndex);
148 void ParseLocalResponseNormalization(
size_t subgraphIndex,
size_t operatorIndex);
149 void ParseLogicalNot(
size_t subgraphIndex,
size_t operatorIndex);
150 void ParseLogistic(
size_t subgraphIndex,
size_t operatorIndex);
151 void ParseLogSoftmax(
size_t subgraphIndex,
size_t operatorIndex);
152 void ParseL2Normalization(
size_t subgraphIndex,
size_t operatorIndex);
153 void ParseMaxPool2D(
size_t subgraphIndex,
size_t operatorIndex);
154 void ParseMaximum(
size_t subgraphIndex,
size_t operatorIndex);
155 void ParseMean(
size_t subgraphIndex,
size_t operatorIndex);
156 void ParseMinimum(
size_t subgraphIndex,
size_t operatorIndex);
157 void ParseMirrorPad(
size_t subgraphIndex,
size_t operatorIndex);
158 void ParseMul(
size_t subgraphIndex,
size_t operatorIndex);
159 void ParseNeg(
size_t subgraphIndex,
size_t operatorIndex);
160 void ParseNotEqual(
size_t subgraphIndex,
size_t operatorIndex);
161 void ParsePack(
size_t subgraphIndex,
size_t operatorIndex);
162 void ParsePad(
size_t subgraphIndex,
size_t operatorIndex);
164 void ParsePrelu(
size_t subgraphIndex,
size_t operatorIndex);
165 void ParseQuantize(
size_t subgraphIndex,
size_t operatorIndex);
167 void ParseReduceMax(
size_t subgraphIndex,
size_t operatorIndex);
168 void ParseReduceMin(
size_t subgraphIndex,
size_t operatorIndex);
169 void ParseReduceProd(
size_t subgraphIndex,
size_t operatorIndex);
170 void ParseRelu(
size_t subgraphIndex,
size_t operatorIndex);
171 void ParseRelu6(
size_t subgraphIndex,
size_t operatorIndex);
172 void ParseReshape(
size_t subgraphIndex,
size_t operatorIndex);
173 void ParseResize(
size_t subgraphIndex,
size_t operatorIndex,
armnn::ResizeMethod resizeMethod);
174 void ParseResizeBilinear(
size_t subgraphIndex,
size_t operatorIndex);
175 void ParseResizeNearestNeighbor(
size_t subgraphIndex,
size_t operatorIndex);
176 void ParseRsqrt(
size_t subgraphIndex,
size_t operatorIndex);
177 void ParseShape(
size_t subgraphIndex,
size_t operatorIndex);
178 void ParseSin(
size_t subgraphIndex,
size_t operatorIndex);
179 void ParseSlice(
size_t subgraphIndex,
size_t operatorIndex);
180 void ParseSoftmax(
size_t subgraphIndex,
size_t operatorIndex);
181 void ParseSqrt(
size_t subgraphIndex,
size_t operatorIndex);
182 void ParseSpaceToBatchND(
size_t subgraphIndex,
size_t operatorIndex);
183 void ParseSplit(
size_t subgraphIndex,
size_t operatorIndex);
184 void ParseSplitV(
size_t subgraphIndex,
size_t operatorIndex);
185 void ParseSqueeze(
size_t subgraphIndex,
size_t operatorIndex);
186 void ParseStridedSlice(
size_t subgraphIndex,
size_t operatorIndex);
187 void ParseSub(
size_t subgraphIndex,
size_t operatorIndex);
188 void ParseSum(
size_t subgraphIndex,
size_t operatorIndex);
189 void ParseTanH(
size_t subgraphIndex,
size_t operatorIndex);
190 void ParseTranspose(
size_t subgraphIndex,
size_t operatorIndex);
191 void ParseTransposeConv(
size_t subgraphIndex,
size_t operatorIndex);
192 void ParseUnidirectionalSequenceLSTM(
size_t subgraphIndex,
size_t operatorIndex);
193 void ParseUnpack(
size_t subgraphIndex,
size_t operatorIndex);
195 void RegisterProducerOfTensor(
size_t subgraphIndex,
size_t tensorIndex,
armnn::IOutputSlot* slot);
196 void RegisterConsumerOfTensor(
size_t subgraphIndex,
size_t tensorIndex,
armnn::IInputSlot* slot);
197 void RegisterInputSlots(
size_t subgraphIndex,
198 size_t operatorIndex,
200 const std::vector<unsigned int>& tensorIndexes,
201 unsigned int startingSlotIndex = 0);
202 void RegisterOutputSlots(
size_t subgraphIndex,
203 size_t operatorIndex,
205 const std::vector<unsigned int>& tensorIndexes);
207 void SetupInputLayers(
size_t subgraphIndex);
208 void SetupOutputLayers(
size_t subgraphIndex);
209 void SetupConstantLayers(
size_t subgraphIndex);
213 void AddBroadcastReshapeLayer(
size_t subgraphIndex,
214 size_t operatorIndex,
219 unsigned int outputSlot,
220 tflite::ActivationFunctionType activationType);
227 struct SupportedDataStorage
231 SupportedDataStorage(std::unique_ptr<
float[]>&& data);
232 SupportedDataStorage(std::unique_ptr<uint8_t[]>&& data);
233 SupportedDataStorage(std::unique_ptr<int8_t[]>&& data);
234 SupportedDataStorage(std::unique_ptr<int32_t[]>&& data);
238 std::unique_ptr<float[]> m_FloatData;
239 std::unique_ptr<uint8_t[]> m_Uint8Data;
240 std::unique_ptr<int8_t[]> m_Int8Data;
241 std::unique_ptr<int32_t[]> m_Int32Data;
244 bool ShouldConstantTensorBeCreated(
unsigned int tensorIndex);
249 std::pair<armnn::ConstTensor, SupportedDataStorage>
253 std::pair<armnn::ConstTensor, std::unique_ptr<float[]>>
259 std::pair<armnn::ConstTensor, TfLiteParserImpl::SupportedDataStorage>
264 std::pair<armnn::ConstTensor*, std::unique_ptr<float[]>>
275 std::vector<OperatorParsingFunction> m_ParserFunctions;
276 std::unordered_map<std::string, OperatorParsingFunction> m_CustomParserFunctions;
284 std::vector<armnn::IInputSlot*> inputSlots;
286 TensorSlots() : outputSlot(nullptr) { }
288 typedef std::vector<TensorSlots> TensorConnections;
291 std::vector<TensorConnections> m_SubgraphConnections;
295 std::vector<std::vector<unsigned int>> m_OverridenOutputShapes;
297 std::vector<unsigned int> m_ConstantsToDequantize;
298 std::vector<unsigned int> m_ConstantsToBeCreated;
std::unique_ptr< tflite::TensorT > TensorPtr
std::unique_ptr< tflite::ModelT > ModelPtr
static TensorIdRawPtrVector GetSubgraphOutputs(const ModelPtr &model, size_t subgraphIndex)
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
const tflite::TensorT * TensorRawPtr
const tflite::BufferT * BufferRawPtr
BindingPointInfo GetNetworkOutputBindingInfo(size_t subgraphId, const std::string &name) const
Retrieve binding info (layer id and tensor info) for the network output identified by the given layer...
std::vector< std::string > GetSubgraphOutputTensorNames(size_t subgraphId) const
Return the output tensor names for a given subgraph.
~TfLiteParserImpl()=default
std::unique_ptr< tflite::OperatorT > OperatorPtr
static armnn::TensorInfo OutputShapeOfReshape(const armnn::TensorInfo &inputTensorInfo, const std::vector< int32_t > &targetDimsIn)
TfLiteParserImpl(const armnn::Optional< ITfLiteParser::TfLiteParserOptions > &options=armnn::EmptyOptional())
std::unique_ptr< tflite::BufferT > BufferPtr
armnn::INetworkPtr CreateNetworkFromBinary(const std::vector< uint8_t > &binaryContent)
Create the network from a flatbuffers binary.
static BufferRawPtr GetBuffer(const ModelPtr &model, size_t bufferIndex)
armnn::INetworkPtr CreateNetworkFromBinaryFile(const char *graphFile)
Create the network from a flatbuffers binary file on disk.
std::unique_ptr< tflite::OperatorCodeT > OperatorCodePtr
BindingPointInfo GetNetworkInputBindingInfo(size_t subgraphId, const std::string &name) const
Retrieve binding info (layer id and tensor info) for the network input identified by the given layer ...
static ModelPtr LoadModelFromBinary(const uint8_t *binaryContent, size_t len)
std::vector< TensorIdRawPtr > TensorIdRawPtrVector
static std::vector< int32_t > & GetInputTensorIds(const ModelPtr &model, size_t subgraphIndex, size_t operatorIndex)
An output connection slot for a layer.
static const std::string GetVersion()
Retrieve version in X.Y.Z form.
static ModelPtr LoadModelFromFile(const char *fileName)
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
std::vector< TensorRawPtr > TensorRawPtrVector
size_t GetSubgraphCount() const
Return the number of subgraphs in the parsed model.
armnn::INetworkPtr LoadModel(std::unique_ptr< tflite::ModelT > model)
std::pair< size_t, TensorRawPtr > TensorIdRawPtr
std::unique_ptr< tflite::SubGraphT > SubgraphPtr
static TensorIdRawPtrVector GetSubgraphInputs(const ModelPtr &model, size_t subgraphIndex)
static TensorRawPtrVector GetInputs(const ModelPtr &model, size_t subgraphIndex, size_t operatorIndex)
static TensorRawPtrVector GetOutputs(const ModelPtr &model, size_t subgraphIndex, size_t operatorIndex)
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
static std::vector< int32_t > & GetOutputTensorIds(const ModelPtr &model, size_t subgraphIndex, size_t operatorIndex)
armnn::BindingPointInfo BindingPointInfo
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
armnn::INetworkPtr CreateNetworkFromBinaryAsDynamic(const std::vector< uint8_t > &binaryContent)
static armnn::TensorInfo OutputShapeOfSqueeze(std::vector< uint32_t > squeezeDims, const armnn::TensorInfo &inputTensorInfo)
std::vector< std::string > GetSubgraphInputTensorNames(size_t subgraphId) const
Return the input tensor names for a given subgraph.