基于 DK-SVD 的判别性字典学习人脸识别系统
项目介绍
本项目是一个基于 MATLAB 实现的人脸识别系统,复现了 CVPR 经典论文《Discriminative K-SVD dictionary learning for face recognition》中提出的 DK-SVD (Discriminative K-SVD) 算法。
传统的 K-SVD 算法主要侧重于样本的信号重建能力,而忽略了样本的类别判别信息。DK-SVD 算法通过在目标函数中引入分类误差项和标签一致性正则化项,将字典学习与线性分类器的训练统一在一个优化框架中。本项目实现了一个完整的仿真流程,从数据生成、联合训练到最终的分类识别,旨在训练出一个既能高效重建人脸图像,又具有强大分类能力的判别性字典。
功能特性
- 联合目标优化:实现了字典 $D$ 和分类器 $W$ 的联合学习,通过引入控制参数 $alpha$ 平衡重建误差与分类误差。
- 增强矩阵策略:采用矩阵增强(Augmented Matrix)技术,将原始信号 $Y$ 与加权标签 $H$ 拼接,将判别性问题转化为标准的 K-SVD 求解形式。
- K-SVD 迭代更新:利用奇异值分解(SVD)逐个更新字典原子及其对应的稀疏系数,确保字典原子能够适应数据分布。
- 稀疏编码 (OMP):集成了正交匹配追踪(Orthogonal Matching Pursuit)算法,用于快速求解训练和测试阶段的稀疏系数。
- 全流程仿真:包含模拟数据生成模块,无需外部数据集即可直接运行,验证算法在低维子空间模型下的有效性。
- 结果可视化:提供收敛曲线、字典原子可视化、分类器权重热力图及混淆矩阵等多种图表展示。
系统流程与实现逻辑
本项目的主程序 (main) 严格按照以下步骤执行:
1. 参数初始化
配置系统运行的关键参数,包括:
- 人脸类别数、图像尺寸(宽/高)。
- 训练集与测试集样本数量。
- 字典原子数量 ($K$) 和稀疏度约束 ($T$)。
- 判别项权重 ($alpha$):控制分类误差在总目标函数中的比重。
- 迭代次数。
2. 数据准备 (模拟仿真)
系统内置数据生成功能,不依赖外部人脸数据库。
- 基于子空间假设生成数据:假设每类人脸数据由特定的基向量张成。
- 生成随机基矩阵和系数,并叠加高斯噪声模拟真实环境。
- 对生成的数据进行 L2 范数归一化处理。
3. 标签矩阵构建
构建用于监督学习的逻辑标签矩阵 $H$。如果样本 $j$ 属于第 $i$ 类,则矩阵对应位置为 1,其余为 0。此矩阵将用于训练线性分类器。
4. DK-SVD 联合训练
这是系统的核心模块,执行以下联合优化过程:
- 初始化:随机选择训练样本初始化字典 $D$,随机初始化分类器 $W$。
- 矩阵增强:构建联合信号矩阵 $Y_{aug} = [Y; sqrt{alpha}H]$ 和联合字典 $D_{aug} = [D; sqrt{alpha}W]$。
- 迭代循环:
1.
稀疏编码:在增强空间中,利用 OMP 算法求解稀疏系数矩阵 $X$。
2.
字典更新:遍历每个原子,计算残差矩阵,利用 SVD 分解更新联合字典的列(原子)和对应的系数值。
3.
误差记录:分别计算重建误差和分类误差,监控收敛情况。
- 分离输出:训练结束后,将联合字典拆分为最终的字典 $D$ 和分类器 $W$,并进行归一化处理。
5. 测试与识别
利用训练好的模型对测试集进行分类:
- 稀疏重构:仅使用学习到的字典 $D$,对测试样本 $Y_{test}$ 求解稀疏系数 $X_{test}$。
- 预测评分:应用训练好的分类器 $W$ 计算得分矩阵 $Scores = W times X_{test}$。
- 决策:选取得分最高的类别作为预测结果,并计算整体识别准确率。
6. 结果可视化
程序最后会生成一个包含四个子图的窗口:
- 收敛曲线:显示总目标函数随迭代次数下降的趋势。
- 字典原子:将学习到的字典列向量重塑为图像块进行展示,观察其是否以此捕捉到人脸特征。
- 分类器权重:以热力图形式展示矩阵 $W$,直观反映其对稀疏系数的加权情况。
- 混淆矩阵:展示真实标签与预测标签的对应关系及分类精度。
关键算法实现细节
DK-SVD 训练 (dksvd_train)
该函数实现了《Discriminative K-SVD》论文的核心思想。区别于传统方法,它不分开训练字典和分类器,而是构造一个增强问题:
$$ min_{D,W,X} |Y - DX|_F^2 + alpha |H - WX|_F^2 quad text{s.t.} quad |x_i|_0 le T $$
代码通过构造 $Y_{aug}$ 和 $D_{aug}$ 将上述两个范数项合并为一个标准的矩阵分解问题,从而可以直接复用 K-SVD 的更新策略。在更新过程中,代码显式处理了原子未被使用(unused atom)的情况,通过替换误差最大的样本来保持字典的表达能力。
正交匹配追踪 (omp)
实现了标准的 OMP 贪婪算法。
- 输入:字典 $D$,信号 $X$,稀疏度 $L$。
- 逻辑:在每一步迭代中,选择与当前残差相关性最大的原子,将其加入索引集,然后通过最小二乘法更新系数并计算新残差,直到达到稀疏度约束。
数据生成 (generate_synthetic_data)
为了保证代码的可移植性和复现性,本模块模拟了低维度流形数据。
- 逻辑:为每个类别随机生成一组“基向量”(模拟该类人脸的共性特征)。
- 训练和测试样本均由这些基向量线性组合并加上噪声生成,确保了训练集和测试集分布的一致性,同时保留了类别间的差异性。
使用方法
- 确保安装了 MATLAB 软件。
- 将包含
main 函数的文件保存为 main.m。 - 直接运行
main 函数。 - 程序将自动输出每一轮迭代的误差日志,并在结束后弹窗显示识别准确率和可视化结果。
系统要求
- MATLAB R2016b 或更高版本。
- 需要 Image Processing Toolbox(用于图像显示相关功能,非核心算法必须)。
- 无需额外安装第三方库,所有算法(SVD, OMP 等)均基于 MATLAB 原生函数或手动实现。