您的当前位置:首页正文

采用混合核函数的人脸识别方法

2021-12-18 来源:意榕旅游网
%一个修改后的PCA+SVM进行人脸识别的Matlab代码

%取每一个人的前3张图片,一共120张图片作为训练集,剩下其余280张为测试集 %SVM的核函数为径向基与多项式相结合的混合核函数

tic;%计时

allsamples=[];%所有训练图像构成的矩阵

tcoor=[];%所有测试图像经过PCA降维后构成的矩阵 for i=1:40 for j=1:3

a=imread(strcat('D:\\MATLAB7\\work\\ORL\\s',num2str(i),'\\',num2str(j),'.bmp')); % imshow(a);

b=a(1:112*92); % b是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右

b=double(b);

allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200 end end

samplemean=mean(allsamples); % 平均图片,1 × N for i=1:120

xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片” end;

sigma=xmean*xmean'; % M * M 阶矩阵 [v d]=eig(sigma); %计算特征向量和特征值 d1=diag(d); %提取对角元素

[d2 index]=sort(d1); %以特征值升序排序特征向量 cols=size(v,2);% 特征向量矩阵的列数 for i=1:cols

vsort(:,i) = v(:, index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量

dsort(i) = d1( index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一维行向量 end %完成降序排列 %以下选择90%的能量 dsum = sum(dsort); dsum_extract = 0; p = 0;

while( dsum_extract/dsum < 0.9) p = p + 1;

dsum_extract = sum(dsort(1:p)); end i=1;

% (训练阶段)计算特征脸形成的坐标系

while (i<=p && dsort(i)>0) %不通过比例来选取p的值时,可直接取p为[1,120]之间的值

base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化 i = i + 1;

end

% add by wolfsky 就是下面两行代码,将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor

allcoor = allsamples * base;

% 测试过程 for i=1:40

for j=4:10 %读入40 x 7 副测试图像

a=imread(strcat('D:\\MATLAB7\\work\\ORL\\s',num2str(i),'\\',num2str(j),'.bmp')); b=a(1:10304); b=double(b); c= b * base;

tcoor=[tcoor;c]; %将测试样本对坐标系上进行投影,得到一个 M*p 阶矩阵tcoor end; end

%规范化数据到[-1,1] x=allcoor;

[m,n] = size(x); S = zeros(m,n); for i = 1:m

mea = mean( x(i,:) ); va = var( x(i,:) );

S(i,:) = ( x(i,:)-mea )/va; end

y=tcoor;

[m,n] = size(y); T = zeros(m,n); for i = 1:m

mea = mean( y(i,:) ); va = var( y(i,:) );

T(i,:) = ( y(i,:)-mea )/va; end

%给数据添上类别标签

label1=[1;1;1;2;2;2;3;3;3;4;4;4;5;5;5;6;6;6;7;7;7;8;8;8;9;9;9;10;10;10; 11;11;11;12;12;12;13;13;13;14;14;14;15;15;15;16;16;16;17;17;17; 18;18;18;19;19;19;20;20;20;21;21;21;22;22;22;23;23;23;24;24;24; 25;25;25;26;26;26;27;27;27;28;28;28;29;29;29;30;30;30;31;31;31; 32;32;32;33;33;33;34;34;34;35;35;35;36;36;36;37;37;37;38;38;38; 39;39;39;40;40;40];

label2=[1;1;1;1;1;1;1;2;2;2;2;2;2;2;3;3;3;3;3;3;3;4;4;4;4;4;4;4;5;5;5;5;5;5;5;6;6;6;6;6;6;6;7;7;7;7;7;7;7;8;8;8;8;8;8;8;9;9;9;9;9;9;9;10;10;10;10;10;10;10;

11;11;11;11;11;11;11;12;12;12;12;12;12;12;13;13;13;13;13;13;13;14;14;14;14;14;14;14;15;15;15;15;15;15;15;16;16;16;16;16;16;16;17;17;17;17;17;17;17;

18;18;18;18;18;18;18;19;19;19;19;19;19;19;20;20;20;20;20;20;20;21;21;21;21;21;21;21;22;22;22;22;22;22;22;23;23;23;23;23;23;23;24;24;24;24;24;24;24;

25;25;25;25;25;25;25;26;26;26;26;26;26;26;27;27;27;27;27;27;27;28;28;28;28;28;28;28;29;29;29;29;29;29;29;30;30;30;30;30;30;30;31;31;31;31;31;31;31;

32;32;32;32;32;32;32;33;33;33;33;33;33;33;34;34;34;34;34;34;34;35;35;35;35;35;35;35;36;36;36;36;36;36;36;37;37;37;37;37;37;37;38;38;38;38;38;38;38; 39;39;39;39;39;39;39;40;40;40;40;40;40;40;];

% 选取120个数据作为训练集合,280个数据作为测试集合

traindata = S;

trainlabel = label1; testdata = T;

testlabel = label2;

% 使用混合核函数 % 核矩阵

ktrain = ones(120,120); for i = 1:120

for j = 1:120

ktrain(i,j) = 0.1*exp(-2.8*norm(S(i,:)-S(j,:)).^2) +0.9*((2.8*S(i,:)*S(j,:)').^2);%SVM的核函数为径向基与多项式相结合的混合核函数,比例和参数可修改 end end

Ktrain = [(1:120)',ktrain];

% 利用训练集合建立分类模型

model = svmtrain(label1, Ktrain, '-t 4');

ktest = ones(280,120); for i = 1:280

for j = 1:120

ktest(i,j) = 0.1*exp(-2.8*norm(T(i,:)-S(j,:)).^2) +0.9*((2.8*T(i,:)*S(j,:)').^2); end end

Ktest = [(1:280)', ktest];

% 利用建立的模型看其在测试集合上的分类效果

[predict_label, accuracy, dec_values]= svmpredict(label2, Ktest, model); toc;

因篇幅问题不能全部显示,请点此查看更多更全内容