aihot  2017-06-18 08:20:38  深度学习 |   查看评论   

特征的改进和变迁
 
  虽然Haar特征已经能够刻画人脸的一些特点,但是相比于人脸复杂的变化模式,VJ人脸检测器所采用的5种Haar特征还是过于简单。光考虑姿态上的变化,人脸可能是斜着的(平面内旋转),也可能是仰着的或者侧着的(平面外旋转),同一个Haar特征在不同姿态的人脸上差异可能非常大,而同时又可能和非人脸区域上的特征更相近,这就很容易在分类的时候引起误判。于是人们开始对Haar特征进行扩展,使得其能够刻画更加丰富的变化模式:
1. 环形的黑白区域划分模式,而不仅仅是上下或者左右型;
2. 旋转的Haar的特征,即将原来提取Haar特征的局部小块顺时针或逆时针旋转45度;
3. 分离的Haar特征,即允许一个Haar特征由多个互相分离的黑白区域来计算,而不要求黑白区域必须处于一个矩形小块中;
4. 对角型Haar特征;
5. 组合Haar特征,即对多个不同的Haar特征进行组合和二值编码;
6. 局部组合二值特征,即在局部对特定的Haar特征按照一定的结构进行组合和二值编码;
7. 带权多通道Haar特征,即一个Haar特征不再只包含黑白两种块,而允许有多种不同形状和不同颜色的块,其中不同的颜色对应着不同的权值,表示像素点上求和之后所占的比重——原来只有1和-1两种,多通道指的是在像素点上求和不仅仅是在灰度这一个通道上计算,而是同时在其它通道上计算(如RGB三个颜色通道;事实上,基于原图计算而来和原图同样大小的任何一张图都可以是图像的一个通道)。
 
  这些扩展极大地增强了Haar特征的表达能力,使得人脸窗口和非人脸窗口之间具有更好的区分性,从而提高了分类的准确度。
Haar特征
  除了直接对Haar特征进行改进,人们也同时在设计和尝试其它特征。Haar特征本质上是局部区域像素值的一种线性组合,其相对应的更一般的形式则是不指定线性组合的系数,允许系数为任意实数,这被称之为线性特征——这里的组合系数可以基于训练样例来进行学习,类似于学习分类器参数的过程。稀疏粒度特征也是一种基于线性组合来构造的特征,与线性特征所不同的是,稀疏粒度特征是将不同尺度(将100*100的图像放大到200*200,它和原本大小就为200*200的图像是处于不同的尺度上)、位置和大小的局部区域进行组合,而线性特征只是组合同一个局部区域内的像素值。
 
  LBP特征是一种二值编码特征,其直接基于像素灰度值进行计算,特点是在编码时考虑的是两个值的相对大小,并且按照一定的空间结构来进行编码,局部组合二值特征就是在LBP特征的启发下设计的;从计算上来看,提取LBP特征比提取Haar特征要快,但是Haar特征对于人脸和非人脸窗口的区分能力更胜一筹。简化的SURF特征是一种和Haar特征相类似的特征,但是其计算的是局部区域中像素点的梯度和,并在求和的过程中考虑了梯度方向(所谓梯度,最简单的一种情形就是指同一行上两个不同位置像素值的差比上它们水平坐标的差);SURF特征比Haar特征更为复杂,因此计算代价更高,但是由于其表达能力更强,因此能够以更少数目的特征来达到相同的区分度,在一定程度上弥补了其在速度上的不足。HOG特征也是一种基于梯度的特征,其对一个局部区域内不同方向的梯度进行统计,计算梯度直方图来表示这个区域。积分通道特征和多通道的Haar特征有些类似,但是其使用的通道更加多样化,将通道的概念推广为由原图像变换而来并且空间结构和原图像对应的任何图像。聚合通道特征则在积分通道特征的基础上进一步加入了对每个通道进行下采样的操作,实现局部区域信息的聚合。
 
  在过去十几年的探索过程中,涌现出的特征不胜枚举,这里只选取了部分比较有代表性和反映了人们探索思路的特征进行举例。这里所有列举的特征都有一个共同的特点:都由科研工作者根据自己的经验手工设计,这些特征的设计反映了人们对问题的理解和思考。虽然随着不断的改进,设计出的特征已经日臻完善,但直到现在,人们在特征上的探索还远没有结束。
 
分类器及其学习方法的改进
 
  分类器能力的强弱直接决定了分类准确度的高低,而分类的计算代价是影响检测速度的一个关键因素,因此,人们探索的另一个方向就是对分类器及其学习方法的改进。
 
  采用AdaBoost方法由弱分类器构建强分类器,这是一个顺序执行的过程,换言之,一旦一个弱分类器被选中,其就必定会成为强分类器的组成部分,不允许反悔,这其实是假设增加弱分类器一定会使得强分类器的分类准确度更高,但是,这个假设并不总是成立。事实上,每次对弱分类器的选择只是依照当时的情况决定,而随着新的弱分类器被增加进来,从整体上来看,之前的选择未必最优。基于这样的想法,出现了允许回溯的FloatBoost方法。FloatBoost方法在选择新的弱分类器的同时,也会重新考查原有的弱分类器,如果去掉某个弱分类器之后强分类器的分类准确度得到了提升,那说明这个弱分类器带来了负面影响,应该被剔除。
 
  VJ人脸检测器中,相级联的多个分类器在学习的过程中并不会产生直接的联系,其关联仅体现在训练样例上:后一级分类器的训练样例一定要先通过前一级分类器。不同分类器在学习时的独立性会带来两方面的坏处:一是在每个分类器都是从头开始学习,不能借鉴之前已经学习好的分类器的经验;二是每个分类器在分类时都只能依靠自己,不能利用其它分类器已经获得的信息。为此,出现了两种改进的方案:链式Boosting方法和嵌套式Boosting方法。两种方案都在学习新一级的分类器时,都考虑之前已经学好的分类器,区别在于链式Boosting方法直接将前面各级分类器的输出进行累加,作为基础得分,新分类器的输出则作为附加得分,换言之,前面各级分类器实际上是新分类器的一个“前缀”,所有的分类器通过这种方式链在了一起;嵌套式Boosting方法则直接将前一级分类器的输出作为新分类器第一个弱分类器的特征,形成一种嵌套的关系,其特点是只有相邻的分类器才会互相影响。还有一种和嵌套式Boosting方法相类似的方案:特征继承,即从特征而不是分类器的角度来关联不同的分类器,具体而言,新的分类器在学习时会先继承前一级分类器的所有特征,基于这些特征学习弱分类器,再此基础上再考虑增加新的弱分类器,这一方案的特点在于其只引入了分类器学习时的相互影响,而在分类时分类器之间仍然是相互独立的。
 
  相关的任务之间往往会相互产生促进作用,相辅相成,而和人脸检测密切相关的一个任务就是特征点定位:预测脸部关键点的位置,这些关键点可以是双眼中心、鼻尖、嘴角等。基于这样一种想法,在2014年出现了Joint Cascade,即把检测人脸所需要的分类器和预测特征点位置的回归器交替级联,同时进行人脸检测和特征点定位两个任务。用特征点定位辅助人脸检测的关键在于形状索引特征的引入,即特征不再是在整个窗口中提取,而是在以各个特征点为中心的局部区域进行提取,这样的好处就在于提高了特征的语义一致性。不同的人脸其对应的特征点位置是不同的,反过来看,也就是说相同的位置实际上对应于脸部的不同区域,那么在相同区域提取的特征实际上表示的是不同的语义,简单地说,就是在拿鼻子去和嘴巴匹配。采用形状索引特征可以很好地避免这个问题,从而增大人脸和非人脸窗口之间的区分性。对于一个给定的窗口,我们并不知道特征点的位置,因此采用一个“平均位置”作为初始位置,即基于标注有特征点坐标的人脸样例集,计算出的每个点坐标的平均值;在平均位置的基础上,我们提取特征预测各个特征点真实的位置,不过一次预测往往是不准确的,就好像跑步的时候我们没法直接从起点跳到终点一样,所以需要不断基于当前确定的特征点位置来预测新的位置,逐步向其真实的位置靠近。这个过程很自然地形成了一种级联结构,从而能够和人脸检测器耦合在一起,形成一种不同模型交替级联的形式。
 
  针对分类器学习过程中的每一个环节,人们都进行了细致而充分的探索,除了上面提到的几个方向,在分类器分类阈值的学习、提升分类器学习的速度等问题上,也出现了很多出色的研究工作。大部分在分类器及其学习方法上进行改进的工作关注的还是Boosting方法(AdaBoost方法是Boosting方法的一个杰出代表)和相对简单的分类器形式,如果能够引入具有更强分类能力的分类器,相信能给检测器带来进一步的性能提升,这一点在后文会有所涉及。
 
级联结构的演化
 
  分类器的组织结构也是人们关心的一个重要问题,尤其是在面临多姿态人脸检测任务的时候。人脸的姿态是指人脸在三维空间中绕三个坐标轴旋转的角度,而多姿态人脸检测就是要将带旋转的人脸给检测出来,不管是斜着的(绕x轴旋转)、仰着的(绕y轴旋转)还是侧着的(绕z轴旋转)。不同姿态的人脸在表观特征上存在很大的差异,这给检测器带来了非常大的挑战,为了解决这一问题,通常采用分治的策略,即分别针对不同姿态的人脸单独训练分类器,然后组合起来构建成多姿态人脸检测器。
 
  最简单的多姿态人脸检测器就是将针对不同姿态人脸的分类器采用并列式的结构进行组织,其中并列的每一个分类器仍然采用原来的级联结构(我们称这种分类器为级联分类器);在检测人脸的过程中,一个窗口如果被其中一个级联分类器分为人脸窗口,则认为其确实是一个人脸窗口,而只有当每一个级联分类器都将其判别为非人脸窗口时,才将其排除掉。这种并列式的组织架构存在两方面的缺陷:一是造成了检测时间的成倍增长,因为绝大部分窗口是非人脸窗口,这些窗口需要经过每一个级联分类器的排除;二是容易造成整体分类准确度的降低,因为整个检测器分错的窗口包含的是所有级联分类器分错的窗口。
 
  有人设计了一种金字塔式的级联结构,金字塔的每一层对应于对人脸姿态(旋转角度)的一个划分,从顶层到底层划分越来越细,级联的每个分类器只负责区分非人脸和某个角度范围内的人脸。对于一个待分类的窗口,从最顶层的分类器开始对其进行分类,如果其被分为人脸窗口,则送入到下一层的第一个分类器继续进行分类,如果其被分为非人脸窗口,则送入到同一层的下一个分类器继续进行分类,当在某一层上所有的分类器都将其分为非人脸窗口时,就确认其为非人脸窗口,将其排除。金字塔式的级联结构也可以看成是一种特殊的并列式结构,只不过每个级联分类器相互之间有共享的部分,这样最直接的好处就在于减少了计算量,共享的部分只需要计算一次,同时在底层又保留了分治策略所带来的好处——子问题比原问题更加容易,因此更容易学习到分类准确度更高的分类器。
人脸检测器
  还有一种比较典型的结构是树形的级联结构,从形状上来看其和金字塔式的级联结构是一样的,也是从上往下分类器的数目逐层增多,区别就在于树形的级联结构中没有同一层分类器之间的横向连接,只有相邻层分类器之间的纵向连接,即一个窗口在同一层上不会由多个分类器进行分类,而会直接被送往下一层或者被排除。树形级联结构通过引入分支跳转机制,进一步减少了对一个窗口进行分类所需要的计算量,不过同时也带来了新的问题,分支跳转通常根据姿态估计(估计旋转角度的范围)的结果来进行,而如果姿态估计出现错误,就会出现某个姿态的人脸窗口被送给另一个姿态人脸对应的分类器进行分类的情况,容易导致错误的分类。为了缓解这一问题,出现了允许多个分支同时跳转的设计,从而降低了由于跳转错误而引起分类错误的风险。
 
  分治策略是处理多姿态人脸检测任务最基本的策略,但要同时兼顾速度和分类准确度并不是一件容易的事情,分类能力的增强不可避免地会带来计算代价的增大,如何用更小的计算代价来换取更高的分类准确度,这仍然是一个需要去思考和探索的问题。

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自走近人脸检测:从 VJ 到深度学习(上)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]