所以,实际操作中,只取L的前m个最大特征值对应的特征向量用于计算特征脸。
在本环节,本文通过直接构造,来计算出L的特征值,再挑选L特征值大于100的作为C的特征值,最后通过C的特征值计算出它的特征向量,从而形成特征脸。
3、人脸识别
人脸识别过程分为训练和测试两个阶段。
在训练阶段,主要是提取数据库人脸图像的特征,并形成特征库。
在测试阶段,主要是提取待识别图像的特征和计算提取的特征和特征库中特征之间的距离测度,并输出最小距离测度对应的人脸图像作为结果。
具体步骤如下:
1)训练阶段
将规范化的图像矩阵A中的每一列向量投影到特征子空间,形成特征库。
2)测试阶段
假设测试人脸图像为Y,在人脸识别前,先对其进行标准化,即。
把标准化后的人脸图像向特征子空间进行投影得到向量。
本文使用最近邻法分类器欧几里德距离[14,15]进行判决分类。
测试图像与每个人脸图像间的距离为(k=1,2,…,P),并将最小距离对应的训练图像作为测试图像的匹配图像。
可以看出,在人脸姿态、表情有略微变化的情况下依旧可以成功识别出正确的人脸。
人脸姿态发生变化下的人脸识别结果
人脸表情变化下的人脸识别结果
之后我们利用ORL人脸库和自建人脸库分别进行了测试。
在ORL人脸库的识别过程中,我们选取了20个人,每人4张照片作为训练样本。
并对这20个人每人另取了一张照片作为测试样本。
每个人测试后最终统计成功识别17个人,识别失败3人。
因为我们采用的是最近邻法分类器欧几里德距离进行判决分类,因此对于识别失败的人同样会显示与其距离最小的照片。
为了解决这个问题,我们决定在该判决分类的基础上加上阈值限制,当最小欧几里德距离高于某个值时,不再显示最近邻的照片,而是显示“无法识别”的提示。
成功识别如下:
当用训练集以外的人的图像进行测试时,欧几里德距离大于阈值,显示无法识别。
接下来我们对欧几里得距离的阈值进行了一定的选取测试。
如下图所示当阈值选取较大时(阈值取9*10^15),图像可以更好的识别出来,
但是此时不可避免的就是降低人脸识别的准确率,因此个别测试图像因为不标准而与训练库中某些图像的距离更小,就造成了识别错误。
如下图所示,此时由于两幅图像的欧几里得距离更小,因而系统显示识别正确,其实是错误的。
以测试图像3.jpg为例。
而当阈值设定比较小时(阈值取4.5*10^15),可以看到上面的测试图像3.jpg无法再识别成功,因为没有足够近距离的训练样本。
尽管17.jpg训练样本与3.jpg测试图像欧几里得距离最小,但因不在阈值范围内故表明不是匹配的图像。
同样当阈值减小后,之前成功识别的11.jpg图像无法再成功识别出来。
六、结果分析
在选定欧几里得最近距离判定距离时要考虑不能选取过大,降低成功率。
因此我认为在建立人脸库时,尽量使所有的图像在相同的背景下进行采样,这样可以时每个人的测试图像和训练图像间的欧几里得距离均处在较小的范围内,可以提高准确率。
此外,我们尝试用稍微侧斜和表情夸张的样本照片进行人脸识别。
当侧脸和表情夸张照片作为测试样本时,程序依旧可以成功识别出对应的人脸照片,然而当这些侧脸和表情夸张的照片作为训练样本中的图像时,可能会影响其他测试图像的识别成功率,因为我们没有对侧脸进行研究,因此将问题放在后续工作中解决。
七、心得体会
本文研究的是基于PCA的人脸识别算法的实现。
在试验中采用的人脸数据库为Essexfaces94人脸数据库和自建的人脸数据库,人脸特征提取算法为PCA算法,分类方法采用的是最小距离分类法。
通过实验发现在无光照变换,正面姿态,少量遮挡情况下,基于PCA的人脸识别系统的识别率很高,而且反应很迅速。
当然也存在着一些问题,例如本文对图像的光照变化,其他姿态没有进行考虑,但实际中这是无法忽略的问题,有可能会导致人脸识别识别率减小。
为了进一步提高基于PCA的人脸识别系统的性能和适应性,我们可以通过以下几个方面进行改进:
改进图像获取方法:
我们可以通过使用人脸检测和跟踪算法,在图像获取的时候,动态跟踪和检测人脸,只采集最佳姿态下的人脸图像。
这在一定程度可以解决姿态所引起的问题,但也同时对系统的检测和跟踪人脸的反应时间提出较严格的要求。
如果反应时间较长,对于快速移动的人脸可能错过采集最佳姿态的图像,而导致系统无法识别人脸。
改进人脸识别的分类器:
最近邻法分类器属于一种线性分类器。
在实际中可以利用神经网络这类学习能力强的非线性分类器对高维人脸识别可能会取得更好的效果。
综合不同的人脸识别方法:
在目前,仅仅单独采用一种现有的人脸识别方法一般都不会取得很好的识别效果。
各种技术和方法都有自己不同的适应环境和各自的特点。
如果我们想进一步提高人脸识别系统的识别率,可以考虑使用数据融合理论,将不同的方法综合起来,相互补充,来取得很好的人脸识别效果。
这也是为人脸识别的研究趋势之一。
八、参考文献
[1]程自龙,雷秀玉.基于K-L变换(PCA)的特征脸人脸识别方法综述[J].中国图像图形学报,2010,20(22):
15-18.
[2]倪世贵,白宝刚.基于PCA的人脸识别研究[J].现代计算机,2011,23(42):
20-22.
[3]徐飞.Matlab应用图像处理[M].西安:
西安电子科技大学出版社,2005.
[4]王映辉.人脸识别:
原理,方法与技术[M].北京:
科学出版社,2010.
[5]田印中,董志学,黄建伟.基于PCA的人脸识别算法研究及实现[J].内蒙古科技与经济,2010,4(208):
15-18.
[6]刘学胜.基于PCA和SVM算法的人脸识别[J].计算机与数字工程,2011,14(3):
56-58.
[7]陈惠明.图像欧氏距离在人脸识别中的应用研究[J].计算机工程与设计,2008,3(14):
22-25.
附程序代码:
main.m
clearall
clc
closeall
TrainDatabasePath=('E:
\train');
TestDatabasePath=('E:
\test');
prompt={'Entertestimagename:
'};
dlg_title='InputofPCA-BasedFaceRecognitionSystem';
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,Euc_dist_min]=Recognition(TestImage,m,A,Eigenfaces);
SelectedImage=strcat(TrainDatabasePath,'\',OutputName);
SelectedImage=imread(SelectedImage);
if(Euc_dist_min<=4.5*10^15)
imshow(im)
title('TestImage');
figure,imshow(SelectedImage);
title('EquivalentImage');
str=strcat('Matchedimageis:
',OutputName);
disp(str)
Euc_dist_min
end
if(Euc_dist_min>4.5*10^15)
str=strcat('ÎÞ·¨Ê¶±ð.×î½Ó½üµÄÊÇ£º',OutputName);
disp(str)
Euc_dist_min
End
CreateDatabase.m
functionT=CreateDatabase(TrainDatabasePath)
TrainFiles=dir(TrainDatabasePath);
Train_Number=0;
fori=1:
size(TrainFiles,1)
ifnot(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcm