人脸检测是人脸识别算法的第一步,人脸识别过程主要分为人脸图像获取、人脸检测、人脸配准、人脸表征以及人脸图像匹配与识别。人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形(椭圆)在图像中的坐标,可能还包括姿态如倾斜角度等信息。人脸检测在安防监控,人证比对,人机交互,社交和娱乐等方面有很强的应用价值。
数据集
人脸检测常用的数据集有FDDB和WIDER FACE, FDDB是一个面部区域数据集,主要研究无约束人脸检测问题,一共包含了2845张图片,包含彩色以及灰度图,其中的人脸总数达到5171个。这些人脸所呈现的状态多样,包括遮挡、罕见姿态、低分辨率以及失焦的情况,并且每个人脸都有其规定的坐标位置。WIDER FACE数据集是人脸检测的一个基准数据集,包含32203图像,以及393,703个人脸,分别在尺度、姿势、标准、表达、装扮和光照等方面有不同的体现。制作者来自于香港中文大学(2016年发布),他们选择了61个事件类别,对于每个类别,随机选择40%,10%,50%作为训练、验证、测试工作。
AdaBoost框架的人脸检测算法
在深度学习的人脸检测方法出现之前,AdaBoost框架的人脸检测方法在工业界被广泛使用。AdaBoost框架的基本思想是通过几个简单的弱分类器构建出强分类器,具有代表性的方法为VJ算法(VJ算法使用了5种基本的Haar特征以及基本的级联结构),后人在一段时间中就VJ框架进行改进,有扩展的Haar特征,LBP特征,SIFT特征,HOG特征等代替5种基本的Haar特征,或者是金字塔式级联结构,树形的级联结构代替原来的级联结构,或是链式Boosting方法,嵌套式Boosting方法来改进分类器,提高人脸检测的效率和精度。
VJ人脸检测器是在2001年提出的,相比于之前的一些早期人脸检测算法,VJ人脸检测器在获得相同或者更好的准确度的同时,速度提升了几十甚至上百倍,在当时的硬件条件下达到了每秒处理15张图像的速度,接近实时速度的25fps。VJ人脸检测器是人脸检测历史上最具有里程碑意义的一个成果之一,奠定了基于AdaBoost的目标检测框架的基础。VJ人脸检测相比于早期的一些算法,在检测速度上提高了很多,归功于三个关键要素:分别是特征的快速计算方法-积分图,分类学习方法-AdaBoost以及级联结构。
下图是分类器级联进行判断的示意图。通过若干个强分类器级联,如果一个检测窗口通过了第一级分类器的筛选就判断为人脸,然后送到下一级分类器进行判定,从前往后,分类器的复杂程度和计算代价逐渐增大。如果检测窗口通过所有的强分类器,就判断为人脸,否则就是非人脸。VJ人脸检测器通过将AdaBoost构建的强分类器级联进行人脸检测,可以提高检测性能也大幅加快检测速度。
VJ算法有3点缺点,首先是5种基本的Haar-like特征是一种相对简单的特征,其稳定性较低。第二点是VJ算法对于解决正面的人脸效果好,对于人脸的遮挡,姿态,表情等特殊且复杂的情况,处理效果不理想。所以后来又有改进Haar特征的方法,在原来5个Haar特征模板的基础上增加了旋转等方式,对姿态等问题有所改进。第三点是VJ分类器评价一个样本不会基于前几个分类器的表现,鲁棒性差。
深度学习的人脸检测方法
1. Cascade CNN
Cascade CNN是传统技术和深度网络相结合的一个代表,他也用到了VJ算法中的级联结构。其包含了多个分类器,这些分类器采用级联结构进行组织,不同的地方在于Cascade CNN采用卷积网络作为每一级的分类器。(VGA图片,14fps on single CPU,100fps on GPU,FDDB上达到85.1%的召回率和87%的准确率)
Cascade CNN的方法是一个3阶级联,是由3对net和calibration-net的组合构成。他的过程是首先构建多尺度的人脸图像金字塔,12-net使用1212的检测窗口,步长为4密集扫描整幅图像,剔除掉非人脸的检测窗口,将分类得到的人脸检测窗口送入12-calibration-net中调整检测窗口的尺寸和位置。然后通过非极大值抑制的方法合并高度重叠的检测窗口,然后保留下来的候选检测窗口被归一化到24x24的检测窗口作为24-net的输入,24-net进一步剔除非人脸的检测窗口,24-calibration-net矫正检测窗口,在利用非极大值抑制进行窗口合并4848的检测窗口作为48-net的输入,然后48-net过滤检测窗口,然后这一步再利用了非极大值抑制NMS进行窗口合并,送入到48-calibration-net作为最后的输出。示意图如下图所示: