%--ModularPCA进行人脸识别算法
%--训练测试图像样本
train_test = [1 2 3 4 5 6 7 8 9 10 11]
%randperm(11);
[aa,bb] = size(train_test);
num_all = bb;
%--每一类训练图像树目
num_samples = 4;
%--设定分块大小
modular_p = 7; %行方向
modular_q = 2; %列方向
num_modulars = modular_p * modular_q;
%--计算图像矩阵的行数和列数
I1 = imread('D:\论文\YALE\Yale_92X112\y0101','tiff');
[Ia,Ib] = size(I1);
mx = Ia / modular_p; %行方向大小
my = Ib / modular_q; %列方向大小
M = mx * my;
N = 15 * num_samples * modular_p * modular_q;
%--读入训练图像—训练图像num_samples副,测试图像11 - num_samples副,图像大小为 Ia × Ib
all_samples = [];
T1 = clock;
%--图像保存在 D:\论文\YALE\Yale_92X112 Yij i-[1,15] j-[1-11]
for i = 1 : 15
for j = 1 : num_samples
if i < 10
pic_name1 = strcat('0',num2str(i));
else
pic_name1 = num2str(i);
end
if train_test(j) < 10
pic_name2 = strcat('0',num2str(train_test(j)));
else
pic_name2 = num2str(train_test(j));
end
pic_name = strcat('D:\论文\YALE\Yale_92X112\y',pic_name1,pic_name2);
I1 = imread(pic_name,'tiff');
for m = 1 : modular_p
for n = 1 : modular_q
im1 = 1 + mx * (m - 1);
im2 = mx * m;
in1 = 1 + my * (n - 1);
in2 = my * n;
tempI1 = I1(im1 : im2, in1 : in2);
tempI2 = reshape(tempI1, mx * my, 1);
tempI2 = double(tempI2);
all_samples = [all_samples tempI2];%all_samples是 M × N 的矩阵
end
end
end
end
T2 = clock;
Tcaiji = etime(T2,T1)
%--计算平均图向量mean_samples M×1的向量
mean_samples = (mean(all_samples'))';
%--计算类内平均图向量
mean_leinei = [];
for i = 1 : num_samples * num_modulars : N
temp1 = all_samples(:,i : i + num_samples * num_modulars - 1);
for j = 1 : num_modulars
temp2 = temp1(:,j : num_modulars : num_samples * num_modulars);
temp3 = mean(temp2')';
temp4 = temp2 - temp3 * ones(1,num_samples);
mean_leinei = [mean_leinei temp3];
end
end
%--计算所有图像向量和平均图向量的差
sub_samples = all_samples - mean_samples * ones(1,N);
%--直接计算总体散布矩阵St = sub_samples * sub_samples' / N 的特征值和特征向量
St = sub_samples * sub_samples' / N;
%--判别准则
Gt = St;
[Vt,Dt] = eig(Gt);
%--选择特征值最大的特征向量的数量eigenvector_nums
eigenvector_nums = 18;
D1 = diag(Dt);
[D2,index] = sort(D1);
[Ma,Na] = size(Vt);
%--选择特征值最大的eigenvector_nums个特征向量作为最优投影特征向量UU
for i = 1 : eigenvector_nums
DD(i) = D2(Na - i + 1);
UU(:,i) = Vt(:,index(Na - i + 1));
end
%--计算所有样本在投影特征向量下的投影系数YY
YY = UU' * all_samples; %(eigenvector_nums × N)
T3 = clock;
Ttique = etime(T3,T2)
%--测试过程
accuracy = 0.;
my_result = [];
for i = 1 : 15
for j = num_samples + 1 : num_all
if i < 10
pic_name1 = strcat('0',num2str(i));
else
pic_name1 = num2str(i);
end
if train_test(j) < 10
pic_name2 = strcat('0',num2str(train_test(j)));
else
pic_name2 = num2str(train_test(j));
end
pic_name = strcat('D:\论文\YALE\Yale_92X112\y',pic_name1,pic_name2);
test = [];
I1 = imread(pic_name,'tiff');
for m = 1 : modular_p
for n = 1 : modular_q
im1 = 1 + mx * (m - 1);
im2 = mx * m;
in1 = 1 + my * (n - 1);
in2 = my * n;
tempI1 = I1(im1 : im2, in1 : in2);
tempI2 = reshape(tempI1, mx * my, 1);
tempI2 = double(tempI2);
test = [test tempI2];%test是 (mx*my) × (p*q) 的矩阵
end
end
YT = UU' * test; %计算测试图像向量在特征向量下的坐标(eigenvector_nums × (p*q))
for k = 1 : 15 * num_samples
it1 = modular_p * modular_q * (k - 1);
tt = zeros(modular_p * modular_q,1);
for l = 1 : modular_p * modular_q
tt(l) = norm(YT(:,l) - YY(:,it1 + l));
end
dist1(k) = sum(tt) / (modular_p * modular_q);
end
[dist,index] = sort(dist1);
my_result = [my_result;index];
if index(1) ~= index(2) && index(2) ~= index(3)
class = index(1);
elseif index(1) == index(2)
class = index(1);
elseif index(2) == index(3)
class = index(2);
else
class = index(1);
end
if mod(class,num_samples) == 0
class = class - 1;
end
class = double(uint8(class / num_samples)) + 1;
if class == i
accuracy = accuracy + 1;
end
end
end
T4 = clock;
Tshibie = etime(T4,T3)
%--输出识别率
accuracy = accuracy / (15 * num_all - 15 * num_samples)