本方案是基于Hexabitz模块的人类活动识别程序,在Hexabitz模块上使用机器学习创建运动感应应用程序以识别人类活动。在本方案中,您将学习如何创建运动感应应用程序,以在Hexabitz模块上使用机器学习来识别人类活动。使用的模型根据H0BR4x(IMU模块)提供的加速度计数据对静止、步行或跑步等活动进行分类。我们将为新的Hexabitz模块H41R6x创建一个人类活动识别(HAR)应用程序。该模块由带有FPU(浮点单元)、ART(自适应实时加速器)、MPU(内存保护单元)和DSP指令的STM32F413VHT6微控制器(32位ARMCortex-M4)供电。首先,我们需要通过向H0BR4x(IMU模块)发送消息来读取加速度计数据值,它将响应代表X、Y和Z轴加速度计值的12字节消息。其次,我们将使用使用专门为此示例创建的小数据集训练的Keras模型。下载预训练的model.h5或使用您自己的数据捕获创建您自己的模型。有关如何创建和训练您自己的模型的说明可以在以下PythonNotebook中找到dataset.zip是用于各种人类活动的3轴加速度数据的即用型数据集。1.在H41R6x固件项目中添加STM32Cube.AI:回到STM32CubeIDE,回到软件组件选择:添加X-CUBE-AICore组件以包含库和代码生成选项:使用人工智能过滤器。启用核心。单击“确定”接下来,配置X-CUBE-AI组件以使用您的keras模型:展开附加软件以选择STMicroelectronics.X-CUBE-AI.7.0.0检查以确保选择了X-CUBE-AI组件点击添加网络将网络类型更改为Keras浏览以选择型号(可选)点击Analyze查看模型内存占用、占用和复杂度。保存或项目>生成代码2.包括STM32Cube.AI的头文件:添加Cube.AI运行时接口头文件(ai_platform.h)和由Cube.AI生成的特定于模型的头文件(network.h和network_data.h)。3.声明神经网络缓冲区:使用默认生成选项,应该分配三个额外的缓冲区:激活、输入和输出缓冲区。激活缓冲区是CubeAI运行时的私有内存空间。在推理执行期间,它用于存储中间结果。声明一个神经网络输入和输出缓冲区(aiInData和aiOutData)。相应的输出标签也必须添加到活动中。4.增加AI自举功能:在函数原型列表中,添加以下声明:此代码段按原样提供,通过使用它,您同意受可在此处找到的组件许可条款的约束:应用程序。并添加以下代码片段以将STM32Cube.AI库用于具有float32输入的模型staticvoidAI_Init(ai_handlew_addr,ai_handleact_addr){ai_errorerr;/*1-Createaninstanceofthemodel*/err=ai_network_create(&network,AI_NETWORK_DATA_CONFIG);if(err.type!=AI_ERROR_NONE){printf("ai_network_createerror-type=%dcode=%d\r\n",err.type,err.code);Error_Handler();}/*2-Initializetheinstance*/constai_network_paramsparams=AI_NETWORK_PARAMS_INIT(AI_NETWORK_DATA_WEIGHTS(w_addr),AI_NETWORK_DATA_ACTIVATIONS(act_addr));if(!ai_network_init(network,¶ms)){err=ai_network_get_error(network);printf("ai_network_initerror-type=%dcode=%d\r\n",err.type,err.code);Error_Handler();}}staticvoidAI_Run(float*pIn,float*pOut){ai_i32batch;ai_errorerr;/*1-CreatetheAIbufferIOhandlerswiththedefaultdefinition*/ai_bufferai_input[AI_NETWORK_IN_NUM]=AI_NETWORK_IN;ai_bufferai_output[AI_NETWORK_OUT_NUM]=AI_NETWORK_OUT;/*2-UpdateIOhandlerswiththedatapayload*/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("AIai_network_runerror-type=%dcode=%d\r\n",err.type,err.code);Error_Handler();}}5.创建一个argmax函数:创建一个argmax函数以返回得分最高的输出的索引。6.调用之前实现的AI_Init()函数在BOS_init()之后在main中添加AI_Init();7.更新主for循环:最后,将所有内容与主循环中的以下更改放在一起for:voidUserTask(void*argument){/*Infiniteloop*/for(;;){while(write_indexmessageParams[0]=4;messageParams[1]=1;SendMessageToModule(1,551,2);HAL_UART_Receive_DMA(&huart4,(uint8_t*)&array_temp[0],12);x=bytesToFloat(array_temp[0],array_temp[1],array_temp[2],array_temp[3]);y=bytesToFloat(array_temp[4],array_temp[5],array_temp[6],array_temp[7]);z=bytesToFloat(array_temp[8],array_temp[9],array_temp[10],array_temp[11]);x=x*1000;y=y*1000;z=z*1000;aiInData[write_index+0]=(float)(x)/4000.0f;aiInData[write_index+1]=(float)(y)/4000.0f;aiInData[write_index+2]=(float)(z)/4000.0f;memset(array_temp,0,12);x=0;y=0;z=0;write_index=write_index+3;Delay_ms(10);}/*Normalizedatato[-1;1]andaccumulateintoinputbuffer*//*Note:windowoverlappingcanbemanagedhere*/if(write_index==AI_NETWORK_IN_1_SIZE){write_index=0;AI_Run(aiInData,aiOutData);class=argmax(aiOutData,AI_NETWORK_OUT_1_SIZE);memset(aiInData,0,sizeof(aiInData));memset(aiOutData,0,sizeof(aiOutData));if(class==0)HAL_UART_Transmit(&huart2,(uint8_t*)"stationary\r\n",sizeof("stationary\r\n"),100);elseif(class==1)HAL_UART_Transmit(&huart2,(uint8_t*)"walking\r\n",sizeof("walking\r\n"),100);elseHAL_UART_Transmit(&huart2,(uint8_t*)"running\r\n",sizeof("runnin3\r\n"),100);}}}8.编译、下载并运行:您现在可以编译、下载和运行您的项目,以使用实时传感器数据测试应用程序。尝试以不同的速度移动板来模拟人类活动。在空闲时,当板子处于静止状态时,我们向H23R0x(蓝牙模块)发送“1”,应用程序应显示“stationary”。如果您缓慢上下移动电路板到中等速度,我们将向H23R0x发送“2”。应用程序应显示“walking”。如果你快速摇动板子,我们发送“3”到H23R0x,应用程序应该显示“正在运行”。如果您对此项目有任何想法、意见或问题,请在下方留言。