PCA+SVM人脸识别
PCA介绍
主成分分析(Principal Component Analysis, 简称PCA)是常用的一种降维方法.
算法步骤:
- 输入: 样本集 D=\{x_1, x_2, ..., x_m\}, 低维空间维数 d'
- 过程:
- 对所有样本进行中心化: x_i \leftarrow x_i - \frac{1}{m} \sum_{i=1}^{m} x_i;
- 计算样本的协方差矩阵: XX^T(有时用散布矩阵, 二者只相差一个倍数);
- 对协方差矩阵 XX^T 做特征值分解;
- 取最大的 d' 个特征值所对应的特征向量 w_1, w_2, ..., w_{d'}.
- 输出: 投影矩阵 W = (w_1, w_2, ..., w_{d'}) .
本例中使用PCA算法对人脸图片进行降维:人脸图片原始大小为 112 \times 92 , 被拉长为 112 \times 92 = 10304 维向量, 利用PCA将这样的数据降维, 供后续匹配.
SVM介绍
支持向量机(Support Vector Machines, 简称SVM)是一种二类分类模型.
划分超平面为:
f(x) = w^T\phi(x) + b
其优化目标函数为: (\alpha_i 为拉格朗日乘子)
\underbrace{ min }_{\alpha} \frac{1}{2}\sum\limits_{i=1,j=1}^{m}\alpha_i\alpha_jy_iy_jK(x_i, x_j) - \sum\limits_{i=1}^{m}\alpha_i
s.t. \; \sum\limits_{i=1}^{m}\alpha_iy_i = 0
0 \leq \alpha_i \leq C
其中 \phi(x) 为将 x 映射到高维度的特征向量, K(x_i, x_j) = \phi(x_i)\cdot\phi(x_j) 为核函数(Kernel Function), 用于线性不可分的情况, 常见核函数有:
Name | Expression |
---|---|
线性核函数 | K(x_i, x_j) = x_i^T x_j |
高斯(RBF)核函数 | K(x_i, x_j) = exp(-\frac{||x_i - x_j||^2}{\delta^2}) |
... | ... |
本例中利用SVM训练 One-VS-One Multiclass SVM 模型, 对前面PCA降维得到的数据进行分类.
人脸识别步骤
- 将每张人脸图片(m, n)读取并展开成(m\times n, 1), 假设总有l张图片, 所有排列到一起, 一列为一张图片, 最终形成一个(m \times n, l) 的矩阵作为原始数据;
- 数据中心化: 计算平均脸, 所有列都减去张平均脸;
- 计算矩阵的协方差矩阵/散布矩阵, 求出特征值及特征向量, 并将其从大到小排列取前K个特征; (到这步特征已将至K维)
- 计算中心化后的数据在K维特征的投影;
- 基于上一步的数据进行 One-VS-One Multiclass SVM模型训练;
- 读取用于测试的人脸图片, 同训练图片一样处理;
- 利用训练出的模型对测试图片进行分类;
- 计算准确率.
代码实现
详见 https://github.com/techping/pca-face-recognition .
- 我的个人主页:http://www.techping.cn/
- 我的CSDN博客:http://blog.csdn.net/techping
- 我的简书:http://www.jianshu.com/users/b2a36e431d5e/
- 我的GitHub:https://github.com/techping