你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

st-img
chrome
st-img
firefox
st-img
safari
st-img
ie8及以上
shequ.stmicroelectronics.cn
  • ST意法半导体官网
  • STM32中文官网
  • ST全球论坛
登录/注册
  • 首页
  • 技术问答
  • 话题
  • 资源
  • 创客秀
  • 视频
  • 标签
  • 积分商城
  • 每日签到
xiaoyao12138

xiaoyao12138

 

回答数 0 关注数 0
关注 私信
  • 动态99
  • 提问
  • 回答0
  • 创客秀 0
  • 分享 0
  • 关注0
4 回答

cubemax ai转换 stm32h7

未设置标签
xiaoyao12138 xiaoyao12138 回答时间: 2020-12-8 17:26

安 发表于 2020-12-8 13:35 楼主是否方便把这个文件上传一下,in template "app_x-cube-ai_c.ftl" at line 296, column 20。看一下这里 ... [#ftl] [#assign useAI_SYSTEM_PERFORMANCE = false] [#assign useAI_VALIDATION = false] [#assign useAI_TEMPLATE = false] [#assign useAI_BSP = false] [#if RTEdatas??]   [#list RTEdatas as define]     [#if define?contains("AI_SYSTEM_PERFORMANCE")]       [#assign useAI_BSP = true]       [#assign useAI_SYSTEM_PERFORMANCE = true]     [/#if]     [#if define?contains("AI_VALIDATION")]       [#assign useAI_BSP = true]       [#assign useAI_VALIDATION = true]     [/#if]     [#if define?contains("AI_ApplicationTemplate")]       [#assign useAI_BSP = false]           [#assign useAI_TEMPLATE = true]     [/#if]   [/#list] [/#if] [#assign useAI_RELOC = false] [#attempt] [#list configs as config]     [#assign ModelNameList = config.peripheralParams.get("STMicroelectronics.X-CUBE-AI.5.2.0").get("ModelNameList").split(",")]     [#assign InitF = config.peripheralParams.get("STMicroelectronics.X-CUBE-AI.5.2.0").get("initFunctions")]         [#if config.peripheralParams.get("STMicroelectronics.X-CUBE-AI.5.2.0").get("relocatableNetwork")??]                 [#assign useAI_RELOC = true]         [/#if]         [#if InitF??]                 [#assign InitFunctions = InitF.split(":")]         [/#if]         [#assign NETWORK = ModelNameList[0]?upper_case] [/#list] [#recover] [/#attempt] #ifdef __cplusplus extern "C" { #endif /**   ******************************************************************************   * @file           : app_x-cube-ai.c   * @brief          : AI program body   ******************************************************************************   * This notice applies to any and all portions of this file   * that are not between comment pairs USER CODE BEGIN and   * USER CODE END. Other portions of this file, whether   * inserted by the user or by software development tools   * are owned by their respective copyright owners.   *   * Copyright (c) 2018 STMicroelectronics International N.V.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without   * modification, are permitted, provided that the following conditions are met:   *   * 1. Redistribution of source code must retain the above copyright notice,   *    this list of conditions and the following disclaimer.   * 2. Redistributions in binary form must reproduce the above copyright notice,   *    this list of conditions and the following disclaimer in the documentation   *    and/or other materials provided with the distribution.   * 3. Neither the name of STMicroelectronics nor the names of other   *    contributors to this software may be used to endorse or promote products   *    derived from this software without specific written permission.   * 4. This software, including modifications and/or derivative works of this   *    software, must execute solely and exclusively on microcontroller or   *    microprocessor devices manufactured by or for STMicroelectronics.   * 5. Redistribution and use of this software other than as permitted under   *    this license is void and will automatically terminate your rights under   *    this license.   *   * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"   * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A   * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY   * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT   * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   *   ******************************************************************************   */ [#if useAI_TEMPLATE] [#if useAI_RELOC] /*   * Description   *   v1.0 - Basic template to show how to instantiate a relocatable binary   *          model. Only one input and one output is supported. It illustrates   *          how to use the ai_rel_network_XXX() API.   *          Re-target of the printf function is out-of-scope.   * [#else] /*   * Description   *   v1.0 - Minimum template to show how to use the Embedded Client API   *          model. Only one input and one output is supported. All   *          memory resources are allocated statically (AI_NETWORK_XX, defines   *          are used).   *          Re-target of the printf function is out-of-scope.   * [/#if]   *   For more information, see the embeded documentation:   *   *       [1] %X_CUBE_AI_DIR%/Documentation/index.html   *   *   X_CUBE_AI_DIR indicates the location where the X-CUBE-AI pack is installed   *   typical : C:%users\<user_name>\STM32Cube\Repository\STMicroelectronics\X-CUBE-AI\5.2.0   */ [/#if] /* Includes ------------------------------------------------------------------*/ /* System headers */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <inttypes.h> #include <string.h> #include "app_x-cube-ai.h" [#if useAI_BSP] #include "bsp_ai.h" [#else] #include "main.h" [/#if] [#if useAI_SYSTEM_PERFORMANCE] #include "aiSystemPerformance.h" [/#if] [#if useAI_VALIDATION] #include "aiValidation.h" [/#if] #include "ai_datatypes_defines.h" /* USER CODE BEGIN includes */ /* USER CODE END includes */ [#if useAI_TEMPLATE] [#if useAI_RELOC] #include <ai_reloc_network.h> /* Global AI objects */ static ai_handle ${ModelNameList[0]} = AI_HANDLE_NULL; static ai_network_report ${ModelNameList[0]}_info; static ai_rel_network_info ${ModelNameList[0]}_rt_info; static void ai_log_err(const ai_error err, const char *fct) {   /* USER CODE BEGIN 0 */   if (fct)     printf("TEMPLATE - Error (%s) - type=0x%02x code=0x%02x\r\n", fct,         err.type, err.code);   else     printf("TEMPLATE - Error - type=0x%02x code=0x%02x\r\n", err.type, err.code);   do {} while (1);   /* USER CODE END 0 */ } static int ai_boostrap(const uint8_t *obj, uint8_t *ram_addr,     ai_size ram_sz, ai_handle w_addr, ai_handle act_addr) {   ai_error err;   ai_handle weights_addr;   /* 1 - Create an instance (XIP mode)*/   err = ai_rel_network_load_and_create(obj,       ram_addr, ram_sz, AI_RELOC_RT_LOAD_MODE_XIP,       &${ModelNameList[0]});   if (err.type != AI_ERROR_NONE) {     ai_log_err(err, "ai_rel_network_load_and_create");     return -1;   }   /* 2 - Initialize the created instance */   if (${ModelNameList[0]}_rt_info.weights)     weights_addr = ${ModelNameList[0]}_rt_info.weights;   else     weights_addr = w_addr;   if (!ai_rel_network_init(${ModelNameList[0]},       weights_addr, act_addr)) {     err = ai_rel_network_get_error(${ModelNameList[0]});     ai_log_err(err, "ai_rel_network_init");     ai_rel_network_destroy(${ModelNameList[0]});     ${ModelNameList[0]} = AI_HANDLE_NULL;     return -2;   }   /* 3 - Retrieve the network info of the created instance */   if (!ai_rel_network_get_info(${ModelNameList[0]}, &${ModelNameList[0]}_info)) {     err = ai_rel_network_get_error(${ModelNameList[0]});     ai_log_err(err, "ai_rel_network_get_info");     ai_rel_network_destroy(${ModelNameList[0]});     ${ModelNameList[0]} = AI_HANDLE_NULL;     return -3;   }   return 0; } static int ai_run(void *data_in, void *data_out) {   ai_i32 batch;   ai_buffer *ai_input = ${ModelNameList[0]}_info.inputs;   ai_buffer *ai_output = ${ModelNameList[0]}_info.outputs;   ai_input[0].data = AI_HANDLE_PTR(data_in);   ai_output[0].data = AI_HANDLE_PTR(data_out);   batch = ai_rel_network_run(${ModelNameList[0]}, ai_input, ai_output);   if (batch != 1) {     ai_log_err(ai_rel_network_get_error(${ModelNameList[0]}),         "ai_rel_network_run");     return -1;   }   return 0; } /* USER CODE BEGIN 2 */ int acquire_and_process_data(void * data) {   return 0; } int post_process(void * data) {   return 0; } /* USER CODE END 2 */ /* USER CODE BEGIN 10 */ /* * The following code is based on the generated/specific * network_img_rel.h/.c files. These files include a * image of the relocatable binary image as a * C-table which is included in the firmware image. * This is a facility to use the model. * * For a normal case with the end-user application which * requires the capability to update the model w/o * re-flash the whole firmware (FOTA-like mechanism), * the BIN_ADDRESS should be provided by the APP module in charge * to update the model. It can be a fixed address. * The requested RT RAM buffer (RAM_RT_ADDRESS/RAM_RT_SIZE) * to instantiate the network can be also fixed or dynamically * allocated. As for the management of the * activations buffer, the sizes of the RT RAM and the activations * buffer are model dependent. */ /* Include the image of the relocatable network */ #include <${ModelNameList[0]}_img_rel.h> #define BIN_ADDRESS ai_${ModelNameList[0]}_reloc_img_get() /* Allocate the rt ram buffer to install a model *  - it should be aligned on 4-bytes */ AI_ALIGNED(4) uint8_t reloc_rt_ram[AI_${NETWORK}_RELOC_RAM_SIZE_XIP]; #define RAM_RT_ADDRESS reloc_rt_ram #define RAM_RT_SIZE    AI_${NETWORK}_RELOC_RAM_SIZE_XIP /* Allocate the activations buffer to use the model *  - it should be aligned on 4-bytes */ AI_ALIGNED(4) uint8_t activations[AI_${NETWORK}_RELOC_ACTIVATIONS_SIZE]; #define ACT_ADDR  activations #define ACT_SIZE  AI_${NETWORK}_RELOC_ACTIVATIONS_SIZE /* In the case where the weights are not included in the * binary object (generated in a separate file), the * @ should be passed to initialize the instance. *  - it should be aligned on 4-bytes */ #define WEIGHTS_ADD  0 #define WEIGHTS_SIZE AI_${NETWORK}_RELOC_WEIGHTS_SIZE /* USER CODE END 10 */ [#else] /* Global AI objects */ static ai_handle ${ModelNameList[0]} = AI_HANDLE_NULL; static ai_network_report ${ModelNameList[0]}_info; /* Global c-array to handle the activations buffer */ AI_ALIGNED(4) static ai_u8 activations[AI_${NETWORK}_DATA_ACTIVATIONS_SIZE]; /*  In the case where "--allocate-inputs" option is used, memory buffer can be *  used from the activations buffer. This is not mandatory. */ #if !defined(AI_${NETWORK}_INPUTS_IN_ACTIVATIONS) /* Allocate data payload for input tensor */ AI_ALIGNED(4) static ai_u8 in_data_s[AI_${NETWORK}_IN_1_SIZE_BYTES]; #endif /*  In the case where "--allocate-outputs" option is used, memory buffer can be *  used from the activations buffer. This is no mandatory. */ #if !defined(AI_${NETWORK}_OUTPUTS_IN_ACTIVATIONS) /* Allocate data payload for the output tensor */ AI_ALIGNED(4) static ai_u8 out_data_s[AI_${NETWORK}_OUT_1_SIZE_BYTES]; #endif static void ai_log_err(const ai_error err, const char *fct) {   /* USER CODE BEGIN 0 */   if (fct)     printf("TEMPLATE - Error (%s) - type=0x%02x code=0x%02x\r\n", fct,         err.type, err.code);   else     printf("TEMPLATE - Error - type=0x%02x code=0x%02x\r\n", err.type, err.code);   do {} while (1);   /* USER CODE END 0 */ } static int ai_boostrap(ai_handle w_addr, ai_handle act_addr) {   ai_error err;   /* 1 - Create an instance of the model */   err = ai_${ModelNameList[0]}_create(&${ModelNameList[0]}, AI_${NETWORK}_DATA_CONFIG);   if (err.type != AI_ERROR_NONE) {     ai_log_err(err, "ai_${ModelNameList[0]}_create");     return -1;   }   /* 2 - Initialize the instance */   const ai_network_params params = {       AI_${NETWORK}_DATA_WEIGHTS(w_addr),       AI_${NETWORK}_DATA_ACTIVATIONS(act_addr) };   if (!ai_${ModelNameList[0]}_init(${ModelNameList[0]}, &params)) {       err = ai_${ModelNameList[0]}_get_error(${ModelNameList[0]});       ai_log_err(err, "ai_${ModelNameList[0]}_init");       return -1;     }   /* 3 - Retrieve the network info of the created instance */   if (!ai_${ModelNameList[0]}_get_info(${ModelNameList[0]}, &${ModelNameList[0]}_info)) {     err = ai_${ModelNameList[0]}_get_error(${ModelNameList[0]});     ai_log_err(err, "ai_${ModelNameList[0]}_get_error");     ai_${ModelNameList[0]}_destroy(${ModelNameList[0]});     ${ModelNameList[0]} = AI_HANDLE_NULL;     return -3;   }   return 0; } static int ai_run(void *data_in, void *data_out) {   ai_i32 batch;   ai_buffer *ai_input = ${ModelNameList[0]}_info.inputs;   ai_buffer *ai_output = ${ModelNameList[0]}_info.outputs;   ai_input[0].data = AI_HANDLE_PTR(data_in);   ai_output[0].data = AI_HANDLE_PTR(data_out);   batch = ai_${ModelNameList[0]}_run(${ModelNameList[0]}, ai_input, ai_output);   if (batch != 1) {     ai_log_err(ai_${ModelNameList[0]}_get_error(${ModelNameList[0]}),         "ai_${ModelNameList[0]}_run");     return -1;   }   return 0; } /* USER CODE BEGIN 2 */ int acquire_and_process_data(void * data) {   return 0; } int post_process(void * data) {   return 0; } /* USER CODE END 2 */ [/#if] [/#if] /*************************************************************************   *   */ void ${fctName}(void) { [#if useAI_BSP]     MX_UARTx_Init(); [/#if] [#if InitFunctions??]   [#list InitFunctions as initFunction]     [#if initFunction?has_content]       [#if initFunction?ends_with(".ftl")]         [#include initFunction]       [#else]     ${initFunction}       [/#if]     [/#if]   [/#list] [/#if] [#if useAI_SYSTEM_PERFORMANCE]     aiSystemPerformanceInit(); [/#if] [#if useAI_VALIDATION]     aiValidationInit(); [/#if]     /* USER CODE BEGIN 3 */ [#if useAI_TEMPLATE] [#if useAI_RELOC]   ai_error err;   printf("\r\nTEMPLATE RELOC - initialization\r\n");   err = ai_rel_network_rt_get_info(BIN_ADDRESS, &${ModelNameList[0]}_rt_info);   if (err.type != AI_ERROR_NONE) {     ai_log_err(err, "ai_rel_network_rt_get_info");   } else {     /* USER CODE BEGIN 11 */     printf("Load a relocatable binary model, located at the address 0x%08x\r\n",         (int)BIN_ADDRESS);     printf(" model name                : %s\r\n", ${ModelNameList[0]}_rt_info.c_name);     printf(" weights size              : %d bytes\r\n", (int)${ModelNameList[0]}_rt_info.weights_sz);     printf(" activations size          : %d bytes (minimum)\r\n", (int)${ModelNameList[0]}_rt_info.acts_sz);     printf(" compiled for a Cortex-Mx  : 0x%03X\r\n", (int)AI_RELOC_RT_GET_CPUID(${ModelNameList[0]}_rt_info.variant));     printf(" FPU should be enabled     : %s\r\n", AI_RELOC_RT_FPU_USED(${ModelNameList[0]}_rt_info.variant)?"yes":"no");     printf(" RT RAM minimum size       : %d bytes (%d bytes in COPY mode)\r\n", (int)${ModelNameList[0]}_rt_info.rt_ram_xip,         (int)${ModelNameList[0]}_rt_info.rt_ram_copy);     /* USER CODE END 11 */     ai_boostrap(BIN_ADDRESS, RAM_RT_ADDRESS, RAM_RT_SIZE,         WEIGHTS_ADD, ACT_ADDR);   } [#else]   printf("\r\nTEMPLATE - initialization\r\n");   ai_boostrap(ai_${ModelNameList[0]}_data_weights_get(), activations); [/#if] [/#if]     /* USER CODE END 3 */ } void ${fctProcessName}(void) { [#if useAI_SYSTEM_PERFORMANCE]     aiSystemPerformanceProcess();     HAL_Delay(1000); /* delay 1s */ [/#if] [#if useAI_VALIDATION]     aiValidationProcess(); [/#if]     /* USER CODE BEGIN 4 */ [#if useAI_TEMPLATE]   int res = -1;   uint8_t *in_data = NULL;   uint8_t *out_data = NULL;   printf("TEMPLATE - run - main loop\r\n");   if (${ModelNameList[0]}) {     if ((${ModelNameList[0]}_info.n_inputs != 1) || (${ModelNameList[0]}_info.n_outputs != 1)) {       ai_error err = {AI_ERROR_INVALID_PARAM, AI_ERROR_CODE_OUT_OF_RANGE};       ai_log_err(err, "template code should be updated\r\n to support a model with multiple IO");       return;     }     /* 1 - Set the I/O data buffer */ [#if useAI_RELOC]     const ai_buffer_format fmt_in = AI_BUFFER_FORMAT(&${ModelNameList[0]}_info.inputs[0]);     const ai_u32 size_in = AI_BUFFER_BYTE_SIZE(AI_BUFFER_SIZE(&${ModelNameList[0]}_info.inputs[0]), fmt_in);     const ai_buffer_format fmt_out = AI_BUFFER_FORMAT(&${ModelNameList[0]}_info.outputs[0]);     const ai_u32 size_out = AI_BUFFER_BYTE_SIZE(AI_BUFFER_SIZE(&${ModelNameList[0]}_info.outputs[0]), fmt_out);     /*  In the case where "--allocate-inputs" option is used, memory buffer can be      *  used from the activations buffer. This is not mandatory.      */     if (${ModelNameList[0]}_info.inputs[0].data)       in_data = ${ModelNameList[0]}_info.inputs[0].data;     else {       in_data = malloc(size_in);     }     /*  In the case where "--allocate-outputs" option is used, memory buffer can be      *  used from the activations buffer. This is no mandatory.      */     if (${ModelNameList[0]}_info.outputs[0].data)       out_data = ${ModelNameList[0]}_info.outputs[0].data;     else {       out_data = malloc(size_out);     } [#else] #if AI_${NETWORK}_INPUTS_IN_ACTIVATIONS     in_data = ${ModelNameList[0]}_info.inputs[0].data; #else     in_data = in_data_s; #endif #if AI_${NETWORK}_OUTPUTS_IN_ACTIVATIONS     out_data = ${ModelNameList[0]}_info.outputs[0].data; #else     out_data = out_data_s; #endif [/#if]     if ((!in_data) || (!out_data)) {       printf("TEMPLATE - I/O buffers are invalid\r\n");       return;     }     /* 2 - main loop */     do {       /* 1 - acquire and pre-process input data */       res = acquire_and_process_data(in_data);       /* 2 - process the data - call inference engine */       if (res == 0)         res = ai_run(in_data, out_data);       /* 3- post-process the predictions */       if (res == 0)         res = post_process(out_data);     } while (res==0);   }   if (res) {     ai_error err = {AI_ERROR_INVALID_STATE, AI_ERROR_CODE_NETWORK};     ai_log_err(err, "rocess has FAILED");   } [/#if]     /* USER CODE END 4 */ } [#if ModelNameList?size > 1 || useAI_SYSTEM_PERFORMANCE || useAI_VALIDATION] /* Multiple network support --------------------------------------------------*/ #include <string.h> #include "ai_datatypes_defines.h" static const ai_network_entry_t networks[AI_MNETWORK_NUMBER] = { [#list 0..ModelNameList?size-1 as i]     [#assign NETWORK = ModelNameList?upper_case]     {         .name = (const char *)AI_${NETWORK}_MODEL_NAME,         .config = AI_${NETWORK}_DATA_CONFIG,         .ai_get_info = ai_${ModelNameList}_get_info,         .ai_create = ai_${ModelNameList}_create,         .ai_destroy = ai_${ModelNameList}_destroy,         .ai_get_error = ai_${ModelNameList}_get_error,         .ai_init = ai_${ModelNameList}_init,         .ai_run = ai_${ModelNameList}_run,         .ai_forward = ai_${ModelNameList}_forward,         .ai_data_weights_get_default = ai_${ModelNameList}_data_weights_get,         .params = { AI_${NETWORK}_DATA_WEIGHTS(0),                 AI_${NETWORK}_DATA_ACTIVATIONS(0)},         .extActBufferStartAddr = AI_${NETWORK}_DATA_ACTIVATIONS_START_ADDR,         .actBufferSize = AI_${NETWORK}_DATA_ACTIVATIONS_SIZE     }, [/#list] }; struct network_instance {      const ai_network_entry_t *entry;      ai_handle handle;      ai_network_params params; }; /* Number of instance is aligned on the number of network */ AI_STATIC struct network_instance gnetworks[AI_MNETWORK_NUMBER] = {0}; AI_DECLARE_STATIC ai_bool ai_mnetwork_is_valid(const char* name,         const ai_network_entry_t *entry) {     if (name && (strlen(entry->name) == strlen(name)) &&             (strncmp(entry->name, name, strlen(entry->name)) == 0))         return true;     return false; } AI_DECLARE_STATIC struct network_instance *ai_mnetwork_handle(struct network_instance *inst) {     for (int i=0; i<AI_MNETWORK_NUMBER; i++) {         if ((inst) && (&gnetworks == inst))             return inst;         else if ((!inst) && (gnetworks.entry == NULL))             return &gnetworks;     }     return NULL; } AI_DECLARE_STATIC void ai_mnetwork_release_handle(struct network_instance *inst) {     for (int i=0; i<AI_MNETWORK_NUMBER; i++) {         if ((inst) && (&gnetworks == inst)) {             gnetworks.entry = NULL;             return;         }     } } AI_API_ENTRY const char* ai_mnetwork_find(const char *name, ai_int idx) {     const ai_network_entry_t *entry;     for (int i=0; i<AI_MNETWORK_NUMBER; i++) {         entry = &networks;         if (ai_mnetwork_is_valid(name, entry))             return entry->name;         else {             if (!idx--)                 return entry->name;         }     }     return NULL; } AI_API_ENTRY ai_error ai_mnetwork_create(const char *name, ai_handle* network,         const ai_buffer* network_config) {     const ai_network_entry_t *entry;     const ai_network_entry_t *found = NULL;     ai_error err;     struct network_instance *inst = ai_mnetwork_handle(NULL);     if (!inst) {         err.type = AI_ERROR_ALLOCATION_FAILED;         err.code = AI_ERROR_CODE_NETWORK;         return err;     }     for (int i=0; i<AI_MNETWORK_NUMBER; i++) {         entry = &networks;         if (ai_mnetwork_is_valid(name, entry)) {             found = entry;             break;         }     }     if (!found) {         err.type = AI_ERROR_INVALID_PARAM;         err.code = AI_ERROR_CODE_NETWORK;         return err;     }     if (network_config == NULL)         err = found->ai_create(network, found->config);     else         err = found->ai_create(network, network_config);     if ((err.code == AI_ERROR_CODE_NONE) && (err.type == AI_ERROR_NONE)) {         inst->entry = found;         inst->handle = *network;         *network = (ai_handle*)inst;     }     return err; } AI_API_ENTRY ai_handle ai_mnetwork_destroy(ai_handle network) {     struct network_instance *inn;     inn =  ai_mnetwork_handle((struct network_instance *)network);     if (inn) {         ai_handle hdl = inn->entry->ai_destroy(inn->handle);         if (hdl != inn->handle) {             ai_mnetwork_release_handle(inn);             network = AI_HANDLE_NULL;         }     }     return network; } AI_API_ENTRY ai_bool ai_mnetwork_get_info(ai_handle network, ai_network_report* report) {     struct network_instance *inn;     inn =  ai_mnetwork_handle((struct network_instance *)network);     if (inn)         return inn->entry->ai_get_info(inn->handle, report);     else         return false; } AI_API_ENTRY ai_error ai_mnetwork_get_error(ai_handle network) {     struct network_instance *inn;     ai_error err;     err.type = AI_ERROR_INVALID_PARAM;     err.code = AI_ERROR_CODE_NETWORK;     inn =  ai_mnetwork_handle((struct network_instance *)network);     if (inn)         return inn->entry->ai_get_error(inn->handle);     else         return err; } AI_API_ENTRY ai_bool ai_mnetwork_init(ai_handle network, const ai_network_params* params) {     struct network_instance *inn;     ai_network_params par;     /* TODO: adding check ai_buffer activations/weights shape coherence */     inn =  ai_mnetwork_handle((struct network_instance *)network);     if (inn) {         par = inn->entry->params;         if (params->activations.n_batches)             par.activations = params->activations;         else             par.activations.data = params->activations.data;         if (params->params.n_batches)             par.params = params->params;         else             par.params.data = inn->entry->ai_data_weights_get_default();         return inn->entry->ai_init(inn->handle, &par);     }     else         return false; } AI_API_ENTRY ai_i32 ai_mnetwork_run(ai_handle network, const ai_buffer* input,         ai_buffer* output) {     struct network_instance* inn;     inn =  ai_mnetwork_handle((struct network_instance *)network);     if (inn)         return inn->entry->ai_run(inn->handle, input, output);     else         return 0; } AI_API_ENTRY ai_i32 ai_mnetwork_forward(ai_handle network, const ai_buffer* input) {     struct network_instance *inn;     inn =  ai_mnetwork_handle((struct network_instance *)network);     if (inn)         return inn->entry->ai_forward(inn->handle, input);     else         return 0; } AI_API_ENTRY int ai_mnetwork_get_private_handle(ai_handle network,          ai_handle *phandle,          ai_network_params *pparams) {      struct network_instance* inn;      inn =  ai_mnetwork_handle((struct network_instance *)network);      if (inn && phandle && pparams) {          *phandle = inn->handle;          *pparams = inn->params;          return 0;      }      else          return -1; } AI_API_ENTRY int ai_mnetwork_get_ext_data_activations(ai_handle network,          ai_u32 *add,          ai_u32 *size) {      struct network_instance* inn;      inn =  ai_mnetwork_handle((struct network_instance *)network);      if (inn && add && size) {          *add = inn->entry->extActBufferStartAddr;          *size = inn->entry->actBufferSize;          return 0;      }      else          return -1; } [/#if] #ifdef __cplusplus } #endif

赞0
xiaoyao12138 xiaoyao12138


阅读作者更多的帖子

所在话题

参与活动

  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    线下 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    网络 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    网络 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    网络 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    线下 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    线下 2020-10-16