基于MATLAB的人脸识别,实现PCA降维,用PCA特征进行SVM训练

发布于:2025-05-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

基于MATLAB的人脸识别完整流程,包含PCA降维和SVM分类的实现。我们以经典的ORL人脸数据库为例,演示从数据加载到结果评估的全过程。


1. 数据准备与预处理

1.1 下载数据集

下载ORL人脸数据库(40人×10张,共400张图像),解压后保存为orl_faces文件夹,按以下结构组织:

orl_faces/
├── s1/
│   ├── 1.pgm
│   ├── 2.pgm
│   └── ...
├── s2/
└── ...
1.2 MATLAB代码实现
clc; clear; close all;

%% 1. 加载人脸数据
dataPath = 'orl_faces/'; % 修改为实际路径
[imds, labels] = loadORLData(dataPath); % 自定义函数(见附录)

%% 2. 数据预处理
% 转换为灰度图像矩阵(每行一个样本)
X = double(reshape(imds.Files{1}, [], 1)); % 示例图像
X = zeros(size(imds.Files, 1), size(imds.Files{1}, 1)*size(imds.Files{1}, 2));
for i = 1:size(imds.Files, 1)
    X(i, :) = double(reshape(imds.Files{i}, [], 1));
end

% 归一化(零均值、单位方差)
X = (X - mean(X)) ./ std(X);

%% 3. PCA降维
[coeff, score, ~] = pca(X); % MATLAB内置PCA函数
explained = 100 * variance(score, 'all') / sum(variance(score, 'all'));

% 选择保留95%方差的主成分
cum_var = cumsum(explained);
k = find(cum_var >= 95, 1);
X_pca = score(:, 1:k);

%% 4. 划分训练集与测试集
rng(1); % 固定随机种子
cv = cvpartition(labels, 'HoldOut', 0.3); % 70%训练,30%测试
X_train = X_pca(cv.training,:);
y_train = labels(cv.training,:);
X_test = X_pca(cv.test,:);
y_test = labels(cv.test,:);

%% 5. SVM分类
% 训练SVM模型(使用RBF核)
template = templateSVM('KernelFunction', 'rbf', 'Standardize', true);
model = fitcecoc(X_train, y_train, 'Learners', template);

% 预测与评估
y_pred = predict(model, X_test);
accuracy = sum(y_pred == y_test) / numel(y_test);
fprintf('分类准确率: %.2f%%\n', accuracy*100);

%% 6. 可视化
% 显示特征脸
figure;
for i = 1:min(k, 20)
    subplot(4,5,i);
    imshow(reshape(coeff(:,i), [112,92])); % ORL图像尺寸112×92
    title(sprintf('PC %d (%.1f%%)', i, explained(i)));
end

% 显示混淆矩阵
confMat = confusionmat(y_test, y_pred);
confusionchart(confMat);

2. 关键函数说明

**2.1 数据加载函数 loadORLData**​
function [imds, labels] = loadORLData(path)
    imds = imageDatastore(fullfile(path, 's*'), ...
        'IncludeSubfolders', true, ...
        'LabelSource', 'foldernames');
    labels = categorical(imds.Labels);
    labels = grp2idx(labels); % 转换为数值标签
end
2.2 PCA降维原理

PCA通过奇异值分解(SVD)提取数据主成分:
X=UΣVT
其中 V 的列为特征向量(主成分),Σ 为奇异值矩阵。

可参考 # 附有人脸数据库,实现PCA降维,用PCA特征进行SVM训练


3. 结果分析

  1. 特征脸可视化​:显示前20个主成分对应的“特征脸”。
  2. 分类准确率​:典型结果约为85%~95%(取决于数据划分和参数)。
  3. 混淆矩阵​:展示各类别的分类细节。

4. 改进方向

  1. 数据增强​:添加旋转、平移等增强方法。
  2. 参数调优​:使用fitcsvmOptimizeHyperparameters自动调参。
  3. 深度学习对比​:使用预训练CNN(如AlexNet)提取特征对比性能。

5. 注意事项

  1. 确保ORL数据库路径正确。
  2. 如果内存不足,可降低图像分辨率(如将112×92缩放到64×64)。
  3. 分类准确率可能因随机划分略有波动,建议多次实验取平均。

此代码实现了从数据加载到模型评估的完整流程,可直接运行并根据需求调整参数。


网站公告

今日签到

点亮在社区的每一天
去签到