基于表面肌电信号sEMG的手势识别——以Ninapro DB1数据集使用CNN网络识别为例

完整代码获取

评论区或者私信留邮箱

接论文辅导!中文核心辅导!SCI三四区辅导!

可接模型改进

任务描述

表面肌电信号( sEMG) 是一种生物电信号,存在于肌肉神经。当大脑下达肌肉动作指令,肌肉会产生控制信号,可以通过相关设备采集到这种电信号。肌电信号的识别研究对于脑卒中患者的恢复治疗有着重要的应用。通过采集患者的肌电信号进行识别可以控制设备进行牵引代替传统医师手动牵引,在可穿戴式外骨骼上也有着重要应用,可通过对肌电信号的识别控制外骨骼的动作。
在肌电信号识别方面一般应用 SVMBP 神经网络等传统方法。近年来,深度学习获得了更好的应用效果。

数据集介绍

本文实验采用公共数据集 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 134689 10 次数据作为此次实验的训练集,把 25 7 次作为测试集,以便于与采用相同数据集的方法进行对比。
根据调试结果选择 Batch_size 512epoch 30

实验结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值