人脸识别核心算法及MATLAB代码.docx
- 文档编号:4055887
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:34.67KB
人脸识别核心算法及MATLAB代码.docx
《人脸识别核心算法及MATLAB代码.docx》由会员分享,可在线阅读,更多相关《人脸识别核心算法及MATLAB代码.docx(15页珍藏版)》请在冰豆网上搜索。
人脸识别核心算法及MATLAB代码
人脸识别核心算法
在检测到人脸并定位面部关键特征点之后,主要的人脸区域就可以被裁剪出来,经过预处理之后,馈入后端的识别算法。
识别算法要完成人脸特征的提取,并与库存的已知人脸进行比对,完成最终的分类。
我们在这方面的主要工作包括:
∙基于LGBP的人脸识别方法
问题:
统计学习目前已经成为人脸识别领域的主流方法,但实践表明,基于统计学习的方法往往会存在“推广能力弱”的问题,尤其在待识别图像“属性”未知的情况下,更难以确定采用什么样的训练图像来训练人脸模型。
鉴于此,在对统计学习方法进行研究的同时,我们还考虑了非统计模式识别的一类方法。
思路:
对于给定的人脸图像,LGBP方法首先将其与多个不同尺度和方向的Gabor滤波器卷积(卷积结果称为Gabor特征图谱)获得多分辨率的变换图像。
然后将每个Gabor特征图谱划分成若干互不相交的局部空间区域,对每个区域提取局部邻域像素的亮度变化模式,并在每个局部空间区域内提取这些变化模式的空间区域直方图,所有Gabor特征图谱的、所有区域的直方图串接为一高维特征直方图来编码人脸图像。
并通过直方图之间的相似度匹配技术(如直方图交运算)来实现最终的人脸识别。
在FERET四个人脸图像测试集合上与FERET97的结果对比情况见下表。
由此可见,该方法具有良好的识别性能。
而且LGBP方法具有计算速度快、无需大样本学习、推广能力强的优点。
参见ICCV2005
表.LGBP方法与FERET'97最佳结果的对比情况
对比算法
各测试子集合性能(首选正确识别率)
FB
FC
DupI
DupII
我们的算法性能
97.5%
96.9%
73.8%
70.5%
FERET’97最好结果
96.0%
82.0%
59.0%
52.0%
∙基于AdaBoost的Gabor特征选择及判别分析方法
问题:
人脸描述是人脸识别的核心问题之一,人脸识别的研究实践表明:
在人脸三维形状信息难以准确获取的条件下,从图像数据中提取多方向、多尺度的Gabor特征是一种合适的选择。
使用Gabor特征进行人脸识别的典型方法包括弹性图匹配方法(EGM)和Gabor特征判别分类法(GFC)。
EGM在实用中需要解决关键特征点的定位问题,而且其速度也很难提高;而GFC则直接对下采样的Gabor特征用PCA降维并进行判别分析,尽管这避免了精确定位关键特征点的难题,但下采样的特征维数仍然偏高,而且简单的下采样策略很可能遗漏了非常多的有用特征。
摘要:
针对上述问题,我们考虑如何对Gabor特征进行有效降维,将目前受到极大关注的AdaBoost算法创新性的应用于Gabor特征的选择上来,用于提取对识别最有利的特征(我们称这些选择出来的Gabor特征为AdaGabor特征),并最终通过对AdaGabor特征的判别分析实现识别(称该方法为AGFC识别方法)。
在CAS-PEAL和FERET人脸图像库上的对比实验表明:
AGFC方法不但可以大大降低Gabor特征的维数从而可以更加有效地避免“维数灾难问题”,降低了计算复杂度,同时识别精度也有了较大的提高。
将AGFC与EGM,GFC进一步比较可以看出:
无论是EGM还是GFC,均是主观的选择若干面部关键特征点提取人脸的特征表示,而我们提出的AGFC方法则是通过机器学习的方法自动的选择那些对区分不同人脸具有关键作用的Gabor特征。
参见下图所示三者之间的区别与联系。
参见FG04,AMFG05
三种不同的人脸建模方法比较示意图
∙基于SV的Kernel判别分析方法sv-KFD
摘要:
支持向量机(SVM)和KernelFisher分析是利用kernel方法解决线性不可分问题的两种不同途径,我们将二者进行了有机结合。
我们首先证明了SVM最优分类面的法向量在基于支持向量的类内散度矩阵的前提下具有零空间性质,基于此定义了核化的决策边界特征矩阵(KernelizedDecisionBoundaryFeatureMatrix,简写为KDBFM),最后利用基于零空间的KernelFisher方法计算投影空间。
我们还进一步提出了融合类均值向量差及KDBFM来构建扩展的决策边界特征矩阵(EKDBFM)的方法,并把这两种方法成功地应用到了人脸识别领域,在FERET和CAS-PEAL数据库的实验结果表明该方法比传统人脸识别算法具有更好的识别性能。
详见CVPR2005
∙基于特定人脸子空间的人脸识别方法
问题:
Eigenface是人脸识别领域最著名的算法之一,本质上是通过PCA来求取人脸图像分布的线性子空间,该空间从最佳重构的角度反映了所有人脸图像分布的共性特征,但对识别而言,这样的特征却未必有利于识别,识别任务需要的是最大可能区分不同人脸的特征。
摘要:
“特征脸”方法中所有人共有一个人脸子空间,而我们的方法则为每一个体人脸建立一个该个体对象所私有的人脸子空间,从而不但能够更好的描述不同个体人脸之间的差异性,而且最大可能地摈弃了对识别不利的类内差异性和噪声,因而比传统的“特征脸算法”具有更好的判别能力。
另外,针对每个待识别个体只有单一训练样本的人脸识别问题,我们提出了一种基于单一样本生成多个训练样本的技术,从而使得需要多个训练样本的个体人脸子空间方法可以适用于单训练样本人脸识别问题。
在YaleFaceDatabaseB人脸库对比实验也表明我们提出的方法比传统的特征脸方法、模板匹配方法对表情、光照、和一定范围内的姿态变化具有更优的识别性能。
参见ICASSP2001,IJIST2003。
1、人体面貌识别技术的内容
人体面貌识别技术包含三个部分:
(1)人体面貌检测
面貌检测是指在动态的场景与复杂的背景中判断是否存在面像,并分离出这种面像。
一般有下列几种方法:
①参考模板法
首先设计一个或数个标准人脸的模板,然后计算测试采集的样品与标准模板之间的匹配程度,并通过阈值来判断是否存在人脸;
②人脸规则法
由于人脸具有一定的结构分布特征,所谓人脸规则的方法即提取这些特征生成相应的规则以判断测试样品是否包含人脸;
③样品学习法
这种方法即采用模式识别中人工神经网络的方法,即通过对面像样品集和非面像样品集的学习产生分类器;
④肤色模型法
这种方法是依据面貌肤色在色彩空间中分布相对集中的规律来进行检测。
⑤特征子脸法
这种方法是将所有面像集合视为一个面像子空间,并基于检测样品与其在子孔间的投影之间的距离判断是否存在面像。
值得提出的是,上述5种方法在实际检测系统中也可综合采用。
(2)人体面貌跟踪
面貌跟踪是指对被检测到的面貌进行动态目标跟踪。
具体采用基于模型的方法或基于运动与模型相结合的方法。
此外,利用肤色模型跟踪也不失为一种简单而有效的手段。
(3)人体面貌比对
面貌比对是对被检测到的面貌像进行身份确认或在面像库中进行目标搜索。
这实际上就是说,将采样到的面像与库存的面像依次进行比对,并找出最佳的匹配对象。
所以,面像的描述决定了面像识别的具体方法与性能。
目前主要采用特征向量与面纹模板两种描述方法:
①特征向量法
该方法是先确定眼虹膜、鼻翼、嘴角等面像五官轮廓的大小、位置、距离等属性,然后再计算出它们的几何特征量,而这些特征量形成一描述该面像的特征向量。
②面纹模板法
该方法是在库中存贮若干标准面像模板或面像器官模板,在进行比对时,将采样面像所有象素与库中所有模板采用归一化相关量度量进行匹配。
此外,还有采用模式识别的自相关网络或特征与模板相结合的方法。
人体面貌识别技术的核心实际为“局部人体特征分析”和“图形/神经识别算法。
”这种算法是利用人体面部各器官及特征部位的方法。
如对应几何关系多数据形成识别参数与数据库中所有的原始参数进行比较、判断与确认。
一般要求判断时间低于1秒。
2、人体面貌的识别过程
一般分三步:
(1)首先建立人体面貌的面像档案。
即用摄像机采集单位人员的人体面貌的面像文件或取他们的照片形成面像文件,并将这些面像文件生成面纹(Faceprint)编码贮存起来。
(2)获取当前的人体面像
即用摄像机捕捉的当前出入人员的面像,或取照片输入,并将当前的面像文件生成面纹编码。
(3)用当前的面纹编码与档案库存的比对
即将当前的面像的面纹编码与档案库存中的面纹编码进行检索比对。
上述的“面纹编码”方式是根据人体面貌脸部的本质特征和开头来工作的。
这种面纹编码可以抵抗光线、皮肤色调、面部毛发、发型、眼镜、表情和姿态的变化,具有强大的可靠性,从而使它可以从百万人中精确地辩认出某个人。
人体面貌的识别过程,利用普通的图像处理设备就能自动、连续、实时地完成。
1.色彩空间转换
function[r,g]=rgb_RGB(Ori_Face)
R=Ori_Face(:
:
1);
G=Ori_Face(:
:
2);
B=Ori_Face(:
:
3);
R1=im2double(R);%将uint8型转换成double型
G1=im2double(G);
B1=im2double(B);
RGB=R1+G1+B1;
row=size(Ori_Face,1);%行像素
column=size(Ori_Face,2);%列像素
fori=1:
row
forj=1:
column
rr(i,j)=R1(i,j)/RGB(i,j);
gg(i,j)=G1(i,j)/RGB(i,j);
end
end
rrr=mean(rr);
r=mean(rrr);
ggg=mean(gg);
g=mean(ggg);
2.均值和协方差
t1=imread('D:
\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1);
t2=imread('D:
\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2);
t3=imread('D:
\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3);
t4=imread('D:
\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4);
t5=imread('D:
\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5);
t6=imread('D:
\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6);
t7=imread('D:
\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7);
t8=imread('D:
\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);
t9=imread('D:
\matlab\皮肤库\9.jpg');[r9,g9]=rgb_RGB(t9);
t10=imread('D:
\matlab\皮肤库\10.jpg');[r10,g10]=rgb_RGB(t10);
t11=imread('D:
\matlab\皮肤库\11.jpg');[r11,g11]=rgb_RGB(t11);
t12=imread('D:
\matlab\皮肤库\12.jpg');[r12,g12]=rgb_RGB(t12);
t13=imread('D:
\matlab\皮肤库\13.jpg');[r13,g13]=rgb_RGB(t13);
t14=imread('D:
\matlab\皮肤库\14.jpg');[r14,g14]=rgb_RGB(t14);
t15=imread('D:
\matlab\皮肤库\15.jpg');[r15,g15]=rgb_RGB(t15);
t16=imread('D:
\matlab\皮肤库\16.jpg');[r16,g16]=rgb_RGB(t16);
t17=imread('D:
\matlab\皮肤库\17.jpg');[r17,g17]=rgb_RGB(t17);
t18=imread('D:
\matlab\皮肤库\18.jpg');[r18,g18]=rgb_RGB(t18);
t19=imread('D:
\matlab\皮肤库\19.jpg');[r19,g19]=rgb_RGB(t19);
t20=imread('D:
\matlab\皮肤库\20.jpg');[r20,g20]=rgb_RGB(t20);
t21=imread('D:
\matlab\皮肤库\21.jpg');[r21,g21]=rgb_RGB(t21);
t22=imread('D:
\matlab\皮肤库\22.jpg');[r22,g22]=rgb_RGB(t22);
t23=imread('D:
\matlab\皮肤库\23.jpg');[r23,g23]=rgb_RGB(t23);
t24=imread('D:
\matlab\皮肤库\24.jpg');[r24,g24]=rgb_RGB(t24);
t25=imread('D:
\matlab\皮肤库\25.jpg');[r25,g25]=rgb_RGB(t25);
t26=imread('D:
\matlab\皮肤库\26.jpg');[r26,g26]=rgb_RGB(t26);
t27=imread('D:
\matlab\皮肤库\27.jpg');[r27,g27]=rgb_RGB(t27);
r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27);
g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27);
m=mean([r,g])
n=cov([r,g])
3.求质心
function[xmean,ymean]=center(bw)
bw=bwfill(bw,'holes');
area=bwarea(bw);
[mn]=size(bw);
bw=double(bw);
xmean=0;ymean=0;
fori=1:
m,
forj=1:
n,
xmean=xmean+j*bw(i,j);
ymean=ymean+i*bw(i,j);
end;
end;
if(area==0)
xmean=0;
ymean=0;
else
xmean=xmean/area;
ymean=ymean/area;
xmean=round(xmean);
ymean=round(ymean);
end
4.求偏转角度
function[theta]=orient(bw,xmean,ymean)
[mn]=size(bw);
bw=double(bw);
a=0;
b=0;
c=0;
fori=1:
m,
forj=1:
n,
a=a+(j-xmean)^2*bw(i,j);
b=b+(j-xmean)*(i-ymean)*bw(i,j);
c=c+(i-ymean)^2*bw(i,j);
end;
end;
b=2*b;
theta=atan(b/(a-c))/2;
theta=theta*(180/pi);%从幅度转换到角度
5.找区域边界
function[left,right,up,down]=bianjie(A)
[mn]=size(A);
left=-1;
right=-1;
up=-1;
down=-1;
forj=1:
n,
fori=1:
m,
if(A(i,j)~=0)
left=j;
break;
end;
end;
if(left~=-1)break;
end;
end;
forj=n:
-1:
1,
fori=1:
m,
if(A(i,j)~=0)
right=j;
break;
end;
end;
if(right~=-1)break;
end;
end;
fori=1:
m,
forj=1:
n,
if(A(i,j)~=0)
up=i;
break;
end;
end;
if(up~=-1)
break;
end;
end;
fori=m:
-1:
1,
forj=1:
n,
if(A(i,j)~=0)
down=i;
break;
end;
end;
if(down~=-1)
break;
end;
end;
6.求起始坐标
functionnewcoord=checklimit(coord,maxval)
newcoord=coord;
if(newcoord<1)
newcoord=1;
end;
if(newcoord>maxval)
newcoord=maxval;
end;
7.模板匹配
function[ccorr,mfit,RectCoord]=mobanpipei(mult,frontalmodel,ly,wx,cx,cy,angle)
frontalmodel=rgb2gray(frontalmodel);
model_rot=imresize(frontalmodel,[lywx],'bilinear');%调整模板大小
model_rot=imrotate(model_rot,angle,'bilinear');%旋转模板
[l,r,u,d]=bianjie(model_rot);%求边界坐标
bwmodel_rot=imcrop(model_rot,[lu(r-l)(d-u)]);%选择模板人脸区域
[modx,mody]=center(bwmodel_rot);%求质心
[morig,norig]=size(bwmodel_rot);
%产生一个覆盖了人脸模板的灰度图像
mfit=zeros(size(mult));
mfitbw=zeros(size(mult));
[limy,limx]=size(mfit);
%计算原图像中人脸模板的坐标
startx=cx-modx;
starty=cy-mody;
endx=startx+norig-1;
endy=starty+morig-1;
startx=checklimit(startx,limx);
starty=checklimit(starty,limy);
endx=checklimit(endx,limx);
endy=checklimit(endy,limy);
fori=starty:
endy,
forj=startx:
endx,
mfit(i,j)=model_rot(i-starty+1,j-startx+1);
end;
end;
ccorr=corr2(mfit,mult)%计算相关度
[l,r,u,d]=bianjie(bwmodel_rot);
sx=startx+l;
sy=starty+u;
RectCoord=[sxsy(r-1)(d-u)];%产生矩形坐标
8.主程序
clear;
[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Pleasechooseacolorpicture...');%返回打开的图片名与图片路径名
[u,v]=size(fname);
y=fname(v);%图片格式代表值
switchy
case0
errordlg('YouShouldLoadImageFileFirst...','Warning...');
case{'g';'G';'p';'P';'f';'F'};%图片格式若是JPG/jpg、BMP/bmp、TIF/tif或者GIF/gif,才打开
I=cat(2,pname,fname);
Ori_Face=imread(I);
subplot(2,3,1),imshow(Ori_Face);
otherwise
errordlg('YouShouldLoadImageFileFirst...','Warning...');
end
R=Ori_Face(:
:
1);
G=Ori_Face(:
:
2);
B=Ori_Face(:
:
3);
R1=im2double(R);%将uint8型转换成double型处理
G1=im2double(G);
B1=im2double(B);
RGB=R1+G1+B1;
m=[0.4144,0.3174];%均值
n=[0.0031,-0.0004;-0.0004,0.0003];%方差
row=size(Ori_Face,1);%行像素数
column=size(Ori_Face,2);%列像素数
fori=1:
row
forj=1:
column
ifRGB(i,j)==0
rr(i,j)=0;gg(i,j)=0;
else
rr(i,j)=R1(i,j)/RGB(i,j);%rgb归一化
gg(i,j)=G1(i,j)/RGB(i,j);
x=[rr(i,j),gg(i,j)];
p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)');%皮肤概率服从高斯分布
end
end
end
subplot(2,3,2);imshow(p);%显示皮肤灰度图像
low_pass=1/9*ones(3);
image_low=filter2(low_pass,p);%低通滤波去噪声
subplot(2,3,3);imshow(image_low);
%自适应阀值程序
previousSkin2=zeros(i,j);
changelist=[];
forthreshold=0.55:
-0.1:
0.05
two_value=zeros(i,j);
two_value(find(image_low>threshold))=1;
change=sum(sum(two_value-previousSkin2));
changelist=[changelistchange];
previousSkin2=two_value;
end
[C,I]=min(changelist);
optimalThreshold=(7-I)*0.1
two_value=zeros(i,j);
two_value(find(image_low>optimalThreshold))=1;%二值化
subplot(2,3,4);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 识别 核心 算法 MATLAB 代码