谷动谷力

 找回密码
 立即注册
查看: 894|回复: 0
打印 上一主题 下一主题
收起左侧

MCU与AI——使用NanoEdge AI Studio生成的模型实现运动状态在线...

[复制链接]
跳转到指定楼层
楼主
发表于 2023-11-26 12:37:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
MCU与AI——使用NanoEdge AI Studio生成的模型实现运动状态在线检测


上一篇讲到了NanoEdge AI Studio这个一站式嵌入式AI工具,也采用这个工具配合B-U585I-IOT02A开发板生成了运动状态检测模型。那么,在这一篇文章中,我们将把这个运动状态模型用在基于B-U585I-IOT02A开发板的运动状态检测工程中,实现人体运动状态的在线检测功能。

生成的模型文件介绍


NanoEdge AI Studio在最后一步生成一个压缩包,解压后里边的内容如下图所示。第一个docs文件夹没什么内容,相关的文档是在线的,需要的话可以去看。第二个文件夹emulators包含了Windows和Linux的Emulator,可以称之为模拟器,通过命令行的方式实现对生成模型的在线仿真,模拟在MCU里运行模型的情况,跟NanoEdge AI Studio的第四步相同,只不过NanoEdge AI Studio提供了图形界面。

这两个文件夹里的文件并不是我们需要的,在嵌入式工程里需要的是knowledge.h,libneai.a和NanoEdgeAI.h三个文件。其中头文件knowledge.h包含了模型的一些参数,NanoEdgeAI.h声明了AI相关的函数,便于我们调用。模型的实现都在库文件libneai.a,并没有开源,我们只能调用留出的接口。

metadata.json这个文件包含了数据集、模型的一些信息,在我们的工程中也不需要。

修改工程文件

我们同样基于之前MCU与AI的文章中给出的运动状态检测例程,在例程基础上修改AI模型部分代码。
例程可以采用如下方法下载:
  1. git clone https://gitee.com/matchrom/mcu-ai-example.git
复制代码

其中的iot2_motiondetecting文件夹即是例程源码。

删除原例程中AI相关的源文件

删除Src文件夹中以network开头的几个源文件;
删除Inc文件夹中以network开头的几个头文件;
删除Middlewares/ST/AI文件夹下Inc文件夹里的所有头文件和Lib文件夹下的库文件。

导入NanoEdge AI Studio生成的文件

把libneai.a库文件复制到Middlewares/ST/AI/Lib文件夹下,把knowledge.h和NanoEdgeAI.h头文件复制到Middlewares/ST/AI/Inc文件夹下。

修改工程配置

打开工程属性,按照下图所标序号修改,也就是把原有的库文件替换为NanoEdge AI Studio生成的库文件。

修改main.c


main.c的修改最为关键,主要参考NanoEdge AI Studio给出的示例代码。上一篇文章中提到过,示例代码在生成模型的最后一步页面中给出了。
首先要删除包含的原有模型的头文件,添加如下两个头文件:
  1. #include "NanoEdgeAI.h"
  2. #include "knowledge.h"
  3. 删除原来定义的与AI相关的所有全局变量和函数声明,添加如下全局变量:

  4. float input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER];
  5. float output_class_buffer[CLASS_NUMBER];
  6. const char * id2class[CLASS_NUMBER] = {"walking","running","stationary"};
  7. 接下来要实现一个从传感器读取数据并填充到input_user_buffer数组中的函数fill_buffer。

  8. void fill_buffer(float sample_buffer[])
  9. {
  10.      uint32_t write_index = 0;
  11.      ISM330DHCX_Axes_t acc_axes;
  12.      
  13.      while(write_index < DATA_INPUT_USER * AXIS_NUMBER)
  14.      {
  15.          if(dataRdyIntReceived != 0)
  16.          {
  17.              dataRdyIntReceived = 0;
  18.              ISM330DHCX_ACC_GetAxes(&MotionSensor, &acc_axes);

  19.              sample_buffer[write_index + 0] = (float) acc_axes.x / 1000.0f;
  20.              sample_buffer[write_index + 1] = (float) acc_axes.y / 1000.0f;
  21.              sample_buffer[write_index + 2] = (float) acc_axes.z / 1000.0f;
  22.              write_index += 3;
  23.          }
  24.      }
  25. }
复制代码

删除掉main函数中调用的AI初始化函数,在main函数的while循环之前添加新生成模型的初始化函数并定义变量:
  1. enum neai_state error_code = neai_classification_init(knowledge);
  2. if (error_code != NEAI_OK)
  3. {
  4. Error_Handler();
  5. }

  6. uint16_t id_class = 0;
  7. uint32_t rec_circle = 1;
  8. printf("===Motion Recognition Based on NanoEdge AI Studio===\r\n");
复制代码

修改while循环里的代码如下:
  1. while (1)
  2. {
  3.      fill_buffer(input_user_buffer);
  4.      HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
  5.      neai_classification(input_user_buffer, output_class_buffer, &id_class);
  6.    
  7.      printf("Motion Recognition Circle No. %ld: %d - %s\r\n", rec_circle++, id_class, \
  8.             id2class[id_class - 1]);
  9.      HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
  10. }
复制代码

删除main函数下方定义的AI_Init,AI_Run,argmax这三个函数。
接下来就可以构建工程并下载到开发板中运行了。

运动状态检测模型运行情况

电脑通过USB线连接开发板,串口终端工具读取到的信息如下:

总结


在MCU与AI系列的最后两篇文章中,介绍了NanoEdge AI Studio这个一站式AI工具的使用方法,并利用这个工具实现了从数据采集,模型训练与验证,到模型生成的整个过程,极大地降低了工作难度,简化了工作流程,减轻了工作量。最后还对嵌入式工程进行了修改,使训练好的模型在嵌入式开发板上运行,实现了人体运动状态的在线检测功能。

从这里我们可以看出,被AI赋能后的嵌入式系统,拥有了更多可能,不再只是简单地获取数据,处理数据,传输数据,而是拥有了对数据进行更高级处理、判断、推理、学习的能力,向着更高智能化的方向发展。

我们也注意到,除了ST推出了一系列实现边缘端AI的工具和程序包之外,NXP也推出了eIQ ML软件开发环境,为其旗下的嵌入式产品提供AI开发环境。相信接下来将会有更多更方便使用的工具,帮助我们降低AI开发的难度。

+10
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-4-29 14:45 , Processed in 0.092723 second(s), 43 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表