python对肌电信号进行简单的手势识别
采集前臂四块不同肌肉的表面肌电信号
#加载相关模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据
data1=pd.read_excel('wq20.xlsx',sheetname=1)
data2=pd.read_excel('zs20.xlsx',sheetname=1)
data3=pd.read_excel('n20.xlsx',sheetname=1)
data4=pd.read_excel('w20.xlsx',sheetname=1)
data1.columns=['ch1','ch2','ch3','ch4']
data2.columns=['ch1','ch2','ch3','ch4']
data3.columns=['ch1','ch2','ch3','ch4']
data4.columns=['ch1','ch2','ch3','ch4']
names=locals()
for i in range(1,5):plt.figure()plt.plot(names['data%s'%i])
握拳
张手
手腕内翻
手腕外翻
将四通道的肌肉电信号汇总求其绝对值平均值,利用移动窗口法,取若干连续时间序列对应的信号强度求局域平均,若其后若干点的均值都超过一定阈值,则视为一个动作开始,反之若其后若干点的局域均值都小于阈值,则视为一个动作结束
def get_mean_semg(data):mean_semg=[]for i in range(len(data)-1):mean_semg.append((data.ch1[i]+data.ch2[i]+data.ch3[i]+data.ch4[i])/4)return mean_semgfor i in range(1,5):names['mean_semg_%s'%i]=get_mean_semg(names['data%s'%i])plt.figure()plt.plot(names['mean_semg_%s'%i])plt.ylim(0,5)plt.savefig('a%s'%i,dpi=400)
握拳
张手
内翻
外翻
def get_move_window(mean_semg):mean_semg_arr=np.array(mean_semg)return pd.rolling_mean(mean_semg_arr,window=800)def get_break(data,i,thre,windowlenth):for i in range(i,i+windowlenth):if data[i]<thre:return 0return 1for i in range(1,5):names['move_averge_%s'%i]=get_move_window(names['mean_semg_%s'%i])names['sta_%s'%i]=[]names['end_%s'%i]=[]thre=1.1windowlenth=800for j in range(len(names['move_averge_%s'%i])-1):if get_break(names['move_averge_%s'%i],j,thre,windowlenth)==0 and get_break(names['move_averge_%s'%i],j+1,thre,windowlenth)==1:names['sta_%s'%i].append(j)if get_break(names['move_averge_%s'%i],j,thre,windowlenth)==1 and get_break(names['move_averge_%s'%i],j+1,thre,windowlenth)==0:names['end_%s'%i].append(j)
获取平均值起始点,并将对应时间点作用于原始信号上,对四通道信号进行行动段提取,并将长度较小的部分过滤,视为噪音
for i in range(1,5):names['period_%s'%i]=[]names['sta_filt_%s'%i]=[]names['end_filt_%s'%i]=[]for j in range(len(names['sta_%s'%i])):names['period_%s'%i].append(names['end_%s'%i][j]-names['sta_%s'%i][j])for k in range(len(names['period_%s'%i])):if names['period_%s'%i][k]>5000:names['sta_filt_%s'%i].append(names['sta_%s'%i][k])names['end_filt_%s'%i].append(names['end_%s'%i][k])
for i in range(1,len(sta_filt_1)+1):names['data1_cut%s'%i]=data1[sta_filt_1[i-1]:end_filt_1[i-1]]
for i in range(1,len(sta_filt_2)+1):names['data2_cut%s'%i]=data2[sta_filt_2[i-1]:end_filt_2[i-1]]
for i in range(1,len(sta_filt_3)+1):names['data3_cut%s'%i]=data3[sta_filt_3[i-1]:end_filt_3[i-1]]
for i in range(1,len(sta_filt_4)+1):names['data4_cut%s'%i]=data4[sta_filt_4[i-1]:end_filt_4[i-1]]plt.figure(figsize=(50,3))
for i in range(1,21):plt.subplot2grid((1,20),(0,i-1),colspan=1).plot(names['data1_cut%s'%i])plt.ylim(0,10)plt.title('fist')
plt.figure(figsize=(50,3))
for i in range(1,22):plt.subplot2grid((1,21),(0,i-1),colspan=1).plot(names['data2_cut%s'%i])plt.ylim(0,10)plt.title('open')
plt.figure(figsize=(50,3))
for i in range(1,25):plt.subplot2grid((1,24),(0,i-1),colspan=1).plot(names['data3_cut%s'%i])plt.ylim(0,10)plt.title('toright')
plt.figure(figsize=(50,3))
for i in range(1,21):plt.subplot2grid((1,20),(0,i-1),colspan=1).plot(names['data4_cut%s'%i])plt.ylim(0,10)plt.title('toleft')
握拳
张手
内弯
外翻
对各通道行动段求区间的平均值MAV,可以看出对于不同的动作,MAV值区别明显,可以作为特征向量对信号进行特征提取
mav_fist=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(20)])
for i in range(1,21):mav_fist.loc[i-1,'ch1']=names['data1_cut%s'%i].ch1.mean()mav_fist.loc[i-1,'ch2']=names['data1_cut%s'%i].ch2.mean()mav_fist.loc[i-1,'ch3']=names['data1_cut%s'%i].ch3.mean()mav_fist.loc[i-1,'ch4']=names['data1_cut%s'%i].ch4.mean()
mav_open=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(21)])
for i in range(1,22):mav_open.loc[i-1,'ch1']=names['data2_cut%s'%i].ch1.mean()mav_open.loc[i-1,'ch2']=names['data2_cut%s'%i].ch2.mean()mav_open.loc[i-1,'ch3']=names['data2_cut%s'%i].ch3.mean()mav_open.loc[i-1,'ch4']=names['data2_cut%s'%i].ch4.mean()
mav_toright=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(24)])
for i in range(1,25):mav_toright.loc[i-1,'ch1']=names['data3_cut%s'%i].ch1.mean()mav_toright.loc[i-1,'ch2']=names['data3_cut%s'%i].ch2.mean()mav_toright.loc[i-1,'ch3']=names['data3_cut%s'%i].ch3.mean()mav_toright.loc[i-1,'ch4']=names['data3_cut%s'%i].ch4.mean()
mav_toleft=pd.DataFrame(columns=['ch1','ch2','ch3','ch4'],index=[np.arange(20)])
for i in range(1,21):mav_toleft.loc[i-1,'ch1']=names['data4_cut%s'%i].ch1.mean()mav_toleft.loc[i-1,'ch2']=names['data4_cut%s'%i].ch2.mean()mav_toleft.loc[i-1,'ch3']=names['data4_cut%s'%i].ch3.mean()mav_toleft.loc[i-1,'ch4']=names['data4_cut%s'%i].ch4.mean()
plt.figure(figsize=(20,5))
mav_fist_ax=plt.subplot2grid((1,4),(0,0),colspan=1)
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch1,c='r')
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch2,c='g')
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch3,c='b')
mav_fist_ax.scatter(x=np.arange(20),y=mav_fist.ch4,c='y')
mav_open_ax=plt.subplot2grid((1,4),(0,1),colspan=1)
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch1,c='r')
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch2,c='g')
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch3,c='b')
mav_open_ax.scatter(x=np.arange(21),y=mav_open.ch4,c='y')
mav_toright_ax=plt.subplot2grid((1,4),(0,2),colspan=1)
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch1,c='r')
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch2,c='g')
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch3,c='b')
mav_toright_ax.scatter(x=np.arange(24),y=mav_toright.ch4,c='y')
mav_toleft_ax=plt.subplot2grid((1,4),(0,3),colspan=1)
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch1,c='r')
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch2,c='g')
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch3,c='b')
mav_toleft_ax.scatter(x=np.arange(20),y=mav_toleft.ch4,c='y')
mav_fist['action']=0
mav_open['action']=1
mav_toright['action']=2
mav_toleft['action']=3
sumup=mav_fist.append([mav_open,mav_toright,mav_toleft],ignore_index=True)
y=sumup.actionx=sumup.drop(['action'],axis=1)
from sklearn.model_selection import train_test_splitimport xgboost as xgb
train_x,test_x,train_y,test_y=train_test_split(x.as_matrix(),y.as_matrix(),test_size=0.2)
xg_train=xgb.DMatrix(train_x,label=train_y)
xg_test=xgb.DMatrix(test_x,label=test_y)
param = {}param['objective'] ='multi:softmax'param['eta']=0.1
param['max_depth']=6
param['silent']=1
param['nthread']=4
param['num_class']=4
watchlist = [(xg_train, 'train'), (xg_test, 'test')]
num_round=5
bst = xgb.train(param, xg_train, num_round, watchlist)
pred = bst.predict(xg_test)
对四个不同的手势进行数字命名,通过xgboost进行训练分析,16个测试样的预测结果正确率为100%
更多Python视频、源码、资料加群683380553免费获取
转载至:https://zhuanlan.zhihu.com/p/41073513
python对肌电信号进行简单的手势识别相关推荐
- 读论文-----基于单通道表面肌电信号的手势识别 Hand Gestures Recognition Based on One-Channel Surface EMG Signal
Hand Gestures Recognition Based on One-Channel Surface EMG Signal 摘要 本文提出了一个利用OpenBCI采集两种手势信号的数据并解码信 ...
- 循环神经网络(RNN)简单介绍及实现(基于表面肌电信号)
循环神经网络(RNN) 文章目录 循环神经网络(RNN) 一.介绍 二.python实现(LSTM) 三.总结 一.介绍 以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接 ...
- 基于表面肌电信号的手势识别——深度学习方法
文章目录 基于表面肌电信号的手势识别--深度学习方法 1.方法和代码 2.数据下载 基于表面肌电信号的手势识别--深度学习方法 1.方法和代码 https://github.com/malele4th ...
- matlab肌电信号平滑滤波_BCIduino 滤波和频谱计算操作
本文介绍用 python 对航弈生物 BCIduino 放大器脑电/肌电数据进行滤波及频谱计算,介绍如何用 python mne 对 fif 格式保存的脑电数据进行读取和简单的滤波,并用numpy 对 ...
- linux python 信号,Python模块之信号(signal)
在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...
- 【python】通过信号机制对子进程进行控制
在python中,使用多进程可以绕过GIL的限制从而充分利用多核CPU来加速任务.但如果对进程处理不当,就容易造成僵尸进程或孤儿进程,从而造成系统资源的浪费. 本文分析了在python中可能会生成这两 ...
- 肌电信号特征提取的代码
肌电信号特征提取的代码可以使用 Python 编写.具体实现可以使用 numpy 和 scipy 库进行数据处理,使用 matplotlib 库进行数据可视化,使用 scikit-learn 库进行特 ...
- python处理扭振信号
python处理扭振信号 一.概述 二.扭振分析流程 三.关键算法解释 3.1 模拟方波信号 a.简单方波信号 b.简单复杂信号 3.2 瞬时转速计算 3.3 扭转角计算 3.4 谐次分析 四.代码实 ...
- python对语音信号读取、分帧、加窗
python对语音信号读取.分帧.加窗 一.读入音频信号 语音信号有三个重要的参数:声道数.取样频率和量化位数. 声道数:单声道或者双声道 采样频率:一秒钟对声音采样的次数,例如10000HZ代表一秒 ...
最新文章
- java排序为什么会出现多次排序结果不一样_并发理论基础:指令重排序问题
- C++知识点23——使用C++标准库(顺序容器list的其他操作)
- 新手站长们如何利用10分钟的时间内多写高质量的原创量?
- java opencv bytearray转mat_OpenCV开发中的内存管理问题
- defer 被调用时机
- MFC的程序,不想显示窗口,任务栏里也不显示
- layui选项卡嵌套选项卡_在ProtoPie中使用嵌套组件构建选项卡栏
- [Leetcode][第337题][JAVA][打家劫舍3][递归][动态规划]
- Visual Studio 2012 Ultimate旗舰版序列号
- PDE14 heat equation intuition
- grub.conf解析
- VS2017下载地址和安装教程(图解)
- 2022年最新前端面试题(大前端时代来临卷起来吧小伙子们..持续维护走到哪记到哪)
- 郑大第九届校赛正式赛(1819: 加加加!(油))
- 项目管理: Alpha,Beta,RC,GA,Release
- [FirefoxOS_调试]Firefox OS调试开发系列视频教程
- python返回绝对值的函数_Python中用于返回绝对值的abs()方法
- win10电脑底下一排图标没了怎么办
- 云主机是不是服务器?云主机和服务器有什么区别?
- android手机加密失败怎么办,安卓刷机教程_安卓手机TWRP-Recovery模式图文刷机指导...
热门文章
- Smooth Freehand Drawing on iOS
- 【Tools】IDApatch工具安装——keypatch
- 【css】CSS position(定位)属性
- 工业现场总线 linux 服务器,基于Linux的现场总线无线通信卡的实现
- pasa查看mysql_某AutoEq数据库的解读及其使用
- Densely Connected Convolutional Networks
- nginx本地服务器的搭建(保姆式教学)
- html 隐藏域 用什么标签,html中隐藏域hidden的做用介绍及使用示例
- 企业电子邮箱注册哪个好?如何注册电子邮箱?
- fastboot 模式下刷入Recovery