基於MATLAB的人臉識別
一、原始碼參考
% FaceRec。m
% PCA 人臉識別修訂版,識別率88%
% calc xmean,sigma and its eigen decomposition
allsamples=[];%所有訓練影象
for i=1:40
for j=1:5
a=imread(strcat(‘e:\ORL\s’,num2str(i),‘\’,num2str(j),‘。jpg’));
% 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);
% 按特徵值大小以降序排列
dsort = flipud(d1);
vsort = fliplr(v);
%以下選擇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;
% (訓練階段)計算特徵臉形成的座標系
base = xmean’ * vsort(:,1:p) * diag(dsort(1:p)。^(-1/2));
% base 是N×p 階矩陣,除以dsort(i)^(1/2)是對人臉影象的標準化(使其方差為1)
% 詳見《基於PCA 的人臉識別演算法研究》p31
% xmean‘ * vsort(:,i)是小矩陣的特徵向量向大矩陣特徵向量轉換的過程
%while (i<=p && dsort(i)>0)
% base(:,i) = dsort(i)^(-1/2) * xmean’ * vsort(:,i); % base 是N×p 階矩陣,除以dsort(i)^(1/2)
是對人臉影象的標準化(使其方差為1)
% 詳見《基於PCA 的人臉識別演算法研究》p31
% i = i + 1; % xmean‘ * vsort(:,i)是小矩陣的特徵向量向大矩陣特
徵向量轉換的過程
%end
% 以下兩行add by gongxun 將訓練樣本對座標系上進行投影,得到一個 M*p 階矩陣allcoor
allcoor = allsamples * base; % allcoor 裡面是每張訓練人臉圖片在M*p 子空間中的一個點,
即在子空間中的組合係數,
accu = 0; % 下面的人臉識別過程中就是利用這些組合係數來進行識別
% 測試過程
for i=1:40
for j=6:10 %讀入40 x 5 副測試影象
a=imread(strcat(’e:\ORL\s‘,num2str(i),’\‘,num2str(j),’。jpg‘));
b=a(1:10304);
b=double(b);
tcoor= b * base; %計算座標,是1×p 階矩陣
for k=1:200
mdist(k)=norm(tcoor-allcoor(k,:));
end;
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 %輸出識別率
特徵人臉
% eigface。m
function [] = eigface()
% calc xmean,sigma and its eigen decomposition
allsamples=[];%所有訓練影象
for i=1:40
for j=1:5
a=imread(strcat(’e:\ORL\s‘,num2str(i),’\‘,num2str(j),’。jpg‘));
% 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
% 獲取特徵值及特徵向量
dsort = flipud(d1);
vsort = fliplr(v);
%以下選擇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
p = 199;
% (訓練階段)計算特徵臉形成的座標系
%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; % xmean‘ * vsort(:,i)是小矩陣的特徵向量向大矩
陣特徵向量轉換的過程
%end
base = xmean’ * vsort(:,1:p) * diag(dsort(1:p)。^(-1/2));
% 生成特徵臉
for (k=1:p),
temp = reshape(base(:,k), 112,92);
newpath = [‘d:\test\’ int2str(k) ‘。jpg’];
imwrite(mat2gray(temp), newpath);
end
avg = reshape(samplemean, 112,92);
imwrite(mat2gray(avg), ‘d:\test\average。jpg’);
% 將模型儲存
save(‘e:\ORL\model。mat’, ‘base’, ‘samplemean’);
人臉重建
% Reconstruct。m
function [] = reconstruct()
load e:\ORL\model。mat;
% 計算新圖片在特徵子空間中的係數
img = ‘D:\test2\10。jpg’
a=imread(img);
b=a(1:112*92); % b 是行向量 1×N,其中N=10304,提取順序是先列後行,即從上到下,
從左到右
% 根據特徵係數及特徵臉重建圖
% 前15 個
t = 15;
temp = base(:,1:t) * c(1:t)‘;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 112,92)),‘d:\test2\t1。jpg’);
% 前50 個
t = 50;
temp = base(:,1:t) * c(1:t)‘;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 112,92)),‘d:\test2\t2。jpg’);
% 前100 個
t = 100;
temp = base(:,1:t) * c(1:t)‘;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 112,92)),‘d:\test2\t3。jpg’);
% 前150 個
t = 150;
temp = base(:,1:t) * c(1:t)‘;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 112,92)),‘d:\test2\t4。jpg’);
% 前199 個
t = 199;
temp = base(:,1:t) * c(1:t)‘;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 112,92)),‘d:\test2\t5。jpg’);