您當前的位置:首頁 > 書法

基於MATLAB的人臉識別

作者:由 藍莓醬 發表于 書法時間:2021-08-24

一、原始碼參考

% 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’);

標簽: temp  dsort  base  xmean  allsamples