MFC下利用OpenCV进行人脸检测的研究与实现①
2013-09-27程舰
程 舰
(大连海事大学信息科学技术学院,辽宁 大连 116026)
0 引言
人脸检测的目的是在给定的一副图像上将人脸部分定位出来,这种技术涉及了计算机图形学、生物学等领域的相关技术.人脸检测的本质是对人脸进行建模,提取样本中的人脸特征信息,比较待检测图像与模型的匹配度,来判断待检测图像中是否存在人脸.根据检测原理和方法的不同,人脸检测方法分为基于特征统计模型和基于特征两种检测方法.本文所采用的是Adaboost方法,其属于人脸检测方法中的统计方法.这些算法设计到图形学中很多繁琐的计算,如全部靠程序员手动编写,工作量非常大.本文设计的系统采用了C++中的OpenCV计算机视觉函数库中的一些函数.并以Visual C++6.0作为开发环境.
1 Adaboost算法原理及其在人脸检测中的运用
Adaboost算法是通过boosting算法改进而来的[1],boosting 算法是一种通用的学习算法[2],这一算法可以提升任意给定的学习算法的性能[3],其思想源于1984年Valiant提出的“可能近似正确”-PCA(Probably Approximately Correct)学习模型[4].它是一种将弱分类器通过某种结合方式结合起来得到一个分类器性能大幅度提高的强分类器的分类方法[5].
2001年,Viola等人提出了基于AdaBoost算法的人脸检测框架[6],此后越来越多的学者开始研究这个领域,通过不断的完善,目前他们构建的这个检测框架可对图像中的人脸进行快速的检测,正确率也很高.在AdaBoost算法的训练工程中,每个Haar特征都被当做一个弱分类器,然而,仅有一部分Haar特征能够描述人脸灰度分布的一些特点.因此AdaBoost算法在训练过程中必须攻克的一个难题是:采取合适恰当的方法从众多的Haar特征中筛选出最优的Haar特征,并利用该特征制作成人脸检测中所使用的分类器.
2 WindowsXP下训练.xml文件
本文中人脸检测使用的方法是haar+Ada-Boost,前提是要训练好级联分类器.机器学习前要训练很多人脸数据,本文采用从网上下载的Yale大学的人脸数据库,即将它们当做训练的正样本使用.该人脸数据库是由Yale大学的计算视觉与控制中心所创建,其中涵盖了15名志愿者每人11张,共165张头像照片,本文使用其中的133张作为正样本,其余22张用来做测试,如图1所示:
Yale大学人脸数据都是bmp格式的,80*80像素大小.这个算法训练的时间非常长,图片不到1000就需要的时间都是以天为单位.所以为了减少训练时间,减小图片的尺寸,我们可以利用ACD-see软件将80*80的图片统一到尺寸24*24像素大小.最后所得的图片截图如2所示:
图1 Yale人脸数据库部分图像截图
图2 尺寸归一化后部分图像的截图
本文采用的负样本是weizmann团队网站上的图像分割数据库,选取其中200张的灰度图,这些图片基本都没有人脸.至此正负样本的图片都已准备好,首先建立名为pos_image的文件夹放入正样本,建立名为neg_image的文件夹放入负样本,建立名为test_image的文件夹放入测试样本,并将opencv安装目录下的 opencv_haartraining.exe和openv_createsamples.exe两个文件也拷贝过来.
首先建立正样本描述文件,打开cmd窗口,进入pos_image文件夹内,使用 dir/b>pos_image.txt,且用editplus打开该文件,删除最后一行,最后将名字归一化如图3所示:
负样本描述文件的建立类似,文件命名为neg_image.txt.接下来创建vec文件时,需将pos_image.txt和 neg_image.txt两个样本描述文件剪切到上一目录,然后利用opencv_createsamples.exe应用程序在该目录下使用如下cmd命令:opencv_createsamples.exe – vec pos.vec – info pos_image.txt–bg neg_image.txt–w 24 –h 24–num 154
其中的-vec是指定后面输出vec文件的文件名,-info指定正样本描述文件,-bg指定负样本描述文件,-w和-h分别指正样本的宽和高,-num表示正样本的个数.执行完该命令后就会在当前目录下生产一个pos.vec文件了.
接下来在当前目录下新建一个xml文件夹用于存放生成的.xml文件.在当前目录使用cmd命令:Opencv_haartraining.exe –data xml–vec pos.vec–bg neg_image.txt–nsplits 1– sym – w 24–h24–mode all–mem1870.
图3 正样本描述文件名字归一化操作的部分截图
其中-data为输出xml中间文件的位置,-sym表示训练的目标为垂直对称,-nsplits 1表示使用简单的stump classfier分类.-mem 1870表示允许使用计算机的1870M内存,-mode all表示使用haar特征集的种类既有垂直的,又有45度角旋转的.训练好之后在当前目录下生产了一个xml.xml文件,将其重名名为 face_test.xml.
图4 人脸检测效果图
3 在Visual C++6.0中人脸检测的实现
本系统创建的工程为MFC AppWizard,选择基本对话框的应用程序类型,对话框类命名为:CAdaboostFaceDlg.系统的功能主要编写在以下几个函数:OnPreview(),利用 OpenCV库中的 cvCapture-FromCAM()、cvQueryFrame()函数从摄像头中截图一副图像;OnCheckface(),利用 CvHaarClassifierCascade()函数加载之前生成的face_test.xml文件,供检测人脸使用;detect_and_draw(IplImage*timg),此函数为人脸检测的核心函数,其核心代码如下:
实现人脸检测并在检测到的头部位置画红色的圆圈示意.运行结果如图4:
实验结果表明,本次实验利用MFC所搭建的平台能够准确无误的捕捉到摄像头,并且可以通过手动截取到一帧图片,然后利用C++的OpenCV库函数加载按照本文的方法所训练的训练分类器.xml文件进行人脸检测.检测结果表明,按照本文的方法可以较准确地检测出人脸,证明训练方法正确可行.
4 结语
本文介绍了如何在MFC下利用OpenCV库函数来搭建进行人脸检测系统,重点阐述了Haar+AdaBoost分类器的训练过程.实验结果表明,本文的设计方案具有较高的准确性和稳定性,基本达到预期的效果.但是本系统仍有可以完善的地方,主要分为两点:一是训练分类器的样本数目不够大;二是当视频上的图像可能会有外界因素影响(强光、抖动等),可以加入消抖、去阴影等算法.
[1]江林升.利用OpenCV实现人脸检测[J].电脑编程技巧与维护.2009,(11):62 -64.
[2]BERND HEISELE,THOMS SERREB,SAM PRENTICEB.Hierarchical Classification and Feature Reduction for Fast Face Detection with Support Vector Machines[J].Pattern Recongnition,2003,36(9):2007 -2013.
[3]左登宇.基于AdaBoost算法的人脸检测研究[D].合肥:中国科学技术大学,2009.
[4]唐渝.人脸实时监测技术研究与实现[D].重庆:重庆大学,2012.
[5]崔晓青.基于AdaBoost算法的人脸检测系统的研究与实现[D].长春:吉林大学,2008.
[6]BRADSKI GARY,KAEBLER ADRIAN.Learning OpenCV[M].北京:清华大学出版社,2009.