一点说明
1. 完成情况
详细阐述了人脸识别中的经典算法与深度学习算法
手动实现了三种人脸识别经典算法 【代码地址】
基于主成分分析(PCA)的Eigenfaces特征脸方法
基于线性判别分析(LDA)的Fisherfaces特征脸方法
局部二进制模式(LBP)直方图方法
实验对比分析了三种人脸识别经典算法 和 CNN 实现人脸识别的特点以及异同点
2. 项目结构
data/(存放项目用到的数据集,如有更改,记得修改代码中的引用地址)
src/(存放源代码,直接运行 src/ 中的 Classical_Methods.py 即可)
README.md (实验报告)
思路分析
0. 人脸识别 综述
人脸识别(Face Recognition)是指 能够识别或验证图像或视频中的主体的身份 的技术。自上个世纪七十年代首个人脸识别算法被提出以来,人脸识别已经成为了计算机视觉与生物识别领域被研究最多的主题之一。究其火爆的原因,一方面是它的挑战性——在无约束条件的环境中的人脸信息,也就是所谓自然人脸(Faces in-the-wild),具有高度的可变性,如下图所示;另一方面是由于相比于指纹或虹膜识别等传统上被认为更加稳健的生物识别方法,人脸识别本质上是非侵入性的,这意味着它是最自然、最符合人类直觉的一种生物识别方法。
现代人脸识别技术的研究热潮,已经从使用人工设计的特征(如边和纹理描述量等)与机器学习技术(如主成分分析、线性判别分析和支持向量机等)组合的传统方法的研究,逐渐转移到使用庞大人脸数据集搭建与在其基础上训练深度神经网络的研究。但是,无论是基于传统方法还是深度神经网络,人脸识别的流程都是相似的,大概由以下四个模块组成:
人脸检测 :提取图像中的人脸,划定边界;
人脸对齐 :使用一组位于图像中固定位置的参考点来缩放和裁剪人脸图像;
人脸表征 :人脸图像的像素值会被转换成紧凑且可判别的特征向量,或称模板;
人脸匹配 :选取并计算两个模板间的相似度分数来度量两者属于同一个主体的可能性。
1. 传统算法——主成分分析(PCA)与 线性判别分析(LDA)
准确地说,是 基于主成分分析的Eigenfaces特征脸方法 与 基于线性判别分析的Fisherfaces特征脸方法,这是根据整体特征进行人脸辨别的两种方法。
1)算法框架
使用 PCA 或 LDA 进行人脸识别的算法流程十分相似,具体步骤如下。
读取人脸图片数据库的图像及标签,并进行灰度化处理(可以同时进行直方图均衡等)
将读入的二维图像数据信息转为一维向量,然后按列组合成原始数据矩阵
对原始矩阵进行归一化处理,并使用PCA或LDA算法对原始数据矩阵进行特征分析与降维(计算过程中,根据原始数据得到一维均值向量经过维度的还原以后得到的图像为“平均脸”)
读取待识别的图像,将其转化为与训练集中的同样的向量表示,遍历训练集,寻找与待识别图像的差值小于阈值(或差值最小)的图像,即为识别结果
2)PCA 原理
参考链接:《PCA的数学原理》 (强烈推荐,讲得非常透彻!)
PCA(Principal Component Analysis,主成分分析)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
I. 为什么要降维?
数据分析时,原始数据的维度与算法的复杂度有着密切的关系,在保留原始数据特征的情况下,对数据进行降维可以有效地提高时间效率,减少算力损失。
II. PCA降维的原理是什么?
降维意味着信息的丢失,但是由于实际数据内部往往具有相关性,所以我们可以利用这种相关性,通过某些方法使得在数据维度减少的同时保留尽可能多的原始特征,这就是PCA算法的初衷。
那么这一想法如何转化为算法呢?我们知道,在N维空间对应了由N个线性无关的基向量构成的一组基,空间中的任一向量都可用这组基来表示。我们要将一组N维向量降为K维(K大于0,小于N),其实只需要通过矩阵乘法将原N维空间中的向量转化为由K个线性无关的基向量构成的一组基下的表示。
但是,这一组K维的基并不是随便指定的。为了尽可能保留原始特征,我们希望将原始数据向量投影到低维空间时,投影后各字段(行向量)不重合(显然重合会覆盖特征),也就是使变换后数据点尽可能分散,这就自然地联系到了线性代数中的方差与协方差。
所以,综合来看,我们降维的目标为 选择K个基向量(一般转化为单位长度的正交基),使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。这也就是PCA的原理——PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。
III. 如何使用PCA进行降维?
在上一个问题中,我们其实已经介绍了PCA的算法流程。转化成具体的数学方法,主要有以下几步(设有 \(m\) 条 \(n\) 维数据,将其降为 \(k\) 维):</