如何利用Arduino串口数据实现机器学习实时手势预测?
实时手势预测实现方案
你可以将机器学习模型训练逻辑与Arduino串口数据读取逻辑整合,在每次获取到传感器实时数据后,直接调用训练好的模型进行预测。以下是完整的实现代码及关键说明:
完整整合代码
import pandas as pd import time import serial from sklearn.tree import DecisionTreeClassifier # 1. 加载数据集并训练模型(仅初始化时执行一次,无需重复训练) data = pd.read_csv('mydata.csv') X = data.drop(columns=['Word']).values y = data['Word'] model = DecisionTreeClassifier() model.fit(X, y) # 2. 初始化Arduino串口通信 arduinoData = serial.Serial('com6', 115200) time.sleep(1) # 等待串口连接稳定 # 3. 实时数据读取与预测循环 while True: # 等待串口发送数据 while arduinoData.inWaiting() == 0: pass try: # 读取并清洗串口数据 dataPacket = arduinoData.readline().decode('utf-8').strip('\r\n') splitPacket = dataPacket.split(",") # 校验数据格式是否符合要求(8个传感器值) if len(splitPacket) != 8: print("无效数据,跳过本次读取") continue # 将字符串转换为浮点型数组 sensor_values = [float(val) for val in splitPacket] # 4. 调用模型进行预测(注意:predict方法需要二维数组输入) prediction = model.predict([sensor_values]) # 输出预测结果 print(f"当前手势预测结果: {prediction[0]}") # --------------------------- # 可选:播放对应手势的音频文件 # 假设音频文件命名规则为「手势名称.mp3」 # import playsound # playsound.playsound(f"{prediction[0]}.mp3") # --------------------------- except Exception as e: print(f"数据处理出错: {str(e)}")
关键注意事项
- 模型仅训练一次:将模型训练逻辑放在循环外,避免每次读取数据都重复训练,大幅提升运行效率
- 输入格式匹配:
model.predict()需要接收二维数组(即使是单个样本),因此要将传感器值放在[]内再传入 - 异常处理:添加
try-except块防止串口数据格式错误、转换失败等情况导致程序崩溃 - 可选优化:可以使用
joblib或pickle保存训练好的模型,下次启动时直接加载模型而非重新训练:# 保存模型 import joblib joblib.dump(model, 'sign_language_model.pkl') # 后续加载模型 model = joblib.load('sign_language_model.pkl')
内容的提问来源于stack exchange,提问作者Sam Asad
相关产品推荐
相关产品推荐

