From 5fba4c3ad9c92f11b10868038e82e1bf1e1efd3e Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Tue, 29 May 2018 17:57:56 +0200 Subject: [PATCH] NN: Move output buffer to network struct. --- src/omv/nn/nn.c | 12 +++++++----- src/omv/nn/nn.h | 5 +++-- src/omv/py/py_nn.c | 9 ++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/omv/nn/nn.c b/src/omv/nn/nn.c index 2b3ce5fec..e3595e291 100644 --- a/src/omv/nn/nn.c +++ b/src/omv/nn/nn.c @@ -263,6 +263,8 @@ int nn_load_network(nn_t *net, const char *path) layer = layer->next; } + // Alloc output buffer. + net->output_data = xalloc(net->output_size); printf("Max layer: %lu Max col buf: %lu Max scratch buf: %lu Output size:%lu\n\n", net->max_layer_size, net->max_colbuf_size, net->max_scrbuf_size, net->output_size); error: @@ -328,7 +330,7 @@ void nn_transform_input(data_layer_t *data_layer, image_t *img, q7_t *input_data } } -int nn_run_network(nn_t *net, image_t *img, int8_t *output_data) +int nn_run_network(nn_t *net, image_t *img) { uint32_t layer_idx = 0; layer_t *layer = net->layers; @@ -425,7 +427,7 @@ int nn_run_network(nn_t *net, image_t *img, int8_t *output_data) // Last layer if (layer->next && layer->next->next == NULL) { - output_buffer = output_data; + output_buffer = net->output_data; } } @@ -440,7 +442,7 @@ int nn_run_network(nn_t *net, image_t *img, int8_t *output_data) (buffer == buffer1) ? "buffer1":\ (buffer == buffer2) ? "buffer2":\ (buffer == input_data) ? "input_data":\ - (buffer == output_data) ? "output_data": "???" + (buffer == net->output_data) ? "output_data": "???" #define CONV_FUNC_2STR(conv_func)\ (conv_func == arm_convolve_HWC_q7_basic) ? "arm_convolve_HWC_q7_basic" :\ @@ -449,7 +451,7 @@ int nn_run_network(nn_t *net, image_t *img, int8_t *output_data) #define POOL_FUNC_2STR(pool_func)\ (pool_func == arm_maxpool_q7_HWC) ? "arm_maxpool_q7_HWC" : "arm_avepool_q7_HWC" -int nn_dry_run_network(nn_t *net, image_t *img, int8_t *output_data) +int nn_dry_run_network(nn_t *net, image_t *img) { uint32_t layer_idx = 0; layer_t *layer = net->layers; @@ -549,7 +551,7 @@ int nn_dry_run_network(nn_t *net, image_t *img, int8_t *output_data) // Last layer if (layer->next && layer->next->next == NULL) { - output_buffer = output_data; + output_buffer = net->output_data; } } diff --git a/src/omv/nn/nn.h b/src/omv/nn/nn.h index 259083b9a..8e2367ad5 100644 --- a/src/omv/nn/nn.h +++ b/src/omv/nn/nn.h @@ -80,6 +80,7 @@ typedef struct { typedef struct { uint8_t type[4]; uint32_t n_layers; + int8_t *output_data; uint32_t output_size; uint32_t max_layer_size; uint32_t max_colbuf_size; @@ -99,6 +100,6 @@ typedef void (*pool_func_t)(q7_t * Im_in, const uint16_t dim_im_in, const uint16 int nn_dump_network(nn_t *net); int nn_load_network(nn_t *net, const char *path); -int nn_run_network(nn_t *net, image_t *img, int8_t *output); -int nn_dry_run_network(nn_t *net, image_t *img, int8_t *output); +int nn_run_network(nn_t *net, image_t *img); +int nn_dry_run_network(nn_t *net, image_t *img); #endif //#define __CNN_H__ diff --git a/src/omv/py/py_nn.c b/src/omv/py/py_nn.c index 151491aa0..ec829d34f 100644 --- a/src/omv/py/py_nn.c +++ b/src/omv/py/py_nn.c @@ -34,18 +34,17 @@ STATIC mp_obj_t py_net_forward(uint n_args, const mp_obj_t *args, mp_map_t *kw_a nn_t *net = py_net_cobj(args[0]); image_t *img = py_helper_arg_to_image_mutable(args[1]); - int8_t output_data[10]; //TODO alloc output buffer mp_obj_t output_list = mp_obj_new_list(0, NULL); bool dry_run = py_helper_keyword_int(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_dry_run), false); if (dry_run == false) { - nn_run_network(net, img, output_data); + nn_run_network(net, img); } else { - nn_dry_run_network(net, img, output_data); + nn_dry_run_network(net, img); } - for (int i=0; i<10; i++) { - mp_obj_list_append(output_list, mp_obj_new_int(output_data[i])); + for (int i=0; ioutput_size; i++) { + mp_obj_list_append(output_list, mp_obj_new_int(net->output_data[i])); } return output_list; }