图像识别概念入门之“基于主成份分析的人脸识别学习”

最近看到一篇介绍利用“主成份分析实现人脸识别”的matlab应用实例。

学习了一遍,对主成份分析和图像识别有了一个概念性的认识。

这个例子可能是最简单的人脸识别例子了,暂且不考虑实用性,单单起到认识和了解。

下面matlab程序进行学习注释,希望能帮助记忆。同时加强交流。

程序使用的人脸库来自Essex大学的人脸数据库的face94部分。选择了10个人,每人选择3张照片。1张放入测试集合。

2张放入训练集合。照片比较理想化,绿色背景的大头照片,表情略有不同,光照均匀。

程序的链接如下:

http://www.mathworks.com/matlabcentral/fileexchange/17032-pca-based-face-recognition-system/all_files

内部包含的文件如下

红色的文件是主程序,绿色的是测试集合,蓝色的是训练集合。

license.txt
PCA_based Face Recognition System/CreateDatabase.m
PCA_based Face Recognition System/EigenfaceCore.m
PCA_based Face Recognition System/example.m
PCA_based Face Recognition System/Readme.txt
PCA_based Face Recognition System/Recognition.m
PCA_based Face Recognition System/TestDatabase/1.jpg
PCA_based Face Recognition System/TestDatabase/10.jpg
PCA_based Face Recognition System/TestDatabase/2.jpg
PCA_based Face Recognition System/TestDatabase/3.jpg
PCA_based Face Recognition System/TestDatabase/4.jpg
PCA_based Face Recognition System/TestDatabase/5.jpg
PCA_based Face Recognition System/TestDatabase/6.jpg
PCA_based Face Recognition System/TestDatabase/7.jpg
PCA_based Face Recognition System/TestDatabase/8.jpg
PCA_based Face Recognition System/TestDatabase/9.jpg
PCA_based Face Recognition System/TrainDatabase/1.jpg
PCA_based Face Recognition System/TrainDatabase/10.jpg
PCA_based Face Recognition System/TrainDatabase/11.jpg
PCA_based Face Recognition System/TrainDatabase/12.jpg
PCA_based Face Recognition System/TrainDatabase/13.jpg
PCA_based Face Recognition System/TrainDatabase/14.jpg
PCA_based Face Recognition System/TrainDatabase/15.jpg
PCA_based Face Recognition System/TrainDatabase/16.jpg
PCA_based Face Recognition System/TrainDatabase/17.jpg
PCA_based Face Recognition System/TrainDatabase/18.jpg
PCA_based Face Recognition System/TrainDatabase/19.jpg
PCA_based Face Recognition System/TrainDatabase/2.jpg
PCA_based Face Recognition System/TrainDatabase/20.jpg
PCA_based Face Recognition System/TrainDatabase/3.jpg
PCA_based Face Recognition System/TrainDatabase/4.jpg
PCA_based Face Recognition System/TrainDatabase/5.jpg
PCA_based Face Recognition System/TrainDatabase/6.jpg
PCA_based Face Recognition System/TrainDatabase/7.jpg
PCA_based Face Recognition System/TrainDatabase/8.jpg
PCA_based Face Recognition System/TrainDatabase/9.jpg

训练集合照片

10个人的训练集合照片差别是比较大的,表情、头部的位置都不相同。

测试集合照片 的差别也是比较大的,与训练集合相似度也不大,远远达不到利用像素对比实现图像识别的能力。

主程序包含下面几个文件

PCA_based Face Recognition System/example.m

用于设定训练集合目录、测试集合目录,链接其余函数。

PCA_based Face Recognition System/CreateDatabas.m

用于将训练集合照片转为灰度照片,然后将照片转换为列向量,最后将所有的训练集合照片形成矩阵

PCA_based Face Recognition System/EigenfaceCore.m

用于对训练集合矩阵标准化,然后求标准化矩阵的相关矩阵的特征根和特征向量。

根据特征值的贡献率,选择大于1的特征根作为主成份分量。 组合主成份分量对应的特征向量为特征向量矩阵。

标准化后的训练集合矩阵与特征向量矩阵相乘得到特征脸核函数。

PCA_based Face Recognition System/Recognition.m

将原始的训练集合彩色照片与特征脸核函数相乘,映射训练集合照片到特征脸空间中。

将测试照片与特征脸核函数相乘,映射测试照片到特征脸空间中。

在特征脸空间求测试照片与每一个训练集合照片的方差,方差最小的训练集合照片编号,就是测试照片鉴别结果。

下面对代码进行注释

example.m

% A sample script, which shows the usage of functions, included in
% PCA-based face recognition system (Eigenface method)
%
% See also: CREATEDATABASE, EIGENFACECORE, RECOGNITION

% Original version by Amir Hossein Omidvarnia, October 2007
% Email: [email protected]

// 清理运行环境

clear all
clc
close all

// 定义训练集合、测试集合的位置以及测试照片的编号

% You can customize and fix initial directory paths

TrainDatabasePath = uigetdir(‘D:\Program Files\MATLAB\R2006a\work‘, ‘Select training database path‘ );
TestDatabasePath = uigetdir(‘D:\Program Files\MATLAB\R2006a\work‘, ‘Select test database path‘);

prompt = {‘Enter test image name (a number between 1 to 10):‘};

dlg_title = ‘Input of PCA-Based Face Recognition System‘;
num_lines= 1;
def = {‘1‘};

TestImage = inputdlg(prompt,dlg_title,num_lines,def);
TestImage = strcat(TestDatabasePath,‘\‘,char(TestImage),‘.jpg‘);

// 读入测试照片
im = imread(TestImage);

// 将训练集合照片转换为灰度的训练集合矩阵.

T = CreateDatabase(TrainDatabasePath);

// 将灰度的训练集合矩阵转换为特征脸核函数
[m, A, Eigenfaces] = EigenfaceCore(T);

//将测试照片 训练集合 利用特征脸核函数进行鉴别
OutputName = Recognition(TestImage, m, A, Eigenfaces);

//根据鉴别结果从训练集合中选择原始照片

SelectedImage = strcat(TrainDatabasePath,‘\‘,OutputName);
SelectedImage = imread(SelectedImage);

//输出鉴别结果
figure
imshow(im)
title(‘Test Image‘);
figure,imshow(SelectedImage);
title(‘Equivalent Image‘);

str = strcat(‘Matched image is : ‘,OutputName);
disp(str)

CreateDatabas.m

// 定义函数,输入变量为训练集合路径

function T = CreateDatabase(TrainDatabasePath)
% Align a set of face images (the training set T1, T2, ... , TM )
%
% Description: This function reshapes all 2D images of the training database
% into 1D column vectors. Then, it puts these 1D column vectors in a row to
% construct 2D matrix ‘T‘.
%
%
% Argument: TrainDatabasePath - Path of the training database
%
% Returns: 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 MN and ‘T‘ will be a MNxP 2D matrix.
%
% See also: STRCMP, STRCAT, RESHAPE

% Original version by Amir Hossein Omidvarnia, October 2007
% Email: [email protected]

%%%%%%%%%%%%%%%%%%%%%%%% File management

//得到训练集合的文件
TrainFiles = dir(TrainDatabasePath);
Train_Number = 0;

for i = 1:size(TrainFiles,1)
if not(strcmp(TrainFiles(i).name,‘.‘)|strcmp(TrainFiles(i).name,‘..‘)|strcmp(TrainFiles(i).name,‘Thumbs.db‘))
Train_Number = Train_Number + 1; % Number of all images in the training database
end
end

%%%%%%%%%%%%%%%%%%%%%%%% Construction of 2D matrix from 1D image vectors

// 将训练集合照片拼接为矩阵
T = [];
for i = 1 : Train_Number

% I have chosen the name of each image in databases as a corresponding
% number. However, it is not mandatory!

// 拼接训练集合照片 路径和文件名
str = int2str(i);
str = strcat(‘\‘,str,‘.jpg‘);
% strg = strcat(‘\‘,str,‘_g.jpg‘);
str = strcat(TrainDatabasePath,str);
% strg = strcat(TrainDatabasePath,strg);

//读取训练照片,并转为灰度照片
img = imread(str);
img = rgb2gray(img);
% imwrite(img,strg);
[irow icol] = size(img);

// 将照片转为列向量,按照先行再列的顺序转换为irow*icol行的列向量
temp = reshape(img‘,irow*icol,1); % Reshaping 2D images into 1D image vectors

//拼接列向量为矩阵
T = [T temp]; % ‘T‘ grows after each turn
end

EigenfaceCore.m

// 定义函数,输入为的训练集合照片灰度矩阵

输出m为训练集合照片灰度矩阵的行均值的列向量

输出A为训练集合照片灰度矩阵的偏差矩阵

输出Eigenfaces 为训练集合得到的特征脸核函数

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: [email protected]

%%%%%%%%%%%%%%%%%%%%%%%% 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
% normal1 = reshape(temp,180,200);
% imwrite(normal1‘,[num2str(i),‘_normal.jpg‘]);
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.

// 求出偏差矩阵的相关矩阵,以及相关矩阵的特征值D和特征向量V

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‘.
% diag(D)
% V
%%%%%%%%%%%%%%%%%%%%%%%% 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).

// 选择大于1的特征值作为主成份。提取对应的特征向量,拼接为特征向量矩阵。

L_eig_vec = [];
for i = 1 : size(V,2)
if( D(i,i)>1 )
L_eig_vec = [L_eig_vec V(:,i)];
end
end
% L_eig_vec

%%%%%%%%%%%%%%%%%%%%%%%% 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
% for i = 1 : 19
% temp = Eigenfaces(:,i); % Computing the difference image for each image in the training set Ai = Ti - m
% normal1 = reshape(temp,180,200);
% imwrite(normal1‘,[num2str(i),‘_Eigenfaces.jpg‘]);
% end

时间: 2024-10-19 04:25:22

图像识别概念入门之“基于主成份分析的人脸识别学习”的相关文章

stata学习笔记(四):主成份分析与因子分析

1.判断是否适合做主成份分析,变量标准化 Kaiser-Meyer-Olkin抽样充分性测度也是用于测量变量之间相关关系的强弱的重要指标,是通过比较两个变量的相关系数与偏相关系数得到的. KMO介于0于1之间.KMO越高,表明变量的共性越强.如果偏相关系数相对于相关系数比较高,则KMO比较低,主成分分析不能起到很好的数据约化效果. 根据Kaiser(1974),一般的判断标准如下: 0.00-0.49,不能接受(unacceptable); 0.50-0.59,非常差(miserable): 0

主成份分析(Principal Components Analysis)

因子分析是基于概率模型的基础上,利用EM算法的迭代,对参数进行估计.主成份分析(Principal Components Analysis, PCA)仅仅通过的线性变幻,用少数几个主分量来近似的表示所有的变量,以达到降低维度的目的. 一.  规范化(normalize) 规范化的目的是将不同尺度的数据化为同一尺度.规范化的步骤如下: (1)令 : (2)将所有替换为: (3)令: (4)将所有替换为. 其中,步骤(1)和步骤(2)将数据的均值转换为零:步骤(3)和步骤(4)使得数据都为单位方差,

PCA主成份分析

1   背景介绍 真实的训练数据总是存在各种各样的问题: 1. 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余. 2. 拿到一个数学系的本科生期末考试成绩单,里面有三列,一列是对数学的兴趣程度,一列是复习时间,还有一列是考试成绩.我们知道要学好数学,需要有浓厚的兴趣,所以第二项与第一项强相关,第三项和第二项也是强相关.那是不是可以合并第一项和第二项呢? 3. 拿到一个样本,特征非常多,而样例特别少,这样用回归去直接

因子分析——主成份算法实现

主因子分析,在炼数成金课程中提到: ?降维的一种方法,是主成分分析的推广和发展?是用于分析隐藏在表面现象背后的因子作用的统计模型.试图用最少个数的不可测的公共因子的线性函数与特殊因子之和来描述原来观测的每一分量?例子:各科学习成绩(数学能力,语言能力,运劢能力等)?例子:生活满意度(工作满意度,家庭满意度)?例子:薛毅书P522 总结就是:把多个变量,根据主观(业务经验),或客观(具体分类算法),归为几个类别,从而使变量减少,便于分析.比如, 这里,m的值表示最后只需要2个因子,就是说最后这八项

PCA--主成份分析

主成份分析(Principle Component Analysis)主要用来对数据进行降维.对于高维数据,处理起来比较麻烦,而且高维数据可能含有相关的维度,数据存在冗余,PCA通过把高维数据向低维映射的同时尽可能保留数据蕴含的信息,到达简化数据的目的. 假设原始数据表示为$\{{{x}_{1}},{{x}_{2}},\cdots ,{{x}_{n}}\}$共$n$个数据,${{x}_{i}}$是$d$维的,现在首先分析PCA如何将它映射到一维,再推广到多维. 为了将数据向一维映射,需要解决两个

Serverless 基本概念入门

从行业趋势看,Serverless 是云计算必经的一场革命 2019 年,Serverless 被 Gartner 称为最有潜力的云计算技术发展方向,并被赋予是必然性的发展趋势.Serverless 从底层开始变革计算资源的形态,为软件架构设计与应用服务部署带来了新的设计思路. 为此,我们策划了?Serverless 技术专栏,从基础概念入门,到前后台架构设计.应用拓展.最佳实践等多维度,揭开 Serverless 的面纱,带你走进无服务器的世界. 什么是 Serverless? Serverl

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

主分量分析PCA

主分量分析PCA 摘要:本次实验分为两部分,第一部分:利用PCA,通过自定义函数PCA_two(MU,SIGMA,N)进行特征空间的规整化.第二部分:利用PCA,通过自定义函数PCA_three(MU,SIGMA,N)进行特征空间降维.PCA方法是一种处理数据过多维数的方法,它的目的是寻找在最小均方意义下最能代表原始数据的投影方法.经过本次实验,了解了PCA主分量分析的基本概念,学习和掌握了PCA主分量分析的方法. 一. 实验原理 1.统计分析方法中的降维思想 在模式识别的研究过程中,往往需要对

模式识别:PCA主分量分析与Fisher线性判别分析

本实验的目的是学习和掌握PCA主分量分析方法和Fisher线性判别方法.首先了解PCA主分量分析方法的基本概念,理解利用PCA 分析可以对数据集合在特征空间进行平移和旋转.实验的第二部分是学习和掌握Fisher线性判别方法.了解Fisher线性判别方法找的最优方向与非最优方向的差异,将高维分布的数据进行降维,并通过Fisher线性判别方法实现高维数据在一维中分类. 一.技术论述 1.统计分析方法中的降维思想 在模式识别的研究过程中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行