怎么在stm32上跑自己的神经网络

server/2024/9/23 16:01:52/

此教程为目前全网为数不多用于使用STM32实时跑神经网络结果输出的教程,不涉及原理讲解,只为帮助想在stm32上使用神经网络的朋友

基本步骤为先跑出神经网络得到xxx.h5文件,然后用cubemx把h5文件移植到stm32中,然后初始化设置输入输出,实时输入数据进行神经网络检测,需要做的工作主要有:会写或者会改神经网络代码,输出.h5文件(使用Tesoroflow产生得有版本要求,太高得可能不行),使用cubemx来移植到stm32上;初始化输入输出来使之能把数据输入到神经网络进行运算。

1、 自行上网查询stm32AI教程,网上90%的教程会教到能把官方例程跑出来,使用cubemx进行验证(跑不出来,检查步骤有无错误,时钟设置是否正确,串口设置是否正确)
2、 但如果想实时跑数据进行神经网络检测,在Cubemx上能验证是没有用的,需要在代码中设置输入输出。
3、 根据我给得输入输出初始化函数来进行初始化自己得输入输出参数,然后进行验证。

使用STM32跑神经网络需要的初始化代码:

static void AI_Run(float* pIn, float* pOut)   //神经网络实时计算代码,填入输入输出数组即可
{ai_i32 batch;ai_error err;/* 1 - Create the AI buffer IO handlers with the default definition */ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;/* 2 - Update IO handlers with the data payload */ai_input[0].n_batches = 1;ai_input[0].data = AI_HANDLE_PTR(pIn);ai_output[0].n_batches = 1;ai_output[0].data = AI_HANDLE_PTR(pOut);batch = ai_network_run(network, ai_input, ai_output);if (batch != 1) {err = ai_network_get_error(network);printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
//		Error_Handler();}
}static void AI_Init(ai_handle w_addr, ai_handle act_addr) //初始化代码
{ai_error err;printf("AI_NETWORK_IN_NUM=%d AI_NETWORK_OUT_NUM=%d\r\n", AI_NETWORK_IN_NUM, AI_NETWORK_OUT_NUM);/* 1 - Create an instance of the model */err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);if (err.type != AI_ERROR_NONE) {printf("ai_network_create error - type=%d code=%d\r\n", err.type, err.code);
//		Error_Handler();}/* 2 - Initialize the instance */const ai_network_params params = AI_NETWORK_PARAMS_INIT(AI_NETWORK_DATA_WEIGHTS(w_addr),AI_NETWORK_DATA_ACTIVATIONS(act_addr));if (!ai_network_init(network, &params)) {err = ai_network_get_error(network);printf("ai_network_init error - type=%d code=%d\r\n", err.type, err.code);
//		Error_Handler();}
}

給出一个可参考的伪代码(参考使用方式,以下代码无法直接跑,只是示意)实例:


#include "sys.h"
#include "delay.h"/*bsp*/
#include "usart.h" 
#include "led.h"
#include "key.h"
#include "timer.h"
#include "adc.h"
#include "arc_de.h"
#include "main.h"
#include "crc.h"
#include "usart.h"
#include "gpio.h"
#include "app_x-cube-ai.h"/*宏定义*//**********************全局变量****************************/
float team_data[3] = { 0 };
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;
u16 adcx, i = 0;
u16 n = 0, m = 0;
float F_rate[3] = { 0 };
/* Reference index at which max energy of bin ocuurs */
uint32_t Index = 0;struct  arc_eigenvalue arc_eig;
ai_handle network = AI_HANDLE_NULL;
/**********************函数申明****************************/
static void AI_Init(ai_handle w_addr, ai_handle act_addr);
static void AI_Run(float* pIn, float* pOut);void hard_init(void)
{}
int main(void)
{arm_rfft_fast_instance_f32 S;float aiInData[row][AI_NETWORK_IN_1_SIZE] = {};float aiOutData[AI_NETWORK_OUT_1_SIZE];ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];hard_init();
//初始化AIMX_CRC_Init();MX_X_CUBE_AI_Init();AI_Init(ai_network_data_weights_get(), activations);delay_ms(1);while (1){ AI_Run(aiInData[i], aiOutData);//实时运行}}#ifdef  USE_FULL_ASSERTstatic void AI_Run(float* pIn, float* pOut)
{ai_i32 batch;ai_error err;/* 1 - Create the AI buffer IO handlers with the default definition */ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;/* 2 - Update IO handlers with the data payload */ai_input[0].n_batches = 1;ai_input[0].data = AI_HANDLE_PTR(pIn);ai_output[0].n_batches = 1;ai_output[0].data = AI_HANDLE_PTR(pOut);batch = ai_network_run(network, ai_input, ai_output);if (batch != 1) {err = ai_network_get_error(network);printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);}
}static void AI_Init(ai_handle w_addr, ai_handle act_addr)
{ai_error err;printf("AI_NETWORK_IN_NUM=%d AI_NETWORK_OUT_NUM=%d\r\n", AI_NETWORK_IN_NUM, AI_NETWORK_OUT_NUM);/* 1 - Create an instance of the model */err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);if (err.type != AI_ERROR_NONE) {printf("ai_network_create error - type=%d code=%d\r\n", err.type, err.code);}/* 2 - Initialize the instance */const ai_network_params params = AI_NETWORK_PARAMS_INIT(AI_NETWORK_DATA_WEIGHTS(w_addr),AI_NETWORK_DATA_ACTIVATIONS(act_addr));if (!ai_network_init(network, &params)) {err = ai_network_get_error(network);printf("ai_network_init error - type=%d code=%d\r\n", err.type, err.code);}
}

http://www.ppmy.cn/server/48415.html

相关文章

Python 制作词云图

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

DeepSORT(目标跟踪算法)中卡尔曼滤波器中的预测

DeepSORT(目标跟踪算法)中卡尔曼滤波器中的预测 flyfish 先略再详,先简洁的说,再细说。 卡尔曼滤波器的预测步骤主要有两个目标: 预测下一时刻的状态向量:根据当前状态和运动模型,预测对象在…

【总线】设计fpga系统时,为什么要使用总线?

目录 为什么用总线 为什么选择AMBA 总结 系列文章 【总线】AMBA总线架构的发展历程-CSDN博客 【总线】设计fpga系统时,为什么要使用总线?-CSDN博客 为什么用总线 在FPGA系统设计中,使用总线是为了实现组件间的高效互联与通信&#xff0c…

【Qt 快速入门(三)】- Qt信号和槽

目录 Qt 快速入门(三)- Qt信号和槽Qt信号和槽详解信号和槽的基本概念信号槽连接 信号和槽的声明与定义连接信号和槽信号和槽的高级特性自动参数匹配信号与信号连接lambda 表达式作为槽自定义信号和槽 信号和槽的线程支持跨线程连接 信号和槽的生命周期管…

JAVA动态表达式:Antlr4 G4 模板 + 读取字符串表达式结构树

安装antlr4插件 创建一个后缀是g4的文件 grammar Expr;expression :( expression ) # parens| expression and expression # andOp| expression or expression # orOp| VARNAME comparison_op NUMBER # comparison| VARNAME comparison_op STRING # comparison| …

出现 Cannot deserialize value of type `java.time.LocalDateTime` from String 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 修改Json数据格式3.2 @JsonFormat注解3.3 更换格式3.4 序列化和反序列化1. 问题所示 执行功能模块的时候,后端(浏览器)弹出如下提示 JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from Stri…

viso中分隔符和泳道的定义是什么?有什么作用?

在Microsoft Visio中,分隔符和泳道是两个重要的元素,它们各自在创建和理解流程图时发挥着不同的作用。以下是关于这两个元素的详细定义和作用的解释: 分隔符(Visio分隔符) 定义:Visio分隔符是在使用Visio…

深度神经网络——图像分类如何工作?

智能手机如何仅凭拍摄的照片就能识别物体?社交媒体网站又是如何自动标记照片中的人物?这些功能背后,是人工智能驱动的图像识别和分类技术。 图像识别和分类技术是人工智能领域中一些最令人瞩目的成就。但计算机是如何学会检测和分类图像的呢…