改进型PCA算法人脸识别系统
项目简介
本项目基于MATLAB实现了一个高效、鲁棒的人脸识别系统。系统采用了改进型主成分分析(Modified PCA/Eigenface)算法,针对传统特征脸方法在光照变化和维度选择上的不足进行了优化。通过引入累积方差贡献率自动选择特征维数,并结合加权欧氏距离与余弦相似度度量,系统能够在保证计算效率的同时显著提升识别准确率。
此外,为了确保代码的即通过性和演示效果,系统内置了合成数据生成机制,使得在未配置本地人脸数据库的情况下也能完整运行并展示算法流程。
功能特性
- 智能数据处理:支持读取标准ORL人脸数据库,具备自动降级机制——若未检测到数据库,自动生成含光照与噪声变化的合成人脸数据进行演示。
- 图像预处理:包含灰度化、几何归一化(统一尺寸为64x64)以及直方图均衡化,有效抑制光照不均匀的影响。
- 改进型PCA算法:
*
快照法(Snapshot Method):针对高维图像数据,采用 $A^T A$ 代替 $A A^T$ 进行特征值分解,大幅降低计算复杂度。
*
自适应维数约简:摒弃固定特征数的做法,根据累积方差贡献率(默认95%)动态决定保留的主成分数量,最大程度保留有效信息并去除噪声。
- 多重距离度量:支持余弦相似度(对光照变化鲁棒)和改进的加权欧氏距离(对小特征值方向引入惩罚项)作为分类判据。
- 可视化分析:提供完整的图形化结果展示,包括平均脸、特征脸、图像重构效果对比以及识别匹配结果。
系统要求
- MATLAB R2016a 或更高版本
- (可选)Image Processing Toolbox
使用方法
- 将代码保存为MATLAB脚本文件(如
main.m)。 - (可选)若需测试真实数据,请将ORL人脸数据库(包含s1, s2...文件夹)放置于代码同级目录下的
att_faces 文件夹中。 - 直接运行脚本。
- 控制台将输出训练集/测试集信息、保留的主成分数量及最终识别准确率。
- 程序运行结束后将弹出一个可视化窗口展示算法细节。
算法流程与实现细节
系统主要流程分为四个阶段,具体实现逻辑如下:
1. 数据加载与预处理
程序首先根据
opts.img_height 和
opts.img_width 参数初始化环境。
- 数据源检测:程序会首先尝试加载本地
att_faces 目录。如果该目录不存在,则调用 generate_synthetic_data 函数。该函数通过高斯分布模拟人脸轮廓,并叠加随机条纹、光照变化和高斯噪声,生成具有类内差异的合成数据,确保代码可运行性。 - 标准化处理:对于读取的图像,统一调整大小至 64x64 像素,转为灰度图,并转换为双精度浮点数。
- 直方图均衡化:对每张图像执行
histeq 操作,增强图像对比度,减轻阴影和光照对识别的影响。 - 数据集划分:依据
train_ratio(默认0.7),将每个人的前7张图片划分为训练集,后3张划分为测试集。
2. 特征子空间构建 (PCA训练)
此阶段旨在提取最具代表性的人脸特征:
- 中心化:计算训练集的“平均脸”(Mean Face),并将所有训练样本减去该平均脸,得到去均值矩阵 $A$。
- 快速特征分解:由于图像维度(4096)远大于样本数,代码采用快照法,先计算 $L = A^T A$ 的特征值和特征向量,再将其转换回原始协方差矩阵的特征向量(Eigenfaces)。
- 特征筛选:对特征值进行降序排列,剔除接近零(小于1e-5)的无效特征值。
- 自适应截断:计算累积方差贡献率,自动截取前 $K$ 个特征向量,使得累积方差达到预设阈值(0.95)。这确保了特征子空间既紧凑又包含了绝大部分人脸信息。
- 训练集投影:将去均值后的训练样本投影到选定的 $K$ 维特征子空间中,得到训练集的特征系数矩阵。
3. 人脸识别 (测试阶段)
对测试集中的每一张图像进行处理和分类:
- 投影:将测试图像减去训练集的平均脸,然后投影到上述特征子空间,获得测试样本的特征系数向量。
- 重构误差计算:利用特征向量反向重构图像,计算其与原始图像的范数差异(主要用于分析,非分类依据)。
- 最近邻分类 (KNN):遍历所有训练样本的特征系数,计算测试样本与训练样本之间的距离。
- 距离度量逻辑:
*
余弦相似度 (Cosine):计算 $1 - cos(theta)$,关注向量方向而非大小,因此对光照引起的整体亮度变化具有很好的鲁棒性。
*
加权欧氏距离 (Weighted Euclidean):引入特征值倒数作为权重,降低小特征值(通常对应高频噪声)方向上的距离差异对总距离的影响,提高分类稳定性。
- 判决:选取距离最小的训练样本所属的类别(Person ID)作为预测结果,并统计准确率。
4. 结果可视化
代码最后会生成一个综合图表,直观展示算法内部状态:
- 平均脸:展示训练集中所有人的平均面部特征。
- 特征脸:展示贡献率最高的前3个“主成分”图像,反映了人脸数据集中变化最剧烈的部分(如轮廓、光影方向)。
- 重构演示:并排显示一张原始测试图像及其经过PCA降维-重构后的图像,直观反映主要成分对细节的保留程度。
- 识别示例:随机抽取一个测试样本,左侧显示该样本,右侧显示系统在数据库中找到的最佳匹配图像,并在标题中注明真实ID、匹配ID以及识别是否成功。