sEMG+IMU手势识别实战:从数据采集到实时部署全解析 简介本资源是一套面向人机交互与生物信号处理方向研究者及嵌入式AI开发者的完整手语识别技术实现方案聚焦于sEMG与IMU多模态信号融合建模解决聋哑人群无障碍实时手势交互中的特征弱表征、动态识别延迟高、嵌入式部署难等核心问题。压缩包共71个文件涵盖8个核心Python模型脚本含RNN/CNN/BRNN多版本、2个Visual Studio工程C数据采集程序、6个MATLAB预处理脚本如小波滤波、滑动窗特征提取、以及训练检查点、日志、CSV原始数据和说明文档等整体41.81MB结构清晰支持从底层信号采集到端侧推理的全链路复现。已有127人学习下载读者可直接获取高精度残差注意力网络模型、轻量化部署配置、实测达98.7%静态/92.3%连续识别率的完整实验记录及跨平台采集工具链显著降低多源生理信号识别系统的开发门槛。 这两年因为做可穿戴设备我前后折腾了不少手势识别方向的方案。手语识别这个赛道看起来门槛不高但真正做起来坑比想象中深。很多人一上来就想着用摄像头加OpenPose靠手部骨骼关键点去翻译手语。这个思路在演示视频里确实很惊艳可一旦脱离实验室环境光线一变、背景一杂、手稍微挡一下识别效果就直接崩盘。而sEMG表面肌电加IMU惯性测量单元这条路虽然前期麻烦一点但做出来的系统是真的能实时跑、能稳定用。这篇文章我会把整套系统的完整实现过程拆开讲从数据采集硬件怎么搭、双信号怎么时间对齐到预处理、特征融合、神经网络设计再到实时部署的延迟优化最后附上实测表现和一堆踩坑经验。如果你正在做可穿戴手势识别、肌电交互、手语翻译辅助这类方向这篇应该能帮你少走不少弯路。整个过程不涉及复杂的专用设备普通开发板加传感器模块就能复现。1. 为什么是sEMG和IMU手语识别到底难在哪手语和其他手势识别的最大区别在于它的信息密度很高。手语不仅靠手指的静态形状表达含义还依赖运动轨迹、速度、节奏甚至手掌朝向和手腕动作。换句话说手语是一个“手型 动态轨迹 时序节奏”三位一体的信息编码方式。想把这个编码解出来单靠单一传感器根本不够。1.1 手语动作的信号构成先拆解一下手语动作里到底有哪些可被传感器捕捉的物理量。手指的弯曲、并拢、交叉反映的是前臂多条肌肉的协同收缩状态。这些肌肉收缩会产生微弱的电信号也就是表面肌电信号。sEMG通过贴在皮肤表面的电极拾取这些电信号对“手指在做什么”非常敏感。比如拇指对捏、食指伸直、五指张开对应的肌电激活模式是明显不同的。而整条手臂的运动轨迹、旋转方向、移动速度则是sEMG几乎采集不到的信息。手臂抬起、向左平移、手腕翻转这些动作主要牵动大肌群但在前臂表面记录到的肌电信号变化并不直观。这个时候就需要IMU出马了。IMU包含三轴加速度计、三轴陀螺仪和三轴磁力计能够测量手臂的加速度、角速度和朝向变化正好补齐sEMG缺少的全局运动信息。sEMG负责“局部的手型”IMU负责“全局的动向”。两者结合在一起才是对一次手语手势比较完整的物理描述。1.2 光学方案为什么不适合手语有人可能会问既然手语是视觉语言那用摄像头不是最自然的吗理论上是但实际工程里问题很大。手指在视觉上属于小目标手指之间的重叠、遮挡在2D图像里极其常见。想靠纯视觉从正对手掌的角度准确估计每根手指的弯曲角度目前任何开源骨架模型都做不到稳定。而且手语动作速度快普通30fps摄像头在动作时间上会出现明显的运动模糊导致关键点抖动。更麻烦的是光照和背景。手语识别要在真实的交流场景里工作背景往往杂乱光照变化无常。视觉方案在这种情况下鲁棒性很差。再加上视觉方案天然存在隐私问题很多实际应用场景对环境里的摄像头非常敏感。sEMG和IMU都是穿戴式传感器贴着胳膊工作不依赖外部环境不存在遮挡、光照、隐私这些问题实用价值明显更高。1.3 融合的本质用互补信息降低不确定性单个传感器都有“感知盲区”。sEMG对动作幅度不敏感——同样握拳手臂静止和手臂快速挥动前臂肌电的幅值分布是不同的单靠sEMG很难判断手臂是不是在动。而IMU虽然能量化手臂运动但对手指的细微姿态变换没有任何分辨力。信号融合不是简单地把两组数据拼接在一起而是利用两者的互补性来消除各自的歧义。手语识别里常见的一个困难场景是一个手型配合多个运动轨迹表达完全不同的词。比如同样的“五指并拢伸直”加上朝上、朝前、朝左三个不同的移动方向就是三个不同的意思。只靠肌电会误判只靠IMU会丢失手型信息融合之后才能准确分类。我在后续模型设计时就是把这两路特征做特征级融合识别效果比单模态高出十多个百分点。2. 系统整体架构与核心设计决策这套系统从物理层到应用层可以拆成四条链路数据采集链路、信号预处理链路、模型推理链路、实时交互链路。在真正动手买硬件之前先把整体架构想清楚非常关键否则后面改起来非常痛苦。2.1 完整系统通路从传感器原始数据到最终手势输出要经过这样的处理链条sEMG电极 → 模拟前端放大滤波 → ADC采样8通道1000Hz IMU传感器 → 三轴加速度/角速度/磁力计200Hz → 时间戳打包 → 缓存与对齐 → 预处理 → 滑窗切分 → 特征提取 → 特征级融合 → 神经网络推理 → 输出手势类别 → 实时显示前后端是解耦的。数据采集部分跑在MCU上负责实时采样和打包预处理、特征提取和推理可以放在PC上也可以放到手机上甚至可以尝试部署在带有NPU的嵌入式平台上。2.2 关键设计决策我在这套系统里做了几个比较重要的决策直接影响了后续实现复杂度。第一数据采集端和推理端分离。采集端用MCU完成sEMG和IMU的同步采样通过USB或者蓝牙把打包好的数据帧实时上传给上位机。这样MCU的实时性压力小上位机又能用Python做复杂的预处理和神经网络推理。第二预处理尽量放在推理侧做。虽然MCU也能做滤波但考虑到模型迭代阶段需要频繁调整参数把预处理放在软件侧更灵活。等模型稳定之后再把预处理和推理一起固化到端侧。第三离线数据采集和在线识别共用同一套数据通路。训练数据用同一套硬件采只是多了标签记录。这样能保证训练时看到的数据分布和实际运行时一致避免“实验室表现很好现场跑就崩”的问题。2.3 为什么采用特征级融合而不是端到端这个问题我纠结了很久。端到端的做法是把sEMG原始波形和IMU原始序列直接堆成多通道张量丢给神经网络让模型自己学特征。它的上限理论上更高但在数据量有限的情况下非常容易过拟合。手语数据集的构建成本很高一名操作者连续录几小时包含大量重复动作有效独立样本也就几千条。这样的数据量撑不起端到端模型的复杂度。我最终采用的方式是手工提取sEMG时频特征和IMU统计特征拼接成低维特征向量再送入轻量级神经网络分类。这个方案在用小数据量保证模型泛化能力上明显更稳。3. 数据采集硬件选型、佩戴方式与时间同步数据采集是整个系统里最“脏活累活”的部分但没有这一步后面所有东西都是空中楼阁。这部分我会讲清楚硬件清单、佩戴细节以及最关键的信号同步问题。3.1 硬件选型参考先说sEMG采集。sEMG信号的幅度范围大约在几十微伏到几毫伏能量主要集中在20Hz-500Hz频段。因此必须经过高共模抑制比的仪表放大器放大再经过带通滤波后才能送给ADC采样。我这边用的是8通道肌电采集模块采样率设为1000Hz满足sEMG的奈奎斯特要求同时数据量也不会太大。电极采用湿性Ag/AgCl贴片电极接触阻抗低信号质量比干电极好不少。如果你想更省事也可以考虑类似Myo臂带那种带电极阵列的一体化设备但要注意通道数和采样率是否满足要求。IS_IMU我用的是常见的9轴惯性模块包含三轴加速度计、三轴陀螺仪和三轴磁力计。IMU采样率设为200Hz。手势动作中手臂运动的主要能量集中在10Hz以下200Hz完全够用。磁力计的作用是对抗陀螺仪积分带来的偏航角漂移。参数sEMGIMU采样率1000Hz200Hz通道数89轴采集对象前臂肌电加速度/角速度/朝向主要特征手型、发力模式运动轨迹、方向、速度预处理需求带通滤波、陷波零偏校准、姿态解算3.2 电极放置与佩戴细节sEMG最容易翻车的地方就是电极贴不稳。我总结出的经验是电极一定要沿肌纤维方向贴在肌腹最饱满的位置而不是随便找个地方一贴。手语手势主要涉及的肌肉群包括指浅屈肌、指深屈肌控制手指屈曲、指伸肌控制手指伸展、桡侧腕屈肌控制手腕屈曲和外展、尺侧腕屈肌控制手腕屈曲和内收等。8个通道可以这样分配4个贴在前臂屈侧围绕圆周排开2个贴在前臂伸侧1个贴在尺侧1个贴在桡侧。参考电极贴在腕部骨性突起处也就是手肘或腕关节附近骨头明显的位置。佩戴时要注意松紧度。太紧会压迫肌肉改变肌电形态太松电极接触不良信号会忽大忽小。我一般以“轻轻接触不滑动”为准然后用弹性绷带固定。每次佩戴后需要休息几分钟等信号稳定再开始采集。3.3 IMU的安装位置IMU我放在了前臂靠近腕部的位置也就是手背正上方。这个位置离手近可以捕捉到手腕转动带来的角速度变化同时比直接贴在手背上更不容易被用户动作干扰。IMU的固定同样要牢靠任何微小的松动都会让姿态解算结果产生严重漂移。安装完成后需要做一次静止初始化。把手臂自然放在桌面上保持不动约2秒记录这期间的IMU原始数据计算各轴的均值作为零偏补偿值。这个零偏值会随温度、电池电压变化所以每次开机都做一次。这个步骤同时也提供了IMU传感器噪声的方差估计后面如果要做融合滤波可以将静止测量方差作为初始过程噪声的参考量。3.4 双信号时间对齐是数据质量的命门sEMG采样率和IMU采样率不一样一个1000Hz一个200Hz二者之间没有天然的时钟同步机制。如果只是各自独立读数据再拼在一起时序一错位所有特征全部作废。我的做法是在MCU上用同一个定时器驱动两路传感器的采样。每个sEMG采样点打一个时间戳每个IMU采样点也打一个时间戳数据打包成帧后上传。这样在软件端就能根据时间戳把IMU数据插值到sEMG采样时刻或者反过来把sEMG重采样到IMU采样时刻。具体到同步策略我采用“以高通数据为基准”的方式sEMG 1000Hz作为主时间轴把IMU的200Hz数据用线性插值对齐到每个sEMG时间戳上。这样在滑窗阶段就能直接取出同一时间范围内的两路采样点不会出现错位问题。# 插值对齐示例 import numpy as np from scipy.interpolate import interp1d def align_imu_to_emg(imu_time, imu_data, emg_time): f interp1d(imu_time, imu_data, axis0, kindlinear, fill_valueextrapolate) return f(emg_time)4. 信号预处理与滑动窗口切分信号预处理的目标是让原始数据变成干净、稳定、适合特征提取的形态。预处理做得好不好直接决定后面模型的上限。我在这部分分别处理sEMG和IMU再合到一起切窗。4.1 sEMG预处理流程sEMG原始信号非常脏里面混杂着工频干扰、基线漂移和运动伪迹。需要依次处理带通滤波保留20Hz-500Hz频段抑制低频漂移和高频噪声。我用的是四阶巴特沃斯带通滤波器。50Hz陷波亚洲地区市电是50Hz电极和导线会感应到严重的工频干扰必须用陷波器去掉。要注意陷波器的品质因数不能太高否则会连带滤掉附近频段的有效信号。基线校正由于运动伪迹和电极极化信号会有一个缓慢变化的直流偏置。用高通滤波把基线去掉也可以直接减去滑动窗口内的均值。滤波频段的选择我反复验证过。把下限提高到30Hz能去掉更多低频运动伪迹但是手指发力时的部分低频成分也有损失。对于手语这种精细动作20Hz的下限更稳妥。4.2 IMU预处理流程IMU的原始数据相对干净但有几个要注意的点首先是坐标系统一。IMU输出的加速度和角速度在传感器自身坐标系下而不同用户佩戴时IMU朝向可能有轻微差异。虽然我固定了安装位置和方向但在预处理阶段还是建议做一次轴对齐校准把一个标准静止姿态定义为参考方向。然后是零偏校正。用采集开始时静止2秒的数据计算各轴均值从后续数据中减掉。这个操作每次采集前都要做别想着标定一次用到天荒地老。陀螺仪零偏会随温度、时间漂移而且漂移量累积在积分姿态里会被放大。做完零偏校正后我还会对IMU数据做一次低通滤波截止频率15Hz。手臂运动能量集中在低频段这样能滤掉一部分传感器的高频噪声。如果你要做姿态解算可以使用四元数形式表示朝向。这里提一句IMU姿态解算是另一个深坑如果只是做手势分类不一定非得解算出精确姿态角直接用原始加速度和角速度统计特征往往就够用。4.3 滑动窗口切分与样本构建神经网络不是直接吃原始时间序列而是吃一个固定长度的窗口。窗口长度选择要考虑手势动作的持续时间。手语中一个完整的单手势动作平均持续约1到2秒我选用2秒窗口覆盖完整动作。步长决定了识别延迟和计算量。200ms的步长意味着每200ms做一次识别基本可以认为是实时的。对应的窗口重叠率是90%重叠率越高识别结果越平滑但计算开销也越大。在数据采集阶段标签和窗口的对应关系尤其需要注意。我采用“动作结束后打标”的方案操作者每完成一个手势后在软件里按键时程序在时间轴上记录一个标记点。之后离线处理时以标记点为窗口终点向前取2秒窗口生成一条训练样本。这样能避免先入为主地选窗导致窗口内不包含完整动作。def build_samples(label_timestamps, emg_data, imu_data, fs_emg, window_size2.0): window_len int(window_size * fs_emg) samples [] labels [] for t_ms, label in label_timestamps: end_idx int(t_ms / 1000 * fs_emg) start_idx end_idx - window_len if start_idx 0: samples.append((emg_data[start_idx:end_idx], imu_data[start_idx:end_idx])) labels.append(label) return samples, labels5. 特征融合策略怎么把两类信号拧成神经网络爱吃的输入特征提取这块我踩过不少坑。刚入门时喜欢把一堆特征都算一遍恨不得把几十个特征全塞进去结果模型又慢又过拟合。后来才明白好的特征工程不是做加法而是做减法只留真正有用的信息。5.1 sEMG时域与频域特征对于每一个sEMG通道我提取以下特征时域特征选择均方根值、平均绝对值、过零率、波形长度和斜率变化率。均方根值和平均绝对值描述肌肉收缩强度过零率和波形长度描述信号的频率和复杂程度对手指快速变化比较敏感斜率变化率则对信号平滑度更敏感。频域特征选择功率谱密度估计后的中值频率和平均功率频率。这两个特征能反映肌肉疲劳状态和发力模式的变化。手语动作持续时间短但对精细指力控制的要求高频域特征能捕捉到一些时域特征看不出的差异。8通道乘以上述8个特征就是64维的sEMG特征向量。这个维度对一个小型神经网络来说非常适中不需要额外做降维。5.2 IMU统计特征IMU特征相对简单。对于加速度计和陀螺仪的各轴原始数据提取均值、方差、峰值、均方根值。加速度的均值反映静态倾斜方差反映抖动程度陀螺仪的均值反映旋转趋势峰值反映快速挥动。另外我会加上加速度计三轴合成幅值的均值和方差以及陀螺仪三轴合成幅值的均值。这里有个经验从IMU数据直接解算姿态角再提取特征不一定比直接使用原始轴的统计特征效果好。姿态解算引入的滤波器延迟和漂移反而可能丢失关键信息。我实测下来原始轴统计特征在分类准确率上并不输给姿态角特征还省去了解算的麻烦。5.3 特征级融合的实现方式特征级融合就是在特征层把两类特征拼接成一个整体向量。sEMG 64维特征加上IMU特征三轴加速度、三轴陀螺仪每项5个统计量共30维再加合成幅值4个共34维得到98维特征向量。这个向量会作为神经网络的输入。需要注意两类特征的数值量级差异很大。sEMG特征的值域可能从几到几百IMU特征可能从零点几到几十。如果不做归一化梯度更新会被大数值特征主导。我在送入网络前对每个特征维度做了z-score标准化归一化参数从训练集计算并保存推理时复用同样的参数。6. 神经网络模型设计与训练调参实战网络结构的选择要考虑两个矛盾模型太小分类能力不足模型太大又会在小数据集上过拟合且推理延迟高。我最终采用的方案是堆一个轻量的1D卷积加全连接网络。实际用下来这个结构在准确率和实时性之间取得了很好的平衡。6.1 模型选型为什么不用LSTM也不用大CNN手势特征经滑窗提取后已经压缩为单一向量不再是一个长序列。这个前提下LSTM之类循环结构其实没有用武之地因为序列的时间信息已经被滑窗和统计特征吸收掉了。用循环网络反而白白增加参数量和推理延迟。大CNN也不合适。我们面向的是实时识别系统参数量一大部署到端侧就困难。我最终的模型只有三层一维卷积加两层全连接参数量约十几万主频1.8GHz的PC上单次推理不到1毫秒。这个量级的模型即使用TensorFlow Lite量化后部署到手机端也能轻松跑实时。模型结构如下import torch.nn as nn class GestureNet(nn.Module): def __init__(self, input_dim98, num_classes10): super().__init__() self.conv nn.Sequential( nn.Conv1d(1, 32, kernel_size5, padding2), nn.BatchNorm1d(32), nn.ReLU(), nn.MaxPool1d(2), nn.Conv1d(32, 64, kernel_size3, padding1), nn.BatchNorm1d(64), nn.ReLU(), nn.MaxPool1d(2), nn.Conv1d(64, 128, kernel_size3, padding1), nn.BatchNorm1d(128), nn.ReLU(), nn.AdaptiveAvgPool1d(1) ) self.fc nn.Sequential( nn.Linear(128, 64), nn.ReLU(), nn.Dropout(0.5), nn.Linear(64, num_classes) ) def forward(self, x): # x: (batch, input_dim) x x.unsqueeze(1) # (batch, 1, input_dim) x self.conv(x).squeeze(-1) out self.fc(x) return out6.2 训练数据与超参设置我定义的手势集包含10个常用手语词汇好、谢谢、我、是、不、来、走、吃、喝、知道。每种手势采集200条样本总计2000条。数据来自三名志愿者每人约采集70条每类这样训练出来的模型有一定跨用户泛化能力。数据划分采用按志愿者划分而不是按样本随机划分。如果随机划分同一用户的数据会同时出现在训练集和测试集里模型学到的是“这个人的肌电基线”并不是真正的泛化能力。按人划分后训练集包含两人测试集包含一人能更真实地反映跨用户效果这也是实际应用中真正面临的难点。训练超参方面优化器Adam初始学习率0.001。损失函数交叉熵带类别权重处理样本不均衡。Batch size64。训练轮数80轮配合早停。数据增强对sEMG特征加少量高斯噪声对IMU特征做随机缩放能明显提升模型鲁棒性。训练时监控验证集准确率防止过拟合。我通常只看验证集损失不盲目追求训练集准确率。好的模型训练集准确率约99%验证集准确率保持在90%以上而一旦训练集到99.9%、验证集却掉到80%以下那就是过拟合信号需要减少模型容量或增加正则化。6.3 评估指标选择准确率是最直观的指标但在类别不均衡时具有欺骗性。我重点看混淆矩阵分析哪些手势之间容易混淆。实测中最容易混淆的是“我”和“不”两者都是五指并拢的动作区别主要在于“我”是手背朝向对方“不”是掌心朝向对方。肌电模式类似IMU姿态差异也只在特定维度。这说明这类细粒度手势需要更精细的传感器数据或增加训练样本才能区分。另一个重要指标是推理延迟这直接影响用户体验。我统计的是“从输入特征到输出类别”的单次推理时间以及“从窗口结束到输出结果”的端到端延迟后者包含了预处理和特征提取的时间。整个系统在PC上的端到端延迟约30-40毫秒远低于手语识别可接受的100毫秒门槛。7. 实时推理部署与延迟优化模型训练好了离“能用的系统”还有一段距离。实时推理阶段要做的工作不少模型轻量化、推理流水线设计、延迟预算分配。7.1 模型轻量化我先把模型用ONNX导出再通过ONNX Runtime进行推理。相比直接使用PyTorchONNX Runtime在CPU上的推理速度快20%到30%。如果目标平台是手机可以进一步做INT8量化模型体积从几百KB缩小到一百多KB推理速度还能再快一倍。不过量化和训练后量化需要注意数值范围。特征里sEMG部分某些维度归一化后可能出现最大值较大的情况INT8量化时如果校准数据集选取不合适会损失精度。我的做法是先从验证集抽取1000条样本做校准在量化后跑一次验证集准确率若掉点超过2%就回退到FP16或者动态量化。7.2 实时推理流水线实时识别的核心是流水线设计。采集线程不断接收数据预处理线程负责滤波和特征提取推理线程负责神经网络计算。三个线程用两个缓冲队列连接避免互相阻塞。滑窗重叠率很高意味着相邻两个窗口共享90%的数据。如果每次都重新计算所有特征计算量就白花很多。我做了个优化上一窗口的部分统计特征缓存滑窗滑动后只更新增量部分。以均方根值为例新窗口的均方根可以由旧窗口的值和滑入滑出的样本快速更新时间成本可忽略不计。这个优化让特征提取的耗时从十几毫秒降到了4毫秒左右。def update_rms(old_rms, old_window, new_window, old_sum_sq, new_sum_sq): # 简化示例维护平方和增量 sum_sq old_sum_sq np.sum(new_window ** 2) - np.sum(old_window ** 2) return np.sqrt(sum_sq / len(new_window)), sum_sq7.3 延迟预算分配我把端到端延迟拆开量了量发现大头其实不在推理而在采集缓存和特征提取。环节延迟毫秒数据缓存与同步2-3预处理7-10特征提取3-5神经网络推理0.5-1系统调度与显示2-3合计15-22实际上如果按200ms步长滑动每次推理间隔200ms上面的延迟完全可以被掩盖系统实时性体验很好。需要注意的是MCU端到上位机的数据上传协议不要用重传机制否则在网络抖动时会卡住流水线。用UDP或者USB批量传输丢一帧数据远比重传导致的整体停顿更可接受。7.4 手势输出与结果显示最后输出的手势结果我简单接了一个屏幕显示界面左侧展示当前手势名称右侧画一个时间轴显示最近5秒内识别结果的变化。手语是连续动作识别结果不可避免会有闪烁抖动。我加了一个简单的平滑策略连续3次推理结果相同才更新显示否则保持上一次结果。这样单次误判不会造成界面乱跳。8. 实测效果与踩坑记录这部分我根据自己的实测结果和踩坑经历整理了一些经验对打算复现这套系统的朋友应该比较有参考价值。8.1 不同信号配置下的识别效果对比为了验证融合的价值我做了三组对比实验。单独使用sEMG特征时识别准确率为78%左右单独使用IMU特征时只有65%左右融合后提升到91%左右。这个数据很能说明问题两种信号确实在提供互补的信息融合后系统的鲁棒性和识别准确性都有明显提升。考虑到我们只有3名志愿者的数据91%的准确率还有进一步优化空间。如果每个手势采集500条以上数据加入更多志愿者把模型训练得更充分准确率应该能推到95%以上。8.2 各种坑与排查链路有几类问题在实测中反复出现这里详细说说避免大家重蹈覆辙。第一类电极接触不良导致信号突变。某个通道的肌电幅值突然变大波形变得杂乱模型输出也会异常。最初我以为是算法问题后来排查发现是电极边缘卷起接触面积变小导致接触阻抗增高信号夹杂了大量噪声。解决方法是优先检查物理接触而不是怀疑模型。第二类串扰和伪迹导致的特征混叠。手语动作快时手臂和电极之间的相对滑动会产生运动伪迹。这种伪迹在频谱上和肌电重叠带通滤波无法完全消除。我后来在预处理阶段加了一个经验规则若某个通道窗口内的最大幅值超过正常范围5倍判定为伪迹污染丢弃该样本或者用相邻通道插值补全。这也是实时场景下的应急手段。第三类标签错位。采集时打标时间点稍微晚了一点滑窗终点就会落在动作结束之后窗口前移导致部分动作信息缺失。后来我在离线处理时加入了标签对齐校正用sEMG综合能量曲线和标签时间点做互相关自动校正标签偏移。这个校正提升效果非常明显。8.3 给新手的避坑清单别一开始就上深度学习。先用特征加传统分类器比如随机森林支持向量机跑通整个链路确认数据质量和特征有效性再换神经网络。这样出问题容易定位。记录原始数据别只存特征。特征处理完就丢原始数据后面想调特征工程只能重新采集非常痛苦。每次采集前都要做IMU静止初始化。忘了这一步IMU特征会带一个未知的零偏模型输入分布变了预测结果自然不准。多用户数据要按用户划分训练集测试集。随机划分会让结果虚高真正跨用户使用时就会现出原形。说实话这套系统从零搭到现在前前后后改了好几版。最深的体会是sEMG加IMU这条路采集端的工程细节决定了最终效果的上限模型反而是最省事的一环。数据没对齐、电极没贴好、零偏没校准再多花哨的网络结构都救不回来。如果你正准备做可穿戴手势识别我建议先把数据采集这关练扎实再考虑模型的事。后面的路会越走越顺。本文还有配套的精品资源点击获取