导航:首页 > 编程语言 > 人脸检测算法和代码

人脸检测算法和代码

发布时间:2023-05-18 17:50:42

① 人脸图像识别算法

人脸识别三大经典算法,分别为:特征脸法(Eigenface)、局部二值模式(LocalBinaryPatterns,LBP)、Fisherface算法。
特征脸技术是近期发展起来的用于人脸或者一般性刚体识别以及其它涉及到人脸处理的一种方法。使用特征脸进行人脸识别的方法首先由陪歼贺Sirovich和Kirby(1987)提出(《Low-》),并由MatthewTurk和AlexPentland用于人脸分类(《改运Eigenfacesforrecognition》)。
首先芦派把一批人脸图像转换成一个特征向量集,称为“Eigenfaces”,即“特征脸”,它们是最初训练图像集的基本组件。识别的过程是把一副新的图像投影到特征脸子空间,并通过它的投影点在子空间的位置以及投影线的长度来进行判定和识别。

② 人脸识别的算法

1、人体面貌识别技术的内容
人体面貌识别技术包含三个部分:
(1) 人体面貌检测
面貌检测是指在动态的场景与复杂的背景中判断是否存在面像,并分离出这种面像。一般有下列几种方法:
①参考模板法
首先设计一个或数个标准人脸的模板,然后计算测试采集的样品与标准模板之间的匹配程度,并通过阈值来判断是否存在人脸;
②人脸规则法
由于人脸具有一定的结构分布特征,所谓人脸规则的方法即提取这些特征生成相应的规则以判断测试样品是否包含人脸;
③样品学习法
这种方法即采用模式识别中人工神经网络的方法,即通过对面像样品集和非面像样品集的学习产生分类器;
④肤色模型法
这种方法是依据面貌肤色在色彩空间中分布相对集中的规律来进行检测。
⑤特征子脸法
这种方法是将所有面像集合视为一个面像子空间,并基于检测样品与其在子孔间的投影之间的距离判断是否存在面像。
值得提出的是,上述5种方法在实际检测系统中也可综合采用。
(2)人体面貌跟踪
面貌跟踪是指对被检测到的面貌进行动态目标跟踪。具体采用基于模型的方法或基于运动与模型相结合的方法。
此外,利用肤色模型跟踪也不失为一种简单而有效的手段。
(3)人体面貌比对
面貌比对是对被检测到的面貌像进行身份确认或在面像库中进行目标搜索。这实际上就是说,将采样到的面像与库存的面像依次进行比对,并找出最佳的匹配对象。所以,面像的描述决定了面像识别的具体方法与性能。目前主要采用特征向量与面纹模板两种描述方法:
①特征向量法
该方法是先确定眼虹膜、鼻翼、嘴角等面像五官轮廓的大小、位置、距离等属性,然后再计算出它们的几何特征量,而这些特征量形成一描述该面像的特征向量。
②面纹模板法
该方法是在库中存贮若干标准面像模板或面像器官模板,在进行比对时,将采样面像所有象素与库中所有模板采用归一化相关量度量进行匹配。
此外,还有采用模式识别的自相关网络或特征与模板相结合的方法。
人体面貌识别技术的核心实际为“局部人体特征分析”和“图形/神经识别算法。”这种算法是利用人体面部各器官及特征部位的方法。如对应几何关系多数据形成识别参数与数据库中所有的原始参数进行比较、判断与确认。一般要求判断时间低于1秒。
2、人体面貌的识别过程
一般分三步:
(1)首先建立人体面貌的面像档案。即用摄像机采集单位人员的人体面貌的面像文件或取他们的照片形成面像文件,并将这些面像文件生成面纹(Faceprint)编码贮存起来。
(2)获取当前的人体面像
即用摄像机捕捉的当前出入人员的面像,或取照片输入,并将当前的面像文件生成面纹编码。
(3)用当前的面纹编码与档案库存的比对
即将当前的面像的面纹编码与档案库存中的面纹编码进行检索比对。上述的“面纹编码”方式是根据人体面貌脸部的本质特征和开头来工作的。这种面纹编码可以抵抗光线、皮肤色调、面部毛发、发型、眼镜、表情和姿态的变化,具有强大的可靠性,从而使它可以从百万人中精确地辩认出某个人。
人体面貌的识别过程,利用普通的图像处理设备就能自动、连续、实时地完成。

③ 人脸识别算法的简介

人脸识别(Facial Recognition),就是通过视频采集设备获取用户的面部图像,再利用核心的算法对其脸部的五官位置、脸型和角度进行计算分析,进而和自身数据库里已有的范本进行比对,后判断出用户的真实身份。人脸识别技术基于局部特征区域的单训练样本人脸识别方法。第一步,需要对局部区域进行定义;第二步,人脸局部区域特征的提取,依据经过样本训练后得到的变换矩阵将人脸图像向量映射为人脸特征向量;第三步,局部特征选择(可选);后一步是进行分类。分类器多采用组合分类器的形式,每个局部特征 对应一个分类器,后可空歼用投票或线性加权等方式得到终识别结果。 人脸识别综合运用了数字图像/视频处理、模式识别、计算机视觉等多种技术,核心技 术是人脸识别算法。目前人脸识别的算法有 4 种:基于人脸特征点的识别算法、基于整幅 人脸图像的识别算法、基于模板的识别算法、利用神经网络进行识别的算法。
作为人脸识别的第一步,人脸检测所进行的工作是将人脸从图像背景中检测出来,由于受图像背景、亮度变化以及人的头部姿势等因素影响使人脸检测成为一项复杂研究内容。检测定位:检测是判别一幅图像中是否存在人脸,定位则是给出人脸在图像中的位置。定位后得到的脸部图像信息是测量空间的模式,要进行识别工作,首先要将测量空间中的数据映射到特征空间中。采用主分量分析森陆方法,原理是将一高维向量,通过一个特殊的特征向量矩阵,投影到一个低维的向量空间中,表征为一个低维向量,并且仅仅损失一些次要信息。通过对经过检测和定位过的人脸图像进行特征提取操作可以达到降低图像维数,从而可以减小识别计算量,提高识别精度的作用。人脸识别斗春冲系统采用基于特征脸的主 成分分析法(PCA),根据一组人脸训练样本构造主元子空间,检测时,将测试图像投影到 主元空间上,得到一组投影系数,再和各已知的人脸图像模式比较,从而得到检测结果。

④ 人脸识别最新的算法有哪些csdn

  1. 图像数据交换格式遵循ISO/IEC 19794-5标准算法,算法采集并识别400~500个人脸特征,兼具近红外和可见光两种识别算法

  2. 主流的人脸检测采用Adaboost学习算法,Adaboost算法是一种用来分类的方法,它把一些比较弱的分类方法合在一起,组合出新的很强的分类方法。

  3. 人脸特征点的识别算法(Feature-based recognition algorithms)

  4. 神经网络进行识别的算法(Recognition algorithms using neural network)。

⑤ matlab人脸检测步骤

步骤如下:
人脸识别 % FaceRec.m
% PCA 人脸识别修订版,识别率88%
% calc xmean,sigma and its eigen decomposition allsamples=[];%所有训练图像 for i=1:40 for j=1:5
a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); % imshow(a);
b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上 到下,从左到右 b=double(b);
allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数 据代表一张图片,其中M=200 end end
samplemean=mean(allsamples); % 平均图片,1 × N
for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M × N 矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片” end;
% 获取特征值及特征向量
sigma=xmean*xmean'; % M * M 阶矩阵 [v d]=eig(sigma); d1=diag(d);
% 按特征值大小以降序排列 dsort = flipud(d1); vsort = fliplr(v);
%以下选择90%的能量 dsum = sum(dsort); dsum_extract = 0; p = 0;
while( dsum_extract/dsum < 0.9) p = p + 1;
dsum_extract = sum(dsort(1:p)); end i=1;
% (训练阶段)计算特征脸形成的坐标系
base = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2)); % base 是N×p 阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1) % 详见《基于PCA 的人脸识别算法研究》p31
% xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程 %while (i<=p && dsort(i)>0)
% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以dsort(i)^(1/2) 是对人脸图像的标准化(使其方差为1)
% 详见《基于PCA 的人脸识别算法研究》p31
% i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特 征向量转换的过程 %end
% 以下两行add by gongxun 将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor allcoor = allsamples * base; % allcoor 里面是每张训练人脸图片在M*p 子空间中的一个点, 即在子空间中的组合系数,
accu = 0; % 下面的人脸识别过程中就是利用这些组合系数来进行识别
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
% 测试过程 for i=1:40
for j=6:10 %读入40 x 5 副测试图像
a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); b=a(1:10304); b=double(b);
tcoor= b * base; %计算坐标,是1×p 阶矩阵 for k=1:200
mdist(k)=norm(tcoor-allcoor(k,:)); end;
%三阶近邻
[dist,index2]=sort(mdist);
class1=floor( (index2(1)-1)/5 )+1; class2=floor((index2(2)-1)/5)+1; class3=floor((index2(3)-1)/5)+1; if class1~=class2 && class2~=class3 class=class1;
elseif class1==class2 class=class1;
elseif class2==class3 class=class2; end;
if class==i accu=accu+1; end; end; end;
accuracy=accu/200 %输出识别率
特征人脸 % eigface.m
function [] = eigface()
% calc xmean,sigma and its eigen decomposition allsamples=[];%所有训练图像 for i=1:40 for j=1:5
a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); % imshow(a);
b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上 到下,从左到右 b=double(b);
allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数 据代表一张图片,其中M=200 end end
samplemean=mean(allsamples); % 平均图片,1 × N
for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M × N 矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片” end;
% 获取特征值及特征向量
sigma=xmean*xmean'; % M * M 阶矩阵 [v d]=eig(sigma); d1=diag(d);
% 按特征值大小以降序排列
dsort = flipud(d1); vsort = fliplr(v);
%以下选择90%的能量 dsum = sum(dsort); dsum_extract = 0; p = 0;
while( dsum_extract/dsum < 0.9) p = p + 1;
dsum_extract = sum(dsort(1:p)); end p = 199;
% (训练阶段)计算特征脸形成的坐标系 %while (i<=p && dsort(i)>0)
% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以
dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA 的人脸识别算法研究》p31 % i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩 阵特征向量转换的过程 %end
base = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2)); % 生成特征脸 for (k=1:p),
temp = reshape(base(:,k), 112,92); newpath = ['d:\test\' int2str(k) '.jpg']; imwrite(mat2gray(temp), newpath); end
avg = reshape(samplemean, 112,92);
imwrite(mat2gray(avg), 'd:\test\average.jpg'); % 将模型保存
save('e:\ORL\model.mat', 'base', 'samplemean');
人脸重建
% Reconstruct.m
function [] = reconstruct() load e:\ORL\model.mat;
% 计算新图片在特征子空间中的系数 img = 'D:\test2\10.jpg' a=imread(img);
b=a(1:112*92); % b 是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下, 从左到右 b=double(b); b=b-samplemean;
c = b * base; % c 是图片a 在子空间中的系数, 是1*p 行矢量 % 根据特征系数及特征脸重建图 % 前15 个 t = 15;
temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';
imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t1.jpg'); % 前50 个 t = 50;
temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';
imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t2.jpg'); % 前10
t = 100;
temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';
imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t3.jpg'); % 前150 个 t = 150;
temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';
imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t4.jpg'); % 前199 个 t = 199;
temp = base(:,1:t) * c(1:t)'; temp = temp + samplemean';
imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t5.jpg')

⑥ 求个MATLAB大神来帮忙解释下,这段人脸检测的代码是基于什么样的算法原理实现的。

这段程序是基于Viola-Jones 算法检测人脸、鼻子、眼睛的,其过程是先用faceDetector = vision.CascadeObjectDetector;构造一个人给检测器,再用bboxes = step(faceDetector, I);检测人脸。

⑦ 人脸识别算法是指什么

教程操作环境:windows7系统、Dell G3电脑。
人脸识别(Facial Recognition),就是通过视频采集设备获取用户的面部图像,再利用核心的算法对其脸部的五官位置、脸型和角度进行计算分析,进而和自身数据库里已有的范本进行比对,后判断出用户的真实身份。
人脸识别算法是指在检测到人脸并定位面部关键特征点之后,主要的人脸区域就可以被裁剪出来,经过预处理之后,馈入后端的识别算法。识别算法要完成人脸特征的提取,并与库存的已知人脸进行比对,完成最终的分类。
人脸识别的算法有 4 种:基于人脸特征点的识别算法、基于整幅 人脸图像的识别算法、基于模板的识别算法、利用神经网络进行识别的算法。

人脸识别算法的原理:
系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
人脸识别的三个经典算法
1、Eigenfaces(特征脸)算法

Eigenfaces是在人脸识别的计算机视觉问题中使用的一组特征向量的名余滑举称,竖碧Eigenfaces是基于PCA(主成分分析)的,所以学习Eigenfaces需要我们了解PCA的原理。
基本思想
主成分分析(PCA)是一种矩阵的压缩算法,在减少矩阵维数的同时尽可能的保留原矩阵的信息,简单来说就是将 n×m的矩阵转换成n×k的矩阵,仅保留矩阵中所存在的主要特性,从而可以大大节省空间和数据量。PCA的实现需要进行降维,也就是将矩阵进行变换,从更高的维度降到低的维度,然而PCA的降维离不开协方差矩阵。方差是描述一维数据样本本身相对于均值的偏离程度,是一种用来度量两个随机变量关系的统计量,从角度来说,其夹角越小,值越大,方向越相近,也就是越正相关。协方差矩阵度量除了是两个随机变量的关系外,还是维度与维度之间的关系,而非样本与样本之间的关系。
学习一种新的东西,尤其是知识,我们需要了解知识中的思想。我在了解和学习Eigenface算法时它的思想是图像识别首先要选择一个合适的子空间,将所有的图像集中到这个子空间中,然后在这个子空间中衡量相似性或者进行分类学习,再讲子空间变换到另一个空间中,这样的作用一是同一个类别的图像离得更近,二是不同的类别的图像会离得比较远;这样经过线性分类分开的图像在新空间就能容易分开。同时特征脸技术会寻找人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以此来表征人脸图像。人脸图像的基本元素有很多,比如眼、面颊、唇等基本元素,这些特征向量在特征脸的图像空间中对应生成的子空间被称为子脸空间。
生成了子空间之后就要进行空间构造,那么如何进行空间构造呢?首先要寻找人脸的共性,其次是要寻找个体与共性的差异,还有就是要明白共性其实是空间,个体就是向量。利用协方差矩阵把目标集中所有人脸图像的特征值进行分解,得到对应的特征向量,这些特征向量就是“特征脸”。寻找特征向量的特性,将其进行线性组合。在以每一个特征子脸为基的空间,每个人脸就是一个点,这个点的坐标就是每一个人脸在每个特征基下的的投影坐标。
Eigenfaces算法过程
获得人脸图像数据,将每一个人脸图像矩阵按行串成一维,每个人脸就是一个向量;
将M个人脸在对应维度上加起来,然后求平均得到“平均脸”;
将每个图像都减去平均脸向量;
计算协方差矩阵;
运用Eigenfaces记性人脸识别;
算法实践过程;
训练图像
求出平均脸
获得特征子脸
进行图像重构
寻找相似度高的人脸图像。
2、FisherFace算法
FisherFace是Fisher线性判别在人脸识别的应用。线性判别分析(LDA)算法思想最早由英国统计与遗传学家,现代统计科学的奠让巧基人之一罗纳德*费舍尔(Ronald)提出。LDA算法使用统计学方法,尝试找到物体间特征的一个线性组合,在降维的同时考虑类别信息。通过该算法得到的线性组合可以用来作为一个线性分类器或者实现降维。
基本思想
线性判别分析的基本思想是:将高维的模式样本投影到低维最佳矢量空间,以达到抽取重要分类信息和压缩特征空间维度的效果,投影后保证模式样本在新的子空间有最大的类间距离、最小的类内距离,即模式在该空间中有最佳的可分离性。理论和特征脸里用到的Eigenfaces有相似之处,都是对原有数据进行整体降维映射到低维空间的方法,fisherfaces和Eigenfaces都是从数据整体入手而不同于LBP提取局部纹理特征。
对降维后的样本使用Fisher线性判别方法,确定一个最优的投影方向,构造一个一维的体征空间,将多维的人脸图像投影到 fisherfaces特征空间,利用类内样本数据形成一组特征向量,这组特征向量就代表了人脸的特征。
我们知道,该算法是在样本数据映射到另外一个特征空间后,将类内距离最小化,类间距离最大化。LDA算法可以用作降维,该算法的原理和PCA算法很相似,因此LDA算法也同样可以用在人脸识别领域。通过使用PCA算法来进行人脸识别的算法称为特征脸法,而使用LDA算法进行人脸识别的算法称为费舍尔脸法。
LDA和PCA相比:
相同:1、在降维的时候,两者都使用了矩阵的特征分解思想;2、两者都假设数据符合高斯分布。不同:1、LDA是有监督的降维方法,而PCA是无监督的。2、如果说数据是k维的,那么LDA只能降到(k-1)维度,而PCA不受此限制。3、从数学角度来看,LDA选择分类性能最好的投影方向,而PCA选择样本投影点具有最大方差的方向。Fisherfaces算法和Eigenfaces算法相比:
相同:两者均可以对数据进行降维;两者在降维时均使用了矩阵特征分解的思想。
不同:Fisherfaces是有监督的降维方法,而是Eigenfaces无监督的降维方法;Fisherfaces除了可以用于降维,还可以用于分类。
值得一提的是,FisherFace算法识别的错误率低于哈佛和耶鲁人脸数据库测试的Eigenfaces识别结果。
Fisherface算法流程
获得人脸图像数据,然后求出人脸的均值。
观察各个人脸的特征值。
进行人脸鉴定,观察人脸特征,判断是否是个人。
最后进行人脸识别。
3、LBPH(Local Binary Patter Histogram)算法
Local Binary Patterns Histograms即LBP特征的统计直方图,LBPH将LBP(局部二值编码)特征与图像的空间信息结合在一起。如果直接使用LBP编码图像用于人脸识别。其实和不提取LBP特征区别不大,因此在实际的LBP应用中,一般采用LBP编码图像的统计直方图作为特征向量进行分类识别。
原始的LBP算子定义为在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于或等于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理特征。
LBPH的维度: 采样点为8个,如果用的是原始的LBP或Extended LBP特征,其LBP特征值的模式为256种,则一幅图像的LBP特征向量维度为:64256=16384维,而如果使用的UniformPatternLBP特征,其LBP值的模式为59种,其特征向量维度为:6459=3776维,可以看出,使用等价模式特征,其特征向量的维度大大减少,这意味着使用机器学习方法进行学习的时间将大大减少,而性能上没有受到很大影响。
基本思想
建立在LBPH基础上的人脸识别法基本思想如下:首先以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;再将LBP图像分为个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图,通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。
LBPH算法“人”如其名,采用的识别方法是局部特征提取的方法,这是与前两种方法的最大区别。
LBPH 算法流程
LBP特征提取:根据上述的均匀LBP算子处理原始图像;
LBP特征匹配(计算直方图):将图像分为若干个的子区域,并在子区域内根据LBP值统计其直方图,以直方图作为其判别特征。
4、算法的复现代码
1)、EigenFaces算法
#encoding=utf-8
import numpy as np
import cv2
import os

class EigenFace(object):
def __init__(self,threshold,dimNum,dsize):
self.threshold = threshold # 阈值暂未使用
self.dimNum = dimNum
self.dsize = dsize

def loadImg(self,fileName,dsize):
‘‘‘
载入图像,灰度化处理,统一尺寸,直方图均衡化
:param fileName: 图像文件名
:param dsize: 统一尺寸大小。元组形式
:return: 图像矩阵
‘‘‘
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow(‘img’,retImg)
# cv2.waitKey()
return retImg

def createImgMat(self,dirName):
‘‘‘
生成图像样本矩阵,组织形式为行为属性,列为样本
:param dirName: 包含训练数据集的图像文件夹路径
:return: 样本矩阵,标签矩阵
‘‘‘
dataMat = np.zeros((10,1))
label = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+’/’+dirname):
for filename in subFilenames:
img = self.loadImg(subParent+’/’+filename,self.dsize)
tempImg = np.reshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = np.column_stack((dataMat,tempImg))
label.append(subParent+’/’+filename)
index += 1
return dataMat,label

def PCA(self,dataMat,dimNum):
‘‘‘
PCA函数,用于数据降维
:param dataMat: 样本矩阵
:param dimNum: 降维后的目标维度
:return: 降维后的样本矩阵和变换矩阵
‘‘‘
# 均值化矩阵
meanMat = np.mat(np.mean(dataMat,1)).T
print ‘平均值矩阵维度’,meanMat.shape
diffMat = dataMat-meanMat
# 求协方差矩阵,由于样本维度远远大于样本数目,所以不直接求协方差矩阵,采用下面的方法
covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) # 归一化
#covMat2 = np.cov(dataMat,bias=True)
#print ‘基本方法计算协方差矩阵为’,covMat2
print ‘协方差矩阵维度’,covMat.shape
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
print ‘特征向量维度’,eigVects.shape
print ‘特征值’,eigVals
eigVects = diffMat*eigVects
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:dimNum] # 取出指定个数的前n大的特征值
print ‘选取的特征值’,eigValInd
eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #归一化特征向量
redEigVects = eigVects[:,eigValInd]
print ‘选取的特征向量’,redEigVects.shape
print ‘均值矩阵维度’,diffMat.shape
lowMat = redEigVects.T*diffMat
print ‘低维矩阵维度’,lowMat.shape
return lowMat,redEigVects

def compare(self,dataMat,testImg,label):
‘‘‘
比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可
:param dataMat: 样本矩阵
:param testImg: 测试图像矩阵,最原始形式
:param label: 标签矩阵
:return: 与测试图片最相近的图像文件名
‘‘‘
testImg = cv2.resize(testImg,self.dsize)
testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
testImg = np.reshape(testImg,(-1,1))
lowMat,redVects = self.PCA(dataMat,self.dimNum)
testImg = redVects.T*testImg
print ‘检测样本变换后的维度’,testImg.shape
disList = []
testVec = np.reshape(testImg,(1,-1))
for sample in lowMat.T:
disList.append(np.linalg.norm(testVec-sample))
print disList
sortIndex = np.argsort(disList)
return label[sortIndex[0]]

def predict(self,dirName,testFileName):
‘‘‘
预测函数
:param dirName: 包含训练数据集的文件夹路径
:param testFileName: 测试图像文件名
:return: 预测结果
‘‘‘
testImg = cv2.imread(testFileName)
dataMat,label = self.createImgMat(dirName)
print ‘加载图片标签’,label
ans = self.compare(dataMat,testImg,label)
return ans

if __name__ == ‘__main__’:
eigenface = EigenFace(20,50,(50,50))
print eigenface.predict(‘d:/face’,’D:/face_test/1.bmp’)2)、FisherFaces算法
#encoding=utf-8
import numpy as np
import cv2
import os

class FisherFace(object):
def __init__(self,threshold,k,dsize):
self.threshold = threshold # 阈值,暂未使用
self.k = k # 指定投影w的个数
self.dsize = dsize # 统一尺寸大小

def loadImg(self,fileName,dsize):
‘‘‘
载入图像,灰度化处理,统一尺寸,直方图均衡化
:param fileName: 图像文件名
:param dsize: 统一尺寸大小。元组形式
:return: 图像矩阵
‘‘‘
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow(‘img’,retImg)
# cv2.waitKey()
return retImg

def createImgMat(self,dirName):
‘‘‘
生成图像样本矩阵,组织形式为行为属性,列为样本
:param dirName: 包含训练数据集的图像文件夹路径
:return: 包含样本矩阵的列表,标签列表
‘‘‘
dataMat = np.zeros((10,1))
label = []
dataList = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
#index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+’/’+dirname):
for index,filename in enumerate(subFilenames):
img = self.loadImg(subParent+’/’+filename,self.dsize)
tempImg = np.reshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = np.column_stack((dataMat,tempImg))
dataList.append(dataMat)
label.append(subParent)
return dataList,label

def LDA(self,dataList,k):
‘‘‘
多分类问题的线性判别分析算法
:param dataList: 样本矩阵列表
:param k: 投影向量k的个数
:return: 变换后的矩阵列表和变换矩阵
‘‘‘
n = dataList[0].shape[0]
W = np.zeros((n,self.k))
Sw = np.zeros((n,n))
Sb = np.zeros((n,n))
u = np.zeros((n,1))
N = 0
meanList = []
sampleNum = []

for dataMat in dataList:
meanMat = np.mat(np.mean(dataMat,1)).T
meanList.append(meanMat)
sampleNum.append(dataMat.shape[1])

dataMat = dataMat-meanMat
sw = dataMat*dataMat.T
Sw += sw
print ‘Sw的维度’,Sw.shape

for index,meanMat in enumerate(meanList):
m = sampleNum[index]
u += m*meanMat
N += m
u = u/N
print ‘u的维度’,u.shape

for index,meanMat in enumerate(meanList):
m = sampleNum[index]
sb = m*(meanMat-u)*(meanMat-u).T
Sb += sb
print ‘Sb的维度’,Sb.shape

eigVals, eigVects = np.linalg.eig(np.mat(np.linalg.inv(Sw)*Sb))
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:k] # 取出指定个数的前k大的特征值
print ‘选取的特征值’,eigValInd.shape
eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #归一化特征向量
redEigVects = eigVects[:,eigValInd]
print ‘变换矩阵维度’,redEigVects.shape

transMatList = []
for dataMat in dataList:
transMatList.append(redEigVects.T*dataMat)
return transMatList,redEigVects

def compare(self,dataList,testImg,label):
‘‘‘
比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可
:param dataList: 样本矩阵列表
:param testImg: 测试图像矩阵,最原始形式
:param label: 标签矩阵
:return: 与测试图片最相近的图像文件夹,也就是类别
‘‘‘
testImg = cv2.resize(testImg,self.dsize)
testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
testImg = np.reshape(testImg,(-1,1))
transMatList,redVects = fisherface.LDA(dataList,self.k)
testImg = redVects.T*testImg
print ‘检测样本变换后的维度’,testImg.shape
disList = []
testVec = np.reshape(testImg,(1,-1))
sumVec = np.mat(np.zeros((self.dsize[0]*self.dsize[1],1)))
for transMat in transMatList:
for sample in transMat.T:
disList.append( np.linalg.norm(testVec-sample))
print disList
sortIndex = np.argsort(disList)
return label[sortIndex[0]/9]

def predict(self,dirName,testFileName):
‘‘‘
预测函数
:param dirName: 包含训练数据集的文件夹路径
:param testFileName: 测试图像文件名
:return: 预测结果
‘‘‘
testImg = cv2.imread(testFileName)
dataMat,label = self.createImgMat(dirName)
print ‘加载图片标签’,label
ans = self.compare(dataMat,testImg,label)
return ans

if __name__==“__main__”:

fisherface = FisherFace(10,20,(20,20))
ans = fisherface.predict(‘d:/face’,’d:/face_test/8.bmp’)
print ans3)、LBPH算法
#encoding=utf-8
import numpy as np
import os
import cv2

class LBP(object):
def __init__(self,threshold,dsize,blockNum):
self.dsize = dsize # 统一尺寸大小
self.blockNum = blockNum # 分割块数目
self.threshold = threshold # 阈值,暂未使用

def loadImg(self,fileName,dsize):
‘‘‘
载入图像,灰度化处理,统一尺寸,直方图均衡化
:param fileName: 图像文件名
:param dsize: 统一尺寸大小。元组形式
:return: 图像矩阵
‘‘‘
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow(‘img’,retImg)
# cv2.waitKey()
return retImg

def loadImagesList(self,dirName):
‘‘‘
加载图像矩阵列表
:param dirName:文件夹路径
:return: 包含最原始的图像矩阵的列表和标签矩阵
‘‘‘
imgList = []
label = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+’/’+dirname):
for filename in subFilenames:
img = self.loadImg(subParent+’/’+filename,self.dsize)
imgList.append(img) # 原始图像矩阵不做任何处理,直接加入列表
label.append(subParent+’/’+filename)
return imgList,label

def getHopCounter(self,num):
‘‘‘
计算二进制序列是否只变化两次
:param num: 数字
:return: 01变化次数
‘‘‘
binNum = bin(num)
binStr = str(binNum)[2:]
n = len(binStr)
if n = center)*(1扩展知识:人脸识别算法研究的难点
人脸识别算法研究已久,在背景简单的情形下,大部分算法都能很好的处理。但是,人脸识别的应用范围颇广,仅是简单图像测试,是远远不能满足现实需求的。所以人脸识别算法还是存在很多的难点。
光照
光照问题是机器视觉中的老问题,在人脸识别中的表现尤为明显,算法未能达到使用的程度。
姿态
与光照问题类似,姿态问题也是人脸识别研究中需要解决的一个技术难点。针对姿态的研究相对比较少,多数的人脸识别算法主要是针对正面,或接近正面的人脸图像,当发生俯仰或者左右侧而比较厉害的情况下,人脸识别算法的识别率也将会急剧下降。
遮挡
对于非配合情况下的人脸图像采集,遮挡问题是一个非常严重的问题,特别是在监控环境下,往往被监控对象都会带着眼镜﹑帽子等饰物,使得被采集出来的人脸图像有可能不完整,从而影响了后面的特征提取与识别,甚至会导致人脸识别算法的失效。
年龄变化
随着年龄的变化,面部外观也在变化,特别是对于青少年,这种变化更加的明显。对于不同的年龄段,人脸识别算法的识别率也不同。
图像质量
人脸图像的来源可能多种多样,由于采集设备的不同,得到的人脸图像质量也不同,特别是对于那些低分辨率﹑噪声大﹑质量差的人脸图像如何进行有效的人脸识别是个需要关注的问题。同样的,对于高分辨图像,对人脸识别算法的影响也需要进一步研究。
样本缺乏
基于统计学习的人脸识别算法是人脸识别领域中的主流算法,但是统计学习方法需要大量的培训。由于人脸图像在高维空间中的分布是一个不规则的流行分布,能得到的样本只是对人脸图像空间中的一个极小部分的采样,如何解决小样本下的统计学习问题有待进一步的研究。
大量数据
传统人脸识别算法如PCA、LDA等在小规模数据中可以很容易进行训练学习。但是对于大量数据,这些方法其训练过程难以进行,甚至有可能崩溃。
大规模人脸识别
随着人脸数据库规模的增长,人脸算法的性能将呈现下降。

⑧ 关于人脸识别人脸检测除了用opencv,还有哪些方法或框架可以实现

除了OpenCV之外,现在有许多其他的人脸检测和人脸识别方法和框架可供选择。以下是一些常见的方法和框架:

⑨ 人脸识别的识别算法

一般来说,人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别(身份确认或者身份查找)。系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或槐尘者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
人脸识别算法分类
基于人脸特征点的识别算法(Feature-based recognition algorithms)。
基于整幅人脸图像的识别算法(Appearance-based recognition algorithms)。
基于模板的识别算法(Template-based recognition algorithms)。
利用神经网络进行识别的算法(Recognition algorithms using neural network)。
基于光照估计模型理论
提出了基于Gamma灰度矫正的光照预处理方法,并且在光照估计模型的基础上,进行相应的光照补偿和光照平衡策略。
优化的形变统计校正理论
基于统计形变的校正理论,优化人脸姿态;强化迭代理论
强化迭代理论是对DLFA人脸检测算法的有效扩展;
独创的实时特征识别理论
该理论侧重于人脸铅裤禅实时数据的中间值处理,从而可以在识别速纯带率和识别效能之间,达到最佳的匹配效果

⑩ 求基于adaboost算法的人脸检测的matlab代码 谢谢了

可以试试下面这个,这个有你想要的。

此问题由colorreco人脸识别回答。

阅读全文

与人脸检测算法和代码相关的资料

热点内容
电脑如何打开ppt文件怎么打开方式 浏览:782
魅族锁定区文件夹 浏览:357
刻字cnc怎么编程 浏览:182
学校的网络拓扑结构图 浏览:784
收集100个pdf文件里关键词 浏览:594
苹果关闭4g网络设置 浏览:289
如何监测数据库 浏览:967
拷贝过来的pdf文件 浏览:751
抖音小店的访客数据怎么看 浏览:670
怎么把c语言编程的字符向下移动 浏览:786
sql删除文件组代码 浏览:978
安卓post请求多重json 浏览:776
微信消除数据怎么恢复 浏览:918
小米刷机显示系统找不到指定文件 浏览:528
苹果手机小风扇图app叫什么 浏览:292
繁体中文输入工具 浏览:916
pc桌面壁纸文件夹 浏览:473
微信怎么添加群 浏览:781
40岁男人适合的微信名 浏览:925
编程里比例怎么打 浏览:215

友情链接