PCA+SVM人脸识别系统设计

Jul 08 2018 ComputerVision
  |  

PCA介绍

主成分分析(Principal Component Analysis, 简称PCA)是常用的一种降维方法.

算法步骤:

  1. 对所有样本进行中心化: $x_i \leftarrow x_i - \frac{1}{m} \sum_{i=1}^{m} x_i$;
  2. 计算样本的协方差矩阵: $XX^T$(有时用散布矩阵, 二者只相差一个倍数);
  3. 对协方差矩阵 $XX^T$ 做特征值分解;
  4. 取最大的 $d’$ 个特征值所对应的特征向量 $w_1, w_2, …, w_{d’}$.

本例中使用PCA算法对人脸图片进行降维:人脸图片原始大小为 $112 \times 92$ , 被拉长为
$112 \times 92 = 10304 $ 维向量, 利用PCA将这样的数据降维, 供后续匹配.


SVM介绍

支持向量机(Support Vector Machines, 简称SVM)是一种二类分类模型.

划分超平面为:

其优化目标函数为: ( $\alpha_i$ 为拉格朗日乘子)

其中 $\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{\Vert x_i - x_j \Vert ^2}{\delta^2})$

本例中利用SVM训练 One-VS-One Multiclass SVM 模型, 对前面PCA降维得到的数据进行分类.


人脸识别步骤

  1. 将每张人脸图片($m, n$)读取并展开成($m\times n, 1$), 假设总有$l$张图片, 所有排列到一起, 一列为一张图片, 最终形成一个$(m \times n, l)$ 的矩阵作为原始数据;
  2. 数据中心化: 计算平均脸, 所有列都减去张平均脸;
  3. 计算矩阵的协方差矩阵/散布矩阵, 求出特征值及特征向量, 并将其从大到小排列取前K个特征; (到这步特征已将至K维)
  4. 计算中心化后的数据在K维特征的投影;
  5. 基于上一步的数据进行 One-VS-One Multiclass SVM模型训练;
  6. 读取用于测试的人脸图片, 同训练图片一样处理;
  7. 利用训练出的模型对测试图片进行分类;
  8. 计算准确率.

代码实现

详见 https://github.com/techping/pca-face-recognition .