怎么在stm32上跑本身的神经网络

一给  论坛元老 | 2024-6-14 23:09:36 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1851|帖子 1851|积分 5553

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
此教程为现在全网为数不多用于使用STM32实时跑神经网络结果输出的教程,不涉及原理讲解,只为资助想在stm32上使用神经网络的朋友
基本步骤为先跑出神经网络得到xxx.h5文件,然后用cubemx把h5文件移植到stm32中,然后初始化设置输入输出,实时输入数据进行神经网络检测,需要做的工作主要有:会写或者会改神经网络代码,输出.h5文件(使用Tesoroflow产生得有版本要求,太高得大概不行),使用cubemx来移植到stm32上;初始化输入输出来使之能把数据输入到神经网络进行运算。
1、 自行上网查询stm32AI教程,网上90%的教程会教到能把官方例程跑出来,使用cubemx进行验证(跑不出来,检查步骤有无错误,时钟设置是否精确,串口设置是否精确)
2、 但如果想实时跑数据进行神经网络检测,在Cubemx上能验证是没有用的,需要在代码中设置输入输出。
3、 根据我给得输入输出初始化函数来进行初始化本身得输入输出参数,然后进行验证。

使用STM32跑神经网络需要的初始化代码:
  1. static void AI_Run(float* pIn, float* pOut)   //神经网络实时计算代码,填入输入输出数组即可
  2. {
  3.         ai_i32 batch;
  4.         ai_error err;
  5.         /* 1 - Create the AI buffer IO handlers with the default definition */
  6.         ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
  7.         ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;
  8.         /* 2 - Update IO handlers with the data payload */
  9.         ai_input[0].n_batches = 1;
  10.         ai_input[0].data = AI_HANDLE_PTR(pIn);
  11.         ai_output[0].n_batches = 1;
  12.         ai_output[0].data = AI_HANDLE_PTR(pOut);
  13.         batch = ai_network_run(network, ai_input, ai_output);
  14.         if (batch != 1) {
  15.                 err = ai_network_get_error(network);
  16.                 printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
  17. //                Error_Handler();
  18.         }
  19. }
  20. static void AI_Init(ai_handle w_addr, ai_handle act_addr) //初始化代码
  21. {
  22.         ai_error err;
  23.         printf("AI_NETWORK_IN_NUM=%d AI_NETWORK_OUT_NUM=%d\r\n", AI_NETWORK_IN_NUM, AI_NETWORK_OUT_NUM);
  24.         /* 1 - Create an instance of the model */
  25.         err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);
  26.         if (err.type != AI_ERROR_NONE) {
  27.                 printf("ai_network_create error - type=%d code=%d\r\n", err.type, err.code);
  28. //                Error_Handler();
  29.         }
  30.         /* 2 - Initialize the instance */
  31.         const ai_network_params params = AI_NETWORK_PARAMS_INIT(
  32.                 AI_NETWORK_DATA_WEIGHTS(w_addr),
  33.                 AI_NETWORK_DATA_ACTIVATIONS(act_addr)
  34.         );
  35.         if (!ai_network_init(network, &params)) {
  36.                 err = ai_network_get_error(network);
  37.                 printf("ai_network_init error - type=%d code=%d\r\n", err.type, err.code);
  38. //                Error_Handler();
  39.         }
  40. }
复制代码
給出一个可参考的伪代码(参考使用方式,以下代码无法直接跑,只是示意)实例:
  1. #include "sys.h"
  2. #include "delay.h"
  3. /*bsp*/
  4. #include "usart.h"
  5. #include "led.h"
  6. #include "key.h"
  7. #include "timer.h"
  8. #include "adc.h"
  9. #include "arc_de.h"
  10. #include "main.h"
  11. #include "crc.h"
  12. #include "usart.h"
  13. #include "gpio.h"
  14. #include "app_x-cube-ai.h"
  15. /*宏定义*/
  16. /**********************全局变量****************************/
  17. float team_data[3] = { 0 };
  18. float   Arc_data[DATASIZE][3] = { 0 }, FFt_Out[DATASIZE / 2] = { 0 }, minValue = 3, maxValue = 0, F_maxValue = 0, FFt_Out1[DATASIZE / 2] = { 0 }, Freqy = 0;
  19. u16 adcx, i = 0;
  20. u16 n = 0, m = 0;
  21. float F_rate[3] = { 0 };
  22. /* Reference index at which max energy of bin ocuurs */
  23. uint32_t Index = 0;
  24. struct  arc_eigenvalue arc_eig;
  25. ai_handle network = AI_HANDLE_NULL;
  26. /**********************函数申明****************************/
  27. static void AI_Init(ai_handle w_addr, ai_handle act_addr);
  28. static void AI_Run(float* pIn, float* pOut);
  29. void hard_init(void)
  30. {
  31. }
  32. int main(void)
  33. {
  34.         arm_rfft_fast_instance_f32 S;
  35.   float aiInData[row][AI_NETWORK_IN_1_SIZE] = {};
  36.   float aiOutData[AI_NETWORK_OUT_1_SIZE];
  37.         ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];
  38.   hard_init();
  39. //初始化AI
  40.   MX_CRC_Init();
  41.   MX_X_CUBE_AI_Init();
  42.   AI_Init(ai_network_data_weights_get(), activations);
  43. delay_ms(1);
  44.         while (1)
  45.         {
  46.            AI_Run(aiInData[i], aiOutData);//实时运行
  47.         }
  48. }
  49. #ifdef  USE_FULL_ASSERT
  50. static void AI_Run(float* pIn, float* pOut)
  51. {
  52.         ai_i32 batch;
  53.         ai_error err;
  54.         /* 1 - Create the AI buffer IO handlers with the default definition */
  55.         ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
  56.         ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;
  57.         /* 2 - Update IO handlers with the data payload */
  58.         ai_input[0].n_batches = 1;
  59.         ai_input[0].data = AI_HANDLE_PTR(pIn);
  60.         ai_output[0].n_batches = 1;
  61.         ai_output[0].data = AI_HANDLE_PTR(pOut);
  62.         batch = ai_network_run(network, ai_input, ai_output);
  63.         if (batch != 1) {
  64.                 err = ai_network_get_error(network);
  65.                 printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
  66.         }
  67. }
  68. static void AI_Init(ai_handle w_addr, ai_handle act_addr)
  69. {
  70.         ai_error err;
  71.         printf("AI_NETWORK_IN_NUM=%d AI_NETWORK_OUT_NUM=%d\r\n", AI_NETWORK_IN_NUM, AI_NETWORK_OUT_NUM);
  72.         /* 1 - Create an instance of the model */
  73.         err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);
  74.         if (err.type != AI_ERROR_NONE) {
  75.                 printf("ai_network_create error - type=%d code=%d\r\n", err.type, err.code);
  76.         }
  77.         /* 2 - Initialize the instance */
  78.         const ai_network_params params = AI_NETWORK_PARAMS_INIT(
  79.                 AI_NETWORK_DATA_WEIGHTS(w_addr),
  80.                 AI_NETWORK_DATA_ACTIVATIONS(act_addr)
  81.         );
  82.         if (!ai_network_init(network, &params)) {
  83.                 err = ai_network_get_error(network);
  84.                 printf("ai_network_init error - type=%d code=%d\r\n", err.type, err.code);
  85.         }
  86. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表