目录
1. 数据集介绍
本实验所用数据集为从Kaggle平台下载的手语数据集(sign_mnist)中选取的部分数据。
sign_mnist 数据集格式的模式化与经典 MNIST 紧密匹配。每个训练和测试用例表示一个标签 (0-25),作为每个字母 A-Z 的一对一映射(由于手势运动,9=J 或 25=Z 没有情况)。训练数据(27,455 个案例)和测试数据(7172 个案例)大约是标准 MNIST 大小的一半,但在其他方面与标签 pixel1,pixel2....pixel784 的标题行相似,它们表示单个 28x28 像素图像,灰度值在 0-255 之间。原始手势图像数据表示多个用户在不同背景下重复手势。部分示例图片如下:
本实验从以上数据集中选取十个手势分别定义为 0~9,定义示例图如下:
本实验所用数据集将原始的 CSV 文件转换成图片(png)格式,两种格式文件下载见文末总结。
2. 训练、保存网络
随机选取 20 张图片进行展示。
clc; clear
gesture_dataset_path = fullfile('dataset', 'train_data');
imds=imageDatastore(gesture_dataset_path, 'FileExtensions',...
{'.png','.jpg','.tif'},'IncludeSubfolders',true,...
'LabelSource','foldernames');
figure
numImages = 11599;
perm = randperm(numImages,20); % 随机选取20个数,perm是1*20double数组
for i = 1:20 % 此循环是MATLAB自带示例
subplot(4,5,i);
imshow(imds.Files{perm(i)}); % 显示随机选取的20幅图像
drawnow;
end
展示如图:
cnn网络结构图:
训练结果:
训练结果显示,其验证准确度达到了 99.97%,效果很好。
3. 手势识别
通过使用测试数据集中的图片进行手势识别,查看识别效果。
clc; clear
% 导入训练好的 CNN 网络
load("cnn.mat");
% 对测试数据集任一图像测试
I = imread('dataset\test_data\5\5_100.png');
imshow(I);
title(classify(net, I));
% 查看对测试数据集中手势 5 的识别正确率
m = 0;
for i = 1:310
P = imread(strcat('dataset\test_data\5\5_', num2str(i),'.png'));
if double(string(classify(net, P))) ~= 5
m = m + 1;
end
end
accy = (310 - m) / 310;
fprintf('The accuracy rate is %6.4f.\n', accy);
4. 识别结果
结果显示,对测试数据集中手势 5 的识别正确率为 93.55%。
5. 总结
1. 识别效果良好,最终的手势识别测试可以改进做一个 GUI 界面更好。
2. 本实验所用数据集和全部源代码下载。