PCA+SVM matlab手势识别

本文记录自己学习matlab的历程,文笔不好 0.0
基于PCA和SVM的手势识别,用MATLAB实现,不过参数选取的不太好,识别率太低了,25%我也不知道什么问题,还不如用HOG+SVM,不过主要在于方法吧

  1. 收集数据
  2. 制作训练集和测试集
  3. 制作分类器
  4. 进行预测

首先是数据的导入,文件的命名一定要标准,否则会出错,我的训练集和预测集就比较随意了,哈哈

dir=('C:\Users\84629\Desktop\源程序\训练集');
testdir=('C:\Users\84629\Desktop\源程序\预测');
trainingSet = imageSet(dir,'recursive');
testSet = imageSet(testdir,'recursive');

PCA+SVM matlab手势识别_第1张图片PCA+SVM matlab手势识别_第2张图片

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特征做的,感觉还可以,有空发出来。

你可能感兴趣的:(matlab,手势识别)