前言
今天在B站上看到一个很有意思的项目:
仔细看了一下项目,大概是通过MPU6050收集陀螺仪数据,然后在STM32上跑了一个神经网络的分类模型,识别出来不同的手势动作。这个项目的思路让我眼前一亮,感觉可玩性很高,只要是MPU6050+可以跑神经网络的开发板都可以这么玩。
技术解析
1. 数据收集和处理
设备端有一个按钮,按了之后会收集80条MPU6050的数据,数据加入头尾封装之后,发送到串口
用python读取串口数据,并保存数据到文件中
收集所有的动作+无动作的数据,每种数据100条
2. 训练
使用CNN网络训练,参数要少,模型要小,以防单片机放不下,参考代码:
inputs = layers.Input(shape=input_shape)
# 卷积层1
x = layers.Conv1D(24, kernel_size=3, strides=1)(inputs) # type: ignore
x = layers.ReLU()(x) # type: ignore
x = layers.Conv1D(12, kernel_size=3, strides=1)(x) # type: ignore
x = layers.ReLU()(x)# type: ignore
x = layers.Conv1D(12, kernel_size=3, strides=1)(x)# type: ignore
x = layers.ReLU()(x)# type: ignore
x = layers.Conv1D(12, kernel_size=3, strides=1)(x)# type: ignore
x = layers.ReLU()(x)# type: ignore
x = layers.MaxPooling1D(pool_size=3, strides=1)(x)# type: ignore
# 展平层
x = layers.Flatten()(x)# type: ignore
x = layers.Dropout(0.5)(x)# type: ignore
# 全连接层1
x = layers.Dense(num_classes)(x)# type: ignore
x = layers.Dropout(0.5)(x)# type: ignore
outputs = layers.Softmax()(x)# type: ignore
model = models.Model(inputs=inputs, outputs=outputs)# type: ignore
3. 部署
只要是能部署神经网络的开发板都可以
使用时,仍然是通过按按钮,收集80条数据,发送给模型进行分类判断
如果置信度高于80%,就输出分类结果,如果不到,则分类为未识别
结语
这个 IDEA 还可以用到很多地方,例如使用动作识别来开门开灯,总之是一个很有意思的工作,大家可以试试看