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

人脸识别也是 Matlab 做课程设计常见题目,整体步骤清晰,工具箱函数多,好实现。本文整理整体流程,给新手参考。
整体流程
- 人脸检测:从图片找到人脸位置,裁剪出来
- 预处理:归一化大小、对齐、去光照
- 特征提取:把人脸图像降维提取特征
- 分类训练:训练分类器,识别是谁
- 测试识别:输入新人脸输出结果
每一步 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 做人脸识别课程设计不难,每一步都有现成函数,拼起来就行。
浙公网安备 33010602011771号