一、系统架构设计
二、核心代码
1. 数据加载与预处理
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:numSamplesimgPath = fullfile(data_dir, imgFiles(i).name);img = imread(imgPath);X(i,:) = double(img(:)); % 展平为行向量end% 生成标签(假设文件夹按类别组织)y = zeros(numSamples, 1);classID = 1;for i = 1:40idx = (i-1)*10 + 1 : i*10;y(idx) = classID;endclassID = classID + 1;
end
2. PCA特征降维
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模型训练与识别
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
三、完整流程示例
%% 主程序
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/contentcnj/64636.html
四、关键功能扩展
1. 特征脸可视化
function plot_eigenfaces(coeff, numFaces)% 显示前numFaces个特征脸figure;for i = 1:numFaceseigFace = 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. 动态人脸检测(摄像头实时识别)
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