生活随笔
收集整理的這篇文章主要介紹了
基于肌电信号(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;end
if(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_point
for 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;end
if(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_one
if(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'
); end
if(repetition
== 2)save_matrix_path
= strcat('EMG_data\test_set\' , filename, '.mat'
);save_matrix_path_gaussian
= strcat('EMG_data\test_set\' , filename, '_GAUSSIAN
.mat'
);end
if(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'
);end
if(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'
);end
if(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ò),歡迎將生活随笔推薦給好友。