資源簡介
包含PCA降維的matlab程序,另外一個是用svm分類的程序。
代碼片段和文件信息
function??[Out]=facerec(Trainset)
Slect=Trainset;
n=1;
M=45;
N=length(Slect);
allsamples=[];%所有訓練圖像
for?i=1:1:2
????for?j=1:N
????????filename??=?sprintf(‘D:\\zzh\\work\\zzh\\baseline_V8\\matlab\\Yale_5G\\face1\\%d_s%d.bmp‘iSlect(j));
??????a=imread(filename);?????
??????a=a‘;??
??????b=a(1:80*80);??%?b是行矢量?1×N,其中N=10000,提取順序是先列后行,即從上到下,從左到右
??????b=double(b);
??????allsamples=[allsamples;?b]??%?allsamples?是一個M?*?N?矩陣,allsamples?中每一行數據代表一張圖片,其中M=200
????end
end
samplemean=mean(allsamples);?%?平均圖片
xmean=[];
for?i=1:1:M?
????xmean(i:)=allsamples(i:)-samplemean;?%?xmean是一個M?×?N矩陣,xmean每一行保存的數據是“每個圖片數據-平均圖片”
end;
xmean
sigma=xmean*xmean‘;???%?M?*?M?階矩陣
sigma;
[v?d]=eig(sigma);
d1=diag(d);
[d2?index]=sort(d1);?%以升序排序
cols=size(v2);%?特征向量矩陣的列數
vsort=[];
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??%完成降序排列
%以下選擇x%的能量
dsort
dsum?=?sum(dsort);
????dsum_extract?=?0;
????p?=?0;
????while(?dsum_extract/dsum?0.90)
????????p?=?p?+?1;
????????dsum_extract?=?sum(dsort(1:p));
????end
i=1;
%?(訓練階段)計算特征臉形成的坐標系
while?(i<=p?&&?dsort(i)>0)
????base(:i)?=?dsort(i)^(-1/2)?*?xmean‘?*?vsort(:i);???%?base是N×p階矩陣,除以dsort(i)^(1/2)是對人臉圖像的標準化,詳見《基于PCA的人臉識別算法研究》p31
????i?=?i?+?1
end
%size(base)
%?add?by?wolfsky?就是下面兩行代碼,將訓練樣本對坐標系上進行投影得到一個?M*p?階矩陣allcoor
allcoor?=?allsamples?*?base;
size(allcoor);
accu?=?0;
accu1?=?0;
accu2?=?0;
m=1;
%%%%%%%%%%%%%%%%%%測試過程%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%測試過程%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%測試過程%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for?i=1:1:15
????disp(‘...........‘)
????for?j=1:11????%讀入測試圖像
???????filename??=?sprintf(‘D:\\zzh\\work\\zzh\\baseline_V8\\matlab\\Yale_5G\\face1\\%d_s%d.bmp‘ij);
??????a=imread(filename);?
??????a=a‘;
??????
??????b=a(1:80*80);
??????b=double(b);
??????tcoor=?b?*?base;?%計算坐標,是1×p階矩陣
%***?歐式距離??****
???
????????for?k=1:1:M?
????????????????mdist(k)=norm(tcoor-allcoor(k:));
????????????end;
????????????
?%三階近鄰????????
?[distindex2]=sort(mdist);?
????????index2=index2-1;
????????class1=floor(index2(1)/N)+1;
????????class2=floor(index2(2)/N)+1;
????????class3=floor(index2(3)/N)+1;????
????????if?class1~=class2?&&?class2~=class3
????????????class=class1;
????????elseif?class1==class2
????????????class=class1;
????????elseif?class2==class3
????????????class=class2;
????????end;
????????if?class==i
????????????accu=accu+1;
????????????if?(j==Slect(1)|j==Slect(2)|j==Slect(3)?)
????????????????accu1=accu1+1;
????????????else
???????????????accu2=accu2+1;?
????????????end
????????end;
%**************************?歐式距離??******************************??
????end;
end;
%accu
%輸出識別率
accuracy=accu/165;
accuracy1=accu1/45;
accuracy2=accu2/120;
Out=[Slectaccuracyaccuracy1accuracy2];?%訓練集?輸出識別率
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????3406??2008-03-18?15:19??code?PCA-SVM\facerec.m
?????文件????????2003??2007-09-09?21:56??code?PCA-SVM\file.txt
?????文件????????5000??2007-09-09?21:58??code?PCA-SVM\file1.txt
?????文件????????1451??2007-09-09?10:51??code?PCA-SVM\kernel.m
?????文件????????1646??2007-09-09?11:01??code?PCA-SVM\rec.m
?????文件????????8206??2007-09-09?10:51??code?PCA-SVM\svm168.m
?????文件????????1032??2007-09-09?21:53??code?PCA-SVM\test.m
?????文件????????1991??2008-01-23?08:56??code?PCA-SVM\WavePCA.m
評論
共有 條評論