基于MATLAB的PCA+SVM人脸识别系统实现

基于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
相关推荐
AI大模型学徒1 分钟前
大模型应用开发(四)_调用大模型分析图片
人工智能·深度学习·ai·大模型·deepseek
可涵不会debug3 分钟前
《“慧眼识障“:基于Rokid AI眼镜的智能维修记录自动归档系统开发实战》
人工智能
xieyan08115 分钟前
什么情况下使用强化学习
人工智能
腾飞开源6 分钟前
04_Spring AI 干货笔记之对话客户端 API
人工智能·元数据·检索增强生成·spring ai·chatclient·对话记忆·流式api
执笔论英雄6 分钟前
【RL】Slime异步原理(单例设计模式)6
人工智能·设计模式
da_vinci_x8 分钟前
PS 结构参考 + Firefly:零建模量产 2.5D 等轴游戏资产
人工智能·游戏·设计模式·prompt·aigc·技术美术·游戏美术
是小崔啊13 分钟前
【SAA】01 - Spring Ai Alibaba快速入门
java·人工智能·spring
semantist@语校14 分钟前
第五十一篇|构建日本语言学校数据模型:埼玉国际学院的城市结构与行为变量分析
java·大数据·数据库·人工智能·百度·ai·github
想要成为计算机高手15 分钟前
π*0.6: 从实践中学习 -- 2025.11.17 -- Physical Intelligence (π) -- 未开源
人工智能·学习·机器人·多模态·具身智能·vla
黑客思维者24 分钟前
LLM底层原理学习笔记:模型评估的基准测试体系与方法论
人工智能·笔记·神经网络·学习·模型评估·基准测试