基于MATLAB的PCA+SVM人脸识别系统实现
一、系统架构设计

二、核心代码
1. 数据加载与预处理
matlab
function [X, y] = load_orl_dataset(data_dir)
% 加载ORL人脸数据集(112x92像素)
% 输入: data_dir - 数据集路径
% 输出: X - 特征矩阵 (m×n), y - 标签向量 (m×1)
imgFiles = dir(fullfile(data_dir, '*.pgm'));
numSamples = length(imgFiles);
X = zeros(numSamples, 10304); % 112 * 92=10304维
for i = 1:numSamples
imgPath = fullfile(data_dir, imgFiles(i).name);
img = imread(imgPath);
X(i,:) = double(img(:)); % 展平为行向量
end
% 生成标签(假设文件夹按类别组织)
y = zeros(numSamples, 1);
classID = 1;
for i = 1:40
idx = (i-1)*10 + 1 : i*10;
y(idx) = classID;
end
classID = classID + 1;
end
2. PCA特征降维
matlab
function [X_pca, coeff] = pca_feature_extraction(X, numComponents)
% PCA降维
% 输入: X - 原始特征矩阵, numComponents - 保留主成分数
% 输出: X_pca - 降维后特征, coeff - 特征向量矩阵
[coeff, score, ~] = pca(X);
X_pca = score(:, 1:numComponents);
end
3. SVM模型训练与识别
matlab
function accuracy = train_and_test(X_train, y_train, X_test, y_test)
% 训练SVM分类器并测试
% 输入: 训练/测试数据及标签
% 输出: 识别准确率
% 设置SVM参数
svmModel = fitcecoc(X_train, y_train, ...
'Learners', templateSVM('KernelFunction', 'rbf', 'BoxConstraint', 10));
% 预测
y_pred = predict(svmModel, X_test);
% 计算准确率
accuracy = sum(y_pred == y_test) / numel(y_test);
end
三、完整流程示例
matlab
%% 主程序
clear; clc;
% 加载数据(示例路径)
dataDir = './ORL/s';
[X, y] = load_orl_dataset(dataDir);
% 数据划分(70%训练,30%测试)
cv = cvpartition(size(X,1),'HoldOut',0.3);
X_train = X(cv.training,:);
y_train = y(cv.training);
X_test = X(cv.test,:);
y_test = y(cv.test);
% PCA降维(保留前50个主成分)
numPCA = 50;
[X_train_pca, coeff] = pca_feature_extraction(X_train, numPCA);
X_test_pca = X_test * coeff(:,1:numPCA);
% 训练与测试
accuracy = train_and_test(X_train_pca, y_train, X_test_pca, y_test);
fprintf('识别准确率: %.2f%%
', accuracy*100);
参考代码 基于PCA_SVM的人脸识别程序 www.youwenfan.com/contentcsl/64636.html
四、关键功能扩展
1. 特征脸可视化
matlab
function plot_eigenfaces(coeff, numFaces)
% 显示前numFaces个特征脸
figure;
for i = 1:numFaces
eigFace = reshape(coeff(:,i), [112,92]);
subplot(2,5,i);
imshow(eigFace, []);
title(sprintf('Eigenface %d', i));
axis off;
end
end
% 调用示例
plot_eigenfaces(coeff, 5);
2. 动态人脸检测(摄像头实时识别)
matlab
function live_recognition()
% 打开摄像头
cam = webcam();
figure;
imshow(im2uint8(snapshot(cam)));
while true
% 采集人脸
img = snapshot(cam);
img_gray = rgb2gray(img);
face = imcrop(img_gray, [50,50,62,62]); % 裁剪人脸区域
% 特征提取
face_vector = double(face(:));
face_pca = face_vector * coeff(:,1:50);
% 识别
[~, label] = max(predict(svmModel, face_pca));
imshow(face);
title(sprintf('ID: %d', label));
drawnow;
end
end