基于AdaBoost的人脸检测 含源码

需要完整源码 联系我QQ [email protected]
基于AdaBoost的人脸检测
一 、实验目的
  掌握利用AdaBoost及级联分类器进行人脸检测的基本方法,通过实验加深对基本概念的理解。

二 实验原理
人脸检测是指对于任意一幅给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸,如果是则返回人脸的位置、大小和姿态。
Adaboost核心思想是通过训练分类器得到检测的目的,不仅仅是人脸,人的眼睛,人上身都可以作为检测的对象,在Matlab以及OpenCV中都有相应的训练结果可以调用,
大部分运行效率较高的只能算法都是通过提取高效以及利于识别和处理的特征实现的,而Adaboost算法也是一样的。Adaboost(Adaptive Boosting)是Freund和Schapire在PAC(ProbablyApproximately Correct)模型基础上提出的一种学习模型,它的算法思想是:通过对大量正样本和负样本的学习,通过学习的反馈,弱分类器在不知道先验的训练误差的前提下,自适应的调整错误率以及相应的权重,直到强分类器达到预定的性能。
Viola等人将Adaboost算法应用于人脸检测,同时将Haar特征和Cascade算法和Adaboost算法结合,大大提高了检测的速度和检测的精确率,其论文的主要工作是:①引入了一种计算简单却十分有效的矩形特征(Haar特征),用来描述人脸图片的灰度分布情况,同时提出了积分图的概念,矩形特征和积分图的结合有助于检测速度的提高。②利用 Adaboost优秀的数据挖掘能力从海量的Haar特征中,挑选出若干个具有最佳样本分类能力的 Haar特征,将Haar特征转化为弱分类器,最后以线性组合的方式得到最终的强分类器;③提出了一种由粗到精的检测思路,构造了一个级联人脸检测器:先用简单的强分类器的把图片中大部分的背景区域剔除,再逐步递增强分类器的复杂度(即构成它的弱分类器数量),不断地过滤掉剩余的背景区域,最后通过所有强分类器的则为人脸窗口。这种检测思路有效的提升了检测速度。进行Adaboost算法之前,必须要得到的是Haar特征,从而得到提高计算效率的积分图:
①trainCascadeObjectDetector函数可以使用Haar特征、梯度方向直方图(Histograms of Oriented Gradients,HOG)、局部二进制模式(Local Binary Pattern,LBP)等实现目标检测器的训练,最后以xml格式的文件返回目标检测器的结果。
②CascadeObjectDetector,该函数可以创建一个目标检测器,它是通过Viola-Jones算法训练实现的,通过对1中训练得到的结果来实现对目标检测器的创建,同时也可以使用工具箱中已经训练好的文件实现检测器的创建。还可以通过制定目标检测模型指定生成的目标检测器的模型,这里的模型实质目标检测器具体适用的检测目标,比如眼睛、耳朵、脸等,默认检测目标是脸。
③检测器的模型通过CasacdeObjectDetector(Model)指定,其中Model是通过输入一行字符串得到的,Model的类型包括FrontalFace(CART)、Frontal Face(LBP)、Upper Body等,默认为FrontalFaceCART。
④BBOX = step(detector, I)可以返回的矩阵BBOX,其中矩阵的每一行可以指定检测到目标的矩形区域,通过矩形左上角横、纵坐标的以及矩形长、宽4个参数确定矩形区域。代表检测到的目标个数

三 实验步骤及程序
 1 实验步骤
(1)创建一个人脸检测系统对象
(2)读入视频的每一帧
(3)对每一帧视频进行人脸检测
(4)将检测出的人脸在图像上标出并显示
(5)对每一帧视频进行人脸检测
(6)将检测出的人脸在图像上标出并显示
(7) 对每一帧视频进行人脸检测
(8) 将检测出的人脸在图像上标出并显示

 2 实验流程图
 
图3-1 人脸检测流程图
3 实验程序
%创建一个人脸检测系统对象(system object)
faceDetector=vision.CascadeObjectDetector();
%读入视频的每一帧
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\马云.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('马云');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\老詹.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('老詹');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\C罗.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('C罗');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\乔帮主.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('乔帮主');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\梅西.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('梅西');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\张国荣.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('张国荣');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\凤姐.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('凤姐 face');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\周立波.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('周立波');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\达康书记.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('达康书记');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\白百合.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('白百合');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\王思聪.jpg');
videoFrame=step(videoFileReader);
%对每一帧视频进行人脸检测
bbox=step(faceDetector,videoFrame);
%将检测出的人脸在图像上标出并显示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
    'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('王思聪');}
四 实验结果与分析
运用AdoBoost算法对含有不同人不同场景的检测如下图所示。
 
图4-1 多人脸图像识别
       
图4-2单人脸图像检测结果


从检测结果可以看出,运用AdoBoost算法进行不同人不同场景下的人脸识别效果很好。但依旧存在一些问题,有时也会出现一些识别错误,比如多人识别时识别侧脸时或有问题。此时我们需要处理好弱分类器阈值、特征值相差程度等,以降低区间率而同时达到较高的检测率。   
基于图像的人脸检测方法具有很强的适应能力和鲁棒性,但由于需要对所有
可能的检测窗口进行穷举搜索,因此计算复杂度高;而且这类方法需要消耗大量的时间和精力收集和训练样本,特别是非人脸样本的选取仍存在很大的困难。
综上所述,人们在人脸检测领域做了大量工作,提出了许多方法,但现有的系统仍存在对限制条件要求较严格、鲁棒性较差、误检率过高等缺点,这些也限制了人脸识别系统的应用范围。所以进一步利用人脸的灰度分布、几何形状、肤色、纹理、运动等知识研究适应性强、分割精度高的快速算法仍是人们未来的工作,因而人脸检测方法的发展方向是建立更有效的人脸描述和搜索计算策略模型。

猜你喜欢

转载自blog.csdn.net/majiawenzzz/article/details/81122657