谷谷小师妹 发表于 2023-11-26 12:37:52

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

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模型部分代码。例程可以采用如下方法下载: 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给出的示例代码。上一篇文章中提到过,示例代码在生成模型的最后一步页面中给出了。首先要删除包含的原有模型的头文件,添加如下两个头文件: #include "NanoEdgeAI.h"
#include "knowledge.h"
删除原来定义的与AI相关的所有全局变量和函数声明,添加如下全局变量:

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

void fill_buffer(float sample_buffer[])
{
   uint32_t write_index = 0;
   ISM330DHCX_Axes_t acc_axes;
   
   while(write_index < DATA_INPUT_USER * AXIS_NUMBER)
   {
         if(dataRdyIntReceived != 0)
         {
             dataRdyIntReceived = 0;
             ISM330DHCX_ACC_GetAxes(&MotionSensor, &acc_axes);

             sample_buffer = (float) acc_axes.x / 1000.0f;
             sample_buffer = (float) acc_axes.y / 1000.0f;
             sample_buffer = (float) acc_axes.z / 1000.0f;
             write_index += 3;
         }
   }
}
删除掉main函数中调用的AI初始化函数,在main函数的while循环之前添加新生成模型的初始化函数并定义变量: enum neai_state error_code = neai_classification_init(knowledge);
if (error_code != NEAI_OK)
{
Error_Handler();
}

uint16_t id_class = 0;
uint32_t rec_circle = 1;
printf("===Motion Recognition Based on NanoEdge AI Studio===\r\n");
修改while循环里的代码如下: while (1)
{
   fill_buffer(input_user_buffer);
   HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
   neai_classification(input_user_buffer, output_class_buffer, &id_class);
   
   printf("Motion Recognition Circle No. %ld: %d - %s\r\n", rec_circle++, id_class, \
            id2class);
   HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
}
删除main函数下方定义的AI_Init,AI_Run,argmax这三个函数。接下来就可以构建工程并下载到开发板中运行了。
运动状态检测模型运行情况

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

在MCU与AI系列的最后两篇文章中,介绍了NanoEdge AI Studio这个一站式AI工具的使用方法,并利用这个工具实现了从数据采集,模型训练与验证,到模型生成的整个过程,极大地降低了工作难度,简化了工作流程,减轻了工作量。最后还对嵌入式工程进行了修改,使训练好的模型在嵌入式开发板上运行,实现了人体运动状态的在线检测功能。
从这里我们可以看出,被AI赋能后的嵌入式系统,拥有了更多可能,不再只是简单地获取数据,处理数据,传输数据,而是拥有了对数据进行更高级处理、判断、推理、学习的能力,向着更高智能化的方向发展。
我们也注意到,除了ST推出了一系列实现边缘端AI的工具和程序包之外,NXP也推出了eIQ ML软件开发环境,为其旗下的嵌入式产品提供AI开发环境。相信接下来将会有更多更方便使用的工具,帮助我们降低AI开发的难度。
页: [1]
查看完整版本: MCU与AI——使用NanoEdge AI Studio生成的模型实现运动状态在线...