日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

基于肌电信号(sEMG) 的深度学习手势分类

發(fā)布時(shí)間:2023/12/20 pytorch 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于肌电信号(sEMG) 的深度学习手势分类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在過(guò)去的幾年里,科研界對(duì)使用基于表面肌電信號(hào) (sEMG) 的深度學(xué)習(xí)方法進(jìn)行手勢(shì)分類產(chǎn)生了濃厚的興趣。根據(jù)該領(lǐng)域的最新工作,我的工作目標(biāo)是設(shè)計(jì)一種新穎的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),用于手勢(shì)分類。我的模型雖然避免了過(guò)度擬合,但與更淺的網(wǎng)絡(luò)相比,性能并沒(méi)有顯著提高。結(jié)果表明,某些手勢(shì)之間的 sEMG 記錄缺乏多樣性,從而限制了 ML 模型的性能。

然而,我使用商業(yè)設(shè)備 (Myo Armband) 開(kāi)發(fā)的數(shù)據(jù)集的分類準(zhǔn)確度明顯高于使用相同設(shè)備記錄的類似基準(zhǔn)數(shù)據(jù)集(約 24%)。

MyoUP 數(shù)據(jù)集

為了有助于獲取 sEMG 數(shù)據(jù),特別是從不需要專業(yè)校準(zhǔn)的設(shè)備中獲取,我開(kāi)發(fā)了一個(gè)相當(dāng)大的 sEMG 數(shù)據(jù)集。我們的數(shù)據(jù)集 MyoUP 受到 Ninapro 數(shù)據(jù)集的啟發(fā),所有記錄的手勢(shì)都與 Ninapro 中的一些 ( http://ninaweb.hevs.ch ) 相同。我們使用的錄音設(shè)備是 Thalmic 實(shí)驗(yàn)室的 Myo Armband。Myo Armband 是一種相對(duì)便宜且易于佩戴的設(shè)備,其采樣頻率為 200Hz,8 個(gè)干式 sEMG 通道已在科學(xué)研究中廣泛采用。

MyoUP 數(shù)據(jù)集包含來(lái)自 8 名完整受試者的記錄(3 名女性,5 名男性;1 名左撇子,7 名右手;年齡 22.38 ± 1.06 歲)。采集過(guò)程分為三個(gè)部分:5 個(gè)基本手指動(dòng)作、12 個(gè)等張和等長(zhǎng)手部配置以及 5 個(gè)抓握手勢(shì)。在進(jìn)行每組練習(xí)之前,志愿者已經(jīng)習(xí)慣了該程序。指示受試者重復(fù)每個(gè)手勢(shì) 5 次,持續(xù) 5 秒,中間有 5 秒的中斷,以避免肌肉疲勞。一名主管協(xié)助受試者將 Myo Armband 戴在他們的慣用手上,以便將設(shè)備放置在受試者舒適的位置,并且設(shè)備將準(zhǔn)確檢測(cè) sEMG 信號(hào)。受試者可以在屏幕上看到 sEMG 以及必須執(zhí)行的手勢(shì)圖片。

實(shí)時(shí)手勢(shì)識(shí)別
通過(guò)使用來(lái)自 MyoUP 數(shù)據(jù)集的 sEMG 記錄訓(xùn)練我們的 CNN,我設(shè)法開(kāi)發(fā)了一個(gè)實(shí)時(shí)手勢(shì)識(shí)別軟件。



數(shù)據(jù)處理的matlab文件

%% Training signals - creation - Myo - step #1 clc; clear all;START = 's'; END = 'e1.mat'; filename = "s";for subject = 1 : 8%_________________________________________code = strcat(START,int2str(subject),END);disp(code);struct = load(code);rep = struct.pulse;emg = struct.emg;%_________________________________________counter = 1;points = zeros(1, 50);for i = 2 : length(rep)if(rep(i - 1) == 0 && rep(i) > 0)points(counter) = i;counter = counter + 1;endif(rep(i - 1) > 0 && rep(i) == 0)points(counter) = i - 1;counter = counter + 1;end endcounter = 1;repeat = 0;exercise = 0;exe_number = 1;for i = 1 : length(points) / 2starting_point = points(counter);counter = counter + 1;finishing_point = points(counter);counter = counter + 1;disp(starting_point)disp(finishing_point)disp('______________')repeat = repeat + 1;exercise = exercise + 1;columns = finishing_point - starting_point + 1;matrix = zeros(8, columns);column = 1;for pointer = starting_point : finishing_pointfor channel = 1 : 8matrix(channel, column) = emg(pointer, channel);endcolumn = column + 1;endfile = filename + subject + "e" + exe_number + "rep" + repeat + ".mat";save(file, 'matrix')if(repeat == 5)repeat = 0;endif(exercise == 5)exercise = 0;exe_number = exe_number + 1;endend end %% Maximum Size Matrix - step #2clc;maximum_size = 0;emg_sizes = zeros(1, 3400); counter = 0;for subject = 1 : 8for exercise = 1 : 5for repetition = 1 : 5counter = counter + 1;filename = strcat('s', int2str(subject), 'e', int2str(exercise), 'rep', int2str(repetition));path = 'Myo_training\E1\';load_path = strcat(path, filename);load_path = strcat(load_path, '.mat');signal = load(load_path); matrix = signal.matrix;matrix_size = size(matrix); matrix_size = matrix_size(2);emg_sizes(1, counter) = matrix_size;if(matrix_size > maximum_size)maximum_size = matrix_size;endendend end%% Training Images - creation II - step #3clear all; clc;for subject = 1 : 8disp('Subject: ');disp(subject)for exercise = 1 : 12for repetition = 1 : 5filename = strcat('s', int2str(subject), 'e', int2str(exercise), 'rep', int2str(repetition));path = 'Myo_training\E2\';load_path = strcat(path, filename);load_path = strcat(load_path, '.mat');signal = load(load_path); original_matrix = signal.matrix;noisy_matrix = awgn(original_matrix,25);matrix_size = size(original_matrix); matrix_size = matrix_size(2);window_type_one = matrix_size / 6;window_type_one = int16(fix(window_type_one));window_type_two = 226 - window_type_one;if(window_type_one > 226)window_type_one = 225;endstart_index = 1;end_index = 15;%________%: Normal Windows. for div = 1 : window_type_oneif(exercise ~= 10 && exercise ~= 11 && exercise ~= 12)filename = strcat('X2_e0', int2str(exercise), '_s', int2str(subject), '_E2_rep', int2str(repetition));fn = strcat('X2_e0', int2str(exercise), '_s', int2str(subject), '_E2_rep', int2str(repetition));elsefilename = strcat( 'X2_e', int2str(exercise), '_s', int2str(subject), '_E2_rep', int2str(repetition));fn = strcat( 'X2_e', int2str(exercise), '_s', int2str(subject), '_E2_rep', int2str(repetition));endcounter = 1;if(end_index <= matrix_size) filename = strcat(filename, '_image', int2str(div));if(repetition == 1 || repetition == 3 || repetition == 5)save_matrix_path = strcat('EMG_data\train_set\' , filename, '.mat');save_matrix_path_gaussian = strcat('EMG_data\train_set\' , filename, '_GAUSSIAN.mat'); endif(repetition == 2)save_matrix_path = strcat('EMG_data\test_set\' , filename, '.mat');save_matrix_path_gaussian = strcat('EMG_data\test_set\' , filename, '_GAUSSIAN.mat');endif(repetition == 4)save_matrix_path = strcat('EMG_data\val_set\' , filename, '.mat');save_matrix_path_gaussian = strcat('EMG_data\val_set\' , filename, '_GAUSSIAN.mat'); endimage = zeros(8, 15);image = original_matrix(1:8, start_index : end_index);save(save_matrix_path, 'image')image = zeros(8, 15);image = noisy_matrix(1:8, start_index : end_index);save(save_matrix_path_gaussian, 'image')start_index = start_index + 6;end_index = end_index + 6;elsediv = div - 1;endend%________%: Random Windows.for index = div : 226limit = matrix_size - 20;random_number = randi([1,limit]);index_start_random = random_number;index_end_random = index_start_random + 14;if(repetition == 1 || repetition == 3 || repetition == 5)save_path = strcat('EMG_data\train_set\' , fn, '_image', int2str(index), '.mat');save_path_gaussian = strcat('EMG_data\train_set\' , fn, '_image', int2str(index), '_GAUSSIAN.mat');endif(repetition == 2)save_path = strcat('EMG_data\test_set\' , fn, '_image', int2str(index), '.mat');save_path_gaussian = strcat('EMG_data\test_set\' , fn, '_image', int2str(index), '_GAUSSIAN.mat');endif(repetition == 4)save_path = strcat('EMG_data\val_set\' , fn, '_image', int2str(index), '.mat');save_path_gaussian = strcat('EMG_data\val_set\' , fn, '_image', int2str(index), '_GAUSSIAN.mat');endimage = zeros(8, 15); image = original_matrix(1:8, index_start_random : index_end_random);save(save_path, 'image');image = zeros(8, 15);image = noisy_matrix(1:8, index_start_random : index_end_random);save(save_path_gaussian, 'image')endendend end

總結(jié)

以上是生活随笔為你收集整理的基于肌电信号(sEMG) 的深度学习手势分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。