Skip to content

Commit 166658f

Browse files
updating more stuff
1 parent dcfc80c commit 166658f

File tree

9 files changed

+176
-32
lines changed

9 files changed

+176
-32
lines changed

src/embedded_ml_sdk/classifiers/nnom_middleware/nnom_middleware.c

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,33 +25,39 @@ License along with SensiML Piccolo AI. If not, see <https://www.gnu.org/licenses
2525

2626
float results[NNOM_MAX_NUMBER_REULTS];
2727

28-
nnom_classifier_rows_t NNOMClassifierTable;
28+
nnom_classifier_rows_t nnom_classifier_rows;
29+
float probability;
30+
int32_t label;
2931

30-
uint8_t tf_micro_simple_submit(uint8_t classifier_id, feature_vector_t *feature_vector, model_results_t *model_results)
32+
int last_nnom_initialized = 0;
33+
nnom_model_t* model;
34+
uint8_t nnom_simple_submit(uint8_t classifier_id, feature_vector_t *feature_vector, model_results_t *model_results)
3135
{
3236
uint8_t y = 1;
3337
float max_result = 0;
3438

3539
if (last_nnom_initialized != classifier_id)
3640
{
37-
micro_model_setup(NNOMClassifierTable[classifier_id].model_data, NNOMClassifierTable[classifier_id].kTensorArenaSize, NNOMClassifierTable[classifier_id].tensor_arena);
38-
last_nnom_initialized = classifier_id;
41+
model = nnom_model_create();
42+
//nnom_classifier_rows[0].model=model
43+
last_nnom_initialized = classifier_id;
3944
}
4045

41-
memcpy(nnom_input_data, feature_vector.data, feature_vector.size);
42-
nnom_predict(NNOMClassifierTable[classifier_id].model, &model_results.result, &model_results.output_tensor);
46+
memcpy(nnom_input_data, feature_vector->data, feature_vector->size);
47+
nnom_predict(nnom_classifier_rows[classifier_id].model, &label, &probability);
4348

4449

4550
// regression
46-
if (NNOMClassifierTable[classifier_id].estimator_type == ESTIMATOR_TYPE_REGRESSION)
51+
if (nnom_classifier_rows[classifier_id].estimator_type == ESTIMATOR_TYPE_REGRESSION)
4752
{
48-
return (uint8_t)results[0];
53+
return (uint8_t)label;
4954
}
5055

5156
// classification
57+
/*
5258
max_result = results[0];
5359
model_results->output_tensor->data[0] = (int16_t)results[0];
54-
for (int32_t i = 1; i < NNOMClassifierTable[classifier_id].num_outputs; i++)
60+
for (int32_t i = 1; i < nnom_classifier_rows[classifier_id].num_outputs; i++)
5561
{
5662
if (results[i] > max_result)
5763
{
@@ -61,30 +67,33 @@ uint8_t tf_micro_simple_submit(uint8_t classifier_id, feature_vector_t *feature_
6167
model_results->output_tensor->data[i] = (int16_t)results[i];
6268
}
6369
64-
if (max_result < NNOMClassifierTable[classifier_id].threshold)
70+
71+
if (max_result < nnom_classifier_rows[classifier_id].threshold)
6572
{
6673
model_results->result = 0.0f;
6774
return 0;
6875
}
69-
70-
model_results->result = (float)y;
71-
72-
return y;
76+
77+
*/
78+
model_results->result = (float)label;
79+
80+
return float(label);
7381
}
7482

75-
void nnom_init(tf_micro_classifier_rows_t *classifier_table, const uint8_t num_classifiers)
83+
void nnom_init(nnom_classifier_rows_t *classifier_table, const uint8_t num_classifiers)
7684
{
7785
model = nnom_model_create();
78-
NNOMClassifierTable = classifier_table;
79-
NNOMClassifierTable[0].model=model
86+
nnom_classifier_rows = classifier_table;
87+
nnom_classifier_rows[0].model=model
88+
last_nnom_initialized=0
8089

8190
}
8291

8392
void nnom_model_results_object(int32_t classifier_id, model_results_t *model_results)
8493
{
85-
for (int32_t i = 0; i < NNOMClassifierTable[classifier_id].num_outputs; i++)
94+
for (int32_t i = 0; i < nnom_classifier_rows[classifier_id].num_outputs; i++)
8695
{
8796
model_results->output_tensor->data[i] = results[i];
8897
}
89-
model_results->output_tensor->size = NNOMClassifierTable[classifier_id].num_outputs;
98+
model_results->output_tensor->size = nnom_classifier_rows[classifier_id].num_outputs;
9099
}

src/server/codegen/knowledgepack_codegen_mixin.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,7 @@ def create_kb_classifier_init(self, classifier_types):
419419

420420
if self.is_tensorflow(classifier_types):
421421
if self.nn_inference_engine == "nnom":
422-
#TODO: NNoM
423-
pass
422+
output.append(c_line(1, "nnom_init(tf_micro_classifier_rows, 0);"))
424423

425424
if self.nn_inference_engine == "tf_micro":
426425
output.append(c_line(1, "tf_micro_init(tf_micro_classifier_rows, 0);"))

src/server/codegen/knowledgepack_fill_files_mixin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,9 @@ def fill_classifier(
285285
self.fill_classifier_support(
286286
output_data, os.path.join(out_dir, libfolder), "nnom_middleware"
287287
)
288-
#self.fill_trained_models(
289-
# output_data, os.path.join(out_dir, libfolder), "nnom_middleware"
290-
#)
288+
self.fill_trained_models(
289+
output_data, os.path.join(out_dir, libfolder), "nnom"
290+
)
291291

292292
if self.nn_inference_engine == "tf_micro":
293293
self.fill_classifier_support(

src/server/codegen/model_gen/nnom.py

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,89 @@ def create_classifier_arrays(model_index, model):
2727
pass
2828

2929

30-
def create_lassifier_struct(model_index, model):
30+
def create_classifier_struct(model_index, model):
3131
pass
3232

3333

3434
def create_classifier_structures(models):
35-
pass
35+
""" typedef struct nnom_classifier_rows
36+
{
37+
uint16_t num_inputs;
38+
uint8_t num_outputs;
39+
float threshold;
40+
uint8_t estimator_type;
41+
nnom_model_t* model;
42+
} nnom_classifier_rows_t;
43+
"""
44+
45+
outputs = []
46+
47+
iterations = 0
48+
for model in models:
49+
if model["classifier_config"].get("classifier", "PME") in [
50+
"TF Micro",
51+
"TensorFlow Lite for Microcontrollers",
52+
"Neural Network"
53+
]:
54+
#outputs.extend(
55+
# create_tf_micro_classifier_arrays(iterations, model["model_arrays"])
56+
#)
57+
iterations += 1
58+
59+
iterations = 0
60+
61+
outputs.append(
62+
(
63+
"nnom_classifier_rows_t nnom_classifier_rows[{}] = ".format(
64+
utils.get_number_classifiers(
65+
models, "TF Micro"
66+
)+utils.get_number_classifiers(
67+
models, "TensorFlow Lite for Microcontrollers"
68+
)+utils.get_number_classifiers(
69+
models, "Neural Network"
70+
)
71+
)
72+
+ "{"
73+
)
74+
)
75+
76+
for model in models:
77+
if model["classifier_config"].get("classifier", "PME") in [
78+
"TF Micro",
79+
"TensorFlow Lite for Microcontrollers",
80+
"Neural Network"
81+
]:
82+
outputs.append("\n\t{")
83+
outputs.append(
84+
"\t\t.num_inputs = {0},".format(model["model_arrays"]["num_inputs"])
85+
)
86+
outputs.append(
87+
"\t\t.num_outputs = {0},".format(model["model_arrays"]["num_outputs"])
88+
)
89+
outputs.append(
90+
"\t\t.threshold = {0},".format(
91+
model["model_arrays"].get("threshold", 0.0) * 256
92+
- 127 # convert to int8 value
93+
)
94+
)
95+
c_estimator_type_param_map = {
96+
"classification": "ESTIMATOR_TYPE_CLASSIFICATION",
97+
"regression": "ESTIMATOR_TYPE_REGRESSION",
98+
}
99+
outputs.append(
100+
"\t\t.estimator_type = {0},".format(
101+
c_estimator_type_param_map[
102+
model["model_arrays"].get("estimator_type", "classification")
103+
]
104+
)
105+
)
106+
outputs.append("\t},")
107+
iterations += 1
108+
109+
outputs.append("};")
110+
111+
return outputs
112+
36113

37114

38115
def create_max_tmp_parameters(kb_models):

src/server/codegen/templates/build/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ build_lib(){
194194

195195
build_tensorflow $1
196196

197+
cp -r nnom/* .
198+
197199
LIB_TENSORFLOW_FILE=libtensorflow-microlite.a
198200
if [ -f "$LIB_TENSORFLOW_FILE" ]; then
199201
build_tensorflow=y

src/server/codegen/templates/compilers/nnom/build.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,11 @@ ls
112112
cd /build/
113113
mkdir libsensiml
114114
mkdir libsensiml/nnom
115-
cp /nnom/inc/* libsensiml/nnom/
115+
cp -r /nnom/inc/* libsensiml/nnom/
116116
cp /nnom/port/* libsensiml/nnom/
117117
cp /nnom/src/core/* libsensiml/nnom/
118-
cp /nnom/src/layers/* libsensiml/nnom/
118+
cp -r /nnom/src/layers/* libsensiml/nnom/layers/
119+
119120
cp /nnom/src/backends/* libsensiml/nnom/
120121
cp nnom/weights.h libsensiml/nnom/
121122
cp nnom/model.h5 libsensiml/

src/server/codegen/templates/compilers/x86gcc_generic/libsensiml/Makefile

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ SIZE := '$(GNU_INSTALL_ROOT)/bin/size'
3232
THIS_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
3333
OUT := $(abspath $(THIS_DIR))/_build
3434

35-
DEBUG_FLAGS = -O0 -g3
36-
CXXFLAGS += -std=c++11 -fno-builtin -DKBSIM -D__GNUC_PYTHON__
35+
DEBUG_FLAGS = -O0 -g3 -fpermissive -Wnarrowing
36+
CXXFLAGS += -fno-builtin -DKBSIM -D__GNUC_PYTHON__
3737
CXXFLAGS += $(SML_FLAGS)
3838

3939
LDFLAGS += -L/include -L./
40-
IFLAGS += -I/include
40+
IFLAGS += -I/include -I/layers -I./
4141
LDLIBS += -lm
4242

4343
// FILL_TENSORFLOW_BUILD_FLAGS
@@ -48,9 +48,14 @@ OBJS = $(patsubst %.c,$(OUT)/%.o,$(SRCS))
4848

4949
// FILL_MAKEFILE_LIBRARY_NAME_MAIN
5050

51+
#$(OUT)/%.o:$(THIS_DIR)/%.c
52+
# @echo $(ANSI_RED)"[cPP]"$(ANSI_OFF) $@
53+
# $(AT)$(CXX) $(CXXFLAGS) $(IFLAGS) $(LDFLAGS) -fPIC -c -o $@ $< $(LDLIBS)
54+
55+
5156
$(OUT)/%.o:$(THIS_DIR)/%.c
5257
@echo $(ANSI_RED)"[cPP]"$(ANSI_OFF) $@
53-
$(AT)$(CXX) $(CXXFLAGS) $(IFLAGS) $(LDFLAGS) -fPIC -c -o $@ $< $(LDLIBS)
58+
$(AT)$(CC) $(CXXFLAGS) $(IFLAGS) $(LDFLAGS) -fPIC -c -o $@ $< $(LDLIBS)
5459

5560

5661
$(MAIN): $(OBJS)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
#include "nnom_trained_models.h"
3+
4+
nnom_classifier_rows_t nnom_classifier_rows[1] = {
5+
{
6+
.num_inputs=9,
7+
.num_outputs=2,
8+
.threshold=0.5,
9+
.estimator_type=0,
10+
.model = null.
11+
12+
}
13+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
Copyright 2017-2024 SensiML Corporation
3+
4+
This file is part of SensiML™ Piccolo AI™.
5+
6+
SensiML Piccolo AI is free software: you can redistribute it and/or
7+
modify it under the terms of the GNU Affero General Public License
8+
as published by the Free Software Foundation, either version 3 of
9+
the License, or (at your option) any later version.
10+
11+
SensiML Piccolo AI is distributed in the hope that it will be useful,
12+
but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
Affero General Public License for more details.
15+
16+
You should have received a copy of the GNU Affero General Public
17+
License along with SensiML Piccolo AI. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
20+
#ifndef __NNOM_TRAINED_MODELS_H__
21+
#define __NNOM_TRAINED_MODELS_H__
22+
23+
#include "nnom_middleware.h"
24+
25+
#ifdef __cplusplus
26+
extern "C"
27+
{
28+
#endif
29+
30+
extern nnom_classifier_rows_t NNOMClassifierTable[];
31+
32+
33+
#ifdef __cplusplus
34+
}
35+
#endif
36+
37+
38+
#endif // __NNOM_TRAINED_MODELS_H__

0 commit comments

Comments
 (0)