基于STM32的机器学习(手势识别)

第一次写博客,希望能给研究单片机AI的同仁一个好的启示。如有不当,多多指正。

STM32自从2019年开始发布AI库以来,网络上关于怎么移植到单片机的资料少得可怜,能找到的也仅仅是新建工程的博客,对我有较大启示的是ST官方的几篇文章。我将对我有启示的文章贴出来供大家参考。

https://blog.csdn.net/qingelife/article/details/78429508?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase

https://blog.csdn.net/qq_39505991/article/details/95176720?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-8

http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619025&page=1

https://blog.csdn.net/bigmaxPP/article/details/104500092/

1、首先,简单描述下我要做的项目—基于单片机的手势识别。

所用到的传感器是10G的雷达芯片,芯片出来的是中频信号,需要根据这些中频信号做手势识别。

单片机模拟有无目标,当没有目标时,单片机模拟IF输出中频信号,雷达芯片输出LO(本振信号)

,混频器的作用是将LO+IF=RF。 得到的RF输出到芯片的RX接收端口。 芯片会将这个信号再解调出来作为最后的模拟信号输出到单片机。

前期的工作接触过单片机的来说应该都不难,采集中频信号,AD转换。

这些都不难。但重要是对这些信号要进一步处理,包括去交流,求平均值,FFT(加窗),一系列的转换目的就是将时域的信号转换到频域。曾经看过一篇经典的文章来描述时域和频域,时域就是随时间的变化状态的变化,而频域就是从侧面看待这个问题,一切都是静止的,就像每个人的人生看似随时间不断变化,每天充满变数,但从频域的角度来看,侧面就好像很大的机械装置,每个人的人生早已安排好了。很多时域看不出任何特征的信号在频域一目了然。

2、频域信号处理好了就来到了我们的重头戏了——机器学习(AI)

首先神经网络的生成我用的是Python,Python生成神经网络现在已经很成熟了,网上的例程一大堆,我就不多说了,训练好神经网络导出 .h5文件,你的工作就完成一半了。

接下来就用到官方的STM32cubemx,用这个工具生成KEIL5或者其他IDE的工程,接下来的移植就是重中之重了。再移植之前你也考虑好你的单片机ROM和RAM以及主频速度。根据我的经验ROM 512k,RAM 100k,主频100M可以满足初步的需要,STM32F411CEU6是我目前看到性价比最高的。下面的流程是STM32cubummx生成工程的流程,大家可以参考。

导入我们的模型计算,点击Analyze,CubeMX会提示我们哪些MCU型号能支持我们使用,当然啦,你也可以直接选STM32F411CEU6,模型官方有手势识别的.h5文件,可以去下载;

3、单片机移植过程有很多需要注意的地方,有时间我会专门写一篇博客。我将单片机Keil中AI部分贴出来供大家参考。

FFT相关处理

AI处理

 主函数部分

最终串口 输出效果

不同的手势outdata输出不同的概率,我将概率Round的最终输出结果。至于你想用手势控制外部任何设备就很容易了。

猜你喜欢

转载自blog.csdn.net/qq_26972441/article/details/107567058