Adaboost算法及其在实时视频流中的应用

时间:2022-07-01 03:07:32

Adaboost算法及其在实时视频流中的应用

摘 要:针对Adaboost算法在实时视频流中的应用,本文基于Adaboost算法的人脸检测原理,即通过提取图像中的haar特征,在训练过程中选出最优特征,转换成弱分类器,优化组合于人脸检测。最终,利用opencv的开发包,通过VC++软件编程实现基于Adaboost算法实时视频流中的人脸检测。

关 键 词:人脸检测;haar特征;Adaboost算法;Opencv

引言

人脸检测的研究最早可以追溯到20世纪60-70年代。经过曲折发展,已经有了一些较为成功的方法,正日趋成熟。一个完整的人脸检测应该包括人脸检测、特征提取以及匹配识别三大基本过程。

人脸检测的常用方法有基于知识的人脸检测、基于特征的人脸检测、基于模板匹配的人脸检测以及基于图像块的人脸检测。

1 基于Adaboost算法的人脸检测

Adaboost算法根据人脸面部的灰度分布特征,选择使用haar特征,其是一种基于积分图像的特征,该特征计算简单,提取速度较快,从而使得Adaboost检测算法基本成为当前最快的检测算法之一。Adaboost算法首先提取图像中的haar特征,然后通过训练过程从中选出最优的haar特征,再将训练得到的haar特征转换成弱分类器,最后将得到的弱分类器进行优化组合用于人脸检测。

1.1 基于Adaboost算法的人脸检测原理

(1) 提取haar特征

提取haar特征,即提取较好的haar特征对人脸图像灰度分布的特点进行描述。

1)积分图像

积分图像是将原图像中任一点的左上方的全部像素相加作为当前点像素值所得到的图像;积分图像中每个点(x,y)的值为原图像中点(x,y)左上部分所有像素值的累加:

(1-1)

其中i为原始图像,ii为积分图像。

假设已经求得某一图像的积分图像(图2),利用公式可以迅速计算出原图像中D区域内的像素的和值。

(1-2)

其中SD是原图像中D区域内的像素的和值,1、2、3、4分别是积分图像中点1、点2、点3和点4的值。

2)haar特征

haar特征是根据区域灰度的对比特点设计。如图3所示,图中给出了4个常用的haar特征。每个特征分为2个部分,对比两个部分(黑块和白块)的像素和值的大小。

(2)生成弱分类器[1][3]

每个haar特征对应一个弱分类器,每个弱分类器根据其所对应的haar特征参数来定义。弱分类器的定义公式如下:

(1-3)

其中,特征参数pj表示不等式方向,j表示阈值。

(3)训练过程[4][5]

Adaboost算法的训练过程就是挑选最优弱分类器,并赋予其权重的过程。图4是Adaboost算法的训练示意图。

1.2 级联分类器的使用

将弱分类器优化组合成强分类器,并将若干个强分类器级联在一起,其一级比一级复杂,一级比一级严格。Adaboost算法引入级联分类器,其检测示意图如图5所示。由于非人脸图像被前几级快速排除,因此加快了Adaboost算法的检测速度。

2 实时视频流中人脸检测的实现

由于使用Adaboost算法进行人脸检测需要大量的样本训练,笔者能力有限,只能基于Intel公司开发的opencv[6]开发包进行编程。编程者无需编写算法函数,只需编写调用程序,以调用opencv函数进行Adaboost算法的视频人脸检测。

2.1 关键代码

(1)获取视频文件并加载到一个windows窗口中

//确定是否目标来自文件或摄像头

if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )

capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );

else capture = cvCaptureFromAVI( input_name );

//建立一个新的window窗口,以result命名

cvNamedWindow( "result", 1 );

if( !cvGrabFrame( capture )) //如果capture成功加载,则捕获一针,并存到图像中

break;

frame = cvRetrieveFrame( capture );

if( !frame ) break; //如果针不存在,退出循环

(2)获取静态图像

//如果捕获没有成功,则 else

{//假设图像是ftest.jpg 或者特定的输入

const char* filename = input_name ? input_name : (char*)"ftest.jpg";

IplImage* image = cvLoadImage( filename, 1 ); //加载文件图像

if( image ) //如果图像成功加载,则调用处理函数

{detect_and_draw( image );

cvWaitKey(0);

cvReleaseImage( &image ); //释放内存}

else//假定它是一个文档类的文件包含要被处理图像名称,每行一个

{ FILE* f = fopen( filename, "rt" ); //以读的形式打开

if( f )

{char buf[1000+1];

while( fgets( buf, 1000, f ) )//从f中读取1000个数据

{ int len = (int)strlen(buf); //从中移去空格并且确定名字长度

while( len > 0 && isspace(buf[len-1]) ) //判断是否为空格

len--;

buf[len] = '\0';

image = cvLoadImage( buf, 1 ); //加载确定名字的图像

if( image ) //如果文件加载成功,则

{//检测图像

detect_and_draw( image );

cvWaitKey(0);

cvReleaseImage( &image );

}}

fclose(f); //既然打开文件,就要关闭它

}}}

static CvMemStorage* storage = 0; // 为计算开辟内存

static CvHaarClassifierCascade* cascade = 0; //建立一个新的haar 分类器

void detect_and_draw( IplImage* image ); //子函数声明从图像中检测出物体

const char* cascade_name ="haarcascade_frontalface_alt.xml";//建立一个字符串,包含cascade的名字,作为训练的分类器

2.2 操作方法

如果存在外接摄像头,则程序自动检测,并将视频图像放入一个名为“result”的windows窗口。紧接着程序将自动调用函数检测图像,标记人脸。如果无外接摄像头,本程序就检测静态图像。由于在程序中声明了指定图像名,因此在程序所在文件夹中须存在名为“ftest.jpg”图像文件。

3 测试结果分析

本程序在PC上测试,平台为windowsXP,软件环境为Microsoft Visual C++ 6.0。摄像头为Hyundai Camera。

从上图中可以看出本程序可以比较成功的实现在实时视频中的正面人脸检测,标记位置十分准确。本程序也可以比较成功的准确标记出视频中侧面人脸的位置。

4 结语

人脸检测技术的突破性发展,对人脸识别、表情姿态的识别、视频监控、身份验证、多媒体数据库检索等相关领域的研究产生巨大推动作用。然而,其本身的复杂性,加之数字图像采集中易受各种外界因素的干扰,Adaboost算法存在误检现象,如何降低误检率,将是笔者下一步探索的方向。

参考文献

[1] 赵丽红,刘纪红,徐心和.人脸检测方法综述[J].计算机应用研究.2004,21(9):1-4.

[2] 张建明,汪大庆.基于Adaboost 算法的多姿态人脸实时视频检测[J].计算机工程与设计.2010,31(18):4065-4067,4096.

[3] Bo Wu,HaizhouAi,Chang Huan,Shihong Lao.Fast rotation invariant multi-view face detection based on real Adaboost [C]//Sixth IEEE International Conference.Automatic Face and Gesture Recognition. 2004:79-84.

[4] 王海川,张立明.一种新的Adaboost快速训练算法[J].复旦学报(自然科学版).2004,43(1):27-33.

[5] Yong Ma,Xiaoqing Ding.Robust Real-time rotation invariant face detection based on cost-sensitive Adaboost [C]// 4th International Conference on Multimedia and Expo (ICME 2003). 2003: 465-468.

[6] 刘瑞祯,于仕琪.Open CV 教程[M].北京:北京航空航天大学出社,2007:385-393.

上一篇:软件项目管理课程教学改革与实践 下一篇:用Berreman 4×4矩阵法计算胆甾相液晶的选择性...