人脸检测发展:从VJ到深度学习(上)

  有人设计了一种金字塔式的级联结构,金字塔的每一层对应于对人脸姿态(旋转角度)的一个划分,从顶层到底层划分越来越细,级联的每个分类器只负责区分非人脸和某个角度范围内的人脸。对于一个待分类的窗口,从最顶层的分类器开始对其进行分类,如果其被分为人脸窗口,则送入到下一层的第一个分类器继续进行分类,如果其被分为非人脸窗口,则送入到同一层的下一个分类器继续进行分类,当在某一层上所有的分类器都将其分为非人脸窗口时,就确认其为非人脸窗口,将其排除。金字塔式的级联结构也可以看成是一种特殊的并列式结构,只不过每个级联分类器相互之间有共享的部分,这样最直接的好处就在于减少了计算量,共享的部分只需要计算一次,同时在底层又保留了分治策略所带来的好处——子问题比原问题更加容易,因此更容易学习到分类准确度更高的分类器。

物联网

  还有一种比较典型的结构是树形的级联结构,从形状上来看其和金字塔式的级联结构是一样的,也是从上往下分类器的数目逐层增多,区别就在于树形的级联结构中没有同一层分类器之间的横向连接,只有相邻层分类器之间的纵向连接,即一个窗口在同一层上不会由多个分类器进行分类,而会直接被送往下一层或者被排除。树形级联结构通过引入分支跳转机制,进一步减少了对一个窗口进行分类所需要的计算量,不过同时也带来了新的问题,分支跳转通常根据姿态估计(估计旋转角度的范围)的结果来进行,而如果姿态估计出现错误,就会出现某个姿态的人脸窗口被送给另一个姿态人脸对应的分类器进行分类的情况,容易导致错误的分类。为了缓解这一问题,出现了允许多个分支同时跳转的设计,从而降低了由于跳转错误而引起分类错误的风险。

  分治策略是处理多姿态人脸检测任务最基本的策略,但要同时兼顾速度和分类准确度并不是一件容易的事情,分类能力的增强不可避免地会带来计算代价的增大,如何用更小的计算代价来换取更高的分类准确度,这仍然是一个需要去思考和探索的问题。

  人脸检测器的比拼

  在不断对人脸检测器进行改进的过程中,有一个问题是不容忽视的:如何科学地比较两个人脸检测器的优劣?简单地说,出一套考题让所有的检测器进行一场考试,谁得分高谁就更好。对于人脸检测器而言,所谓考题(测试集)就是一个图像集合,通常其中每张图像上都包含至少一张人脸,并且这些人脸的位置和大小都已经标注好。关于得分,需要考虑检测器两方面的表现,一是检测率,也即对人脸的召回率,检测出来的人脸占总人脸的比例——测试集中一共标注了100张人脸,检测器检测出其中70张人脸,则检测率为70%;二是误检(也称为虚警)数目,即检测器检测出来的人脸中出现错误(实际上不是人脸)的数目——检测器一共检测出80张人脸,然而其中有10个错误,只有70个是真正的人脸,那么误检数目就是10。在这两个指标上,我们所希望的总是检测率尽可能高,而误检数目尽可能少,但这两个目标之间一般是存在冲突的;在极端的情况下,如果一张脸也没有检测出来,那么误检数目为0,但是检测率也为0,而如果把所有的窗口都判别为人脸窗口,那么检测率为100%,而误检数目也达到了最大。在比较两个检测器的时候,我们通常固定一个指标,然后对比另一个指标,要么看相同误检数目时谁的检测率高,要么看相同检测率时谁的误检少。

  对于每一个检测出的人脸,检测器都会给出这个检测结果的得分(或者说信度),那么如果人为地引入一个阈值来对检测结果进行筛选(只保留得分大于阈值得检测结果),那么随着这个阈值的变化,最终得检测结果也会不同,因而其对应得检测率和误检数目通常也会不同。通过变换阈值,我们就能够得到多组检测率和误检数目的值,由此我们可以在平面直角坐标系中画出一条曲线来:以x坐标表示误检数目,以y坐标表示检测率,这样画出来的曲线称之为ROC曲线(不同地方中文译法不一,如接收机曲线、接收者操作特征曲线等,这里直接采用英文简写)。ROC曲线提供了一种非常直观的比较不同人脸检测器的方式,得到了广泛的使用。