本文记录自己学习matlab的历程,文笔不好 0.0
基于PCA和SVM的手势识别,用MATLAB实现,不过参数选取的不太好,识别率太低了,25%我也不知道什么问题,还不如用HOG+SVM,不过主要在于方法吧
首先是数据的导入,文件的命名一定要标准,否则会出错,我的训练集和预测集就比较随意了,哈哈
dir=('C:\Users\84629\Desktop\源程序\训练集');
testdir=('C:\Users\84629\Desktop\源程序\预测');
trainingSet = imageSet(dir,'recursive');
testSet = imageSet(testdir,'recursive');
for digit = 1:8
numImages = trainingSet(digit).Count
% 遍历每张图片
for i = 1:numImages
img = read(trainingSet(digit), i);% 取出第i张图片
img=imresize(img,[100 100]);
img=rgb2gray(img);
phi(i,:)=double(reshape(img,1,[]));
imshow(img)
labels = repmat(trainingSet(digit).Description, numImages, 1);
end
labels = repmat(trainingSet(digit).Description, numImages, 1);
trainingLabels = [trainingLabels; labels];
对数据进行PCA降维,在这里指出一个问题,我的图像是135*230,维度太高了,没有办法进行直接降维,所以先改变了图片的尺寸,然后再进行的降维,程序有点难看。
SVM分类器
trainingLabels=double(trainingLabels);
testLabels=double(testLabels);
classifier = fitcecoc(pcaData1,trainingLabels);
save classifier.mat classifier;
predictedLabels = predict(classifier,pcaData1);
这里将标签转化为double型了,是进行SVM训练的参数要求,还有我这里没有寻找c、g的最佳参数,应为计算太慢了,机器根本吃不消。。。。难受
进行预测
for k=1:numframe
pcaData3=[];
predictedLabel=[];
img1=read(obj,k);
img=img1;
figure
img=imresize(img,[100 100]);
imshow(img1)
img=rgb2gray(img);
phi(1,:)=double(reshape(img,1,[]));
[coeff, score1, latent, TSQUARED] = princomp(phi);
pcaData3=score1(:,1:32);
% 使用测试图像的特征向量预测样本标签
% predictedLabel = svmpredict(model,pcaDate3);
predictedLabel = predict(classifier,pcaData3);
str = ['请看分类结果:',predictedLabel];
dim = [0.25 0.0004 0.2 0.2];
annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
end
我这里用的是视频数据,结果可以说很惨烈了,计算速度慢先不说,准确率也不高
总结
感觉结果准确率有问题可能是因为数据集没有做好,图像处理太随意,直接进PCA降维了,还改变了数据,还有一种在网上学习的Hog特征做的,感觉还可以,有空发出来。