程序中采用的数据集是ORL人脸库,该人脸库共有400副人脸图像,40人,每人10幅,大小为112*92像素,同一个人的表情,姿势有少许变化。

程序的流程主要分为三部分,数据的预处理(PCA降维和规格化),数据的训练阶段,数据的识别阶段

数据的预处理的流程图如下:

数据的训练流程图如下:

识别流程:

下面贴上一些matlab的实现代码:

数据预处理主要是两个函数,ReadFaces和scaling,第一个函数是将训练图像存成一个200*10304的矩阵,第二个是对数据进行规格化,具体代码如下:

function [imgRow,imgCol,FaceContainer,faceLabel] = ReadFaces(nFacesPerson,nPerson,bTest)

%nFacesPersonn-----每个人需要读入的样本数,默认为5

%nPerson     ------需要读入的人数,默认为全部四十个人

%bTest       ------bool型参数。默认为0,表示读入样本前五张;1:表示后五张





%输出:  FaceContainer------向量化人脸容器,nPerson*10304的二维矩阵,每行对应一个人脸向量





if nargin==0    %默认值   

    nFacesPerson = 5;

    nPerson      = 40;

    bTest        = 0;

elseif nargin<3

    bTest        = 0;

end





img=imread('PCA_face/data/ORL/s1_1.bmp')  %为计算尺寸先读一张

[imgRow,imgCol]=size(img);





FaceContainer = zeros(nFacesPerson*nPerson,imgRow*imgCol);

facelabel     = zeros(nFacesPerson*nPerson,1);





%读入训练数据

for i=1:nPerson     %不同的人

    i1=mod(i,10);

    i0=char(i/10);

    strPath='PCA_face/data/ORL/s';

    if(i0~=0)

        strPath=strcat(strPath,'0'+i0);

    end

    strPath=strcat(strPath,'0'+i1);

    strPath=strcat(strPath,'_');

    tempStrPath=strPath;

    for j=1:nFacesPerson      %每一个人的前五张

        strPath=tempStrPath;

        if bTest==0

            strPath=strcat(strPath,'0'+j);

        else

            strPath=strcat(strPath,num2str(5+j));

        end

        

        strPath = strcat(strPath,'.bmp');

        img=imread(strPath);

        

        %把读入的图像按列存储为行向量放入向量化人脸容器FaceContainer的对应行中

        FaceContainer((i-1)*nFacesPerson+j,:)= img(:)';

        faceLabel((i-1)*nFacesPerson+j)      = i;

    end

end

%保存人脸样本矩阵

save('PCA_face/Mat/FaceMat.mat','FaceContainer');

function [ SVFM, lowVec,upVec ] = scaling( VecFeaMat,bTest,lRealBVec,uRealBVec)

% Input:  VecFeaMat --- 需要scaling的 m*n 维数据矩阵,每行一个样本特征向量,列数为维数

%         bTest ---  =1:说明是对于测试样本进行scaling,此时必须提供 lRealBVec 和 uRealBVec

%                       的值,此二值应该是在对训练样本 scaling 时得到的

%                    =0:默认值,对训练样本进行 scaling

%         lRealBVec --- n维向量,对训练样本 scaling 时得到的各维的实际下限信息

%         uRealBVec --- n维向量,对训练样本 scaling 时得到的各维的实际上限信息

%

% output: SVFM --- VecFeaMat的 scaling 版本

%         upVec --- 各维特征的上限(只在对训练样本scaling时有意义,bTest = 0)

%         lowVec --- 各维特征的下限(只在对训练样本scaling时有意义,bTest = 0)

if nargin<2

    bTest=0;

end





lTargB=-1;

uTargB=1;





[m n] = size(VecFeaMat);





if   bTest

    if nargin<4

        error('to do scaling on test,param must 4');

    end

    

    if nargout>1

        error('when do scaling ,only one output is supported');

    end

    

    for iCol = 1:n

        if  lRealBVec(iCol)==uRealBVec(iCol)

            SVFM(:,iCol) = uRealBVec(iCol);

            SVFM(:,iCol) = 0;

        else

            SVFM(:,iCol) = lTargB  +  ( VecFeaMat(:,iCol) - lRealBVec(iCol) ) / ( uRealBVec(iCol) - lRealBVec(iCol) ) * ( uTargB - lTargB );

        end

    end

else                %bTest  = 0

    upVec = zeros(1,n);

    lowVec= zeros(1,n);

    

    for iCol = 1:n

        lowVec(iCol) = min( VecFeaMat(:,iCol) );

        upVec(iCol)  = max( VecFeaMat(:,iCol) );

        

        if lowVec(iCol) == upVec(iCol)

            SVFM(:,iCol) = upVec(iCol);

            SVFM(:,iCol) = 0;

        else

            SVFM(:,iCol) = lTargB  +  ( VecFeaMat(:,iCol) - lowVec(iCol) ) / ( upVec(iCol) - lowVec(iCol) ) * ( uTargB - lTargB );

        end

    end

end



end

训练阶段的函数是train,代码如下:

function train()

%整个训练过程包括读入图像,PCA降维以及多类SVM训练,各个阶段的处理结果分别保存至文件:

%   将PCA变换矩阵W保存至 PCA_face\Mat\PCA.mat

%   将scaling的各维上下界信息保存至 PCA_face\Mat\scaling.mat

%   将PCA降维并且scaling后的数据保存至 PCA_face\Mat\trainData.mat

%   将多类SVM的训练信息保存至 PCA_face\Mat\multiSVMTrain.mat





global imgRow;

global imgCol;



global W

display('');

display('');

display('训练开始.....');





nPerson = 40;

nFacesPerson = 5;

nSplPerClass=zeros(1,nPerson);

display('读入人脸数据');

[ imgRow, imgCol, FaceContainer, faceLabel] = ReadFaces(nFacesPerson, nPerson);

save('PCA_face\Mat\FaceMat.mat','FaceContainer');

display('..................');





nFaces = size(FaceContainer, 1);%样本人脸数目





display('PCA降维...');





[pcaFaces, W] = fastPCA(FaceContainer, 20);





%pcaFaces是200*20的矩阵,每一行代表一张主成分脸

%W是分离变换矩阵, 10304*20的矩阵





visualize_pc(W);

display('............');





X=pcaFaces;

[X,A0,B0] = scaling(X);

save('PCA_face\Mat\scaling.mat','A0','B0');





%保存scaling的数据至trainData.mat

TrainData = X;

trainLabel = faceLabel;

save('PCA_face\Mat\trainData.mat','TrainData','trainLabel');

display('.........保存scaling的数据至trainData.mat..........');





for iPerson = 1:nPerson

    nSplPerClass(iPerson) = sum((trainLabel == iPerson));

end





multiSVMStruct = multiSVMTrain (TrainData, nSplPerClass, nPerson, Inf, 1);

display('正在保存训练结果.....');





save('PCA_face\Mat\multiSVMTrain.mat','multiSVMStruct');





display('训练结束.................');



end

识别阶段的函数是

function class = SVMClassify(TestFace, multiSVMStruct)



%class  ------识别出的类别

%TestFace------测试图像转换的行向量经过降维后的1*20的行向量,并经过规定化到-1~+1之间

%multiSVMStruct结构体数组,保存了两两分类的svm结构体信息

if nargin<2

    t = dir('PCA_face\Mat\multiSVMTrain.mat');

    if length(t) == 0

        error('没有找到训练结果');

    end

    load('PCA_face\Mat\multiSVMTrain.mat');

end





%nClass = multiSVMStruct.nClass;

nClass=40;

%CASVMStruct = multiSVMStruct.CASVMStruct;

CASVMStruct = multiSVMStruct;

%%%%%投票策略解决多类问题





m = size(TestFace, 1);

Voting = zeros(m,nClass);





for iIndex = 1:nClass-1

    for jIndex = iIndex+1:nClass

        classes = svmclassify(CASVMStruct{iIndex}{jIndex},TestFace);

        

        %voting

        

        Voting(:,iIndex) = Voting(:,iIndex) + (classes==1);

        Voting(:,jIndex) = Voting(:,jIndex) + (classes==0);

    end

end





%decision by voting

[vecMaxValue, class] = max(Voting, [ ] , 2);









end

基于PCA和SVM的人脸识别的更多相关文章

  1. 基于PCA和SVM的人脸识别系统-error修改

    ------------------------------------------------- Undefined function or variable 'W'. Error in class ...

  2. opencv基于PCA降维算法的人脸识别

    opencv基于PCA降维算法的人脸识别(att_faces) 一.数据提取与处理 # 导入所需模块 import matplotlib.pyplot as plt import numpy as n ...

  3. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  4. 关于运行“基于极限学习机ELM的人脸识别程序”代码犯下的一些错误

    代码来源 基于极限学习机ELM的人脸识别程序 感谢文章主的分享 我的环境是 win10 anaconda Command line client (version 1.6.5)(conda 4.3.3 ...

  5. C#实现基于ffmepg加虹软的人脸识别

    关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenCV ...

  6. C#实现基于ffmpeg加虹软的人脸识别demo及开发分享

    对开发库的C#封装,屏蔽使用细节,可以快速安全的调用人脸识别相关API.具体见github地址.新增对.NET Core的支持,在Linux(Ubuntu下)测试通过.具体的使用例子和Demo详解,参 ...

  7. C#实现基于ffmpeg加虹软的人脸识别

    关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸 识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenC ...

  8. 基于Dlib、OpenCV开发人脸识别程序的开发建议

    前言 在去年十月的时候参加了一个小比赛,做了一个人脸识别程序并很意外地获得省里面的一等奖,视频演示链接在这里,有同学想要做这方面的毕业设计or课程设计,发一篇博客来分享一下当时的开发过程. 视频演示链 ...

  9. 基于Python与命令行人脸识别项目(系列一)

    Face Recognition 人脸识别 摘要:本项目face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,方便大家使用.对于本项目可以使用 ...

随机推荐

  1. 你需要知道的九大排序算法【Python实现】之归并排序

    四.归并排序 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并过程:比 ...

  2. Docker远程访问get(root)shell姿势

    0x00 概述 在用swarm来管理dockers容器集群时默认开启了2375端口,通过远程访问docker run -H tcp://ip:2375 $command 可任意执行docker命令.这 ...

  3. 【iOS开发之C语言】sprintf,strncpy,strcmp三个函数的区别

    strncpy 这个函数用于将源字符串的内容拷贝到目标字符串,会覆盖掉目标字符串的之前内容 ] = "love"; char str2[] = "cool"; ...

  4. Draggable(拖动)组件

    一.加载方式 //class 加载方式 <div id="box" class="easyui-draggable" style="width: ...

  5. Ajax (jquery)实现智能提示搜索框(in Django)

    搜索框输入搜索名字,从数据库中筛选名字, 如果有包含输入的字母的名字则以json格式返回并且显示在搜索框下:          html文件: <!DOCTYPE html> <ht ...

  6. HTML5框架、背景和实体、XHTML的使用规范

    HTML5框架 cols :竖排 rows:横排,frameset frame已弃用  iframe仍保留使用.用法: Target属性: HTML5实体 XHTML的使用规范

  7. Hyper-v虚拟机上网

    Windows 8中内置的Hyper-V管理器可以说给许多人带来了惊喜!在Hyper-V管理器强大的同时,也同样面临着设置中一些不可避免的麻烦.有人说,Hyper-V虚拟机联网麻烦,其实,只要掌握了技 ...

  8. (转)SQL Server 2008将数据导出为脚本 [SQL Server]

    之前我们要将一个表中的数据导出为脚本,那么只有在网上找一个导出数据的Script,然后运行就可以导出数据脚本了.现在在SQL Server 2008的Management Studio中增加了一个新特 ...

  9. 关于textbox.attributes["value"]的问题

    在“修改”时,出现这个问题,后台点击修改时,应该是文本框出现一些初始值 BLL.manager bll = new BLL.manager(); Model.manager model = bll.G ...

  10. 根据控件Id得到控件

    在做动态获取控件时,时常需要根据Id得到控件,并对该控件进行操作,此时用 /// <summary>        /// 根据控件id得到控件        /// </summa ...