Skip to content
This repository was archived by the owner on Jun 23, 2024. It is now read-only.

Commit 5492672

Browse files
committed
libtf: Cleanup ops and split into two sizes.
1 parent db7af01 commit 5492672

File tree

7 files changed

+228
-42
lines changed

7 files changed

+228
-42
lines changed

libtf.cc

Lines changed: 170 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
#include "tensorflow/lite/micro/micro_interpreter.h"
1212

1313
#include "libtf.h"
14-
15-
#define LIBTF_MAX_OPS 72
14+
#define LIBTF_MAX_OPS 80
1615

1716
extern "C" {
1817
// These are set by openmv py_tf.c code to redirect printing to an error message buffer...
@@ -62,16 +61,108 @@ extern "C" {
6261
}
6362
}
6463

65-
static void libtf_init_op_resolver(tflite::MicroMutableOpResolver<LIBTF_MAX_OPS> &resolver) {
64+
typedef void (*libtf_resolver_init_t) (tflite::MicroMutableOpResolver<LIBTF_MAX_OPS> &);
65+
66+
static void libtf_reduced_ops_init_op_resolver(tflite::MicroMutableOpResolver<LIBTF_MAX_OPS> &resolver) {
67+
// resolver.AddAbs();
68+
resolver.AddAdd();
69+
resolver.AddAddN();
70+
// resolver.AddArgMax();
71+
// resolver.AddArgMin();
72+
resolver.AddAveragePool2D();
73+
// resolver.AddBatchMatMul(); - Doesn't compile in OpenMV Cam firmware
74+
// resolver.AddBatchToSpaceNd();
75+
// resolver.AddCast();
76+
// resolver.AddCeil();
77+
// resolver.AddCircularBuffer(); - Doesn't compile in OpenMV Cam firmware
78+
// resolver.AddComplexAbs();
79+
// resolver.AddConcatenation();
80+
resolver.AddConv2D();
81+
// resolver.AddCos();
82+
resolver.AddDepthwiseConv2D();
83+
// resolver.AddDequantize();
84+
// resolver.AddDetectionPostprocess();
85+
// resolver.AddDiv();
86+
// resolver.AddElu();
87+
// resolver.AddEqual();
88+
// resolver.AddEthosU();
89+
// resolver.AddExp();
90+
// resolver.AddExpandDims();
91+
// resolver.AddFloor();
92+
resolver.AddFullyConnected();
93+
// resolver.AddGather();
94+
// resolver.AddGreater();
95+
// resolver.AddGreaterEqual();
96+
// resolver.AddHardSwish();
97+
// resolver.AddImag();
98+
// resolver.AddL2Normalization();
99+
// resolver.AddL2Pool2D();
100+
resolver.AddLeakyRelu();
101+
// resolver.AddLess();
102+
// resolver.AddLessEqual();
103+
// resolver.AddLog();
104+
// resolver.AddLogicalAnd();
105+
// resolver.AddLogicalNot();
106+
// resolver.AddLogicalOr();
107+
resolver.AddLogistic();
108+
resolver.AddMaxPool2D();
109+
// resolver.AddMaximum();
110+
resolver.AddMean();
111+
// resolver.AddMinimum();
112+
// resolver.AddMul();
113+
// resolver.AddNeg();
114+
// resolver.AddNotEqual();
115+
// resolver.AddPack();
116+
resolver.AddPad();
117+
// resolver.AddPadV2();
118+
// resolver.AddPrelu();
119+
// resolver.AddQuantize();
120+
// resolver.AddReal();
121+
// resolver.AddReduceMax();
122+
// resolver.AddReduceMin();
123+
resolver.AddRelu();
124+
resolver.AddRelu6();
125+
resolver.AddReshape();
126+
// resolver.AddResizeNearestNeighbor();
127+
// resolver.AddRfft2D(); - Doesn't compile in OpenMV Cam firmware
128+
// resolver.AddRound();
129+
// resolver.AddRsqrt();
130+
// resolver.AddSelect();
131+
// resolver.AddSelectV2();
132+
resolver.AddShape();
133+
// resolver.AddSin();
134+
// resolver.AddSlice(); - Doesn't compile in OpenMV Cam firmware
135+
resolver.AddSoftmax();
136+
// resolver.AddSpaceToBatchNd();
137+
// resolver.AddSplit();
138+
// resolver.AddSplitV();
139+
// resolver.AddSqrt();
140+
// resolver.AddSquare();
141+
// resolver.AddSquaredDifference(); - Doesn't compile in OpenMV Cam firmware
142+
// resolver.AddSqueeze();
143+
// resolver.AddStridedSlice();
144+
resolver.AddSub();
145+
// resolver.AddSum();
146+
// resolver.AddSvdf();
147+
resolver.AddTanh();
148+
// resolver.AddTranspose(); - Doesn't compile in OpenMV Cam firmware
149+
// resolver.AddTransposeConv();
150+
// resolver.AddUnpack();
151+
// resolver.AddZerosLike();
152+
}
153+
154+
static void libtf_all_ops_init_op_resolver(tflite::MicroMutableOpResolver<LIBTF_MAX_OPS> &resolver) {
66155
resolver.AddAbs();
67156
resolver.AddAdd();
68157
resolver.AddAddN();
69158
resolver.AddArgMax();
70159
resolver.AddArgMin();
71160
resolver.AddAveragePool2D();
72-
// resolver.AddBatchMatMul();
161+
// resolver.AddBatchMatMul(); - Doesn't compile in OpenMV Cam firmware
73162
resolver.AddBatchToSpaceNd();
163+
resolver.AddCast();
74164
resolver.AddCeil();
165+
// resolver.AddCircularBuffer(); - Doesn't compile in OpenMV Cam firmware
75166
resolver.AddComplexAbs();
76167
resolver.AddConcatenation();
77168
resolver.AddConv2D();
@@ -121,35 +212,37 @@ extern "C" {
121212
resolver.AddRelu6();
122213
resolver.AddReshape();
123214
resolver.AddResizeNearestNeighbor();
124-
// resolver.AddRfft2D();
215+
// resolver.AddRfft2D(); - Doesn't compile in OpenMV Cam firmware
125216
resolver.AddRound();
126217
resolver.AddRsqrt();
127218
// resolver.AddSelect();
128219
// resolver.AddSelectV2();
129220
resolver.AddShape();
130221
resolver.AddSin();
131-
// resolver.AddSlice();
222+
// resolver.AddSlice(); - Doesn't compile in OpenMV Cam firmware
132223
resolver.AddSoftmax();
133224
resolver.AddSpaceToBatchNd();
134225
resolver.AddSplit();
135226
resolver.AddSplitV();
136227
resolver.AddSqrt();
137228
resolver.AddSquare();
138-
// resolver.AddSquaredDifference();
229+
// resolver.AddSquaredDifference(); - Doesn't compile in OpenMV Cam firmware
139230
resolver.AddSqueeze();
140231
resolver.AddStridedSlice();
141232
resolver.AddSub();
142233
resolver.AddSum();
143234
resolver.AddSvdf();
144235
resolver.AddTanh();
145-
// resolver.AddTranspose();
236+
// resolver.AddTranspose(); - Doesn't compile in OpenMV Cam firmware
146237
resolver.AddTransposeConv();
147238
resolver.AddUnpack();
239+
resolver.AddZerosLike();
148240
}
149241

150-
int libtf_get_parameters(const unsigned char *model_data,
151-
unsigned char *tensor_arena, size_t tensor_arena_size,
152-
libtf_parameters_t *params) {
242+
static int libtf_get_parameters(const unsigned char *model_data,
243+
unsigned char *tensor_arena, size_t tensor_arena_size,
244+
libtf_parameters_t *params,
245+
libtf_resolver_init_t libtf_resolver_init) {
153246
RegisterDebugLogCallback(libtf_debug_log);
154247

155248
tflite::MicroErrorReporter micro_error_reporter;
@@ -168,7 +261,7 @@ extern "C" {
168261
}
169262

170263
tflite::MicroMutableOpResolver<LIBTF_MAX_OPS> resolver;
171-
libtf_init_op_resolver(resolver);
264+
libtf_resolver_init(resolver);
172265

173266
tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, tensor_arena_size, error_reporter);
174267

@@ -287,13 +380,36 @@ extern "C" {
287380
return 0;
288381
}
289382

290-
int libtf_invoke(const unsigned char *model_data,
291-
unsigned char *tensor_arena,
292-
libtf_parameters_t *params,
293-
libtf_input_data_callback_t input_callback,
294-
void *input_callback_data,
295-
libtf_output_data_callback_t output_callback,
296-
void *output_callback_data) {
383+
int libtf_reduced_ops_get_parameters(const unsigned char *model_data,
384+
unsigned char *tensor_arena,
385+
size_t tensor_arena_size,
386+
libtf_parameters_t *params) {
387+
return libtf_get_parameters(model_data,
388+
tensor_arena,
389+
tensor_arena_size,
390+
params,
391+
libtf_reduced_ops_init_op_resolver);
392+
}
393+
394+
int libtf_all_ops_get_parameters(const unsigned char *model_data,
395+
unsigned char *tensor_arena,
396+
size_t tensor_arena_size,
397+
libtf_parameters_t *params) {
398+
return libtf_get_parameters(model_data,
399+
tensor_arena,
400+
tensor_arena_size,
401+
params,
402+
libtf_all_ops_init_op_resolver);
403+
}
404+
405+
static int libtf_invoke(const unsigned char *model_data,
406+
unsigned char *tensor_arena,
407+
libtf_parameters_t *params,
408+
libtf_input_data_callback_t input_callback,
409+
void *input_callback_data,
410+
libtf_output_data_callback_t output_callback,
411+
void *output_callback_data,
412+
libtf_resolver_init_t libtf_resolver_init) {
297413
RegisterDebugLogCallback(libtf_debug_log);
298414

299415
tflite::MicroErrorReporter micro_error_reporter;
@@ -314,7 +430,7 @@ extern "C" {
314430
}
315431

316432
tflite::MicroMutableOpResolver<LIBTF_MAX_OPS> resolver;
317-
libtf_init_op_resolver(resolver);
433+
libtf_resolver_init(resolver);
318434

319435
tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, tensor_arena_size, error_reporter);
320436

@@ -335,6 +451,40 @@ extern "C" {
335451
return 0;
336452
}
337453

454+
int libtf_reduced_ops_invoke(const unsigned char *model_data,
455+
unsigned char *tensor_arena,
456+
libtf_parameters_t *params,
457+
libtf_input_data_callback_t input_callback,
458+
void *input_callback_data,
459+
libtf_output_data_callback_t output_callback,
460+
void *output_callback_data) {
461+
return libtf_invoke(model_data,
462+
tensor_arena,
463+
params,
464+
input_callback,
465+
input_callback_data,
466+
output_callback,
467+
output_callback_data,
468+
libtf_reduced_ops_init_op_resolver);
469+
}
470+
471+
int libtf_all_ops_invoke(const unsigned char *model_data,
472+
unsigned char *tensor_arena,
473+
libtf_parameters_t *params,
474+
libtf_input_data_callback_t input_callback,
475+
void *input_callback_data,
476+
libtf_output_data_callback_t output_callback,
477+
void *output_callback_data) {
478+
return libtf_invoke(model_data,
479+
tensor_arena,
480+
params,
481+
input_callback,
482+
input_callback_data,
483+
output_callback,
484+
output_callback_data,
485+
libtf_all_ops_init_op_resolver);
486+
}
487+
338488
int libtf_initialize_micro_features() {
339489
RegisterDebugLogCallback(libtf_debug_log);
340490

libtf.h

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,18 @@ typedef struct libtf_parameters {
3333
// Call this first to get the model parameters.
3434
// Returns 0 on success and 1 on failure.
3535
// Errors are printed to stdout.
36-
int libtf_get_parameters(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
37-
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
38-
size_t tensor_arena_size, // Size of the above scratch buffer.
39-
libtf_parameters_t *params); // Struct to hold model parameters.
36+
int libtf_reduced_ops_get_parameters(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
37+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
38+
size_t tensor_arena_size, // Size of the above scratch buffer.
39+
libtf_parameters_t *params); // Struct to hold model parameters.
40+
41+
// Call this first to get the model parameters.
42+
// Returns 0 on success and 1 on failure.
43+
// Errors are printed to stdout.
44+
int libtf_all_ops_get_parameters(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
45+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
46+
size_t tensor_arena_size, // Size of the above scratch buffer.
47+
libtf_parameters_t *params); // Struct to hold model parameters.
4048

4149
// Callback to populate the model input data byte array (laid out in [height][width][channel] order).
4250
typedef void (*libtf_input_data_callback_t)(void *callback_data,
@@ -50,13 +58,23 @@ typedef void (*libtf_output_data_callback_t)(void *callback_data,
5058

5159
// Returns 0 on success and 1 on failure.
5260
// Errors are printed to stdout.
53-
int libtf_invoke(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
54-
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
55-
libtf_parameters_t *params, // Struct with model parameters.
56-
libtf_input_data_callback_t input_callback, // Callback to populate the model input data byte array.
57-
void *input_callback_data, // User data structure passed to input callback.
58-
libtf_output_data_callback_t output_callback, // Callback to use the model output data byte array.
59-
void *output_callback_data); // User data structure passed to output callback.
61+
int libtf_reduced_ops_invoke(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
62+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
63+
libtf_parameters_t *params, // Struct with model parameters.
64+
libtf_input_data_callback_t input_callback, // Callback to populate the model input data byte array.
65+
void *input_callback_data, // User data structure passed to input callback.
66+
libtf_output_data_callback_t output_callback, // Callback to use the model output data byte array.
67+
void *output_callback_data); // User data structure passed to output callback.
68+
69+
// Returns 0 on success and 1 on failure.
70+
// Errors are printed to stdout.
71+
int libtf_all_ops_invoke(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
72+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
73+
libtf_parameters_t *params, // Struct with model parameters.
74+
libtf_input_data_callback_t input_callback, // Callback to populate the model input data byte array.
75+
void *input_callback_data, // User data structure passed to input callback.
76+
libtf_output_data_callback_t output_callback, // Callback to use the model output data byte array.
77+
void *output_callback_data); // User data structure passed to output callback.
6078

6179
// Returns 0 on success and 1 on failure.
6280
// Errors are printed to stdout.

libtf/cortex-m0plus/libtf.a

6.99 KB
Binary file not shown.

libtf/cortex-m4/libtf.a

5.59 KB
Binary file not shown.

libtf/cortex-m55/libtf.a

5.46 KB
Binary file not shown.

libtf/cortex-m7/libtf.a

5.46 KB
Binary file not shown.

libtf/libtf.h

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,18 @@ typedef struct libtf_parameters {
3333
// Call this first to get the model parameters.
3434
// Returns 0 on success and 1 on failure.
3535
// Errors are printed to stdout.
36-
int libtf_get_parameters(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
37-
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
38-
size_t tensor_arena_size, // Size of the above scratch buffer.
39-
libtf_parameters_t *params); // Struct to hold model parameters.
36+
int libtf_reduced_ops_get_parameters(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
37+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
38+
size_t tensor_arena_size, // Size of the above scratch buffer.
39+
libtf_parameters_t *params); // Struct to hold model parameters.
40+
41+
// Call this first to get the model parameters.
42+
// Returns 0 on success and 1 on failure.
43+
// Errors are printed to stdout.
44+
int libtf_all_ops_get_parameters(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
45+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
46+
size_t tensor_arena_size, // Size of the above scratch buffer.
47+
libtf_parameters_t *params); // Struct to hold model parameters.
4048

4149
// Callback to populate the model input data byte array (laid out in [height][width][channel] order).
4250
typedef void (*libtf_input_data_callback_t)(void *callback_data,
@@ -50,13 +58,23 @@ typedef void (*libtf_output_data_callback_t)(void *callback_data,
5058

5159
// Returns 0 on success and 1 on failure.
5260
// Errors are printed to stdout.
53-
int libtf_invoke(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
54-
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
55-
libtf_parameters_t *params, // Struct with model parameters.
56-
libtf_input_data_callback_t input_callback, // Callback to populate the model input data byte array.
57-
void *input_callback_data, // User data structure passed to input callback.
58-
libtf_output_data_callback_t output_callback, // Callback to use the model output data byte array.
59-
void *output_callback_data); // User data structure passed to output callback.
61+
int libtf_reduced_ops_invoke(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
62+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
63+
libtf_parameters_t *params, // Struct with model parameters.
64+
libtf_input_data_callback_t input_callback, // Callback to populate the model input data byte array.
65+
void *input_callback_data, // User data structure passed to input callback.
66+
libtf_output_data_callback_t output_callback, // Callback to use the model output data byte array.
67+
void *output_callback_data); // User data structure passed to output callback.
68+
69+
// Returns 0 on success and 1 on failure.
70+
// Errors are printed to stdout.
71+
int libtf_all_ops_invoke(const unsigned char *model_data, // TensorFlow Lite binary model (8-bit quant).
72+
unsigned char *tensor_arena, // As big as you can make it scratch buffer.
73+
libtf_parameters_t *params, // Struct with model parameters.
74+
libtf_input_data_callback_t input_callback, // Callback to populate the model input data byte array.
75+
void *input_callback_data, // User data structure passed to input callback.
76+
libtf_output_data_callback_t output_callback, // Callback to use the model output data byte array.
77+
void *output_callback_data); // User data structure passed to output callback.
6078

6179
// Returns 0 on success and 1 on failure.
6280
// Errors are printed to stdout.

0 commit comments

Comments
 (0)