OpenCV专题|OpenCV用于人脸检测

from: http://www.rs-online.com/designspark/electronics/knowledge-item/content-862

一个人的脸部特征可以传达很多信息,如性别,大致年龄,性别以及情感等,因此,在过去三十多年的时间里有大量学者热衷于对人脸检测与人脸识别的研究。

【OpenCV专题|OpenCV用于人脸检测】人脸检测(Face Detection)是指在输入图像中确定所有人脸(如果存在) 的位置、大小和位姿的过程。人脸检测作为人脸信息处理中的一项关键技术,近年来已成为模式识别与计算机视觉领域内一项受到普遍重视,研究十分活跃的课题。人脸识别或辨认、人脸定位以及人脸追踪等都与人脸检测密切相关。
人脸定位的目的是确定图像中人脸的位置。假设一幅图像中只存在一张脸,则面部特征检测的目的是检测特征的存在和位置,如眼睛、鼻子(鼻孔) (眉毛) (嘴) (嘴唇)耳朵等。人脸识别或辨认是将输入图像与数据库中的图像比对,如果存在,报告匹配结果。人脸识别的目的是检验输入图像中的个体的身份,而人脸追踪方法是实时地、连续地估计在图像序列中的人脸的位置和可能的方向。面部表情识别涉及识别人类的情感状态(高兴、悲伤、厌恶等) 。很明显,在任何解决上述问题的自动识别系统中,人脸检测是第一步。
人脸检测应用
人脸检测可用于生物特征识别,通常做为人脸识别系统的一部分。人脸检测也可以用于视频监听、人机交互和图像数据库管理。一些最新的数码相机使用人脸检测来自动对焦。人脸检测也获得了市场的兴趣。电视机上可以集成摄像头来检测任何走过的人脸,然后计算该用户的种族、性别和年龄范围。一旦获得这些信息,可以针对性的播放广告。

人脸检测也可以用于节约能源。人们看电视或电脑的时候往往会做其他工作,这时候普通的显示器不能自动降低亮度来节省能源。智能系统可以识别用户的面部朝向,当用户不看屏幕时,可以自动降低亮度;在用户重新看屏幕时,再增加亮度。
随着近些年来国际形势的变化,特别是 9.11 事件之后,各国对自身重要设施的安保性能越发重视,也积极研发了一些自动人脸识别系统并投入实用。比如,美国 Identix 公司的 FaceIt系统,该系统基于局部特征分析(LFA),能在不同的光照,肤色,姿态,表情情况下得到良好的检测性能。我国的生物特征认证与安全技术研究中心(CBSR)则在 2004 年成功研制出了基于人脸、指纹、虹膜三种识别方法的快速通关系统(MRTD),取得了国际先进的整体性能。
人脸检测主要难点
人脸的自动检测是一类具有很大挑战性的问题,其主要难点在于:
(1)人脸是一类高度非刚性的目标,存在相貌,表情,肤色等差异;
(2)人脸上可能会存在一些附属物,诸如,眼镜,胡须等;
(3)人脸的姿态变化万千,并且可能存在遮挡物;
(4)待检测图像性质的差异。比如:待检图像的分辨率;摄录器材的质量等;
(5)光源的种类和角度。不同种类和角度的光源会对待检测的人脸产生不同性质的反射和不同区域的阴影。
人脸检测算法实现
到2000年为止,已经出现非常多的技术应用于检测人脸,但是都存在处理速度太慢或可靠性低的问题。直到2001年Viola和Jones提出了基于Haar特征的级联分类器用于对象检测,并于2002年由Lienhart和Maydt经过改进,状况才得到改变。这种对象检测器即快速又可靠,并且可以直接在OpenCV中使用这种分类器。还有一种是基于LBP特征的级联分类器,速度比Haar分类器快好几倍。Haar分类器的训练是独立于人脸检测过程的。分类器的训练分为两个阶段:
A. 创建样本,用OpenCV自带的creatsamples.exe完成。
B. 训练分类器,生成xml文件,由OpenCV自带的haartraining.exe完成。
OpenCV中的这两种分类器都已经是训练好的,可以直接使用。检测流程如下:

Viola-Jones人脸检测算法的主要贡献:
1. 提出积分图像(integral image),从而可以快速计算Haar-like特征。
Haar-like型特征是Viola等人提出的一种简单矩形特征,因为类似Haar小波而得名。Haar型特征的定义是黑色矩形和白色矩形在图像子窗口中对应的区域的权重灰度级总和之差。算子数量庞大时上述计算量显得太大,Viola等人发明了积分图方法,使得计算速度大大加快。
2. 利用Adaboost学习算法进行特征选择和分类器训练,把弱分类器组合成强分类器。
在离散Adaboost算法中,Haar-like特征算子计算结果减去某阈值,便可视为一个人脸检测器。因为其准确率不高,称为弱分类器。Adaboost算法的循环中,首先利用各种弱分类器对训练图片库进行分类,准确度最高的弱分类器保留下来,同时提高判断错误的图片的权重,进入下一循环。最终将每次循环所保留的弱分类器组合起来,成为一个准确的人脸检测器,称为强分类器。
3. 采用分类器级联提高效率。
瀑布型级联检测器是针对人脸检测速度问题提出的一种检测结构。瀑布的每一层是一个由adaboost算法训练得到的强分类器。设置每层的阈值,是的大多数人脸能够通过,在此基础上尽量抛弃反例。位置越靠后的层越复杂,具有越强的分类能力。 这样的检测器结构就想一系列筛孔大小递减的筛子,每一步都能筛除一些前面筛子楼下的反例,最终通过所有筛子的样本被接受为人脸。



OpenCV人脸检测原理
人脸检测属于目标检测(object detection) 的一部分,主要涉及两个方面:

  1. 先对要检测的目标对象进行概率统计,从而知道待检测对象的一些特征,建立起目标检测模型。
  2. 用得到的模型来匹配输入的图像,如果有匹配则输出匹配的区域,否则什么也不做。
OpenCV中Haar分类器的路径:

haarcascades目录下还有人的全身,眼睛,嘴唇,侧脸,鼻子,上半身等的Haar分类器。
那么我们该如何利用呢?可以参见这篇博文——【OpenCV入门指南】第十三篇 人脸检测:http://blog.csdn.net/morewindows/article/details/8426318。
这篇博文写的非常详细。以下摘录一些主要内容。
使用人脸的Haar特征分类器非常之简单,直接使用cvHaarDetectObjects。下面来看看这个函数的介绍。
函数功能:检测图像中的目录
函数原型:
CVAPI(CvSeq*) cvHaarDetectObjects(
const CvArr* image,
CvHaarClassifierCascade* cascade,
CvMemStorage* storage,
double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3),
int flags CV_DEFAULT(0),
CvSize min_size CV_DEFAULT(cvSize(0,0)),
CvSize max_size CV_DEFAULT(cvSize(0,0))
);
函数说明:
第一个参数表示输入图像,尽量使用灰度图以加快检测速度。
第二个参数表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。
第三个参数为CvMemStorage类型,大家应该很熟悉这个CvMemStorage类型了,《OpenCV入门指南》中很多文章都介绍过了。
第四个参数表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%
第五个参数表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
第六个参数要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。
第七个,第八个参数表示检测窗口的最小值和最大值,一般设置为默认即可。
函数返回值:
函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。
这是该博文的其中一个运行结果:

如果你对OpenCV有所了解,可以到上面提出的博文页面参考具体的原代码。

    推荐阅读