人脸检测--基于Adaboost算法的实现

来源:互联网 发布:清风不语百度云网络剧 编辑:程序博客网 时间:2024/05/01 01:50

毕设的时候,做了基于肤色特征的人脸检测之后,通过肤色建模和肤色分割发现检测率并没有预想中的那么好,于是为了提高人脸检测的效率,对基于肤色特征的人脸检测算法那进行了改进,也就是基于模板匹配的人脸检测算法:以下两篇是人脸检测实现的两篇博客,当然也是从自己的毕设论文中搬出来共享给大家的:

1、人脸检测---基于肤色检测的实现

2、人脸检测-基于模板匹配的实现

这两种方法都是基于肤色特征实现的,是比较经典的人脸检测实现的算法,下面将要介绍一种新的人脸检测算法,是一种能够应用于实时监测,同时拥有高检测率的人脸检测算法,Adaboost算法,下面贴出关于几个关于人脸检测算法介绍比较相近的博客:Adaboost的几个人脸检测网站(这个博客将人脸检测的的相关博客都贴出来了,可以参考一下);

Adaboost核心思想是通过训练分类器得到检测的目的,不仅仅是人脸,人的眼睛,人上身都可以作为检测的对象,在Matlab以及OpenCV中都有相应的训练结果可以调用,

一下是关于Matlab中以及OpenCV使用人脸检测的例子:

1、Matlab官方资料--Object Detection

2、【OpenCV入门指南】第十三篇 人脸检测

下面简要的介绍一下Adaboost的算法流程以及核心:

大部分运行效率较高的只能算法都是通过提取高效以及利于识别和处理的特征实现的,而Adaboost算法也是一样的。Adaboost(Adaptive Boosting)是Freund和Schapire在PAC(ProbablyApproximately Correct)模型基础上提出的一种学习模型,它的算法思想是:通过对大量正样本和负样本的学习,通过学习的反馈,弱分类器在不知道先验的训练误差的前提下,自适应的调整错误率以及相应的权重,直到强分类器达到预定的性能。

Viola等人将Adaboost算法应用于人脸检测,同时将Haar特征和Cascade算法和Adaboost算法结合,大大提高了检测的速度和检测的精确率,其论文的主要工作是:

       ①引入了一种计算简单却十分有效的矩形特征(Haar特征),用来描述人脸图片的灰度分布情况,同时提出了积分图的概念,矩形特征和积分图的结合有助于检测速度的提高。

②利用 Adaboost优秀的数据挖掘能力从海量的Haar特征中,挑选出若干个具有最佳样本分类能力的 Haar特征,将Haar特征转化为弱分类器,最后以线性组合的方式得到最终的强分类器;

③提出了一种由粗到精的检测思路,构造了一个级联人脸检测器:先用简单的强分类器的把图片中大部分的背景区域剔除,再逐步递增强分类器的复杂度(即构成它的弱分类器数量),不断地过滤掉剩余的背景区域,最后通过所有强分类器的则为人脸窗口。这种检测思路有效的提升了检测速度。

进行Adaboost算法之前,必须要得到的是Haar特征,从而得到提高计算效率的积分图:对于这些的概念,我放了我的毕业设计的论文在相应的链接,有兴趣的的可以看一下:由于公式较多以及理论有点偏大,博客篇幅有限这里就讲一下实现的过程:人脸检测-毕业论文(PS:自己的毕业设计的论文,当时花了精力做的,分给太低觉得太心痛,如果觉得分给的太高,笔主爱莫能助)

在Matlab2012b的Computer Version Toolbox的工具箱下,提供了目标检测和识别的相关算法和函数。可以使用模板匹配、Blob分析以及Viola-Jones算法实现目标检测。其中的Viola-Jones算法也就是本文中研究的算法,可以实现人脸检测,分类器的训练结果是以XML文件给出的,需要加载相应的训练器结果,从而得到对人脸较为敏感的分类器:

在使用这个算法对应的工具箱实现人脸检测的时候,需要介绍的几个关键函数是:

①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个参数确定矩形区域。代表检测到的目标个数。

最后的代码实现很简单,但是笔主曾经尝试过写了一下Adaboost算法的实现代码,无奈功力有限,希望在以后的学习过程中,能够把这份完整的代码写出来:

clcclear all;close all;img_name = input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');while  ~strcmp(img_name,'0')t1=clock;faceDetector = vision.CascadeObjectDetector;I = imread(img_name);bboxes = step(faceDetector, I);IFaces = insertObjectAnnotation(I, 'rectangle', bboxes, 'Face','color',[0 255 255]);figure, imshow(IFaces), title('Detected faces');t2=clock; disp(['程序运行时间:',num2str(etime(t2,t1))]); img_name = input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');end
最后的实现结果:






2 0
原创粉丝点击