基于Adaboost的人脸检测中关于级联分类器设计和训练问题的探究



  一、光照问题的处理

  光照在许多图像处理方面中都是十分重要的问题,在本文所涉及的人脸检测中,光照也是影响人脸检测效果的重要因素。光照影响体现在两方面:光照强度变化和光照角度变化。光照强度变化会使图片数据在整体上同幅变化;而光照角度变化会产生不同的明暗区域,相应会产生附加的边缘信息。这些都严重的影响人脸检测的效果。在采用Haar特征的情况下,光照会在很大程度上改变Haar特征值,进而影响人脸检测的效果。为了削弱这种影响,非常必要引入去光照技术。

  在去光照的方法分类中主要有光照归一化方法和光照不变量提取方法等。由于归一化方法简单高效,被采用的比较广泛。归一化的方法包括:直方图均衡化、对数变换、伽玛校正、同态滤波、小波直方图均衡化等。

  在归一化方法中,Viola和Jones给出了一种解决方案:在每次计算Haar特征值时,将Haar特征值除以一个归一化参数δ。

  在上面式子中的参数都是关于该Haar特征的覆盖区域定义的。其中:m为均值,x为每个像素的值,N为像素数。m可以通过积分图快速计算,而可以通过平方积分图快速计算。该归一化过程在训练和检测中每一次Haar特征计算时均需使用。

  从图1中可以看出,在不同光照的情况下,使用上面所述归一化方法的检测程序在人脸检测中可以检测到不同光照条件下的人脸,无论是整体光照强度的变化,还是光照不均匀而产生阴影,都实现了正常的识别,从而证实该方法的有效性。

  二、级联分类器设计

  直接构造一个强分类器来实现人脸检测,无论是在训练的复杂度,还是检测时的性能,都是满足不了实践的要求。而通过串联多个分类器来构造一个级联式强分类器,能够很好的解决了上面的问题。

  由于人脸检测是一个非对称的情况,非人脸的子窗口会占绝大多数,这样在每一级的级联子分类器中都会拒绝大部分的检测子窗口,而传到下一级的窗口数量会极大的减少,从而很好的实现了人脸的检测,也极大的提高了检测性能。

  从级联检测器的构造来看,通过第一级的子窗口会传给第二级来进一步检测确认,如果仍然认为是人脸则传递给下一级,以此类推。每一级的级联子分类器的运行频率会相差很大,前面的级联子分类器的运行频率会是后面的数十倍,所以前面级联子分类器的性能要优于后面的级联子分类器。

  三、分类器的训练

  在设计第一级级联子分类器时,为了达到速度最快的目的,可以采用了如下的设计思想:忽略考虑光照问题;计算数量极少。

  具体设计如下:在一个24x24的子窗口中,将9-12行像素值的和减去5-8行像素值的和(等同于采用一个特殊的Haar特征),如果结果为正,则表示为人脸,如果结果为负,则表示为非人脸。

  这种方法在PIE人脸库上面的识别率为99.75%。出现无法识别的图片为眼镜反光或者是图片出现脸部周边背景。这种方法的误识率较高,但是对于这一级并不是考虑的问题。而这种方法在不包含人脸的图片上进行识别,并将这一级认为是人脸的子窗口保存起来。采用这种设计时子窗口通过率小于50%,也就说明大于50%的子窗口在这一级被过滤掉了,是比较有价值的。

  在设计第二级级联子分类器时,可以采用较少的基本Haar特征(不含位置信息)。具体设计时可以先选定几个简单特征,然后进行比例放大。例如:

  HaarLike=[1 -1],放大倍数=[1 2 4 6 8 10 12]

  这样就选定了7个基本Haar特征。然后分别用这7个Haar特征在子窗口中自左上至右下每个像素或每两个像素移动,即可构造出一个图片的Haar特征集。这个Haar特征集即可用于训练或识别。在这一级可以采用大小为1000左右Haar特征集。

  在adaboost的训练中,可以采用PIE人脸库和MIT人脸库,笔者设计中采用了这两个人脸库各一半的数据,共9320个正样本。负样本使用在第一级测试中通过的样本(上一级使用没有人脸的图片检测出的“正样本”是下一级的负样本),具体数量可以采用20000-30000之间。训练完成后,即可用于识别。经过这两级的级联分类器,已经可以得到一定的识别率和误检率。

  在设计第三级级联子分类器时基本采用第二级的思想,可以采用更加丰富的Haar特征及放大比例,为了实验的目的,加快训练和识别的速度,可以采用3000左右的Haar特征集。在adaboost的训练中,依然采用和第二级相同的正样本。负样本采用使用前面已经设计好的两级级联分类器过滤出的“正样本”(其实是误检的非人脸样本),数量依然采用20000-30000。

  在设计后面的级联子分类器时仍然采用前面相同的思想即可。其中一个较大的问题是在固定时间内得到前一级的误检样本(作为本级的负样本)数量会急剧减少,所以影响是大大增加了实验的时间。

  四级级联分类器就基本满足了实验目标,在人脸基本没有倾斜的情况下,检测率大于95%,误检率小于10%。在Matlab的实验环境中,由于Matlab处理循环的效率不高,所以检测一幅480x320的图片中,会耗时2-4分钟左右。