[STM32]:基于X-CUBE-AI的模型推理
基于X-CUBE-AI的模型推理
本文所使用的版本如下:
- X-CUBE-AI:8.1.0
- STM32CUBEMX:6.7.0
基于CUBEMX导出模型
首先需要再软件包选中X-CUBE-AI:
导入模型进行转换,这里选择STM32Cube.AI Runtime
在底部有RAM与ROM的开销占用:
基于STM32实现模型推理
STM32提供了相关了文档,可以到pack包安装的地方查看这篇文章,我的安装路径如下,每个人的电脑都不一样
file:///D:/IDE/STM32CUBEMX/Repository/Packs/STMicroelectronics/X-CUBE-AI/8.1.0/Documentation/how_to_run_a_model_locally.html
接下来,我们按照文档编写图例代码,本文所使用的模型输入为2048长度的一维浮点数据。
1.引入必要的头文件
#include "stdio.h" #include #include #include #include "network.h" #include "network_data.h"
2.创建模型的输入输出以及句柄
AI_ALIGNED(32) static ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE]; AI_ALIGNED(32) static ai_float in_data[AI_NETWORK_IN_1_SIZE]; //这里记得修改为自己的类型,以及长度选择SIZE,不要是byte AI_ALIGNED(32) static ai_float out_data[AI_NETWORK_OUT_1_SIZE]; //这里也是改为size ai_buffer *ai_input; ai_buffer *ai_output; ai_handle network = AI_HANDLE_NULL; ai_error err; ai_network_report report;
3.创建模型初始化代码
int ai_init() { const ai_handle acts[] = {activations}; err = ai_network_create_and_init(&network, acts, NULL); if (err.type != AI_ERROR_NONE) { printf("ai init_and_create error\n"); return -1; } else { printf("ai init success\n"); } if (ai_network_get_report(network, &report) != true) { printf("ai get report error\n"); return -1; } printf("Model name : %s\n", report.model_name); printf("Model signature : %s\n", report.model_signature); return 0; }
3.赋值与推理
int ai_run(ai_float *in_data, ai_float *out_data, float *data, int length) { ai_i32 n_batch; for (int i = 0; i
接下来,我们就可以根据out_data来查看推理结果
for (int i = 0; i
和我们上位机的结果保持一致
全部代码
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" #include #include #include #include "network.h" #include "network_data.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ CRC_HandleTypeDef hcrc; I2C_HandleTypeDef hi2c1; UART_HandleTypeDef huart1; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_CRC_Init(void); static void MX_I2C1_Init(void); static void MX_USART1_UART_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; } AI_ALIGNED(32) static ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE]; AI_ALIGNED(32) static ai_float in_data[AI_NETWORK_IN_1_SIZE]; AI_ALIGNED(32) static ai_float out_data[AI_NETWORK_OUT_1_SIZE]; ai_buffer *ai_input; ai_buffer *ai_output; ai_handle network = AI_HANDLE_NULL; ai_error err; ai_network_report report; //替换为自己的数据 float data[] ={}; /** * @brief ai init * * @return int */ int ai_init() { const ai_handle acts[] = {activations}; err = ai_network_create_and_init(&network, acts, NULL); if (err.type != AI_ERROR_NONE) { printf("ai init_and_create error\n"); return -1; } else { printf("ai init success\n"); } if (ai_network_get_report(network, &report) != true) { printf("ai get report error\n"); return -1; } printf("Model name : %s\n", report.model_name); printf("Model signature : %s\n", report.model_signature); return 0; } int ai_run(ai_float *in_data, ai_float *out_data, float *data, int length) { ai_i32 n_batch; for (int i = 0; i
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。