完整代码获取
评论区或者私信留邮箱
接论文辅导!中文核心辅导!SCI三四区辅导!
可接模型改进
任务描述
表面肌电信号( sEMG) 是一种生物电信号,存在于肌肉神经。当大脑下达肌肉动作指令,肌肉会产生控制信号,可以通过相关设备采集到这种电信号。肌电信号的识别研究对于脑卒中患者的恢复治疗有着重要的应用。通过采集患者的肌电信号进行识别可以控制设备进行牵引代替传统医师手动牵引,在可穿戴式外骨骼上也有着重要应用,可通过对肌电信号的识别控制外骨骼的动作。
在肌电信号识别方面一般应用 SVM、BP 神经网络等传统方法。近年来,深度学习获得了更好的应用效果。
数据集介绍
本文实验采用公共数据集 Ninapro。该数据集数据量大,采集的动作丰富,每个单位数据集里面包括表面肌电信号、加速度计、手部运动学和动态数据等,记录了 67 名完整受试者和 11 名进行了至少 50 次手部运动的截肢者的数据。
NinaproDB1 数据集包括 27 名完整的受试者( 7 名女性和 20 名男性,其中 2 个左手和 25 个右手) 的肌电信号。信号采集频率为100Hz。
CNN模型搭建
import torch
import torch.nn as nn
class CNN1D(nn.Module):
def __init__(self, in_channels, num_classes):
super(CNN1D, self).__init__()
self.conv1 = nn.Conv1d(in_channels=in_channels, out_channels=64, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1)
self.conv3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1)
self.maxpool = nn.MaxPool1d(kernel_size=3, stride=2)
self.act = nn.PReLU()
self.bn1 = nn.BatchNorm1d(num_features=64)
self.bn2 = nn.BatchNorm1d(num_features=128)
self.bn3 = nn.BatchNorm1d(num_features=256)
self.fc = nn.Linear(256, num_classes)
self.avg = nn.AdaptiveAvgPool1d(1)
def forward(self, x):
x = x.transpose(1, 2)
x = self.act(self.bn1(self.conv1(x)))
x = self.act(self.bn2(self.conv2(x)))
x = self.act(self.bn3(self.conv3(x)))
x = self.avg(x).squeeze(2)
x = self.fc(x)
return x
if __name__ == '__main__':
x = torch.randn(32, 20, 10)
model = CNN1D(in_channels=10, num_classes=52)
outputs = model(x)
print(outputs.shape)
数据及处理
采用重叠滑动窗口。将滤波后的数据按照窗口重叠法进行分段,选择滑动窗口 200 ms,滑动步长为 50 ms,重叠部分 150 ms。 以一段数据为例,信号分割过程如图 10 所示。100 Hz的采样率,分段后每段数据大小为 10 × 20,将分段后的数据送入模型。
将公共数据集 NinaproDB1 的 1、3、4、6、8、9 和 10 次数据作为此次实验的训练集,把 2、5 和 7 次作为测试集,以便于与采用相同数据集的方法进行对比。
根据调试结果选择 Batch_size 为 512,epoch 为 30。