基于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
相关推荐
谭欣辰6 分钟前
C++ 排列组合完整指南
开发语言·c++·算法
love530love10 分钟前
精简版|Claude-HUD 插件介绍 + 一键安装教程
人工智能·windows·笔记
代码中介商20 分钟前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
冬奇Lab29 分钟前
RAG 系列(四):文档处理——从原始文件到高质量 Chunk
人工智能·llm·源码
冬奇Lab35 分钟前
一天一个开源项目(第89篇):Warp - AI 驱动的现代化 Rust 终端
人工智能·rust·开源
蔡俊锋1 小时前
AI是一面镜子
人工智能·ai·规格说明书·ai是一面镜子
四方云1 小时前
Kamailio 启动报错 “invalid curve” 与 “freeing already freed pointer” 的终极解决方案
人工智能
foundbug9991 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab
沪漂阿龙1 小时前
OpenAI Agents SDK 深度解析(三):执行层——Agent 的“幕后指挥部”
人工智能·深度学习
还是奇怪1 小时前
AI 提示词工程入门:用好的语言与模型高效对话
大数据·人工智能·语言模型·自然语言处理·transformer