昨天介绍了使用ST的NanoEdge AI Studio实现MAX30100对于心率是否异常的检测。
我提到了一嘴,用该传感器判断是食指还是中指还是其他指头。本来是随口提一嘴举个例子,但是今天还是去尝试了一下能不能实现。
对于我们的三个指头(5个也好)本质上是一种多分类网络问题,我们将输入信号划分成不同的分类。
-
小拇指
-
大拇指
-
中指(后来用了食指方便)
-
没有指头(空置)
因此我们利用多分类神经网络来实现判断功能。
int i = 0;void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ maxim_max30102_read_fifo(&red,&ir); printf("%ld ",ir); i++; if(i==128) { i=0; printf("n"); }}
信号的输入部分则和上期一样,100HZ的采样率,128的采样长度。
创建一个n-Class n分类神经网络。
其他设置都和上期的保持一样,使用通用一轴传感器。
但是信号输入的地方,我们利用串口导入各个类别的数据(这里是不同的指头)
需要注意的是,这里的标签即代表着我们的分类,不像之前那样子可以一个类别下面可以使用多组数据。
训练我们的模型,这里可以选择我们的分类(其实这里我觉得要是把某组数据能添加到某个分类就好了,这里让我研究一下)。
训练好我们的模型,这里可以关注各指标。 接着就是验证我们的模型, 验证的过程可以参考文章开头的视频 。
部署完我们的模型之后,查看生成的.ZIP文件,其中相比于异常识别多了一个knowledge的头文件。
这里我们需要libneai.a以及两个.h文件
STM32中用机器学习实现正确率99.95%的心率异常检测!STM32机器学习实例:心率检测!简单的小实例,却是迈向新领域的步伐
怎么导入文件请查看这篇文章。
初始化函数中,我们需要导入一个数组,这个数组就定义在knowledge.h这个文件中。
neai_classification_init(knowledge);
初始化的时候,需要以这个数组为参数。
之后我们在定时器中,采集到128个数据之后进行预测。
float IRD[128];int i = 0;int LeranTime= 0;const char *id2class[CLASS_NUMBER + 1] = { // Buffer for mapping class id to class name "unknown", "zhongzhi", "Error", "xiaomuzhi2", "damuzhi",};float Output[4];void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ uint16_t yuce; maxim_max30102_read_fifo(&red,&ir); IRD[i] = ir; i++; //printf("%d ",ir); if(i==128) {
neai_classification(IRD,Output,&yuce);
printf("nnn"); printf("zhongzhi:%.2frn",Output[0]); printf("Error:%.2frn",Output[1]); printf("xiaomuzhi:%.2frn",Output[2]); printf("damuzhi:%.2frn",Output[3]); LeranTime++; i = 0; }}
这里的 预测函数有三个参数,第一个参数是输入数组,第二参数是输出数组,输出数组中包含着对于各个分类的参数预测值,第三个参数输入一个指针,
这个指针会指向预测最大值的索引 。
烧入我们的代码,可以看到,空置的时候,Error的预测值是最大的。
当我们放上中指的时候,检测到中指的概率是最大的。
小拇指也是可以正常的检测。