資源簡介
簡單的pca人臉識別程序,包括了orl的人臉庫
運行方便,不需要修改.
程序可輸出識別率

代碼片段和文件信息
%一個修改后的PCA進行人臉識別的Matlab代碼
%?calc?xmeansigma?and?its?eigen?decomposition
allsamples=[];%所有訓練圖像
for?i=1:40
????for?j=1:5
??????a=imread(strcat(‘ORL\s‘num2str(i)‘\‘num2str(j)‘.pgm‘));
??????%?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:200?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(v2);%?特征向量矩陣的列數
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)
????base(:i)?=?dsort(i)^(-1/2)?*?xmean‘?*?vsort(:i);???%?base是N×p階矩陣,除以dsort(i)^(1/2)是對人臉圖像的標準化,詳見《基于PCA的人臉識別算法研究》p31
????i?=?i?+?1;
end
%?add?by?wolfsky?就是下面兩行代碼,將訓練樣本對坐標系上進行投影得到一個?M*p?階矩陣allcoor
allcoor?=?allsamples?*?base;
accu?=?0;
%?測試過程
for?i=1:40
????for?j=6:10?%讀入40?x?5?副測試圖像
????????a=imread(strcat(‘ORL\s‘num2str(i)‘\‘num2str(j)‘.pgm‘));
????????b=a(1:10304);
????????b=double(b);
????????tcoor=?b?*?base;?%計算坐標,是1×p階矩陣
????????for?k=1:200?
????????????????mdist(k)=norm(tcoor-allcoor(k:));
????????????end;
????????%三階近鄰?
?[distindex2]=sort(mdist);
????????class1=floor(?index2(1)/5?)+1;
????????class2=floor(index2(2)/5)+1;
????????class3=floor(index2(3)/5)+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;
????????end;
????end;
end;
accuracy=accu/200?%輸出識別率
zuobiao=[1:100];
plot(zuobiaoaccuracy);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1579??1995-02-24?02:13??orl\README
?????文件??????10318??1994-04-18?21:17??orl\s1\1.pgm
?????文件??????10318??1994-04-18?21:07??orl\s1\10.pgm
?????文件??????10318??1994-04-18?21:17??orl\s1\2.pgm
?????文件??????10318??1994-04-18?21:17??orl\s1\3.pgm
?????文件??????10318??1994-04-18?21:17??orl\s1\4.pgm
?????文件??????10318??1994-04-18?21:17??orl\s1\5.pgm
?????文件??????10318??1994-04-18?21:07??orl\s1\6.pgm
?????文件??????10318??1994-04-18?21:07??orl\s1\7.pgm
?????文件??????10318??1994-04-18?21:07??orl\s1\8.pgm
?????文件??????10318??1994-04-18?21:07??orl\s1\9.pgm
?????文件??????10318??2008-06-18?17:33??orl\s1\1.pgmhex.TXT
?????文件?????209256??2008-07-05?11:13??orl\s1\pgm.rar
?????文件???????3387??2008-06-18?18:01??orl\s1\pgm\Test1.dsp
?????文件????????533??2008-06-18?18:01??orl\s1\pgm\Test1.dsw
?????文件??????41984??2008-08-01?16:52??orl\s1\pgm\Test1.ncb
?????文件???????1427??2008-07-05?11:25??orl\s1\pgm\Test1.plg
?????文件????????923??2008-07-05?11:25??orl\s1\pgm\Test1.c
?????文件?????218112??2008-08-01?16:52??orl\s1\pgm\Test1.opt
?????文件??????10318??1994-04-18?21:17??orl\s1\pgm\a\1.pgm
?????文件??????33792??2008-07-05?11:25??orl\s1\pgm\Debug\vc60.idb
?????文件??????53248??2008-07-05?11:25??orl\s1\pgm\Debug\vc60.pdb
?????文件?????175656??2008-06-18?21:10??orl\s1\pgm\Debug\Test1.pch
?????文件???????4302??2008-07-05?11:25??orl\s1\pgm\Debug\Test1.obj
?????文件?????180282??2008-07-05?11:25??orl\s1\pgm\Debug\Test1.exe
?????文件?????451584??2008-07-05?11:25??orl\s1\pgm\Debug\Test1.pdb
?????文件?????210672??2008-07-05?11:25??orl\s1\pgm\Debug\Test1.ilk
?????文件??????10318??1994-04-18?21:17??orl\s1\pgm\Debug\a\1.pgm
?????文件??????10318??1994-04-18?21:18??orl\s10\1.pgm
?????文件??????10318??1994-04-18?21:07??orl\s10\10.pgm
............此處省略437個文件信息
評論
共有 條評論