opencv特征脸方法(Eigenface)

eigenvalue :特征值

特征值算法基本是将人脸识别算法推向真正可用的第一种方法,

其主要工作步骤如下:

1)将训练集的每一个人脸图像都拉长一列,将他们组合在一起形成一个大矩阵A。假设每个人脸图像是MxM大小,那么拉成一列后每个人脸样本的维度就是d=MxM大小了。假设有N个人脸图像,那么样本矩阵A的维度就是dxN了。

2)将所有的N个人脸在对应维度上加起来,然后求个平均,就得到了一个“平均脸”。你把这个脸显示出来的话,还挺帅的哦。

3)将N个图像都减去那个平均脸图像,得到差值图像的数据矩阵Φ。

4)计算协方差矩阵C=ΦΦT。再对其进行特征值分解。就可以得到想要的特征向量(特征脸)了。

5)将训练集图像和测试集的图像都投影到这些特征向量上了,再对测试集的每个图像找到训练集中的最近邻或者k近邻啥的,进行分类即可。

详细步骤:

步骤一:获取包含M张人脸图像的集合S。在我们的例子里有25张人脸图像,。每张图像可以转换成一个N维的向量(是的,没错,一个像素一个像素的排成一行就好了,至于是横着还是竖着获取原图像的像素,随你自己,只要前后统一就可以),然后把这M个向量放到一个集合S里,如下式所示。

img

img

步骤二:在获取到人脸向量集合S后,计算得到平均图像Ψ,也就是 每张图片的相同位置加起来再去求个平均值

img

基本上得到了这样一个人。。。。。 这就是传说中的大众脸?

img

步骤三:计算每张图像和平均图像的差值Φ ,就是用S集合里的每个元素减去步骤二中的平均值。

img

也就是说开始的那20个人, 每人都减去这个大众脸。

步骤四 : 先看看这个 “” ,

如果训练图像的数量小于图像的维数比如(M<N2),那么起作用的特征向量只有M-1个而不是N2个(因为其他的特征向量对应的特征值为0),所以求解特征向量我们只需要求解一个NxN的矩阵。我们可以设该矩阵为L,那么L的第m行n列的元素可以表示为:

img

一旦我们找到了L矩阵的M个特征向量vl,那么协方差矩阵的特征向量ul就可以表示为:

img

这些特征向量如果还原成像素排列的话,其实还蛮像人脸的,所以称之为特征脸(如下图)。图里有二十五个特征脸,数量上和训练图像相等只是巧合。有论文表明一般的应用40个特征脸已经足够了。论文Eigenface for recognition里只用了7个特征脸来表明实验。

协方差矩阵的每一个特征向量代表一个特征脸, 把特征向量还原为 图片可知:

img

步骤五

识别人脸。OK,终于到这步了,别绕晕啦,上面几步是为了对人脸进行降维找到表征人脸的合适向量的。首先考虑一张新的人脸,我们可以用特征脸对其进行标示:

img

其中k=1,2…M,对于第k个特征脸uk,上式可以计算其对应的权重,M个权重可以构成一个向量:

img

perfect,这就是求得的特征脸对人脸的表示了!

那如何对人脸进行识别呢,看下式:

img

其中Ω代表要判别的人脸,Ωk代表训练集内的某个人脸,两者都是通过特征脸的权重来表示的。式子是对两者求欧式距离,当距离小于阈值时说明要判别的脸和训练集内的第k个脸是同一个人的。当遍历所有训练集都大于阈值时,根据距离值的大小又可分为是新的人脸或者不是人脸的两种情况。根据训练集的不同,阈值设定并不是固定的。

回到自己的项目来说, 我们有41个人脸文件夹, 训练的时候(train文件之中 pop出去的不是待检测图像请注意), 因此会得到41个特征向量, 对应41个特征脸,当真正进行人脸检测的时候,通过捕捉视频中的人脸 来和特征脸进行比对,从而得到一个标签值(也就是和哪个特征脸最相似)我们根据这个标签纸是不是41(我们待检测的人脸)来判断是不是目标。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值