Matlab实现人脸检测与表情识别,完整实战
人脸检测与表情识别是计算机视觉领域的经典应用,广泛用于智能交互、情感分析、安防监控等场景。Matlab凭借其强大的计算机视觉工具箱(Computer Vision Toolbox)和简洁的语法,成为快速实现这类算法的首选工具。本文将从实战角度出发,一步步教你用Matlab完成人脸检测,并基于SVM分类器实现表情识别,所有代码均可直接运行,零基础也能轻松上手。
一、环境准备
1. Matlab版本要求
推荐使用Matlab R2020b及以上版本,该版本的Computer Vision Toolbox对人脸检测相关函数做了优化,兼容性更好。如果使用更低版本,部分函数(如extractHOGFeatures)的参数可能需要小幅调整。
2. 必备工具箱
实现人脸检测与表情识别需要安装两个核心工具箱,缺一不可:
- Computer Vision Toolbox:提供人脸检测级联分类器、HOG特征提取等核心功能;
- Image Processing Toolbox:用于图像灰度化、裁剪、尺寸归一化等预处理操作。
检查工具箱方法:在Matlab命令行输入ver,查看已安装的工具箱列表;若未安装,可通过Matlab主页的“附加功能管理器”搜索对应工具箱,点击“安装”即可。
3. 表情数据集准备
表情识别需要标注好的人脸表情数据集,新手优先选择轻量化的公开数据集:
- JAFFE数据集:包含7种基本表情(中性、愤怒、厌恶、恐惧、快乐、悲伤、惊讶),共213张图像,体积小、标注清晰,适合入门训练;
- 下载方式:可通过GitHub、Kaggle或学术数据库搜索“JAFFE dataset”获取,下载后按表情类别分文件夹存放(如建立
angry、disgust、happy等子文件夹),方便后续读取。
二、Matlab人脸检测实现
人脸检测是表情识别的前提,Matlab内置的vision.CascadeObjectDetector函数基于Haar特征级联分类器,无需自行训练模型,就能快速定位图像中的人脸区域。
1. 核心原理
Haar特征级联分类器通过提取人脸的灰度特征(如眼睛与脸颊的灰度差、鼻子的轮廓特征),构建多层筛选器:先快速排除非人脸区域,再精准定位人脸,兼顾检测速度和准确率。Matlab已内置训练好的人脸检测模型,直接调用即可。
2. 实战代码
% 人脸检测核心代码
% 1. 加载预训练的人脸检测器
faceDetector = vision.CascadeObjectDetector();
% 2. 读取测试图像(替换为你的图片路径)
img = imread('test_face.jpg');
figure('Name','原始图像');
imshow(img);
title('原始图像');
% 3. 检测人脸区域(返回人脸框坐标:[x,y,宽度,高度])
bbox = step(faceDetector, img);
% 4. 绘制人脸检测框并显示
detectedImg = insertObjectAnnotation(img, 'rectangle', bbox, 'Face');
figure('Name','人脸检测结果');
imshow(detectedImg);
title('人脸检测结果');
% 5. 裁剪人脸区域(为表情识别做准备)
if ~isempty(bbox)
faceImg = imcrop(img, bbox);
figure('Name','裁剪后的人脸');
imshow(faceImg);
title('裁剪后的人脸');
else
disp('未检测到人脸,请更换正面、清晰的测试图片!');
end
3. 运行说明
- 运行前需将
test_face.jpg替换为本地人脸图片路径,建议使用正面、光线充足的图片,检测准确率更高; - 若检测到多个人脸,
bbox会返回多行坐标,可通过循环遍历处理; - 核心函数
step()是检测器的执行入口,输入原始图像即可返回人脸框坐标,新手无需深入底层原理,重点掌握参数含义即可。
三、Matlab表情识别实现
表情识别的核心流程为:人脸预处理→HOG特征提取→SVM分类器训练→表情预测,下面分步实现完整流程。
1. 核心思路
- 预处理:统一人脸图像的尺寸、色彩格式,消除光照、尺寸对识别的影响;
- 特征提取:用HOG(方向梯度直方图)提取人脸纹理特征,HOG能有效描述表情对应的面部轮廓变化(如嘴角上扬、眉头紧皱);
- 分类训练:用SVM(支持向量机)对HOG特征进行多分类训练,建立表情识别模型;
- 预测:对新人脸图像提取特征后,输入模型即可输出表情类别。
2. 分步代码实现
2.1 人脸预处理函数
% 函数功能:统一处理人脸图像格式
function processedImg = preprocessFace(img)
% 转为灰度图(消除色彩干扰)
if size(img,3) == 3
img_gray = rgb2gray(img);
else
img_gray = img;
end
% 归一化尺寸为64×64(统一特征维度)
processedImg = imresize(img_gray, [64,64]);
% 灰度值归一化到0-1(提升模型收敛速度)
processedImg = im2double(processedImg);
end
2.2 加载数据集并提取HOG特征
% 定义表情类别和数据集路径
emotionLabels = {'neutral','angry','disgust','fear','happy','sad','surprise'};
datasetPath = 'jaffe_dataset'; % 替换为你的数据集根目录
features = []; % 存储所有样本的HOG特征
labels = []; % 存储样本对应的表情标签
% 遍历每个表情文件夹提取特征
disp('开始加载数据集并提取特征...');
for i = 1:length(emotionLabels)
folderPath = fullfile(datasetPath, emotionLabels{i});
if ~exist(folderPath, 'dir')
disp(['警告:文件夹不存在 - ', folderPath]);
continue;
end
% 获取文件夹内所有jpg格式图片
imgFiles = dir(fullfile(folderPath, '*.jpg'));
for j = 1:length(imgFiles)
imgPath = fullfile(folderPath, imgFiles(j).name);
img = imread(imgPath);
% 预处理人脸
processedImg = preprocessFace(img);
% 提取HOG特征
hogFeature = extractHOGFeatures(processedImg);
% 存入特征和标签数组
features = [features; hogFeature];
labels = [labels; i]; % 用数字1-7表示不同表情
end
end
disp(['数据集加载完成,共提取 ', size(features,1), ' 个样本的特征']);
2.3 训练SVM表情分类器
% 训练多分类SVM模型(适合7类表情分类)
svmModel = fitcecoc(features, labels, ...
'Learner', 'LinearSVM', ... % 线性SVM,适配小数据集
'Coding', 'onevsall', ... % 一对一编码,提升多分类效果
'Verbose', 0); % 关闭训练过程输出
% 保存训练好的模型(避免重复训练)
save('emotion_svm_model.mat', 'svmModel');
disp('SVM表情分类模型训练完成并保存!');
2.4 人脸检测+表情识别联合预测
% 加载训练好的SVM模型
load('emotion_svm_model.mat');
% 读取测试图片
testImg = imread('test_emotion.jpg'); % 替换为测试图片路径
faceDetector = vision.CascadeObjectDetector('FrontalFaceALT2'); % 更鲁棒的检测器
bbox = step(faceDetector, testImg);
% 对检测到的人脸进行表情识别
if ~isempty(bbox)
% 处理多个人脸情况
for k = 1:size(bbox,1)
faceImg = imcrop(testImg, bbox(k,:));
processedFace = preprocessFace(faceImg);
% 提取HOG特征并预测
testHog = extractHOGFeatures(processedFace);
[predLabel, ~] = predict(svmModel, testHog);
predEmotion = emotionLabels{predLabel};
% 绘制检测框和表情结果
testImg = insertObjectAnnotation(testImg, 'rectangle', bbox(k,:), predEmotion);
end
% 显示最终结果
figure('Name','表情识别结果');
imshow(testImg);
title('人脸检测与表情识别结果');
disp(['预测表情:', predEmotion]);
else
disp('未检测到人脸,无法进行表情识别!');
end
四、常见问题与解决方法
1. 人脸检测失败
- 原因:图片人脸角度过大、光线过暗/过曝、分辨率过低;
- 解决:① 用
imadjust调整图片亮度:img = imadjust(img);;② 更换更鲁棒的检测器:faceDetector = vision.CascadeObjectDetector('FrontalFaceALT2');;③ 使用正面、清晰的人脸图片。
2. 表情识别准确率低
- 原因:JAFFE数据集样本量小、特征单一;
- 解决:① 扩充数据集(加入CK+数据集);② 尝试LBP特征替代HOG:
lbpFeature = extractLBPFeatures(processedImg);;③ 调整SVM参数,改用RBF核函数:'Learner', 'KernelSVM', 'KernelFunction', 'rbf'。
3. 函数报错“Undefined function”
- 原因:未安装对应工具箱;
- 解决:通过“附加功能管理器”安装Computer Vision Toolbox和Image Processing Toolbox。
五、完整可运行源码
% Matlab人脸检测与表情识别完整脚本
% 说明:运行前需替换数据集路径和测试图片路径
%% 1. 人脸预处理函数
function processedImg = preprocessFace(img)
% 转为灰度图
if size(img,3) == 3
img_gray = rgb2gray(img);
else
img_gray = img;
end
% 归一化尺寸
processedImg = imresize(img_gray, [64,64]);
% 灰度归一化
processedImg = im2double(processedImg);
end
%% 2. 主程序:训练+预测
% ====================== 第一步:训练表情模型 ======================
emotionLabels = {'neutral','angry','disgust','fear','happy','sad','surprise'};
datasetPath = 'jaffe_dataset'; % 替换为你的数据集路径
features = [];
labels = [];
% 加载数据集并提取HOG特征
disp('加载数据集...');
for i = 1:length(emotionLabels)
folderPath = fullfile(datasetPath, emotionLabels{i});
if ~exist(folderPath, 'dir')
disp(['跳过不存在的文件夹:', folderPath]);
continue;
end
imgFiles = dir(fullfile(folderPath, '*.jpg'));
for j = 1:length(imgFiles)
imgPath = fullfile(folderPath, imgFiles(j).name);
img = imread(imgPath);
processedImg = preprocessFace(img);
hogFeature = extractHOGFeatures(processedImg);
features = [features; hogFeature];
labels = [labels; i];
end
end
disp(['数据集加载完成,样本数:', num2str(size(features,1))]);
% 训练SVM模型
disp('训练SVM模型...');
svmModel = fitcecoc(features, labels, ...
'Learner', 'LinearSVM', ...
'Coding', 'onevsall', ...
'Verbose', 0);
save('emotion_svm_model.mat', 'svmModel');
disp('模型训练完成!');
% ====================== 第二步:人脸检测+表情预测 ======================
% 加载模型
load('emotion_svm_model.mat');
% 读取测试图片
testImgPath = 'test_emotion.jpg'; % 替换为测试图片路径
if ~exist(testImgPath, 'file')
error('测试图片不存在,请检查路径!');
end
testImg = imread(testImgPath);
% 人脸检测
faceDetector = vision.CascadeObjectDetector('FrontalFaceALT2');
bbox = step(faceDetector, testImg);
% 表情预测
if ~isempty(bbox)
for k = 1:size(bbox,1)
faceImg = imcrop(testImg, bbox(k,:));
processedFace = preprocessFace(faceImg);
testHog = extractHOGFeatures(processedFace);
[predLabel, ~] = predict(svmModel, testHog);
predEmotion = emotionLabels{predLabel};
testImg = insertObjectAnnotation(testImg, 'rectangle', bbox(k,:), predEmotion);
end
% 显示结果
figure('Position',[100,100,800,600]);
imshow(testImg);
title('Matlab人脸检测与表情识别结果','FontSize',14);
disp('表情识别完成!');
else
disp('未检测到人脸,请更换测试图片!');
end

浙公网安备 33010602011771号