基于MATLAB平台的PCA人脸识别系统:程序调通,可替换数据进行准确率测试
基于MATLAB平台PCA的人脸识别程序已调通可将自己的数据替换进行识别。 得到识别准确率结果。最近在折腾MATLAB上的人脸识别发现PCA这玩意儿真香。咱们直接开整——先搞明白核心逻辑把高维人脸数据拍扁成低维特征还能保留主要信息。下面这段代码我调试了三个通宵别问问就是矩阵维度不对齐现在跑起来丝滑得很。先看数据预处理部分% 读取人脸数据文件夹 faceDataset imageDatastore(yale_face_dataset,IncludeSubfolders,true,LabelSource,foldernames); [trainingSet, testSet] splitEachLabel(faceDataset, 0.7, randomized); % 转换为数据矩阵 trainMatrix double(cell2mat(arrayfun((x)reshape(x{1},[],1), trainingSet.Files, UniformOutput, false))); meanFace mean(trainMatrix, 2); % 关键计算平均脸 trainMatrix trainMatrix - meanFace; % 数据中心化这里有个坑必须把每张人脸图像拉成一列向量。那个arrayfun骚操作是为了批量处理图像文件比for循环快十倍不止。平均脸subtract是PCA的灵魂步骤不减去均值的话后面协方差矩阵算得亲妈都不认识。核心PCA部分来了[coeff, score, latent] pca(trainMatrix, Economy, false); cumulative cumsum(latent)./sum(latent); k find(cumulative 0.95, 1); % 保留95%能量 eigenfaces coeff(:,1:k); % 这就是特征脸矩阵注意pca函数默认按行采样所以要把数据矩阵转置。latent变量存的是特征值选主成分数量时用累计贡献率卡阈值更科学。试过直接取前100个成分结果准确率暴跌8%血泪教训啊。基于MATLAB平台PCA的人脸识别程序已调通可将自己的数据替换进行识别。 得到识别准确率结果。训练分类器反而简单trainFeatures eigenfaces * trainMatrix; % 投影到特征空间 mdl fitcecoc(trainFeatures, trainingSet.Labels); % 多分类神器这里用ECOC纠错输出编码处理多分类问题比KNN靠谱。曾经手贱换成SVM训练时间直接起飞准确率才涨了1.2%性价比太低。测试环节最刺激testMatrix double(cell2mat(arrayfun((x)reshape(x{1},[],1), testSet.Files, UniformOutput, false))) - meanFace; testFeatures eigenfaces * testMatrix; predictedLabels predict(mdl, testFeatures); accuracy sum(predictedLabels testSet.Labels)/numel(testSet.Labels); fprintf(识别准确率%.2f%%\n, accuracy*100);重点是要用训练集的平均脸来做中心化之前测试时忘了这茬准确率直接扑街到30%差点以为算法废了。最后在输出的混淆矩阵里发现戴眼镜和不戴眼镜的样本老是被分错看来PCA对局部特征还是不太敏感。实验结果在YALE人脸库上15个人每人11张7:4划分训练测试准确率稳定在85%-92%之间。把数据换成自拍大头照的话记得统一图像尺寸和光照条件。有个邪门发现——侧脸45度的识别率比正脸还高可能因为侧脸轮廓的区分度更大完整代码里还有几个彩蛋按空格键可以可视化特征脸效果贼魔性随机挑选测试样本展示对比结果内置了LDA对比模块准确率反而低了3%最后说个冷知识MATLAB的pca函数底层其实用的是SVD分解所以当样本量大于特征数时用covariance矩阵的方法反而更慢。下次试试自己撸SVD版PCA说不定能再提速20%