姜海波 孙洋
(南京信息职业技术学院电子信息学院 江苏省南京市 210023)
随着近年来人工智能技术的快速发展,人脸检测技术在人机交互、公安系统、安全认证、活体检测等方面得到了广泛的应用,并且在医学医疗、疫情防控、远程会议、档案管理、身份认证等领域也发挥着越来越大的作用,人脸检测是在复杂的背景图片中能准确甄别人脸图像所在位置,并将其锁定,为后期的人脸识别提供采集图像,是人脸识别过程中关键的环节和前提条件,因为面部肌肉运动、年龄增长、表情程度、成像距离、成像偏转角度、光照因素等等变化都会造成人脸图像具有较大的差异,从而为人脸检测分析计算带来很大的困扰,由此应用要求而引发的问题,使得研究者对人脸检测技术的探索渐渐的重视起来,并慢慢发展成一个独立的研究方向,相应的算法和应用也得到了扩展和完善。
人脸检测大致可分为两大类,一类是基于静止图片,通过判断背景图像中是否含有人脸存在,并讲人脸部分在图像中进行标注;另一类则是基于视频,通过视频资源中人脸图像出现情况,进行区域标记。后者难度较高,它对算法和计算机的实时性和性能提出更高的要求。本文主要针对第一类,即针对静止图片进行人脸检测研究,其主要的检测方法种类繁多,总体可分为统计法和几何特征法,比较主流的算法有子空间法、神经网络法、SVM、基于肤色模型法、基于统计模型法等。值得一提的是在1990年,Schapire 提出一种多项式级思想,这是最初的Boosting 算法,后经Freund和Schapire 于1995年对Boosting 算法的改进得到AdaBoost算法,其算法原理是通过调整样本权重和弱分类器权值,从训练出的弱分类器中筛选出权值系数最小的弱分类器组合成一个最终强分类器。基于训练集训练弱分类器,每次下一个弱分类器都是在样本的不同权值集上训练获得的。每个样本被分类的难易度决定权重,而分类的难易度是经过前面步骤中的分类器的输出估计得到的。同时也具有一定缺点,其训练速度较慢,依赖于训练集,在训练数据偏颇或不充足情况下,其分类结果不够理想,准确率也较低,使其分类效果大大提升,主要是通过弱分类器的级联组合,形成一个较强的强分类器来实现的目标检测,
如图1 所示,Haar 特征是一种用于物体检测的数字图像特征,也是一种矩形特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。Haar 特征包含边缘特征、线性特征、中心特征、特定方向特征等。
图1 :Haar 特征模板
通过Haar 特征模板,使用检测模板对人脸相邻区域像素进行差值运算,可以将人脸图像进行不角度的解析,得到对应的特征值。以线性特征中的白黑白模板为例,该模板在人脸眼睛与鼻子处所计算得到的特征值将与非人脸图片得到的特征值有较大差值,因此该模板对于鉴别人脸与非人脸有一定区分能力。
Haar 特征最主要的优势是它的计算非常快速,其中主要是因为它使用积分图的结构,成块区域的值进行减运算,其对应的值大小为坐标 (x,y)左上角的所有像素之和,对于图像内一个点i(x,y),定义其积分图ii(x,y)为:
要计算相应的Haar 特征,只需要用端点的积分图进行简单加减运算,它可以快速计算矩形特征值,如图2 所示。
图2 :积分图
那么该特征模板所对应的特征值=[ii+ii-(ii+ii)] 。通过不同模板、不同步长(在图像子窗口平移、伸缩、扩展)得到了矩形特征,矩形特征可以位于图像任意位置、大小也可以任意改变,所以矩形特征值是矩形模板、矩形位置、举行大小三个因素最终作用的结果。遍历对人脸图像进行特征提取,最终将得到表示人脸特征的一个n*1 维的特征向量,完成人脸特征的提取,举个例子,一张32*32 像素大小的图片,可以根据Haar 特征检测得到特征数量多达到十万以上,那么后续如何对这些特征进行分类最有效呢?这就要通过AdaBoost 算法进行特征训练。
AdaBoost算法是一种自适应增长算法,也是一种迭代算法,在每一轮加入一个新的弱分类器,直至达到某个预定的足够小的错误率。通过第一次分类后,对分错的样本进行权重重新调整,加大分类错误的样本权重,让算法重视该样本,并能在下次分类时候向分错样本进行倾斜。每次训练都将得到一个弱分类器,在下次训练时进行样本权重调整,直至到总训练达到设定参数,将得到的所有分类器进行线性组合,得到最终的强分类器。经过不停的迭代,训练得到一个强分类器,最总通过强分类器加权判断最终样本的是否为目标,在训练过程中,通过“聚焦”那些较难分的样本,通过不停调整权重,只有当整个样本的错误率小于设定参数或者达到一定的迭代次数才会停止训练。
在具体实现上,其主要的步骤为:
(1)输入样本集合N={(x,B),(x,B),(x,B),(x,B)…(x,B)},其中B=y为样本类别,y属于{-1,1},即分别表示正样本和负样本,n 为总的样本数量。
(2)初始化样本权重,正负样本进行平均权重赋值D1;
(3)对于迭代次数t=1,2,3,4…T,
1.针对初始化的样本权重,用垂直的直线作为分类器,得到一个子分类器H1;
2.根据该弱分类器模型H1 分类结果,重新调大分错样本的权重,更新得到新的样本权重D2,其对应权重调整公式如(2)所示,利用新的权重,用水平直线再做分类器,得到一个子分类器H2;
3.再根据弱分类器H2 分类结果,重新调整样本的权重,得到新的样本权重D3,利用新的权重,做垂直直线再进行分类,得到一个子分类器H3;
4.重复步骤(1-3),直至达到最初设定分类正确率或迭代次数后,将所有弱分类器线性组合,每个权重就是公式中计算的α 值。
AdaBoost 算法训练所对应的过程如图3 所示。
图3 :AdaBoost 样本训练过程
通过 AdaBoost 算法的实现过程可知,该算法在实现过程中根据训练集的多少初始化样本的权值,第一次样本权重是按照均匀分布进行初始化,在后续操作中通过公式来改变和规范化算法迭代后样本的权值。样本被错误分类导致权值增大,反之权值相应减小,这表明被错误分类的训练集将被赋予一个更大的权值,使它在下轮时训练样本集更注重分类错误的样本,针对这些关键样本的不断学习来构建下一个弱分类器,直至样本被正确分类。在达到规定的迭代次数或者预期的误差率时,则强分类器构建完成。
AdaBoost 算法可以使用回归分类模型构建弱分类器,非常灵活且具有很高的精度,并且能充分考虑每个分类器的重要程度,但在分类训练过程中,训练时间花费较大,且受限于人为设定参数。鉴于对不同样本训练没有经验可以借鉴,因此想训练一个较好的分类器将要对参数进行多组对比实验和不停尝试,我们将在探索和实验上花费大量的时间,算法在重复训练过程中,通过是否达到准确率和训练次数作为结束条件,参数是人为设定的,设定的参数可能对训练的周期、分类器的性能产生较大的影响,异常样本在迭代过程中可能会获得较高的权重,从而影响强学习器的准确性。本文通过算法进行准确度对比,自动判断训练结束,减少人为设定所带来的影响。将训练过程加入分类器前一次和后一次的正确提升率比较,比较发现两者之间的分类准确率,如果低于阈值时,所训练得到的分类器已经达到最优解,则结束训练,其流程图如图4 所示。
图4 :改进的AdaBoost 流程图
通过不同的Haar 特征算子对人脸图片进行不同尺度、不同步长的特征提取,将提取的特征作为输入,根据已标定的正负结果,进行模型自主学习训练,其实现的步骤大致分为几步:
人脸样本主要下载国际上公开的一些人脸库,包括Yale人脸库、ORL 人脸库、FERET 人脸库、AR 人脸库及网上搜集的一些常规人脸图片,这些人脸图片包含彩色、黑白且大小尺寸都不相同,要对其进行尺寸变换,统一成相同的尺寸。同时,非人脸的负样本采集时要多加入一些与人脸近似的照片,含圆形、动物脸及常见背景图等作为负样本,不做归一化。负样本所选的易混淆种类越多,算法误判越小,正负样本包含倾斜角度越多、数量越多,其算法准确率越高。本文正样本数量约为1000 张人脸图片,负样本约为3000 张。
训练使用,设置分类器迭代次数及停止迭代的样本误差,输入参数时要注意参与单一分类器训练的正样本个数要比总正样本总量少,通过不断抽取正样本库中的不同样本进行单一分类器的训练,同时,在训练单一分类器时,负样本的选取数量最好设置在正样本的2-5 倍为最佳。
选择相同的训练和测试样本,对比改进前后两种算法的准确度和训练时间,对比分析两个分类器的性能,为了能实验数据严谨可靠,在本次对比试验过程中,采用多组测试取均值进行对比。通过多组人脸目标测试,发现改进后的算法训练时长明显缩短,且准确率稍有提升。
本文对正负样本数据进行多组实验,并统计多组实验的准确率和时间的平均值进行比较,不难发现,经过改进的算法时间上大大缩减,且人脸检测准确率也有所上升,达到预期的目标。
时间 准确率AdaBoost 算法 4.5min 89.77%Improved AdaBoost 算法 2.7min 91.22%
如图5 所示分别是检测原图、原算法检测结果图、改进算法检测结果图,通过检测发现原算法和改进算法不仅仅在训练时间上有所缩短,而且对图片中人脸检测定位更为精准,在准确率也有所提升。
图5 :测试对比图
实验过程中也发现光线、偏转角度不同造成部分人脸检测不到,后期可以考虑在训练样本中添加了带有偏转角度的、光线强弱不同的正样本,使得分类器能具备具有一定的鲁棒性,在对目标人脸进行测试时,对于一定范围内的偏转角度有所改善,能够检测到以往漏检的人脸,并标记出来,未来将会继续跟进此方向研究,探索不同图片光线强度、人脸遮挡、背景复杂等情况下的解决办法和对比性实验,使其保证分辨能力准确率同时能更快更精准定位到目标所在位置。
本文通过对人脸检测重要性、Haar 特征及AdaBoost 分类器训练原理进行详细阐述,并对AdaBoost 算法的存在训练周期过长不足,提出改进算法,通过自行误差比较判断迭代训练是否结束,实现一种通过量化训练样本从而加快训练速度办法。通过多组对比实验数据统计,发现该方法在保证算法准确精度的基础上,缩短了训练时间。通过算法改进前后的实验对比发现,改进算法训练速度快、准确率较高,达到了很好的效果。