基于Matlab的人脸识别,实现步骤

图片

人脸识别也是 Matlab 做课程设计常见题目,整体步骤清晰,工具箱函数多,好实现。本文整理整体流程,给新手参考。

整体流程

  1. 人脸检测:从图片找到人脸位置,裁剪出来
  2. 预处理:归一化大小、对齐、去光照
  3. 特征提取:把人脸图像降维提取特征
  4. 分类训练:训练分类器,识别是谁
  5. 测试识别:输入新人脸输出结果

每一步 Matlab 都有现成函数,不用从零写。

第一步:人脸检测

检测图像里哪里有人脸,用 Viola-Jones 算法,Matlab 自带训练好的检测器:

detector = vision.CascadeObjectDetector;
img = imread('test.jpg');
bboxes = step(detector, img);

bboxes 每一行是一个人脸框 [x y w h],裁剪出来:

for i = 1:size(bboxes,1)
    face = imcrop(img, bboxes(i,:));
    face = imresize(face, [100 100]); % 归一大小
    faces{i} = face;
end

自带检测器对于正面人脸检测效果不错,够课程设计用了。

第二步:预处理

检测出人脸要预处理,减少干扰:

  • 灰度化:face_gray = rgb2gray(face);
  • 直方图均衡化:增强对比度,解决光照问题 face_eq = histeq(face_gray);
  • 归一大小:所有人脸缩放到同样大小,方便特征提取,一般 100×100 或者 64×64

第三步:特征提取

最经典方法 PCA(主成分分析),也就是 Eigenfaces,Matlab 有 pca 函数:

把所有人脸拉直成向量,拼矩阵,算主成分,投影到低维:

% faces 是 n 个人脸,每个拉直成向量,拼成 n×d 矩阵
[coeff, score, latent] = pca(faces);
% 取前 k 个主成分,投影
projected = faces * coeff(:, 1:k);

k 一般取几十到一百,降维之后分类更快,也去掉噪声。

还有 LBP 特征,局部纹理,也好用:

features = extractLBPFeatures(face);

直接提取 LBP 特征,也很方便。

第四步:分类识别

特征提取完,训练分类器,常用 k-NN 最近邻:

% projected 是训练特征,labels 是标签
model = fitcknn(projected, labels);
% 预测
label = predict(model, test_projected);

就出来识别结果了,简单有效。

想用更准用 SVM:

model = fitcecoc(training_features, training_labels);
label = predict(model, test_features);

多分类 SVM,效果也不错。

完整框架例子

% 读ORL人脸数据集
image_dir = 'orl_faces/';
num_persons = 40;
num_per_person = 10;
features = [];
labels = [];
for p = 1:num_persons
    for i = 1:num_per_person
        filename = sprintf('%ss%d_%d.pgm', image_dir, p, i);
        img = imread(filename);
        % 预处理已经裁剪好了,直接灰度
        img = imresize(img, [64 64]);
        f = img(:)'; % 拉直
        features = [features; f];
        labels = [labels; p];
    end
end

% 划分训练测试
train_idx = mod(1:size(features,1), 2) == 1;
test_idx = ~train_idx;
X_train = features(train_idx,:);
y_train = labels(train_idx,:);
X_test = features(test_idx,:);
y_test = labels(test_idx,:);

% PCA降维
[coeff, X_train_pca] = pca(X_train);
X_train_pca = X_train_pca(:, 1:50);
X_test_pca = X_test * coeff(:,1:50);

% kNN分类
model = fitcknn(X_train_pca, y_train);
y_pred = predict(model, X_test_pca);

% 正确率
acc = mean(y_pred == y_test);
fprintf('识别正确率: %.2f%%\n', acc*100);

ORL 数据集经典人脸识别测试数据集,这么跑下来正确率一般 90% 以上,效果不错。

总结难点

  • 人脸检测不准,背景复杂容易误检,拍的时候尽量背景干净点
  • 光照变化影响大,预处理一定要均衡化
  • 降维维度选多少,几十够了,太大容易过拟合

整个流程走下来,用 Matlab 做人脸识别课程设计不难,每一步都有现成函数,拼起来就行。

posted @ 2026-05-08 07:53  小飞技术快餐  阅读(13)  评论(0)    收藏  举报