基于QT,C++和opencv 的人脸识别项目(四)

目录

    • 1.引言
    • 2.正文
        • 人脸识别原理
            • PCA
            • 特征脸算法Eigenface
    • 3.总结

1.引言

本篇文章是上一篇原理介绍文章的延续,是这个项目的第四篇文章
第一篇文章,主要介绍项目的任务和实验环境,点击阅读
第二篇文章,主要介绍opencv和相关模型,点击阅读。
第三篇文章,主要介绍人脸检测haar+adaboost的原理,点击阅读。
第五篇文章,主要给出相关的代码,点击阅读。

2.正文

人脸识别原理

PCA

在这里分享一篇解释PCA主成分分析的博文。PCA原理
其中中心的一句话就是:PCA能做的事情其实很有限,那就是 降维。用几张图就可以很好的表示:
基于QT,C++和opencv 的人脸识别项目(四)_第1张图片
在这副图里。我们可以看到,用x2轴来描述这些点是一个很好的选择。我们再看看下面的图:

基于QT,C++和opencv 的人脸识别项目(四)_第2张图片
对于斜着的呢,我们会发现x1和x2都挺重要的,那咋办?可以我们可以换一个坐标系来描述,如上图的y1和y2坐标轴,改玩坐标后,我们会发现又可以只用y1来描述这些点了是吧。这样我们在描述这些点的工作量和计算量就会小很多。这就是所谓的降维的原因。

对于我们的图片来说,每一个像素点都是一个维度,例如24*24大小的图片,那么这个图像就有576个维度,这无疑使计算量增大很多,这里降维就显得尤为重要。

对于数学计算公式,上面的链接里的文章解释的很清楚。

PCA的流程编程为基于QT,C++和opencv 的人脸识别项目(四)_第3张图片

特征脸算法Eigenface

特征脸把人脸从像素空间变换到另一个空间,在另一个空间中做相似性的计算。在该算法中选择空间变换方法PCA(主成分分析)。
利用PCA得到人脸分布的主要成分:对训练集中所有人脸图像的协方差矩阵进行特征值分解,得到对应的特征向量,这些特征向量就是是特征脸。
在PCA中我们得到如下结论:
想降维并且使分布距离尽可能的最大(便于点与点之间的区分),我们可以计算原空间的协方差矩阵的特征值和特征向量。
根据上面的PCA流程图,我么尝试计算出图像集的特征值和特征向量,在这里我们把特征向量叫做特征脸。

step1:
获取包含M张人脸图像的集合S。每张图像可以转换成一个N维的向量(例如一张照片的大小为2424,我们排成一行1576的向量),然后把这M个向量放到一个集合S里,如下式所示。
在这里插入图片描述

step2:
在获取到人脸向量集合S后,计算得到平均图像Ψ ,至于怎么计算平均图像,公式在下面。就是把集合S里面的向量遍历一遍进行累加,然后取平均值。得到的这个Ψ 其实还挺有意思的,Ψ 其实也是一个N维向量,如果再把它还原回图像的形式的话,可以得到如下的“平均脸”,是的没错,还他妈的挺帅啊。那如果你想看一下某计算机学院男生平均下来都长得什么样子,用上面的方法就可以了。
在这里插入图片描述
step3
计算每张图像和平均图像的差值Φ ,就是用S集合里的每个元素减去步骤二中的平均值。
在这里插入图片描述
step4
训练图像的数量小于图像的维数,那么起作用的特征向量只有M-1个而不是N^2个(因为其他的特征向量对应的特征值为0),所以求解特征向量我们只需要求解一个NxN的矩阵 ,我们可以设该矩阵为L,那么L的第m行n列的元素可以表示为:
在这里插入图片描述
一旦我们找到了L矩阵的M个特征向量vl,那么协方差矩阵的特征向量ul就可以表示为:
在这里插入图片描述
这些特征向量如果还原成像素排列很像人脸的,所以称之为特征脸(如下图)。图里有二十五个特征脸。有论文表明一般的应用40个特征脸已经足够了。论文Eigenface for recognition里只用了7个特征脸来表明实验。
基于QT,C++和opencv 的人脸识别项目(四)_第4张图片
step5
识别人脸。OK,终于到这步了,别绕晕啦,上面几步是为了对人脸进行降维找到表征人脸的合适向量的。首先考虑一张新的人脸,我们可以用特征脸对其进行标示:
在这里插入图片描述
其中k=1,2…M,对于第k个特征脸uk,上式可以计算其对应的权重,M个权重可以构成一个向量:
在这里插入图片描述
然后我们利用欧氏距离计算:
在这里插入图片描述
其中Ω代表要判别的人脸,Ωk代表训练集内的某个人脸,两者都是通过特征脸的权重来表示的。式子是对两者求欧式距离,当距离小于阈值时说明要判别的脸和训练集内的第k个脸是同一个人的。当遍历所有训练集都大于阈值时,根据距离值的大小又可分为是新的人脸或者不是人脸的两种情况。根据训练集的不同,阈值设定并不是固定的。

3.总结

本文主要讲解了PCA的原理,进而引入如何进行特征脸的计算和人脸的识别。在下一篇文章中,我会给出具体的代码。

你可能感兴趣的:(C++,qt,opencv)