主成分分析法在人脸识别中的应用

文摘   2024-08-20 11:58   江苏  
主成分分析法 Principal Component Analysis 早在 1901 年由英国数学家卡尔∙皮尔逊 Karl Pearson 发明 [1],后来由美国数理统计和经济学家哈罗德∙霍特林 Harold Hotelling 进一步发展并运用于金融统计学 [2]。直到计算机出现以后,主成分分析法才被广泛地应用于多变量统计计算。PCA 的基本思想是从原始数据当中创建一个新坐标系,原始数据投影到新坐标系后得到的方差最大,数学上称为主成分。每个主成分都是原始变量的线性组合,主成分之间彼此互相独立。在机器学习算法中,通常用 PCA 对数据进行预处理,只需要一部分主成分就能够保留原始变量的绝大部分信息,起到给数据降维的作用。
主成分分析法的基本概念
假如我们测量8个样本的两个变量,比如8个人的身高和体重,8只老鼠的两种基因等等。将这些数据放进一个n行m列的数据矩阵 X(即n=8和 m=2),如表1所示。 

表1  原始数据矩阵

只考虑两个变量是为了把数据放在一个二维坐标系中来讨论。见图1,纵坐标表示变量1,横坐标表示变量2,黑色圆点代表8个样本的观测值。首先将表1中每一行的观测数据减去各个变量的平均值,从而使坐标轴中心移到数据中心。然后旋转坐标轴,计算出数据在新坐标系中的方差,而数据间的相对位置没有变化。比如当坐标系旋转了20°,算出沿A轴(红色实线)的方差为25,占总方差的55.4%,沿 B 轴(蓝色实线)的方差为20.1,占总方差的 44.6%。方差的定义为:    

     图1  坐标系旋转20°。虚线为原坐标系,实线为新坐标系

在运用 PCA 分析数据时,要让坐标轴旋转到某个角度,使得该方向的方差最大,即全部 n 个数据在新坐标轴上的投影最大。图2中,新坐标系相对于老坐标系旋转了 60°,8个样本在新坐标系中的观测值见表2。

图2  坐标系旋转 60°。虚线为原坐标系,实线为新坐标系   

表 2  样本在主成分空间的观测值    
根据表2可以算得红色实线上的方差增加到 44.6,占总方差的 98.9%, 此时方差最大,这个方向称为第一主成分。和第一主成分正交的蓝色实线代表第二主成分,方差仅为 0.43,占总方差的 1.1%。m个变量有m个主成分。主成分的计算通常归结为求解本征值和本征向量的问题,只需调用现成的计算机程序,如R,MATLAB 等语言所写的程序便可得到(参见今年2月20日公众号用主成分分析(Principal Component Analysis)方法进行图像压缩)。    
由于第一主成分包含了表1数据中的主要信息,我们可以忽略第二主成分,只用第一主成分来重构数据。重构后的数据见表3。

表 3 根据第一主成分重构的数据      

 

比较表1,可见重构后的数据很接近原始数据。也就是说,在允许的误差范围内,可以用 L (L<m) 维主成分重构m维变量,从而达到降维的目的。   

 

PCA 用于人脸识别    

PCA 是一种非常有效的人脸识别技术。人脸识别需要存储和传输大量数字图像,如何从海量的人脸数据中提取特征信息,去除不必要的信息或噪声是人脸识别面对的主要挑战。人脸库图像数据存储在一个n行m列的二维数据矩阵X中,利用PCA算法确定出L个主成分。这些主成分上方差之和包含了人脸的主要特征,而其它主成分上的方差之和只占总方差的很小一部分,可以忽略不计,这样就能大大节省图像存储空间和提高数据传输速度。下面通过一个计算实例来介绍一下如何用 PCA 进行人脸识别, 附录中的 MATLAB 代码供读者参考。    

该例子中所采用的400张人脸照片取自人脸库https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html共有20个人,每人10张照片(见图 3)。

   

图 3 人脸数据库

每张照片的分辨率为 112 x 92 个像素。首先将每张图像从二维数组转换成一维向量,依次放入一个 n 行m 列的数据矩阵 X 中。对照上节的例子,本例中 X 的行数 n = 112 x 92 = 10304,列数 m = 400。根据文献 [3], 人脸识别算法主要有以下步骤:   

1、计算平均值    

 

2、根据方程  计算特征向量v和特征值λ

3、计算特征脸eigenface [4]   。根据以上算法得到400张特征脸,见图4。任何一张人脸图像都可以用这些特征脸的组合来表示。例如,一张人脸图像可能是特征脸1的10%,加上特征脸2的55%,再减去特征脸3的3%。

    

图4  特征脸 eigenfaces(第1~第16主成分)

4.根据特征值λ计算L值,即保留人脸主要特征所需要的最少的主成分个数。若特征值为 λ1, λ2, …, λm,则前 L各主成分方差与总方差之比为   

   

令 r > 95%,就能够确定L的值,本例中算得L=190,也就是说,只要用190张特征脸就可以重构400个已知人脸图像了。

5.计算权重  ,其中  

根据特征脸重构人脸图像(此步骤在人脸识别过程中不是必需的)。重构的人脸图像为  ,其中特征脸  。由于重构的人脸图像是通过一系列向量(每个特征脸的一个比例值)而不是数字图像进行保存,因此可以节省很多存储空间。图 5 为部分重构的人脸图像。

图 5 利用特征脸重构的人脸图像

6、接下来就是人脸识别步骤。本例中的测试样本也取自上述人脸数据库,可以从图3中的 400张照片中任意挑选一张。先将该头像由二维数组转换为一维向量T,然后计算测试样本的权重  ,其中  。在此顺便提一下,测试样本也可以根据特征脸重构出来(这一步不是必需的),重构的测试样本为  ,见图 6。

图 6  左为测试样本,右为重构的测试样本

7、最后通过计算权重  和  之间的欧氏距离,来判断测试样本是否和已知样本属于同一个人。欧氏距离为两对应点的笛卡尔坐标的差的绝对值d(p, q) = |p - q|。当欧氏距离小于某一个阈值,就可以认为测试样本和已知样本属于同一个人,见图 7。识别过程仅需几秒就可完成,见视频:


图7 人脸识别结果。左为测试样本,右为被识别的已知样本

结语

机器人脸识别是一项重要的身份确认技术,近几十年来发展非常迅速,广泛应用在银行,安检,交通等场所。人脸识别是运用一定的算法,通过计算机图像处理,快速地将待测人脸和人脸数据库中的已知人脸进行比较,从而确定待测人脸和已知人脸是否属于同一个人。随着神经网络,深度学习等技术的发展,人脸识别技术日臻完善。主成分分析法是最初出现的,也是最基本的人脸识别算法,本文简单地介绍了如何应用主成分分析法进行人脸特征提取,即所谓特征脸的概念,通过具体范例演示了如何 快速进行人脸识别,并和大家分享了MATLAB程序代码,希望对这一领域感兴趣的读者有所帮助。   


附录:人脸识别算例 MATLAB 代码    

n = 400;

rows = 112; cols = 92;           % height and width of image

S = uint8(zeros((rows*cols),n)); % Initialization of data matrix

for k = 1:40

cd(strcat('s',num2str(k)));

for j = 1:10

I = imread(strcat(num2str(j),'.pgm'));

S(:,(k-1)*10+j) = reshape(I,size(I,1)*size(I,2),1);

end

cd ..

end


ri=round(400*rand(1,1)); % Randomly pick an index.

T = S(:,ri); % T contains the image we later on will use to test the algorithm

X = S(:,[1:ri-1 ri+1:end]); % X contains the rest of the 399 images.


X = double(X);

m = mean(X,2);


centredX = X-m; % subtract mean

L = centredX'*centredX; % covariance

[V, lambda] = eig(L); % obtain eigenvalue & eigenvector

[lambda_sorted, ind] = sort(diag(lambda),'descend'); % sort eigenvalues in descending order

V_sorted = V(:, ind);

U = centredX*V_sorted; % eigenfaces


figure(1)

for i = 1:16

subplot(4,4,i)

imagesc(reshape(U(:,i),[rows, cols]))

axis image

axis off

colormap gray

end


% evaluate the number of principal components needed to represent

% 95% Total variance.

Evalsum = sum(lambda_sorted);

csum = 0;

for i = 1:n

csum = csum + lambda_sorted(i);

tv = csum / Evalsum;

if tv > 0.95

N = i;

break

end

end


% reconstruct the training images

weights = V_sorted(:,1:N);

U = centredX*weights;

Xhat = U*weights'+m;

figure(2)

for i = 1:16

subplot(4,4,i)

imagesc(reshape(Xhat(:,(i-1)*10+1),[rows, cols]))

axis image

axis off

colormap gray

end


% Recognition

T = double(T);

centredT = T-m;% Subtract the mean

s = centredT'*U(:,1:N);% calculate the weight of the test image

u = centredT*s;% project the test image into the pca space

That = u*s'+m;% reconstruct the test image


figure(3)

subplot(121)

imshow(reshape(uint8(T), [rows, cols]))

title('Test image','Fontsize',14)

subplot(122)

imagesc(reshape(That, [rows, cols]))

axis image

axis off

colormap gray

title('Reconstructed test image','Fontsize',14)


figure(4);

subplot(121)

imshow(reshape(uint8(T), [rows, cols]))

title('Looking for ...','FontWeight','bold','Fontsize',16,'color','red');


subplot(122)

z = zeros(1,size(X,2));

for i = 1:size(X,2)

z(i) = norm(weights(i,:)-s,2);

if rem(i,20) == 0

imshow(reshape(uint8(X(:,i)),112,92))

end

drawnow;

end


subplot(122)

[~, ind] = min(z);

imshow(reshape(uint8(X(:,ind)),112,92))

title('Found!','FontWeight','bold','Fontsize',16,'color','red')



参考文献:

1. Pearson, K., On lines and planes of closest fit to systems of points in space. Philosophical Magazine, 1901. 2(7-12): p. 559-572.

2. Hotelling, H., Analysis of a complex of statistical variables into principal components. Journal of Educational Psychology, 1933. 24: p. 417-441.

3. Turk, M. and A. Pentland, EIGENFACES FOR RECOGNITION. Journal of Cognitive Neuroscience, 1991. 3(1): p. 71-86.

4. Sirovich, L. and M. Kirby, LOW-DIMENSIONAL PROCEDURE FOR THE CHARACTERIZATION OF HUMAN FACES. Journal of the Optical Society of America a-Optics Image Science and Vision, 1987. 4(3): p. 519-524.

          


想要了解更多信息,请联系我们:
锐光凯奇(镇江)光电科技有限公司
地址:镇江高新区南徐大道298A9
电话0511-83897066(座机)
邮箱:info@raycage.com


锐光凯奇公众号二维码

客服经理微信二维码
 

点击下方卡片
关注【锐光凯奇】

锐光凯奇raycage
介绍自有的最新科技产品、科普及公司动态