人脸识别.docx
《人脸识别.docx》由会员分享,可在线阅读,更多相关《人脸识别.docx(14页珍藏版)》请在冰豆网上搜索。
![人脸识别.docx](https://file1.bdocx.com/fileroot1/2023-4/27/5060a281-9bde-4fb2-9ebe-67278e7463b4/5060a281-9bde-4fb2-9ebe-67278e7463b41.gif)
人脸识别
课程实验报告
2017-2018学年第一学期
课程名称:
计算机视觉及应用
实验名称:
班级:
学生姓名:
学号:
实验日期:
地点:
指导教师:
成绩评定:
批改日期:
实
验
目
的及要求
人脸识别是检测解决的问题是图片中有没有人脸。
我们通过使用opencv自带的分类器,通过摄像头读取自己图片,并识别相关的人脸特征。
此外,在保存自己的样本图片中,选择一张自己的图片,在样本图片中识别出来。
实验仪器设备
实验设备为一台装有win10系统的PC,qt+opencv软件,matlab。
实验原理
目前的人脸检测方法主要有两大类:
基于知识和基于统计。
基于知识的方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。
基于统计的方法则将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。
在这两种框架之下,发展了许多方法。
1)Haar分类器算法
①使用Haar-like特征做检测。
②使用积分图(Integral Image)对Haar-like特征求值进行加速。
③使用AdaBoost算法训练区分人脸和非人脸的强分类器。
④使用筛选式级联把强分类器级联到一起,提高准确率。
将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸。
为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,那么什么样的矩形特征怎么样的组合到一块可以更好的区分出人脸和非人脸呢,这就是AdaBoost算法要做的事了。
同时,利用AdaBoost算法可以帮助我们选择更好的矩阵特征组合,其实这里提到的矩阵特征组合就是我们之前提到的分类器,分类器将矩阵组合用二叉决策树的形式存储起来。
2)弱分类器
最初的弱分类器可能只是一个最基本的Haar-like特征,计算输入图像的Haar-like特征值,和最初的弱分类器的特征值比较,以此来判断输入图像是不是人脸,然而这个弱分类器太简陋了,可能并不比随机判断的效果好,对弱分类器的孵化就是训练弱分类器成为最优弱分类器,注意这里的最优不是指强分类器,只是一个误差相对稍低的弱分类器,训练弱分类器实际上是为分类器进行设置的过程。
机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。
树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。
从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。
在分类的应用中,每个非叶子节点都表示一种判断,每个路径代表一种判断的输出,每个叶子节点代表一种类别,并作为最终判断的结果。
具体操作过程如下:
(1)对于每个特征 f,计算所有训练样本的特征值,并将其排序
①扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值;
②全部人脸样本的权重的和t1;
③全部非人脸样本的权重的和t0;
④在此元素之前的人脸样本的权重的和s1;
⑤在此元素之前的非人脸样本的权重的和s0;
(2)最终求得每个元素的分类误差
在表中寻找r值最小的元素,则该元素作为最优阈值有了该阈值
2)强分类器
1.给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本,T为训练的最大循环次数;
2.初始化样本权重为1/N,即为训练样本的初始概率分布;
3.第一次迭代训练N个样本,得到第一个最优弱分类器;
4.提高上一轮中被误判的样本的权;
5.将新的样本和上次本分错的样本放在一起进行新一轮的训练;
6.循环执行4-5步骤,T轮后得到T个最优弱分类器;
7.组合T个最优弱分类器得到强分类器,组合方式如下;
实验内容
1)通过摄像头识别自己的脸和面部其他的特征。
2)在自己的样本图片中,识别自己。
3)在不同的样本图片中,识别自己。
实验步骤及方法
1.人脸识别
1.1打开摄像头。
1.2.加载人脸检测器,加载人脸模型。
1.3.人脸检测
1.4.把检测到的人脸与人脸模型里面的对比,找出这是谁的脸。
1.5.如果人脸是自己的。
实验数据
1.人脸检测的程序
#include
#include
#include
#include
#include
#include
usingnamespacecv;
usingnamespacestd;
intmain()
{
Matimg;
Matimg_show;
MatgrayscaleFrame;
CascadeClassifierface_cascade;
face_cascade.load("G:
/opencv/source/data/haarcascades/haarcascade_eye.xml");//相对路径,将xml文件放在相应文件里
VideoCapturecam(0);
if(!
cam.isOpened())exit(0);
while(true)
{
cam>>img;
cvtColor(img,grayscaleFrame,CV_BGR2GRAY);
equalizeHist(grayscaleFrame,grayscaleFrame);
std:
:
vectorfaces;
face_cascade.detectMultiScale(grayscaleFrame,faces,1.1,3,0,Size(20,20));
for(inti=0;i{
Pointpt1(faces[i].x+faces[i].width,faces[i].y+faces[i].height);
Pointpt2(faces[i].x,faces[i].y);
rectangle(img,pt1,pt2,cvScalar(0,255,255,0),2,8,0);
floata=faces[i].x+faces[i].width;
floatb=faces[i].y+faces[i].height;
MatmyFace;
if(img.cols>100)
{
resize(img,myFace,Size(a,b));
imwrite("H:
\\picture\\yy2.bmp",img);
}
}
imshow("Camera",img);
waitKey(10);
}
2.人脸匹配的程序
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@faceRe_OpeningFcn,...
'gui_OutputFcn',@faceRe_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
functionfaceRe_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
globalc;
globala;
globalb;
c=0;
guidata(hObject,handles);
functionvarargout=faceRe_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionselectImg_Callback(hObject,eventdata,handles)
globalc;
globala;
globalb;
[a,b,c]=uigetfile('.bmp','载入图片');
ifc==1
str=[b,a];
im=imread(str);
axes(handles.axes1);
imshow(im);
else
end
functionpushbutton2_Callback(hObject,eventdata,handles)
globalc;
globala;
globalb;
ifc==1
k=0;
fori=1:
1:
40
forj=1:
1:
7
filename=sprintf('H:
\\MATLAB\\Face_recognition\\Picture_database\\att_faces\\s%d\\%d.pgm',i,j);
image_data=imread(filename);
k=k+1;
x(:
k)=image_data(:
);
anot_name(k,:
)=sprintf('%2d:
%2d',i,j);
end;
end;
nImages=k;
imsize=size(image_data);
nPixels=imsize
(1)*imsize
(2);
x=double(x)/255;
avrgx=mean(x')';
fori=1:
1:
nImages
x(:
i)=x(:
i)-avrgx;
end;
cov_mat=x'*x;
[V,D]=eig(cov_mat);
V=x*V*(abs(D))^-0.5;
add=0.0;
D=diag(D);
Dsum=sum(D);
fork=nImages:
-1:
1
add=add+D(k);
ifadd/Dsum>0.95»·
break;
end
end
KLCoef=x'*V;
filename=[b,a];
image_data=imread(filename);
y(:
1)=image_data(:
);
y=double(y)/255
fori=1:
1:
1
y(:
i)=y(:
i)-avrgx;
end;
dKLCoef=y'*V;
fori=1:
1:
nImages
dist_comp(i)=sqrt(dot(dKLCoef(1,:
)-KLCoef(i,:
),dKLCoef(1,:
)-KLCoef(i,:
)));
end
min_index=find(dist_comp==min(dist_comp));
str1=anot_name(min_index,:
);
ifstr1
(1)==''&&str1(4)==''
result=['H:
\\MATLAB\\Face_recognition\\Picture_database\\att_faces\\s'str1
(2)'\\'str1(5)'.pgm'];
elseifstr1
(1)==''&&str1(4)~=''
result=['H:
\\MATLAB\\Face_recognition\\Picture_database\\att_faces\\s'str1
(2)'\\'[str1(4)str1(5)]'.pgm'];
elseifstr1
(1)~=''&&str1(4)~=''
result=['H:
\\MATLAB\\Face_recognition\\Picture_database\\att_faces\\s'[str1
(1)str1
(2)]'\\'[str1(4)str1(5)]'.pgm'];
elseifstr1
(1)~=''&&str1(4)==''
result=['H:
\\MATLAB\\Face_recognition\\Picture_database\\att_faces\\s'[str1
(1)str1
(2)]'\\'str1(5)'.pgm'];
end
imr=imread(result);
axes(handles.axes2);
imshow(imr);
else
msgbox('没有模型','warn','modal');
end
functionclear_Callback(hObject,eventdata,handles)
globalc;
try
delete(allchild(handles.axes1));
delete(allchild(handles.axes2));
c=0;
end
实验数据分析及处理
图一识别人脸图二识别人的眼睛
图三自己的样本图片
图四在自己的样本中匹配自己
图五不同人的样本图片
图六在不同的样本中匹配自己
实验结果分析
1)通过这次实验,能够通过摄像头正确的识别人脸和人的眼睛。
2)在自己的样本和不同的样本中,能够准确的识别自己。
同时,光照对人脸的识别中有较大的影响,在用摄像头识别人脸过程中存在一定的延时,可能是电脑的性能的影响和程序优化还的进一步完善。
实验总结
通过这次实验我熟悉了opencv的使用和matlab的使用,也使得我对QT+OPENCV的运用更加熟练。
明白了人脸检测的意义和实际用途。
批改意见
签名:
年月日