【NanoEdgeAIStudio】初次体验

news2024/11/17 9:48:49

本文前言

  NanoEdge ai Studio是ST提供的免费软件,可以轻松地将ai添加到任何Arm@ Cortex®-M MCU上运行的任何嵌入式项目中。官网首页:NanoEdge AI Studio,官方文档:AI:NanoEdge AI Studio。官方文档写的很详细,建议观看。

  原本是基于keil5来体验的,但是keil5的默认编译器找不到添加链接.a文件的地方,虽然说也能切换成GCC,但是看着网上的资料和自己的尝试,感觉问题不少,还是直接换STM32CubeIDE了。

  验证目标:基于STM32F407VGT6+附着在杯子上的六轴传感器(MPU6050)+NanoEdge AI Studio训练的异常状态模型。其它材料:STLINK-V2,USB转串口模块,若干杜邦线。当然文章末尾,我也会提供项目工程,和使用到的正常异常信号的CSV文件和导出的模型。

前置准备

安装NanoEdge AI Studio

去官网注册下载安装包,填好自己的邮箱,会收到账号激活邮件,和进入NanoEdge AI Studio时所需的序列号,就不演示了,相信大家都会注册安装的,前言处有官网链接。

安装STM32CubeIDE

如果,你也和我一样之前只用Keil5,那么就需要去这里,意法官网STM32CubeMX:图形化工具下个STM32CubeIDE了。

  • 为什么在下图实物中插了两个模块,因为STM32CubeIDE默认不支持DAP的,我也鼓捣过下,但是问题不少,所以还是老老实实用STLINK-V2了,不然有1个模块都同时支持串口和DAP了。

体验流程

下述流程,将安装前言的目标进行异常状态项目所配置训练,不会去扩展讲解其它的东西,读者在基本了解流程和软件的使用的流程后,在自行探索,如探寻其它的项目类型,1 类分类,N 级分类*,外推法的训练之类的。

项目设置

在项目配置这里,设置个项目名称,写个描述,选择目标芯片就可以,下滑在选择轴数就可以了。像RAM和Flash都是用默认配置。完成后点击下一步即可。

在这里插入图片描述

在这里插入图片描述


信号采集

信号采集,或者是数据采集。在项目中是步骤2采集正常信号,步骤3采集异常信号。

输入文件格式的一般注意事项:

.txt / .csv 文件。仅数值,无标题。统一分隔符(单字节、制表符、逗号或分号)。使用句点 (.) 格式化的十进制值。每行少于 16,384 个值。每行的数值数量一致。每个传感器轴至少 20 条线。总行数少于 ~100,000 行。文件大小小于 ~1 Gbit。

三个导入信号方式:

  1. 文件.txt / .csv 格式)
  2. 从实时数据记录器的串行端口 (USB)
  3. 来自 FP-SNS-Datalog

上面说的都是官方的规则格式,我的是通过配置好的串口接收信号。关于数据分割可以看到步骤2界面中讲解了。其实就是数据分割符,行与行之间的分割符,上传就看了,可能描述的比较迷糊,可以看代码表述。

int LineNum = 0;
while (1)
{
    while(MPU6050_DMP_Get_Date(&x,&y,&z)!=0){}
    // 学习时,获取数据用	
    printf("%.2f,%.2f,%.2f,",x,y,z);
    LineNum++;
    HAL_Delay(10);
    if(LineNum>=100) 
    {
        printf("\r\n");
        LineNum = 0;
    }
}

点击ADD SIGNAL添加信号

在这里插入图片描述

NormalSignal1信号是之前采集的,刚开始都是空的。选择了串口采集后,就跟常见的串口监视器的操作差不多的,圈出来的两个是开始监听/暂停和清除所有,相信大家都能看得懂的的。还有两个要注意的地方是:

  1. 采集行数不等于最终的信号数,在下一步中是可以删除选择的,假如采集了100行,可以只选择20行。
  2. 串口采集完后,一定要暂停,且有数据后才能点击CONTINUE继续到下一步数据处理

在这里插入图片描述

在这里插入图片描述

当信号采集好后,会有图框分析这段数据。我这里就是采集了20行的数据量,每行300个值,因为设置的是三轴,所以每行每轴是100个值。大概是这么个表达,[x1 y1 z1 … x100 y100 z100 ] * 20行。

在这里插入图片描述

在这里插入图片描述

因为步骤3的异常信号采集,与这个正常信号采集流程一样,就不再赘述。所以说我的验证数据分别是,1个正常信号,1个异常信号,就简单的体验体验先。


基准训练

到基准这里后,点击RUN NEW BENCHMARK,选择信号开始即可。我之前训练过一个了,就不重新训练了,在下面看可以看到它的数据,而且是只训练到了,预计验证模型数的百分之十多,我就停止了,可能全部验证完要1个多小时,我觉得太久了。所以说模型可能不是最优。

在这里插入图片描述

在这里插入图片描述


验证信息

会列出指定基准的,所有验证过的模型列出来和各种基本参数,且把最优标上皇冠。没有要操作的,进行到下一步模型部署。

在这里插入图片描述


模型部署

看下面的模型部署块,还是不理解的话可以看看官方关于部署的介绍,AI:NanoEdge 异常检测 (AD) AI 库—部署。按官方文档中描述,可以在Arduino(基于Cortex-M的板子)下或有GCC编译器的环境下部署的。

在NanoEdge AI Studio上的部署界面

有5个单选框,有跟内存与效率有关的,有是否包括来自基准的知识(否的话,则不包含训练过的知识,在嵌入式上使用时必需调用学习后才能用),这里暂时先按默认配置里。点击COMPILE LIBRARY导出zip即可。

至于官方右侧的开始代码,下面我就去掉注释简单的描述下。

![部署-进入配置2](部署-进入配置2.png)#include "NanoEdgeAI.h"
// 学习样本数量:由用户设置
#define LEARNING_ITERATIONS 10
// 输入值缓冲区
float input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER];
// 私有函数:用于填充数据,来进行学习或验证
void fill_buffer(float input_buffer[])
{
	/* USER BEGIN */
	/* USER END */
}
// 主函数
int main(void)
{
	// 初始化
	enum neai_state error_code = neai_anomalydetection_init();
	uint8_t similarity = 0;

	if (error_code != NEAI_OK) {
		// 初始化失败后操作
	}

	// 学习过程
	for (uint16_t iteration = 0 ; iteration < LEARNING_ITERATIONS ; iteration++) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_learn(input_user_buffer);
	}
	
	// 检测过程
	while (1) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_detect(input_user_buffer, &similarity);
	}
}

在这里插入图片描述

STM32CubeIDE上需要进行的配置。

项目中添加libneai.a的编译链接

添加右键项目,点击属性。然后在属性框下,C/C++构建->设置->MCU/MPU GCC Linker的Libraries下,在 Libraries 部分添加 “neai”,在 Library search path 部分添加 libneai.a 路径。单击 Apply and Close (应用并关闭)

在这里插入图片描述

在这里插入图片描述

项目中添加NanoEdgeAI.h的引入路径

也是在属性框下的配置,大家就按照自己的存放库的路径自行添加。

在这里插入图片描述

至此,文件配置也算是完成了,接下来就是在main.h中编写用户代码了。不过其实在在上面的解析官方的开始文件中,该说的都说了,所以还是,直接把我的main.h用户代码全贴了出来,大家可以自行比对(为了减少行数,已删去HAL库的注释)。

#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"

#include "MPU6050.h"
#include "stdio.h"
#include "MPU6050_DMP.h"
#include "NanoEdgeAI.h"
#define LEARNING_ITERATIONS 10
float input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER]; // Buffer of input values
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1, (uint8_t*)&ch,1,HAL_MAX_DELAY);
    return ch;
}

void SystemClock_Config(void);

float x = 0;
float y = 0;
float z = 0;
int ret = 0;
void fill_buffer(float input_buffer[])
{
	/* USER BEGIN */
	char count = 0;
	// 达到数组即可退出
	while(count < DATA_INPUT_USER)
	{
		// 单轮学习配置
		MPU6050_DMP_Get_Date(&x,&y,&z);
		while(MPU6050_DMP_Get_Date(&x,&y,&z)!=0){}
		// 一次三轴
		input_buffer[count*3] = x;
		input_buffer[count*3+1] = y;
		input_buffer[count*3+2] = z;
		// 递增
		count++;
	}
	/* USER END */
}

int main(void)
{

  enum neai_state error_code;
  uint8_t similarity = 0;
    
  HAL_Init();
   
  SystemClock_Config();
  
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_I2C1_Init();

  printf("Hello World\r\n");
  do
	{
		ret = MPU6050_DMP_init();
		printf("MPU6050 init, ret = %d\r\n", ret);
		HAL_Delay(100);
	} while(ret);
	printf("address:%x\r\n",MPU6050_ReadID());
	// Ai初始化
	error_code = neai_anomalydetection_init();
	similarity = 0;
	if (error_code == NEAI_OK)
	{
		printf("Ai_InitOK\r\n");
	}
	else
	{
		printf("Ai_InitErr:%d\r\n",error_code);
	}
	// Ai前置学习
	for (uint16_t iteration = 0 ; iteration < LEARNING_ITERATIONS ; iteration++) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_learn(input_user_buffer);
		printf("LearnNum:%d\r\n",iteration+1);
	}
  while (1)
  {
  	// 验证数据采集
		// 达到数组即可退出
  	fill_buffer(input_user_buffer);
		// 进入验证
  	neai_anomalydetection_detect(input_user_buffer, &similarity);
  	printf("%d\r\n",similarity);
  }
}

演示验证

实物材料以及烧录到开发板中,测试验证图。相似度从0~100,下述串口输出相似率,降到90以下时,是对杯子进行倾倒了。还就是,因为我的模型没有勾选,利用基准时的数据,所以在10次学习时,还需要让杯子传入10次正常信号,进行学习。

在这里插入图片描述

在这里插入图片描述

资料链接

STM32CubeIDE项目工程,1个正常信号,1个异常信号的CSV文件,libneai_cupcondition_2.zip为上述项目部署导出的模型。
链接:https://pan.baidu.com/s/1p9s-AsT9HGWFgRYQo-VVyQ  提取码:pdhs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 从入门到实战12(流程控制-跳出循环语句)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

【数据结构】顺序表和链表——链表(包含大量经典链表算法题)

文章目录 1. 单链表1.1 概念与结构1.1.1 结点1.1.2 链表的性质1.1.3 链表的打印 1.2 实现单链表1.3 链表的分类1.4 单链表算法题1.4.1 移除链表元素1.4.2 反转链表1.4.3 链表的中间结点1.4.4 合并两个有序链表1.4.5 链表分割1.4.6 链表的回文结构1.4.7 相交链表1.4.8 环形链表1…

【运维监控】influxdb 2.0+grafana 监控java 虚拟机以及方法耗时情况(完整版)

关于java应用的监控本系列有文章如下&#xff1a; 【运维监控】influxdb 2.0telegraf 监控tomcat 8.5运行情况 【运维监控】influxdb 2.0grafana 监控java 虚拟机以及方法耗时情况 【运维监控】Prometheusgrafana监控tomcat运行情况 【运维监控】Prometheusgrafana监控spring b…

软考科目傻傻分不清?一次搞懂各科目考核内容!小白不再纠结!

2024年下半年软考报名已经逐步进入尾声了&#xff0c;大部分考生都已完成报名&#xff0c;但有不少小白因为是第一次报考&#xff0c;对各科目傻傻分不清&#xff0c;导致报错了科目…… 这种情况很可能会影响考试&#xff0c;浪费了一次报考机会。而为了尽量避免这一情况再发生…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

国产“小钢炮”MiniCPM3-4B:小参数,大能量!

前沿科技速递&#x1f680; 在 AI 大模型浪潮中&#xff0c;国内厂商面壁智能再次突破&#xff0c;推出了其最新的“小钢炮”系列——MiniCPM 3.0。这款全新模型不仅实现了在移动设备上运行 GPT-3.5 级别的能力&#xff0c;而且具备超强的推理、检索与代码解释功能。MiniCPM 3.…

Python必知必会:程序员必须知道的22个Python单行代码!

今天给大家分享24个每个Python程序员都必须知道的单行代码&#xff0c;帮你写出更简洁、更优雅、更高效的代码。 1. 列表推导式 列表推导式&#xff08;List Comprehensions&#xff09;可以提供一种简洁的方式创建列表。相较于传统的循环&#xff0c;列表推导式更高效、可读…

240909-ChuanhuChatGPT集成Ollama的环境配置

A. 最终效果 B. 需求文件 requirements.txt (至少需要安装这个&#xff0c;具体参见官网)requirements_advanced.txt &#xff08;如果安装了Ollama&#xff0c;并且可以进行对话&#xff0c;可以不需要安装&#xff0c;具体参见官网&#xff09;requirements_succcess.txt&am…

Qt5.4.1连接odbc驱动操作达梦数据库

Qt5.4.1连接odbc驱动操作达梦数据库 1 环境介绍2 Qt5.4.1 安装2.1 图形化界面安装Qt5.4.12.2 配置Qt5.4.1 环境变量2.3 Qt5.4.1 生成 libqsqlodbc.so 并配置2.3.1 生成Makefile2.3.2 查看 libqsqlodbc.so 文件并配置 3 配置Qt测试用例4 达梦数据库学习使用列表 1 环境介绍 CPU…

SAP加密解密功能设计

SAP加密解密功能设计 【场景】与外围系统对接时&#xff0c;出于信息安全等因素&#xff0c;经常需要对传输的信息做加密解密控制。 1. 公用类zcl_aes_utility *----------------------------------------------------------------------* * CLASS ZCL_AES_UTILITY DEFI…

Ubuntu 22.04 安装增强功能失败

安装的时候&#xff0c;总是失败&#xff0c;然后根据提示查看 log 猜测可能需要安装g12 ubuntu22.04.2 目前(until 23.6.25) gcc 的默认版本是 11.3.0, 有些 c 的特性无法享用.Launchpad toolchain test buildsLanchpad toolchain build 将 Lanchpad 上的 PPA 加入到 apt 搜…

用Python包加速你的视频剪辑:Tailor工具全解析

Tailor是一款视频智能裁剪、视频生成和视频优化的视频剪辑工具。目前的目标是通过人工智能技术减少视频剪辑的繁琐操作&#xff0c;让普通人也能简单实现专业剪辑人的水准&#xff01;长远目标是让视频剪辑实现真正的AIGC&#xff01; 当然&#xff0c;这是一份Python包的列表…

分组注解和自定义注解及分页查询

自定义注解的使用步骤 案例&#xff1a; 此时state需要进行的校验使用普通方式无法满足&#xff0c;需要我们根据需求进行自定义注解 创建一个注解 Documented//元注解 Retention(RetentionPolicy.RUNTIME)//元注解 Constraint(validatedBy {StateValidation.class}//指定提供…

DPDK基础入门(七):网卡性能优化

DPDK的轮询模式 运行在操作系统内核态的网卡驱动程序基本都是基于异步中断处理模式&#xff0c;而DPDK采用了轮询或者轮询混杂中断的模式来进行收包和发包。 任何包进入到网卡&#xff0c;网卡硬件会进行必要的检查、计算、解析和过滤等&#xff0c;最终包会进入物理端口的某…

最高1000万 各地模型和算法备案补贴政策一览

最高1000万 各地模型和算法备案补贴政策一览 2024年7月31日&#xff0c;成都市的人工智能产业再度引起关注。通过国家大模型备案的三家企业——海艺互娱、晓多科技和明途科技&#xff0c;获得了成都市经信局市新经济委的百万奖励。这一奖励源自成都发布的《成都市进一步促进人工…

手把手带你拿捏指针(1)

文章目录 一、内存和地址1.内存编号、地址和指针的关系2.对于编址的理解 二、指针变量和地址1.取地址操作符&2.指针变量3.解引用操作符(*)4.指针变量的大小 三、指针变量类型的意义1.指针解引用2.指针-整数3.void*指针 四、const修饰指针1.const修饰变量2.const修饰指针变量…

避障小车—51单片机

一、小车底盘组装 根据视频的安装步骤安装 二、 电机模块开发 2.1 L9110s概述 接通VCC&#xff0c;GND 模块电源指示灯亮&#xff0c; 以下资料来源官方&#xff0c;但是不对&#xff0c;根据下节课实际调试 IA1输入高电平&#xff0c;IA1输入低电平&#xff0c;【OA1 OB1…

【项目二】C++高性能服务器开发——日志系统(终章)

感谢sylar&#xff0c;感谢开源笔记的所有人~ 知识点备忘录switch结合宏定义简化获取时间戳获取行号获取线程ID 知识点备忘录 上一篇适配器后得到的输出是下面这样&#xff0c;在main函数中定义了需要的一切&#xff0c;和项目所需要的还相差很远&#xff0c;比如日志级别需要…

通过AI来创建一个_____html css网页制作成品 例子演示

使用AI 输入创建一个 html css网页制作成品 例 然后出来 好的&#xff0c;我将为您创建一个简单的HTML和CSS网页制作的示例。这个示例将包括基本的布局、文本样式和一些内联的CSS样式。 { "name": "dalle", "description": "A simple exa…

价值流思维:全面提升业务效率与企业竞争力的核心方法论

价值流驱动的企业架构转型 在数字化浪潮的推动下&#xff0c;企业面临前所未有的竞争压力和业务复杂性。如何在动态市场环境中保持竞争优势&#xff0c;已经成为企业管理者亟待解决的问题。《价值流指南》由The Open Group发布的企业数字化转型专业参考指南&#xff0c;系统化…