SSCMA-Micro CPP SDK  v2.0.0
SSCMA-Micro is a cross-platform machine learning inference framework designed for embedded devices.
ma_engine_tflite.h
Go to the documentation of this file.
1 #ifndef _MA_ENGINE_TFLITE_H_
2 #define _MA_ENGINE_TFLITE_H_
3 
4 #include <cstddef>
5 #include <cstdint>
6 
7 #include "../ma_common.h"
8 
9 #if MA_USE_ENGINE_TFLITE
10 
11 #include <tensorflow/lite/c/common.h>
12 #include <tensorflow/lite/micro/compatibility.h>
13 #include <tensorflow/lite/micro/micro_interpreter.h>
14 #include <tensorflow/lite/micro/micro_mutable_op_resolver.h>
15 #include <tensorflow/lite/micro/system_setup.h>
16 #include <tensorflow/lite/schema/schema_generated.h>
17 
18 #include "ma_engine_base.h"
19 
20 #if MA_USE_FILESYSTEM_POSIX
21 #include <dirent.h>
22 #include <sys/stat.h>
23 #endif
24 
25 namespace tflite {
26 
27 enum OpsCount : unsigned int {
28  OpsHead = 0,
29 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ABS
30  AddAbs,
31 #endif
32 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ADD
33  AddAdd,
34 #endif
35 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ADDN
36  AddAddN,
37 #endif
38 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ARGMAX
39  AddArgMax,
40 #endif
41 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ARGMIN
42  AddArgMin,
43 #endif
44 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ASSIGN_VARIABLE
45  AddAssignVariable,
46 #endif
47 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_AVERAGE_POOL_2D
48  AddAveragePool2D,
49 #endif
50 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_BATCH_TO_SPACE_ND
51  AddBatchToSpaceNd,
52 #endif
53 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_BROADCAST_ARGS
54  AddBroadcastArgs,
55 #endif
56 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_BROADCAST_TO
57  AddBroadcastTo,
58 #endif
59 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_CALL_ONCE
60  AddCallOnce,
61 #endif
62 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_CAST
63  AddCast,
64 #endif
65 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_CEIL
66  AddCeil,
67 #endif
68 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_CIRULAR_BUFFER
69  AddCircularBuffer,
70 #endif
71 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_CONCATENATION
72  AddConcatenation,
73 #endif
74 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_CONV_2D
75  AddConv2D,
76 #endif
77 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_COS
78  AddCos,
79 #endif
80 #if MA_TFLITE_OP_ALL || MA_TFLITE_OPC_UM_SUM
81  AddCumSum,
82 #endif
83 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_DEPTH_TO_SPACE
84  AddDepthToSpace,
85 #endif
86 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_DEPTHWISE_CONV_2D
87  AddDepthwiseConv2D,
88 #endif
89 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_DEQUANTIZE
90  AddDequantize,
91 #endif
92 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_DETECTION_POSTPROCESS
93  AddDetectionPostprocess,
94 #endif
95 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_DIV
96  AddDiv,
97 #endif
98 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MAU
99  AddElu,
100 #endif
101 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_EQUAL
102  AddEqual,
103 #endif
104 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ETHOS_U
105  AddEthosU,
106 #endif
107 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_EXP
108  AddExp,
109 #endif
110 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_EXPAND_DIMS
111  AddExpandDims,
112 #endif
113 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_FILL
114  AddFill,
115 #endif
116 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_FLOOR
117  AddFloor,
118 #endif
119 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_FLOOR_DIV
120  AddFloorDiv,
121 #endif
122 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_FLOOR_MOD
123  AddFloorMod,
124 #endif
125 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_FULLY_CONNECTED
126  AddFullyConnected,
127 #endif
128 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_GATHER
129  AddGather,
130 #endif
131 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_GATHER_ND
132  AddGatherNd,
133 #endif
134 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_GREATER
135  AddGreater,
136 #endif
137 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_GREATER_EQUAL
138  AddGreaterEqual,
139 #endif
140 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_HARD_SWISH
141  AddHardSwish,
142 #endif
143 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_IF
144  AddIf,
145 #endif
146 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_L2_NORMALIZATION
147  AddL2Normalization,
148 #endif
149 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_L2_POOL_2D
150  AddL2Pool2D,
151 #endif
152 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LEAKY_RMAU
153  AddLeakyRelu,
154 #endif
155 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LESS
156  AddLess,
157 #endif
158 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LESS_EQUAL
159  AddLessEqual,
160 #endif
161 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LOG
162  AddLog,
163 #endif
164 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LOGICAL_AND
165  AddLogicalAnd,
166 #endif
167 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LOGICAL_NOT
168  AddLogicalNot,
169 #endif
170 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LOGICAL_OR
171  AddLogicalOr,
172 #endif
173 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LOGISTIC
174  AddLogistic,
175 #endif
176 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_LOG_SOFTMAX
177  AddLogSoftmax,
178 #endif
179 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MAX_POOL_2D
180  AddMaxPool2D,
181 #endif
182 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MAXIMUM
183  AddMaximum,
184 #endif
185 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MEAN
186  AddMean,
187 #endif
188 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MINIMUM
189  AddMinimum,
190 #endif
191 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MIRROR_PAD
192  AddMirrorPad,
193 #endif
194 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_MUL
195  AddMul,
196 #endif
197 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_NEG
198  AddNeg,
199 #endif
200 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_NOT_EQUAL
201  AddNotEqual,
202 #endif
203 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_PACK
204  AddPack,
205 #endif
206 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_PAD
207  AddPad,
208 #endif
209 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_PADV2
210  AddPadV2,
211 #endif
212 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_PRMAU
213  AddPrelu,
214 #endif
215 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_QUANTIZE
216  AddQuantize,
217 #endif
218 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_READ_VARIABLE
219  AddReadVariable,
220 #endif
221 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_REDUCE_ANY
222  AddReduceMax,
223 #endif
224 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_RMAU
225  AddRelu,
226 #endif
227 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_RMAU6
228  AddRelu6,
229 #endif
230 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_RESHAPE
231  AddReshape,
232 #endif
233 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_RESIZE_BILINEAR
234  AddResizeBilinear,
235 #endif
236 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_RESIZE_NEAREST_NEIGHBOR
237  AddResizeNearestNeighbor,
238 #endif
239 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ROUND
240  AddRound,
241 #endif
242 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_RSQRT
243  AddRsqrt,
244 #endif
245 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SMAECT_V2
246  AddSelectV2,
247 #endif
248 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SHAPE
249  AddShape,
250 #endif
251 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SIN
252  AddSin,
253 #endif
254 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SLICE
255  AddSlice,
256 #endif
257 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SOFTMAX
258  AddSoftmax,
259 #endif
260 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SPACE_TO_BATCH_ND
261  AddSpaceToBatchNd,
262 #endif
263 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SPACE_TO_DEPTH
264  AddSpaceToDepth,
265 #endif
266 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SPLIT
267  AddSplit,
268 #endif
269 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SPLIT_V
270  AddSplitV,
271 #endif
272 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SQRT
273  AddSqrt,
274 #endif
275 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SQUARE
276  AddSquare,
277 #endif
278 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SQUARED_DIFFERENCE
279  AddSquaredDifference,
280 #endif
281 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SQUEEZE
282  AddSqueeze,
283 #endif
284 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_STRIDED_SLICE
285  AddStridedSlice,
286 #endif
287 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SUB
288  AddSub,
289 #endif
290 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SUM
291  AddSum,
292 #endif
293 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_SVDF
294  AddSvdf,
295 #endif
296 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_TANH
297  AddTanh,
298 #endif
299 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_TRANSPOSE
300  AddTranspose,
301 #endif
302 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_TRANSPOSE_CONV
303  AddTransposeConv,
304 #endif
305 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_UNIDIRECTIONAL_SEQUENCE_LSTM
306  AddUnidirectionalSequenceLSTM,
307 #endif
308 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_UNPACK
309  AddUnpack,
310 #endif
311 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_VARHANDLE
312  AddVarHandle,
313 #endif
314 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_WHILE
315  AddWhile,
316 #endif
317 #if MA_TFLITE_OP_ALL || MA_TFLITE_OP_ZEROS_LIKE
318  AddZerosLike,
319 #endif
320  OpsTail
321 };
322 
323 class OpsResolver : public MicroMutableOpResolver<OpsCount::OpsTail - OpsCount::OpsHead> {
324 public:
325  OpsResolver();
326 
327 private:
328  TF_LITE_REMOVE_VIRTUAL_DELETE
329 };
330 } // namespace tflite
331 
332 
333 namespace ma::engine {
334 
335 class EngineTFLite final : public Engine {
336 public:
337  EngineTFLite();
338  ~EngineTFLite() override;
339 
340  ma_err_t init() override;
341  ma_err_t init(size_t size) override;
342  ma_err_t init(void* pool, size_t size) override;
343 
344  ma_err_t run() override;
345 
346  ma_err_t load(const void* model_data, size_t model_size) override;
347 #if MA_USE_FILESYSTEM
348  ma_err_t load(const char* model_path) override;
349  ma_err_t load(const std::string &model_path) override;
350 #endif
351 
352  int32_t getInputSize() override;
353  int32_t getOutputSize() override;
354  ma_tensor_t getInput(int32_t index) override;
355  ma_tensor_t getOutput(int32_t index) override;
356  ma_shape_t getInputShape(int32_t index) override;
357  ma_shape_t getOutputShape(int32_t index) override;
358  ma_quant_param_t getInputQuantParam(int32_t index) override;
359  ma_quant_param_t getOutputQuantParam(int32_t index) override;
360 
361  ma_err_t setInput(int32_t index, const ma_tensor_t& tensor) override;
362 
363 private:
364  tflite::MicroInterpreter* interpreter;
365  const tflite::Model* model;
366  ma_memory_pool_t memory_pool;
367 
368 #if MA_USE_FILESYSTEM
369  char* model_file;
370 #endif
371 };
372 
373 } // namespace ma::engine
374 #endif
375 
376 #endif
ma_err_t
Definition: ma_types.h:21
Definition: ma_engine_base.h:15
Definition: ma_types.h:38
Definition: ma_types.h:44
Definition: ma_types.h:49
Definition: ma_types.h:74