基于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
相关推荐
开开心心就好3 分钟前
绿色版PDF多功能工具,支持编辑转换
人工智能·windows·pdf·ocr·excel·语音识别·harmonyos
LY智网强哥4 分钟前
企业怎么出现在AI回答里?GEO优化的原理、路径与边界
大数据·人工智能
国医中兴7 分钟前
Python AI入门:从Hello World到图像分类
人工智能·python·分类
熊猫_豆豆7 分钟前
Python 基于Dlib和OpenCV实现人脸融合算法+代码
图像处理·python·算法·人脸融合
1941s15 分钟前
Google Agent Development Kit (ADK) 指南 第六章:记忆与状态管理
人工智能·python·agent·adk·google agent
no_work18 分钟前
万能图像处理小助手1.1_傅里叶变化_椒盐噪声_直方图均衡等图片批量处理
图像处理·人工智能·python
twc82919 分钟前
写好提示词
人工智能·大模型·llm·提示词工程
Book思议-22 分钟前
【数据结构实战】双向链表:在指定位置插入数据
c语言·数据结构·算法·链表
guoji778826 分钟前
Gemini 3.1 Pro 混合专家系统与注意力机制深度拆解
人工智能
爱钓鱼的程序员小郭26 分钟前
3D打印全流程自动化(AI增强)
人工智能