Hello Mat

 找回密码
 立即注册
查看: 6370|回复: 0

基于PCA和奇异值分解SVD的人脸识别

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2018-1-9 22:23:13 | 显示全部楼层 |阅读模式
基于PCA和奇异值分解SVD的人脸识别
视频链接:https://pan.baidu.com/s/1pMCsJFl
录制的视频是算法底层原理讲解,底层代码实现,方便大家真正掌握算法实质,开发出更加出色的算法。录制视频的初衷是:避免读者朋友利用大把时间学习已有常见算法,本系列视频旨在让读者朋友快速深入了解这些常见算法原理,有更多的时间去研究更加高大上算法(价值)。

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

运行环境:win7+32bit+matlab2014a

       SVD分解提取图像的主要成分,主要根据图像的奇异值相关,一般根据图像的熵来进行选取SVD的奇异值个数,根据选择的奇异值k值个数,再进行PCA分析。
       矩阵分解后较大的奇异值代表了原矩阵的主要信息,而较小的奇异值反映其细节信息,根据奇异值的这一性质,通过选取较大的k个奇异值组成新的成分集Skxk。就可以在误差允许范围内近似还原矩阵的主要信息:Imxn = Umxk* Skxk * Vkxn     (1)
      因为奇异值从大到小依次排列,所以选取的k个奇异值即为前k个奇异值。
      据奇异值分解重建背景的具体步骤如下:
1)对原图像I的像素矩阵进行SVD处理,计算正交阵UV、奇异值矩阵S
2)保留S中选取的k个用于重建背景的有效奇异值,其余置零,得到新奇异值矩阵S
3)根据得到的新奇异值矩阵S和式(1)进行背景重建,得到重建的背景。
4)原图像与背景图像的差则就是无效成分;
        采用最大熵算法确定奇异值个数:

基于最大熵的有效奇异值分解算法,能够较好的滤除图像椒盐噪点,使得图像变得更加平滑。
  1. clc,clear,close all
  2. warning off
  3. path = './ORL92112/bmp/';
  4. if(exist('ORL92112.mat'))
  5.     load('ORL92112.mat')
  6. else
  7.     k1 = 1; k2=1;
  8.     for i=1:40
  9.         paths = [path, 's', num2str(i),'/'];
  10.         for j=1:10
  11.             im = imread([paths, num2str(j), '.BMP']);
  12.             if(mod(j,2))  % train
  13.                 trainImages2D(:,:,k1) = im;
  14.                 trainImages1D(:,k1) = im(:);
  15.                 trainLabels(k1) = i;
  16.                 k1=k1+1;
  17.             else      % test
  18.                 testImages2D(:,:,k2) = im;
  19.                 testImages1D(:,k2) = im(:);
  20.                 testLabels(k2) = i;
  21.                 k2=k2+1;
  22.             end
  23.         end
  24.     end
  25.     save ORL92112.mat trainImages2D trainImages1D trainLabels testImages2D testImages1D testLabels
  26. end
  27. %% SVD图像分解计算
  28. % 测试一张图像
  29. TestImage = testImages2D(:,:,2);  % 选择一张图像
  30. [U,S,V] = svd( double(TestImage) );
  31. k = 50;  % 前k个奇异值
  32. for i=k:min(size(S,1), size(S,2))
  33.     S(i,i) = 0;
  34. end
  35. SVDImage = uint8( U*S*V' );
  36. ErrImage = TestImage-SVDImage;
  37. % figure,
  38. % subplot(311), imshow(TestImage,[])
  39. % subplot(312), imshow(SVDImage,[])
  40. % subplot(313), imshow(ErrImage,[])

  41. %% 最大熵
  42. [U,S,V] = svd( double(TestImage) );
  43. lamda = diag(S);  % 奇异值
  44. for k=1:min(size(S,1), size(S,2))-2
  45.     pB= sum( lamda(1:k) ) ./ sum(lamda);
  46.     pE = 1-pB;
  47.     Xk = -pB*log(pB+eps);
  48.     Yk = -pE*log(pE+eps);
  49.     Hk(k) = (Xk+Yk)./(Xk.^2+Yk.^2+eps);
  50. end
  51. % 首尾两点直线
  52. x1 = 1;           y1 = Hk(1);
  53. x2 = length(Hk);  y2 = Hk(end);
  54. kline = (y2-y1)./(x2-x1+eps);
  55. for i=1:length(Hk)
  56.     dist(i) = abs( kline*(i-x1)+y1-Hk(i) )./ sqrt(kline^2+1);
  57. end
  58. [indexa,indexb] = max(dist);
  59. figure,
  60. plot(Hk,'b.-','linewidth',2)
  61. hold on
  62. plot([x1,x2],[y1,y2],'r-');
  63. plot(indexb, Hk(indexb), 'ro')
  64. hold off;
  65. xlabel('奇异值个数'); ylabel('熵值');

  66. % 测试一张图像
  67. TestImage = testImages2D(:,:,2);  % 选择一张图像
  68. [U,S,V] = svd( double(TestImage) );
  69. k = indexb;  % 前k个奇异值
  70. for i=k:min(size(S,1), size(S,2))
  71.     S(i,i) = 0;
  72. end
  73. SVDImage = uint8( U*S*V' );
  74. ErrImage = TestImage-SVDImage;
  75. figure,
  76. subplot(311), imshow(TestImage,[])
  77. subplot(312), imshow(SVDImage,[])
  78. subplot(313), imshow(ErrImage,[])

  79. %% SVD+PCA
  80. for i=1:size(trainImages2D, 3)
  81.     im = trainImages2D(:,:,i);
  82.     [SVDImage, ErrImage] = SVD_entropy(im);
  83.     trainImages1D_SVD(:,i) = SVDImage(:);
  84. end
  85. %% 特征脸计算
  86. numEigs = 199;   % 特征向量个数
  87. [meanFace, WhiteFace, Eigenfaces] = EigenfaceCore(trainImages1D_SVD, numEigs);
  88. %% 测试图像
  89. TestImage = testImages2D(:,:, 3);  % 选择一张图像
  90. [TestImage_SVD, ErrImage] = SVD_entropy(TestImage);
  91. Recognized_index = Face_Recognition(TestImage_SVD, meanFace, WhiteFace, Eigenfaces);
  92. SelectedImage = trainImages2D(:,:,Recognized_index);
  93. figure,
  94. subplot(121),imshow(TestImage,[]); title('测试图像')
  95. subplot(122),imshow(SelectedImage,[]); title('识别匹配图像')
  96. %% 遍历
  97. for i=1:size(testImages2D,3)
  98.     TestImage = testImages2D(:,:, i);  % 选择一张图像
  99.     [TestImage_SVD, ErrImage] = SVD_entropy(TestImage);
  100.     Recognized_index = Face_Recognition(TestImage_SVD, meanFace, WhiteFace, Eigenfaces);
  101.     testSimu(1,i) = Recognized_index;
  102. end
  103. accuracy = AccCompute( testSimu, testLabels );
  104. disp(['测试精度:  ',num2str(accuracy)])
复制代码
程序识别精度:0.9










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-11-22 16:31 , Processed in 0.216081 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表