对于一个人的10副图,每一副图片按照从上到下,从左到右组成一个行向量,这个行向量的维度为n。a1,a2,...a10组成一个10*n的矩阵A。接下来说一下用matlab做的过程:
1:计算A的没列的平均值meanA矩阵,这个矩阵的大小是1*n的。
2:计算A的协方差矩阵,直接利用matlab的命令covImages = cov(A),得到的协方差矩阵为n*n的。
3:计算covImages的特征值和特征向量,利用命令[V, D] = eig(covImages),这样直接把covImages的特征向量和特征值放在了V和D中,由于covImages是一个对称矩阵,所以D中的对角线元素师按照从小到大的,而我们PCA要的是特征值较大的那个,所以为了取得方便,我们做如下变换D = flipud(diag(D)),同时V = fliplr(V)。此时D是一个n*1的矩阵,从上到下按照从打到小排列的,V是其中与D中每一个值对应的特征向量。根据PCA的定义,我们取最大特征值对应的特征向量也就是eigenFace = V(,:1)作为特征脸(主成分方向就是特征脸)
4:计算人脸在特征脸上的投影,由于这个人有10副图,任意选一个都可以来计算投影,我们选择第一个吧,记firstFace = A(:,1)-meanA,来计算first
Face在投影上的一个权重Weight=eigenFace'*meanA'。
5:以上过程可以叫做是我们叫做人脸识别的学习阶段,主要就是为了获取每一个人的Weight。
6:新来一副图片,让这个图片分别减去所以学习到的meanA,然后计算在对应eigenFace上的投影权重Weight-i,比较Weight-i与所有Weight的欧氏距离,选取最近的或者一定阈值范围内的即可。
1:计算A的没列的平均值meanA矩阵,这个矩阵的大小是1*n的。
2:计算A的协方差矩阵,直接利用matlab的命令covImages = cov(A),得到的协方差矩阵为n*n的。
3:计算covImages的特征值和特征向量,利用命令[V, D] = eig(covImages),这样直接把covImages的特征向量和特征值放在了V和D中,由于covImages是一个对称矩阵,所以D中的对角线元素师按照从小到大的,而我们PCA要的是特征值较大的那个,所以为了取得方便,我们做如下变换D = flipud(diag(D)),同时V = fliplr(V)。此时D是一个n*1的矩阵,从上到下按照从打到小排列的,V是其中与D中每一个值对应的特征向量。根据PCA的定义,我们取最大特征值对应的特征向量也就是eigenFace = V(,:1)作为特征脸(主成分方向就是特征脸)
4:计算人脸在特征脸上的投影,由于这个人有10副图,任意选一个都可以来计算投影,我们选择第一个吧,记firstFace = A(:,1)-meanA,来计算first
Face在投影上的一个权重Weight=eigenFace'*meanA'。
5:以上过程可以叫做是我们叫做人脸识别的学习阶段,主要就是为了获取每一个人的Weight。
6:新来一副图片,让这个图片分别减去所以学习到的meanA,然后计算在对应eigenFace上的投影权重Weight-i,比较Weight-i与所有Weight的欧氏距离,选取最近的或者一定阈值范围内的即可。