10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统_springboot deepseek

1 引言

    STM32 微控制器在嵌入式领域应用广泛,因为它性能不错、功耗低,还有丰富的外设,像工业控制、智能家居、物联网这些场景都能看到它的身影。与此同时,人工智能技术发展迅速,也逐渐融入各个行业。

    把 AI 部署到 STM32 上,能让嵌入式系统更智能,不过这并不容易。AI 模型运行需要大量计算资源和内存,而 STM32 硬件资源有限。所以,找到合适工具很重要。

    今天介绍两款能在 STM32 上部署 AI 的实用软件,Nanoedge AI Studio 和 STM32Cube AI。它们能帮开发者解决难题,顺利在 STM32 上部署 AI 算法,下面就详细讲讲这两款软件。

2 Nanoedge AI Studio

2.1 软件获取

Nanoedge AI Studio是用于STM32部署边缘AI的软件,Studio可生成四种类型的库:异常检测、单分类、多分类、预测。它支持所有类型的传感器,所生成的库不需要任何云连接,可以直接在本地学习与部署,支持STM32所有MCU系列。需要搭配STM32CubeMX、Keil或STM32CubeIDE等编译器使用。

下面这个链接是ST的下载网址:

https://www.st.com/en/development-tools/nanoedgeaistudio.html

下载过程中会收到邮件,里面有license,第一次使用软件需要用到

到此,软件就获取完毕

2.2 软件介绍

前面已提到,Studio可生成四种类型的库:异常检测、单分类、多分类、预测。左上角四个模型分别对应这四种库(AD:异常检测,nC:多分类,1C:单分类,E:预测),然后下面是以前做过的一些历史工程。

下面对这四种库讲一下使用流程:

2.2.1 异常检测

异常检测:异常检测是指模型对正常数据与异常数据进行训练、学习后,生成的模型可以识别生成的边缘AI可以判断数据是正常还是错误。

这里可能会有疑问,为什么不使用阈值判断等方法,甚至加个滤波可能更加准确,这么做不是更简单吗,在这里使用AI的作用在哪?

答案是,第一,得到的数据难免会出现上下浮动的问题,如何选取阈值是一个值得考虑的问题,对于界限没那么清晰的情况,经常需要经过多次实验确定阈值。而如果使用AI,我们只需要告诉模型,一种情况下的现象是如何,另一种情况下的现象是如何,直接由算法帮我们分析。

第二,也是比较关键的一点,如果我们需要根据多维参数确定一个整体的综合情况,比如评价水质,我们可能会从多角度去考虑(温度、浊度、PH值、含氧量等),那么这个时候,设定阈值就会非常难。

综上,使用AI来做异常检测,会使得问题考虑起来更容易。

在学习这里的时候,在几个平台看到了几个比较经典的例子,可以引入异常检测:

1.风扇、电机等异常检测:通过电流传感器、ADC等检测电流、电压等物理量,我试过通过MPU6050加速度传感器监测电机是否在正常工作

2.声音检测:通过声音传感器反馈出电压模拟量

3.无人机飞行异常检测:没有仔细去研究参考的物理量,个人认为需要通过上述提到的物理量综合考虑

当然还有一些例子,这里就不一一列举了,大家可以尝试做一下

那么,下面就开始讲解软件基本用法:

点开左上角的AD,进入模型构建界面:

第一个界面是Project Setting:

第一步确定模型在ROM和RAM上的最大占据量,这里我直接用默认

第二步,在右边确定芯片型号。这里比较好的一点是,我可以直接选择一个系列,这个系列里的所有型号都能够通用

第三步,选择参考量的个数。如果想用三轴加速度传感器,那么显然这时需要参考三个量,点击第一个图标即可选择。当然后面还有电流量等等的检测,这里就不再赘述了。

当然,上面也提到了,使用AI来做异常检测的好处是能综合多个量判断状态,这时点击Cross sectional选项可以选择Multi-sensor,注意参考量个数的选择,几个量就是几个Axes。

这里,我选择三轴加速度传感器作为演示实例。

第二个界面是Regular signals。前面提到,需要引入正常数据和异常数据进行检测,这里就是采集正常数据。

点击Add Signal,然后看到有两个方法:

一个是导入本地csv格式的数据表格,另一种是用串口向电脑发送数据。

对于导入csv表格,软件内的提示我感觉写的并不是很清晰,我的理解是:进行的一次实验测得的数据写在一行内。测得的每个数据,都要按照x,y,z的顺序来,然后不要空格。比如我得到三个方向加速度,分别为x,y,z。第一次实验,我在一段时间内测得200次,也就是得到200组加速度数据,第一组为x1,y1,z1,第二组为x2,y2,z2。那么,放在表格里的顺序是:x1,y1,z1,x2,y2,z2,…第一次实验完成后进行第二次实验,把实验数据写在第二行,每行最多有256组数据,然后实验次数不要低于20次,也就是行数不低于20行。

这里注意的一点是,不要写任何题头,直接顶格写数据

对于用串口发送数据,可能会更加方便一点,但前提是不对数据再做人工处理。但这里需要写程序把数据按顺序通过串口发送电脑上。下面的是我用MPU6050发送数据的代码,其他的思路都是一样的,供大家参考。

 char buf[30];
 int cnt;
 MPU6050_Init();
 while (1)
 {
     sprintf(buf,"%ld,%ld,%ld,",AccelData[0],AccelData[1],AccelData[2]);
     MPU6050ReadAcc(Accel);
     for( int i=0;i<3;i++)
     {
		if(Accel[i]>=0)
		{
			AccelData[i]=Accel[i]*2000/32768;
		}
		else
		{
			AccelData[i]=-(-Accel[i]+1)*2000/32768;
		}		
	}
    HAL_UART_Transmit(&huart1,(uint8_t*)buf,strlen(buf),0xFFFF);
    cnt++;
	if(cnt==256)
	{
		cnt=0;
		HAL_UART_Transmit(&huart1,(uint8_t*)"\r\n",2,0xFFFF);
	}
}

每一次实验的数据要用回车隔开,每个数要用特定字符隔开,这里我用的是逗号,当然其他一些符号也行,大家可以自己研究,最后导入之前再把提示的异常数据删除即可。

这时就能看到导入的数据的直观图了,至于RUN OPTIONAL CHECKS那里,我觉得点不点都行,这个的目的是检查数据的质量。

第三个部分是对异常情况下数据的采集,一样的,就不赘述了

第四个部分Benchmark就是模型训练了,这里会自动计算若干个算法对于导入的这些数据的适配性

训练完如此,可以选择最好的几个进行仿真测试。

最后一步,就是自动生成代码了。

左边这几个选项,第三个和第四个勾选即可,

第二个如果导入的数据里没有浮点数,就不要勾选,

如果想同时使用多个模型,勾选第一个,并命名。

最后点击COMPILE LIBRARY,生成文件。

这里需要导入编译器的文件是libenai.a和NanoEdgeAI.h,找到自己工程的位置

打开Core文件夹,里面有Src和Inc两个文件夹,把libenai.a放到Src文件夹里,NanoEdgeAI.h放到Inc文件夹里。然后打开编译器,我这里使用Keil

导入到工程里,然后双击libneai.h文件,点第一个

文件类型选Library file

至此文件就导入完毕了

在Studio,最后一步右边还有自动生成的代码


/* Includes --------------------------------------------------------------------*/
#include "NanoEdgeAI.h"//直接粘贴
/* Number of samples for learning: set by user ---------------------------------*/
#define LEARNING_ITERATIONS 30//直接粘贴
float input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER]; //直接粘贴
void fill_buffer(float input_buffer[])//直接粘贴,后续需要在这里加代码填充input_buffer[]
{
	/* USER BEGIN */
	/* USER END */
}

/* -----------------------------------------------------------------------------*/
int main(void)
{
	/* Initialization ------------------------------------------------------------*/
	enum neai_state error_code = neai_anomalydetection_init();//直接粘贴
	uint8_t similarity = 0;//直接粘贴

	if (error_code != NEAI_OK) {
		/* This happens if the library works into a not supported board. */
	}//直接粘贴

	/* Learning process ----------------------------------------------------------*/
	for (uint16_t iteration = 0 ; iteration < LEARNING_ITERATIONS ; iteration++) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_learn(input_user_buffer);
	}//直接粘贴
	
	/* Detection process ---------------------------------------------------------*/
	while (1) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_detect(input_user_buffer, &similarity);//直接粘贴
		/* USER BEGIN */
    /*
    * e.g.: Trigger functions depending on similarity
    * (blink LED, ring alarm, etc.).
    */
		/* USER END */
	}
}

similarity代表相似度,相似度越高代表越正常,最高为100,最低为0,低于一定值就代表异常,一般认为90以下异常

最后,别忘勾选Short enums/wchar(之前在Studio里勾选,这里照应上了)

到这里就应该可以正常编译了

2.2.2 单分类/多分类

单分类的是指,将数据进行导入,进行机器学习后,可以判断出设备的正常或者异常。这里与异常判断不同的是,这里会将所有非正常的数据判断为异常,而异常判断却可以分析出当前数据与正常数据的相似度。

单分类跟异常检测还是很像的,这里就不多说了,唯一需要说的是,导入数据的时候要把两类都导入,同样多分类也是,也不多说了

2.2.3 预测

模型可以对过往的数据进行分析,训练,生成的模型可以根据近期的数据近似分析出下一个时刻可能的数据,大家也可以自行研究。

至此,Nanoedge AI Studio讲解完毕

3 STM32Cube AI

3.1 软件获取

X-CUBE-AI是STM32Cube.AI生态系统的STM32Cube扩展软件包的一部分,通过自动转换预训练的神经网络并将生成的优化库集成到用户的项目中,扩展了STM32CubeMX功能。

简而言之就是通过X-Cube-AI扩展将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用,目前使用X-Cube-AI需要在STM32CubeMX版本5.0以上,目前支持转化的模型有Keras、TF lite、ONNX等,还算比较牛的,Cube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。

在工程内,或Manage Embedded Software Packages里安装

3.2 软件介绍

我这里使用8.1版本,导入什么类型的模型就选什么格式,选择STM32Cube.AI runtime,Compression代表压缩模型,如果模型过于复杂,那么根据需求选择压缩程度,Optimization是选择时间和空间的协调程度,即时间优先还是空间优先

然后点击Analyze分析模型,分析结束后可以直接生成代码,打开编译器,这里着重讲一下代码,需要对自动生成的代码有一定了解。

写程序基本的思路是:输入数据(预处理)、模型推理、输出数据(后处理)

先看main.c文件,自动生成的代码如下:

MX_X_CUBE_AI_Init();
while (1)
{
    MX_X_CUBE_AI_Process();
}

显然,第一句是AI初始化,while内的是AI的数据处理

AI的初始化我没有改动,主要看AI的数据处理过程,右键MX_X_CUBE_AI_Process()看这个函数的定义

void MX_X_CUBE_AI_Process(void)
{
    /* USER CODE BEGIN 6 */
  int res = -1;

  printf("TEMPLATE - run - main loop\r\n");

  if (network) {

    do {
      /* 1 - acquire and pre-process input data */
      res = acquire_and_process_data(data_ins);
      /* 2 - process the data - call inference engine */
      if (res == 0)
        res = ai_run();
      /* 3- post-process the predictions */
      if (res == 0)
        res = post_process(data_outs);
    } while (res==0);
  }

  if (res) {
    ai_error err = {AI_ERROR_INVALID_STATE, AI_ERROR_CODE_NETWORK};
    ai_log_err(err, "Process has FAILED");
  }
    /* USER CODE END 6 */
}

其实这里就可以看出前面提到的三个步骤,但这里的逻辑我感觉没有说很好,于是决定自己封装函数。

这里就不过多讲解了,其实这里需要对app_x_cube_ai.c文件里的代码做一定的了解,

比如代码里涉及到的数据类型,这里换了个名,要能看懂

typedef uint8_t       ai_custom_type_signature;

typedef void*         ai_handle;
typedef const void*   ai_handle_const;

typedef float         ai_float;
typedef double        ai_double;

typedef bool          ai_bool;

typedef char          ai_char;

typedef uint32_t      ai_size;
typedef int16_t       ai_short_size;

typedef uintptr_t     ai_uptr;

typedef unsigned int  ai_uint;
typedef uint8_t       ai_u8;
typedef uint16_t      ai_u16;
typedef uint32_t      ai_u32;
typedef uint64_t      ai_u64;

typedef int           ai_int;
typedef int8_t        ai_i8;
typedef int16_t       ai_i16;
typedef int32_t       ai_i32;
typedef int64_t       ai_i64;

typedef uint64_t      ai_macc;

typedef int32_t       ai_pbits;

typedef uint32_t      ai_signature;

typedef void (*ai_handle_func)(ai_handle);

CubeMX也提供了一些示例代码,也有一个大概的了解

/* USER CODE BEGIN 2 */
int acquire_and_process_data(ai_i8* data[])
{
  /* fill the inputs of the c-model
  for (int idx=0; idx < AI_NETWORK_1_IN_NUM; idx++ )
  {
      data[idx] = ....
  }

  */
  return 0;
}

int post_process(ai_i8* data[])
{
  /* process the predictions
  for (int idx=0; idx < AI_NETWORK_1_OUT_NUM; idx++ )
  {
      data[idx] = ....
  }

  */
  return 0;
}
/* USER CODE END 2 */

最后附上我自己封装的代码,供大家参考。

我训练的模型是输入5个float数据,输出1个ai_i32数据

app_x_cube_ai.c文件

ai_buffer* Get_Inputs(void)
{
	ai_u16 *in_buffer=(short unsigned int*)0;
	return ai_network_inputs_get(network,in_buffer);
}
ai_buffer* Get_Outputs(void)
{
	ai_u16 *out_buffer=(short unsigned int*)0;
	return ai_network_outputs_get(network,out_buffer);
}
void PrepareInput(ai_float* InputData)
{
	ai_input=Get_Inputs();
	ai_input->data=InputData;
}
ai_i32* Predict()
{
	ai_output=Get_Outputs();
	ai_run();
	return (ai_i32*)ai_output->data;
}
void NetPrint()
{
	printf("Input shape:");
	for(int i=0;i<Get_Inputs()->shape.size;i++)
	{
		printf("%d ",Get_Inputs()->shape.data[i]);
	}
	printf("\r\n");
	printf("Output shape:");
	for(int i=0;i<Get_Outputs()->shape.size;i++)
	{
		printf("%d ",Get_Outputs()->shape.data[i]);
	}
	printf("\r\n");
}

.h文件

void PrepareInput(ai_float* InputData);
void NetPrint(void);
ai_i32* Predict(void);

main.c文件

float Data[6][5]={
  
  {1,450,23,7,60},{0,640,25,8,10},{2,420,25,8,0},{3,680,27,8.5,20},{4,400,24,7,80},{5,530,22,7.5,40}};
NetPrint();
 while (1)
 {    
    for(int k=0;k<6;k++)
    {
	    float InputData[5]={Data[k][0],Data[k][1],Data[k][2],Data[k][3],Data[k][4]};
		PrepareInput(InputData);
		printf("InputData:%f %f %f %f %f\r\n",InputData[0],InputData[1],InputData[2],InputData[3],InputData[4]);
		printf("outData:%d\r\n",*Predict());
		printf("\r\n");
	}
 }

测试结果与上位机一致。至此,STM32Cube AI的基本使用讲解结束。

AI大模型学习路线

如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

微信扫描下方二维码获取哦!
在这里插入图片描述

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

请添加图片描述
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

100套AI大模型商业化落地方案

请添加图片描述

大模型全套视频教程

请添加图片描述

200本大模型PDF书籍

请添加图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

LLM面试题合集

请添加图片描述

大模型产品经理资源合集

请添加图片描述

大模型项目实战合集

请添加图片描述

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

### 如何使用 Spring BootVue 构建 AI 聊天应用 #### 后端服务搭建 为了构建一个AI聊天应用程序,首先需要创建一个Spring Boot项目来处理业务逻辑和服务请求。通过Spring Initializr初始化一个新的Spring Boot项目,并添加必要的依赖项,如`Spring Web`用于提供RESTful API支持,以及可能的其他库比如`Spring Security`以保障安全性[^1]。 对于AI部分的功能实现,则需集成第三方API或是自定义机器学习模型来进行自然语言处理(NLP),这通常涉及到调用外部NLP服务提供商的服务接口完成消息的理解和回复生成工作。 ```java // 示例:配置RestTemplate Bean以便于后续调用远程HTTP服务 @Configuration public class AppConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } ``` #### 前端界面设计 前端采用Vue框架配合Element UI组件库能够快速搭建起美观易用的应用程序界面。利用Vue CLI工具可以方便地建立新的Vue项目,在此之上安装并引入Element UI作为UI解决方案的一部分[^2]。 针对聊天场景的特点,应该精心规划页面布局结构,确保用户体验良好;同时也要考虑到实时通信的需求,考虑WebSocket或其他适合的技术方案来实现实时的消息传递机制。 ```javascript // 安装element-ui命令 npm install element-ui --save ``` #### 数据交互与展示 在前后端分离架构下,客户端发送用户输入至服务器端进行解析计算后返回响应结果再由前端负责渲染显示出来。因此要特别注意前后两端之间的数据格式约定一致性和高效传输性能优化等问题。 具体来说就是当用户提交一条新信息到对话框里时,它会被封装成JSON对象并通过AJAX异步请求的方式传送给后台处理器方法处理;而接收到的回答同样是以JSON的形式被送回给浏览器端,最后交由JavaScript代码更新DOM节点从而呈现在屏幕上[^3]。 #### 实现细节补充说明 由于涉及到了较为复杂的算法运算(例如意图识别、情感分析等),这部分往往不是简单的几行代码就能概括清楚的内容。实际操作过程中建议开发者深入研究相关领域知识和技术文档资料,必要时候还可以借助开源社区的力量寻求帮助和支持。 另外值得注意的是安全方面的问题也不容忽视,尤其是在涉及到敏感个人信息保护的时候更应加强防范措施,防止发生数据泄露事件造成不良后果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值