工程实践课程设计报告
1.人脸识别的具体实现
一个完整的人脸识别系统由以下几个环节组成,人脸检测,特征提取,和分类识别。人脸检测即为从输入的静止图像或序列图像中检测图像是否包含人脸。因为本次实验主要是验证PCA和KNN算法的精度,所以选择的图像都是包含人脸的图像。实验中采用PCA算法对特征进行提取,用KNN算法对实验结果进行检测,测定测试图像属于哪个分类。
在计算机中,一幅数字图像可以看成是一个矩阵或者是一个数组,用B(i,j)表示。其行列下标对应了图像上的一个点,而在矩阵中对应相应元素,则标出了该点的灰度值。一幅nxm大
小的
图像
按行列
相连
构成一
个
n*m
维向量
x(b11b12b1mb21b22b2mbn1bn2bnm),它被视为n*m空间中的一个点。
人脸图像样本
集可用矩阵X表示,其中,
X[x1x2xp]
,P为样本集中人脸图像的数量。
2.交叉验证
当数据源不充足时,为了保证所建分类器的性能和错误率估计的准确性,交叉验证技术常常被采用.在交叉验证中,先要决定一个固定的重数,或者说折数.一般地,将重数定为k,这就是k 重交叉验证,记为k-CV.
由于本次试验中采集了40组图像,每组10帧,数据源相对不充足,为了充分验证算法的性能,分别采用了3-CV, 4-CV, 5-CV交叉验证法,随机选择训练样例。
3.实验结果分析
实验中采取了40组图像,每组10帧。其中一组图像如下图所示:
图 5-1样本图例
为了保证分类的健壮性,在试验中在训练集上采取交叉验证的方法,分别从每组样本中国随机选取3,4,5张图像作为训练样本,其余的样本作为测试样本。计算训练样本的特征向量。
实验中使用的图像为1024*92大小的图片,通过resize()函数的处理,把图像变为32*32
大小的图像,把此图像重置为1*1023的向量。当每组选择3张训练样本时,训练样本矩阵大小为120*1024.,训练样本的大小为:280*1024。使用PCA方法得到了训练样本矩阵的特征值和特征向量,特征值按从大到小排序。较大特征值对应的一些正交基(也称主分量)能够表达人脸的大体形状。
贡献率表示所定义的主成分在整个数据分析中承担的主要意义占多大的比重,当取前 r 个主成分来代替原来全部变量时,累计贡献率的大小反应了这种取代的可靠性,累计贡献率越大,可靠性越大;反之,则可靠性越小。一般要求累计贡献率达到 70% 以上。实验中的贡献率是通过选择的特征值之和与总的特征值之和的比值来计算的,要求贡献率达到98%以上。实验中计算得到的特征向量即特征脸部分如下图所示。
实验中通过变换不同的参数,统计了参数对实验进度的影响。具体如下。 (1)KNN算法中近邻个数的选择
当每组的训练样本数取5个,近邻数分别为1,2,3时的情况
虽然很多文献中提到,当近邻数位1时,并不足以确定测试样本的类别,因为数据中有噪声和异常值。但在本次实验中,通过结果我们可以看到实验进度不受近邻个数的影响。 (2)交叉验证次数的影响
本次实验中进行了5次交叉验证,为论文测试交叉验证的次数是否对实验进行影响,我们采集了K=5,每组的训练样本为5时,CV变换的进度结果。
表 5-2 交叉次数对进度的影响统计
通过上述实验结果分析可知,在本次实验中
(1)交叉验证中CV的选择和KNN中K的选择对精度的影响不大; (2)训练样本的数量和特征向量的数量与识别精度成正相关;
(3)但为了保证对全局的识别更加稳定,我们需要选择尽量高的CV次数;
(4)为了识别精度和系统的运行速度,我们选择的特征向量的数目为15到50个比较合理,训练数目选择3-5个比较合理。
4.展望
从压缩能量的角度来看,K-L变换是最优的,变换后的低维空间对于人脸有很好的表达能力,然而这并不等同于对不同人脸具有较好的判别能力。选择训练样本的散布矩阵作为K.L变换的生成矩阵,其最大特征向量反映了该样本集合的最大分布的方向,但这是图像统计方
法,而不是人脸统计方法。它查找的是图像之间所有的差异,并根据这些差异来确定不同人脸间的距离,而不管这些差异是由于光线、发型或背景的改变引起的,还是属于人脸本身的内在差异,因此特征脸的方法用于人脸识别存在理论的缺陷。研究表明,特征连的方法随着光线、
角度以及人脸的尺寸的引入而识别率急剧下降。主分量的方法使得变换后的表达能力最佳,次分量的方法考虑了高频的人脸区分能力,但是由于外在因素带来图像差异和人脸本身带来的差异对K-L变换而言是不加任何区分的,因此,如何选择正交基并不根本解决问题。改进的一个思路是针对干扰所在,对输入图像作规范化处理,包括输入图像的均值方差归一化,人脸尺寸归一化。另一种改进是考虑到局部人脸图像受到外在干扰相对较小的情况,除了计算特征脸之外,还利用K-L变换计算出特征眼、特征嘴等。将局部特征向量加权进行匹配得到一些好的效果。
5.代码
(1)%用pca方法进行降维矩阵,得到特征脸 function y = pca(mixedsig) if nargin == 0
error('You must supply the mixed data as input argument.'); end
if length(size(mixedsig))>2
error('Input data can not have more than two dimensions. '); end
if any(any(isnan(mixedsig)))
error('Input data contains NaN''s.'); end
meanValue = mean(mixedsig')'; [m,n] = size(mixedsig); for s = 1:m for t = 1:n
mixedsig(s,t) = mixedsig(s,t) - meanValue(s); end end
[Dim,NumofSampl] = size(mixedsig); oldDimension = Dim;
fprintf('Number of signals: %d\n',Dim);
fprintf('Number of samples: %d\n',NumofSampl); fprintf('Calculate PCA...'); firstEig = 1; lastEig = Dim;
covarianceMatrix = cov(mixedsig',1); [E,D] = eig(covarianceMatrix);
rankTolerance = 1e-5;
maxLastEig = sum(diag(D)) >= rankTolerance; lastEig = maxLastEig; lastEig = 10;
eigenvalues = flipud(sort(diag(D))); if lastEig
lowerLimitValue = (eigenvalues(lastEig) + eigenvalues(lastEig + 1))/2; else
lowerLimitValue = eigenvalues(oldDimension) - 1; end
lowerColumns = diag(D) > lowerLimitValue; if firstEig > 1
higherLimitValue = (eigenvalues(firstEig - 1) + eigenvalues(firstEig))/2; else
higherLimitValue = eigenvalues(1) + 1; end
higherColumns = diag(D)
fprintf('Selected [%d] dimensions.\n',sum(selectedColumns)); fprintf('Smallest remaining (non-zero)
eigenvalue[ %g ]\n',eigenvalues(lastEig)); fprintf('Largest remaining (non-zero)
eigenvalue[ %g ]\n',eigenvalues(firstEig));
fprintf('Sum of removed eigenvalue[ %g ]\n',sum(diag(D) .* (~selectedColumns)));
E = selcol(E,selectedColumns);
D = selcol(selcol(D,selectedColumns)',selectedColumns); whiteningMatrix = inv(sqrt(D)) * E'; dewhiteningMatrix = E * sqrt(D); y = whiteningMatrix * mixedsig;
function newMatrix = selcol(oldMatrix,maskVector) if size(maskVector,1)~= size(oldMatrix,2)
error('The mask vector and matrix are of uncompatible size.'); end
numTaken = 0;
for i = 1:size(maskVector,1) if maskVector(i,1) == 1
takingMask(1,numTaken + 1) ==i; numTaken = numTaken + 1; end end
newMatrix = oldMatrix(:,takingMask);
(2) %KNN方法计算准确率
function info=KNN(targetimage) temp=0;kind=[0 0 0]; i=0;j=0;temp1=0;i1=0;
s(1)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('a1.jpg'));
s(2)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('a2.jpg'));
s(3)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('a3.jpg'));
s(4)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('a4.jpg'));
s(5)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('a5.jpg'));
s(6)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('b1.jpg'));
s(7)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('b2.jpg'));
s(8)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('b3.jpg'));
s(9)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('b4.jpg'));
s(10)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('b5.jpg'));
s(11)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('c1.jpg'));
s(12)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('c2.jpg'));
s(13)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('c3.jpg'));
s(14)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('c4.jpg'));
s(15)=ComputSimilarity(HandGeoExtraction(targetimage),HandGeoExtraction('c5.jpg'));
sub=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]; for i=1:3
for j=1:15
if(s(i)
s(j)=temp; sub(j)=temp1; end end end
for i1=1:3
if(sub(i1)>=1&&sub(i1)
elseif(sub(i1)>5&&sub(i1)
kind(3)=kind(3)+1; end end
if(kind(1)>kind(2)&&kind(1)>kind(3)) info=1
elseif(kind(2)>kind(1)&&kind(2)>kind(3)) info=2; else
info=3; end