特征脸(Eigenfaces)

我们给的图像表达的问题在于它的高维度性。一个二维的pxq的灰度图像扩展到一个m=pq维的向量空间,所以对一个100X100像素的图像来说,已经有一个10000维的图像空间了。这对于任何计算来说都是太多了,但是所有的维度对我们来说都是有用的吗?只有在数据上有一些变化时,我们才能做出决定。所以我们要寻找的是占最多信息的部分。Karl Pearson于1901年独立地提出主元素分析(Principal Component Analysis),Harold Hotelling将一个可能的相关变量集合降到一个更小的不相关变量的集合。高维的数据集经常描述为相关变量,因此只有一些有意义的维度占据了信息的绝大大部分。PCA方法寻找数据中方差最大的方向,称为主元素。
算法描述:
假设 X={x1,x2,...,xn} 是一个随机变量, xiRd
以下每个人脸图像对应一个 X 中的一列。
这里写图片描述

  1. 计算均值
    μ=1ni=1nx2i

    以下图像为上述25张图像的平均值,也就是平均脸。
    这里写图片描述

    • 计算协方差矩阵 S

      S=1ni=1n(xiμ)(xiμ)T

    • 计算 S 的特征值λi和特征向量 νi

      Sνi=λiνi,i=1,2,...,n

    • 根据他们的特征值将特征向量递减排序。 k 个主成分即为对应着k个最大的特征值的特征向量。
    • 然后,向量 x k个主成分通过以下式子给出:

      y=WT(xμ)
      ,其中 W=(ν1,ν2,...,νk) . 从PCA基进行重建由下式给出:
      x=Wy+μ

      我们来推导一下这个关系,对 y=WT(xμ) 两侧同乘以 WT)1 即为 (WT)1y=xμ ,将 μ 移到右侧,即得
      x=(WT)1y+μ

      因为 W S的特征向量组成的矩阵,因为特征向量是正交的,所以矩阵 W 是正交矩阵。因为正交矩阵的转置等于正交矩阵的逆,即WT=W1,得 (WT)1=W 。(注:此处的证明不确定是正确的)
      特征脸方法通过以下步骤进行人脸识别:
      1. 将所有的训练图像数据映射到PCA子空间。
      2. 将查询图像数据映射到PCA子空间。
      3. 在映射的训练图像和查询图像之间找到最近的一个。
      至此仍然有一个问题没有解决。假设我给出了400副图像,每副图像的大小为100X100像素。主元素分析要求解协方差矩阵 S=XXT ,其中在我们的例子中 size(X)=10000×400 。你需要处理 10000×10000 的矩阵,大约为 0.8GB 。很显然这是不可行的,所以我们用了一些小伎俩。从线性代数中我们知道一个 M×N 的矩阵,其中 M>N ,只有 N1 个非零特征值。所以可以对 S=XTX 替代 S=XTX 进行特征值分解:
      XTXνi=λiνi

      对上式左乘一个矩阵X得到 S=XTX 的初始特征向量:
      XXT(Xνi)=λi(Xνi)

      生成的特征向量是正交的,为了得到正交特征向量他们需要被归一化到单位长度。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
% 导入库 import matlab.io.* % 预先定义好的6张图片数据(灰度值) img1 = imresize(rgb2gray(imread('1.bmp')), [64, 64]); img2 = imresize(rgb2gray(imread('6.bmp')), [64, 64]); img3 = imresize(rgb2gray(imread('11.bmp')), [64, 64]); img4 = imresize(rgb2gray(imread('16.bmp')), [64, 64]); faceData = [ img1(:), img2(:), img3(:), img4(:)]; % 定义为一个矩阵 % 计算平均脸 meanFace = mean(faceData, 2); % 减去平均脸 F = double(faceData) - repmat(meanFace, [1, 4]); % 计算协方差矩阵 juzhen = cov(double(F')); % 使用 eig 函数计算特征值和特征向量 [eigVectors, eigValues] = eig(juzhen); % 将特征值从大到小排序,并获取对应的索引 [~, sortedIndices] = sort(diag(eigValues), 'descend'); % 根据排序后的索引重新排列特征向量 sortedEigVectors = eigVectors(:, sortedIndices); % 计算特征脸 eigenFaces = F .* sortedEigVectors(:,1:4); % K-L变换,基于PCA kLTransformedData = eigenFaces' * F; % 新的待识别的图像 testImage = imresize(rgb2gray(imread('wukong.jpg')), [64, 64]); testImageData = testImage(:); % 减去平均脸 F2 = double(testImageData) - meanFace; % 应用K-L变换 kLTransformedTestImage = eigenFaces' * F2; % 计算欧氏距离 distances = sqrt(sum((kLTransformedData - repmat(kLTransformedTestImage, 1, size(kLTransformedData, 2))).^2, 1)); % 设定阈值 threshold = 0.5 * max(distances); if any(distances < threshold) % 该图片更接近 "人脸" 类别 disp('该图像被认定为人脸!'); else % 该图片更接近 "非人脸" 类别 disp('该图像不是人脸!'); end 在上述代码中加入该要求从网上下载人脸数据集,构建人来训练和测试数据库;并给我代码
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值