PCA人脸识别

PCA方法由于其在降维和特征提取方面的有效性,在人脸识别领域得到了广泛的应用。

其基本原理是:利用K-L变换抽取人脸的主要成分,构成特征脸空间,识别时将测试图像投影到此空间,得到一组投影系数,通过与各个人脸图像比较进行识别。

进行人脸识别的过程,主要由训练阶段和识别阶段组成:

训练阶段

第一步:写出训练样本矩阵,其中向量xi为由第i个图像的每一列向量堆叠成一列的MN维列向量,即把矩阵向量化。假设训练集有200个样本,,由灰度图组成,每个样本大小为M*N。

第二步:计算平均脸

Ψ=1200∑i=1i=200xi

第三步:计算差值脸,计算每一张人脸与平均脸的差值

di=xi?Ψ,i=1,2,...,200

第四步:构建协方差矩阵

C=1200∑i=1200didiT=1200AAT

第五步:求协方差矩阵的特征值和特征向量,构造特征脸空间

求出 ATA 的特征值 λi及其正交归一化特征向量νi,根据特征值的贡献率选取前p个最大特征值及其对应的特征向量,贡献率是指选取的特征值的和与占所有特征值的和比,即:

?=∑i=1i=pλi∑i=1i=200λi≥a

若选取前p个最大的特征值,则“特征脸”空间为:

w=(u1,u2,...up)

第六步:将每一幅人脸与平均脸的差值脸矢量投影到“特征脸”空间,即

Ωi=wTdi(i=1,2,...,200)

识别阶段

第一步:将待识别的人脸图像Γ与平均脸的差值脸投影到特征脸空间,得到其特征向量表示:

ΩΓ=wT(Γ?Ψ)

第二布:采用欧式距离来计算ΩΓ与每个人脸的距离εi

εi2=∥∥Ωi?ΩΓ∥∥2(i=1,2,...,200)

求最小值对应的训练集合中的标签号作为识别结果

需要说明的是协方差矩阵AAT的维数为MN*MN,其维数是比较较大的,而我们在这里的训练样本个数为200,ATA的维数为200*200小了许多,实际情况中,采用奇异值分解(SingularValue Decomposition ,SVD)定理,通过求解ATA的特征值和特征向量来组成特征脸空间的。必须明白的是特征脸空间是由ATA的子空间构成,我们的识别任务也是将原始ATA所构成的空间投影到我们选取前p个最大的特征值对应的特征向量组成的子空间里,进行比较,选取最近的训练样本为标号。

代码

训练过程代码如下:

function [m, A, Eigenfaces] = EigenfaceCore(T)
% Use Principle Component Analysis (PCA) to determine the most
% discriminating features between images of faces.
%
% Description: This function gets a 2D matrix, containing all training image vectors
% and returns 3 outputs which are extracted from training database.
%
% Argument:      T                      - A 2D matrix, containing all 1D image vectors.
%                                         Suppose all P images in the training database
%                                         have the same size of MxN. So the length of 1D
%                                         column vectors is M*N and ‘T‘ will be a MNxP 2D matrix.
%
% Returns:       m                      - (M*Nx1) Mean of the training database
%                Eigenfaces             - (M*Nx(P-1)) Eigen vectors of the covariance matrix of the training database
%                A                      - (M*NxP) Matrix of centered image vectors
%
% See also: EIG

% Original version by Amir Hossein Omidvarnia, October 2007
%                     Email: aomidvar@ece.ut.ac.ir                  

%%%%%%%%%%%%%%%%%%%%%%%% Calculating the mean image
m = mean(T,2); % Computing the average face image m = (1/P)*sum(Tj‘s)    (j = 1 : P)
Train_Number = size(T,2);

%%%%%%%%%%%%%%%%%%%%%%%% Calculating the deviation of each image from mean image
A = [];
for i = 1 : Train_Number
    temp = double(T(:,i)) - m; % Computing the difference image for each image in the training set Ai = Ti - m
    A = [A temp]; % Merging all centered images
end

%%%%%%%%%%%%%%%%%%%%%%%% Snapshot method of Eigenface methos
% We know from linear algebra theory that for a PxQ matrix, the maximum
% number of non-zero eigenvalues that the matrix can have is min(P-1,Q-1).
% Since the number of training images (P) is usually less than the number
% of pixels (M*N), the most non-zero eigenvalues that can be found are equal
% to P-1. So we can calculate eigenvalues of A‘*A (a PxP matrix) instead of
% A*A‘ (a M*NxM*N matrix). It is clear that the dimensions of A*A‘ is much
% larger that A‘*A. So the dimensionality will decrease.

L = A‘*A; % L is the surrogate of covariance matrix C=A*A‘.
[V D] = eig(L); % Diagonal elements of D are the eigenvalues for both L=A‘*A and C=A*A‘.

%%%%%%%%%%%%%%%%%%%%%%%% Sorting and eliminating eigenvalues
% All eigenvalues of matrix L are sorted and those who are less than a
% specified threshold, are eliminated. So the number of non-zero
% eigenvectors may be less than (P-1).

L_eig_vec = [];
for i = 1 : size(V,2)
    if( D(i,i)>4e+07)
        L_eig_vec = [L_eig_vec V(:,i)];
    end
end

%%%%%%%%%%%%%%%%%%%%%%%% Calculating the eigenvectors of covariance matrix ‘C‘
% Eigenvectors of covariance matrix C (or so-called "Eigenfaces")
% can be recovered from L‘s eiegnvectors.
Eigenfaces = A * L_eig_vec; % A: centered image vectors

识别过程代码如下:

function OutputName = Recognition(TestImage, m, A, Eigenfaces)
% Recognizing step....
%
% Description: This function compares two faces by projecting the images into facespace and
% measuring the Euclidean distance between them.
%
% Argument:      TestImage              - Path of the input test image
%
%                m                      - (M*Nx1) Mean of the training
%                                         database, which is output of ‘EigenfaceCore‘ function.
%
%                Eigenfaces             - (M*Nx(P-1)) Eigen vectors of the
%                                         covariance matrix of the training
%                                         database, which is output of ‘EigenfaceCore‘ function.
%
%                A                      - (M*NxP) Matrix of centered image
%                                         vectors, which is output of ‘EigenfaceCore‘ function.
%
% Returns:       OutputName             - Name of the recognized image in the training database.
%
% See also: RESHAPE, STRCAT

% Original version by Amir Hossein Omidvarnia, October 2007
%                     Email: aomidvar@ece.ut.ac.ir                  

%%%%%%%%%%%%%%%%%%%%%%%% Projecting centered image vectors into facespace
% All centered images are projected into facespace by multiplying in
% Eigenface basis‘s. Projected vector of each face will be its corresponding
% feature vector.

ProjectedImages = [];
Train_Number = size(Eigenfaces,2);
for i = 1 : Train_Number
    temp = Eigenfaces‘*A(:,i); % Projection of centered images into facespace
    ProjectedImages = [ProjectedImages temp];
end

%%%%%%%%%%%%%%%%%%%%%%%% Extracting the PCA features from test image
InputImage = imread(TestImage);
temp = InputImage(:,:,1);

[irow icol] = size(temp);
InImage = reshape(temp‘,irow*icol,1);
Difference = double(InImage)-m; % Centered test image
ProjectedTestImage = Eigenfaces‘*Difference; % Test image feature vector

%%%%%%%%%%%%%%%%%%%%%%%% Calculating Euclidean distances
% Euclidean distances between the projected test image and the projection
% of all centered training images are calculated. Test image is
% supposed to have minimum distance with its corresponding image in the
% training database.

Euc_dist = [];
for i = 1 : Train_Number
    q = ProjectedImages(:,i);
    temp = ( norm( ProjectedTestImage - q ) )^2;
    Euc_dist = [Euc_dist temp];
end

[Euc_dist_min , Recognized_index] = min(Euc_dist);
OutputName = strcat(int2str(Recognized_index),‘.jpg‘);

其中训练样本的最后一行代码:

Eigenfaces = A * L_eig_vec; % A: centered image vectors

和识别过程的

 temp = Eigenfaces‘*A(:,i); % Projection of centered images into facespace

写成公式也就是如下

T=(AV)TA=VT(ATA)

这里VT是新坐标系下的基,投影的结果也就是新坐标系下的系数。基于PCA的人脸识别也就是我们在新的坐标系下比较两个向量的距离。稍后上传完整代码。

Licenses

作者 日期 联系方式
风吹夏天 2015年8月10日 [email protected]

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 16:45:52

PCA人脸识别的相关文章

Sklearn -PCA 人脸识别 百度网盘sklearn学习API

PCA脸部识别现在让我们用PCA来解决一个脸部识别问题.脸部识别是一个监督分类任务,用于从照片中认出某个人.本例中,我们用剑桥大学AT&T实验室的Our Database of Faces数据集(http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html),这个数据集包含40个人每个人10张照片.这些照片是在不同的光照条件下拍摄的,每张照片的表情也不同.照片都是黑白的,尺寸为92 x 112像素.虽然这些图片都不大,但是每张

人脸识别相关分享

人脸识别源代码 ※人脸检测(文章+程序)---技术文档及代码非常全『 人脸检测(文章+程序).rar (1.27 MB) 人脸检测(文章+程序).rar (1.27 MB) 下载次数: 12502 2010-12-21 12:26 』 ※完整的Matlab下人脸检测及识别系统源代码『 Face-Recognition-Detection.rar (393.19 KB) Face-Recognition-Detection.rar (393.19 KB) 下载次数: 11604 2010-12-2

python下PCA算法与人脸识别

关于这部分主要是想在python下试验一下主成分分析(PCA)算法以及简单的人脸识别.曾经详述过matlab下的PCA以及SVM算法进行人脸识别技术,参考如下: 主成分分析法-简单人脸识别(一) 主成分分析-简单人脸识别(二) PCA实验人脸库-人脸识别(四) PCA+支持向量机-人脸识别(五) 主成分分析(PCA)算法主要是对高维数据进行降维,最大限度的找到数据间的相互关系,在机器学习.数据挖掘上很有用.在机器学习领域算法众多,贴一个: 大神博客索引 关于PCA的核心思想与原理介绍上述已经给出

人脸识别图像处理——PCA

本科论文做的是人脸识别,对一些算法进行复习... 概念 PCA (主成分分析算法)主要用于减少数据集的维数,同时保持数据集中方差最大的贡献.(我的理解是,图像处理时,数据量太大,通常需要降低数据维数,但是又希望保留贡献大的特征数据,PCA就是保留主要成分的降维算法).人脸识别中,利用PCA算法构建特征脸. 算法实现流程 PCA降维过程: 1.每个样本(一张人脸图像 92*112=10304)作为一个行向量,所有样本(200张人脸图像)共同构建成一个矩阵(200x10304) 2.求矩阵的协方差矩

OpenCV+Qt:基于PCA主成分分析的人脸识别例程

在模式识别领域中,PCA是一种常用的数据集降维手段,在此基础上,保留数据集中对方差贡献最大的特征从而进行模式分类.OpenCV中提供PCA的类,因此可以方便地使用PCA来进行人脸识别研究.在学习了网上的相关实现和代码,在以下开发平台跑通了代码:win8.1+OpenCV2.4.9+Qt5.3.2. 一.基本步骤 关于PCA的一些理论,可参照:http://blog.csdn.net/liyuefeilong/article/details/45126255 以下是实现PCA的基本思路: 1.把原

Python scikit-learn 学习笔记—PCA+SVM人脸识别

人脸识别是一项实用的技术.但是这种技术总是感觉非常神秘,在sklearn中看到了人脸识别的example,代码网址如下: http://scikit-learn.org/0.13/auto_examples/applications/face_recognition.html#example-applications-face-recognition-py 首先介绍一些PCA和SVM的功能,PCA叫做主元分析,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题.计算主成分的目的

基于svm和pca的人脸识别案例分析

数据集介绍 LFW (Labeled Faces in the Wild) 人脸数据库是由美国马萨诸塞州立大学阿默斯特分校计算机视觉实验室整理完成的数据库,主要用来研究非受限情况下的人脸识别问题.LFW 数据库主要是从互联网上搜集图像,而不是实验室,一共含有13000 多张人脸图像,每张图像都被标识出对应的人的名字,其中有1680 人对应不只一张图像,即大约1680个人包含两个以上的人脸.LFW数据集主要测试人脸识别的准确率. 代码实现 from time import time #记录时间 i

多维活体检测,让人脸识别更安全

今年的315晚会提到人脸识别领域的安全风险,主持人用现场合成的视频通过了活体检测和人脸验证,因此人脸识别的安全性引起大众关注.对于活体检测的安全隐患,腾讯优图团队一直保持高度关注,并依托多年积累的技术能力和业务运营经验,已经对人脸识别技术手段进行过多次安全升级,让人脸识别更安全. 一.目前人脸识别常见攻击手段有什么? 1 .纸片翻拍,通过打印用户的照片进行攻击: 2. 屏幕翻拍,一些3D建模技术可以驱动用户的单张照片或视频做出系统要求的摇头.张嘴.眨眼等动作: 3. 用户戴面具: 二.如何应对人

【从零学习openCV】IOS7人脸识别实战

前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型.可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了. 原理: 从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进