[STM32]:基于X-CUBE-AI的模型推理

05-28 1045阅读

基于X-CUBE-AI的模型推理

本文所使用的版本如下:

  • X-CUBE-AI:8.1.0
  • STM32CUBEMX:6.7.0

    基于CUBEMX导出模型

    首先需要再软件包选中X-CUBE-AI:

    [STM32]:基于X-CUBE-AI的模型推理

    导入模型进行转换,这里选择STM32Cube.AI Runtime

    [STM32]:基于X-CUBE-AI的模型推理

    在底部有RAM与ROM的开销占用:

    [STM32]:基于X-CUBE-AI的模型推理

    基于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  
    

    [STM32]:基于X-CUBE-AI的模型推理

    和我们上位机的结果保持一致

    [STM32]:基于X-CUBE-AI的模型推理

    全部代码

    /* 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 
                    
                    
                    
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]