有关人脸分割的几种算法研究.docx
《有关人脸分割的几种算法研究.docx》由会员分享,可在线阅读,更多相关《有关人脸分割的几种算法研究.docx(13页珍藏版)》请在冰豆网上搜索。
有关人脸分割的几种算法研究
有关人脸分割的几种算法研究
人脸检测
首先先确定一下什么是人脸检测?
人脸检测就是给定任意一幅图像,可以使数字化的视频信号或者扫描进来的相片,要确定其中是否有人脸,如有,则进行编码标记,返回人脸的位置、姿态和大小。
人脸检测源自人脸识别,是人脸识别系统中一个关键环节。
随着近年来电子商务应用的发展,人脸检测作为人脸信息处理中的一项关键技术,在身份验证、基于内容的图像检索、自动监控、人机交互等方面有着重要的应用价值。
Adaboost算法
Adaboost是机器学习中比较流行的分类算法。
1.核心思想:
它是一种迭代算法,是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
通过研究弱分类器的特性,提出两种新的弱分类器的阈值和偏置的计算方法,二者可以使弱分类器识别率大于百分之五十,从而保证在弱分类器达到一定数目的情况下,Adaboost训练收敛。
其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。
将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
使用adaboost分类器可以排除一些不必要的训练数据特徵,并将关键放在关键的训练数据上面。
目前,对Adaboost算法的研究以及应用大多集中于分类问题,同时近年也出现了一些在回归问题上的应用。
就其应用Adaboost系列主要解决了:
两类问题、多类单标签问题、多类多标签问题、大类单标签问题,回归问题。
它用全部的训练样本进行学习。
1.1Adaboost(AdaptiveBoosting)算法
2.存在两个问题及解决方法:
1.如何调整训练集,使得在训练集上训练的弱分类器得以进行;
2.如何将训练得到的各个弱分类器联合起来形成强分类器。
针对以上两个问题,adaboost算法进行了调整:
1.使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;
2.将弱分类器联合起来,使用加权的投票机制代替平均投票机制。
让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。
Adaboost算法是Freund和Schapire根据在线分配算法提出的,他们详细分析了Adaboost算法错误率的上界,以及为了使强分类器达到错误率,算法所需要的最多迭代次数等相关问题。
与Boosting算法不同的是,adaboost算法不需要预先知道弱学习算法学习正确率的下限即弱分类器的误差,并且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,这样可以深入挖掘弱分类器算法的能力。
Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。
开始时,每个样本对应的权重是相同的,即其中 n为样本个数,在此样本分布下训练出一弱分类器。
对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分错的样本就被突出出来,从而得到一个新的样本分布。
在新的样本分布下,再次对弱分类器进行训练,得到弱分类器。
依次类推,经过T 次循环,得到T 个弱分类器,把这T个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。
1.给定训练样本集S,其中X和Y分别对应于正例样本和负例样本;T为训练的最大循环次数;
2.初始化样本权重为1/n,即为训练样本的初始概率分布;
3.第一次迭代:
(1)训练样本的概率分布相当下,训练弱分类器:
(2)计算弱分类器的错误率:
(3)选取合适阈值,使得错误率最小
(4)更新样本权重:
(5)最终得到的强分类器:
每轮循环后,权值应做多大的调整呢?
这个答案依赖于当前分类器的总体误差。
明确地说,如果e代表分类器在加权数据上的误差率(在0和1之间的一个小数),那么对于正确分类的实例,权值更新为
权值=权值*e/(1-e)
对于错误分类的实例,权值保持不变。
当然,这并没有如前所述,增加被错误分类的实例的权值。
然而,在更新了所有实例的权值后,要进行正常化处理,使它们的权值总和与原来的相同。
每个实例的权值都要除以新权值总和再乘以原来的权值总和。
这样便自动增加了每个错误分类实例的权值,同时减小了每个正确分类实例的权值。
每当在加权的训练数据集上的误差率大于等于0.5时,提升程序将删除当前的分类器并不再继续进行循环。
当误差率等于0时,也同样处理,因为这时所有实例的权值都为0。
为了做出一个预测,使用一个加了权的投票来组合它们的输出。
要决定这些权值,性能表现好的分类器(e接近于0)应当获得一个高的权值,而性能表现差的分类器(e接近于0.5)则应获得一个较低的权值。
更具体地说
权值=-log(e/(1-e))
这是一个0和无穷大之间的正数。
为了做出预测,将投给某个具体类的所有分类器的权值相加,选择相加总和最大的那个类别。
博客中的相关内容:
对人脸检测的研究最初可以追溯到20世纪70年代,早期的研究主要致力于模板匹配、子空间方法,变形模板匹配等。
近期人脸检测的研究主要集中在基于数据驱动的学习方法,如统计模型方法,神经网络学习方法,统计知识理论和支持向量机方法,基于马尔可夫随机域的方法,以及基于肤色的人脸检测。
目前在实际中应用的人脸检测方法多为基于Adaboost学习算法的方法。
Viola人脸检测方法是一种基于积分图、级联检测器和AdaBoost算法的方法,方法框架可以分为以下三大部分:
第一部分,使用Harr-like特征表示人脸,使用“积分图”实现特征数值的快速计算;
第二部分,使用Adaboost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器;
第三部分,将训练得到的若干强分类器串联组成一个级联结构的层叠分类器,级联结构能有效地提高分类器的检测速度。
Adaboost算法是一种用来分类的方法,它的基本原理就是“三个臭皮匠,顶个诸葛亮”。
它把一些比较弱的分类方法合在一起,组合出新的很强的分类方法。
例如下图中
需要用一些线段把红色的球与深蓝色的球分开,然而如果仅仅画一条线的话,是分不开的。
a
b
c
d
使用Adaboost算法来进行划分的话,先画出一条错误率最小的线段如图1,但是左下脚的深蓝色球被错误划分到红色区域,因此加重被错误球的权重,再下一次划分时,将更加考虑那些权重大的球,如c所示,最终得到了一个准确的划分,如下图所示。
人脸检测的目的就是从图片中找出所有包含人脸的子窗口,将人脸的子窗口与非人脸的子窗口分开。
大致步骤如下:
(1)在一个20*20的图片提取一些简单的特征(称为Harr特征),如下图所示。
它的计算方法就是将白色区域内的像素和减去黑色区域,因此在人脸与非人脸图片的相同位置上,值的大小是不一样的,这些特征可以用来区分人脸和分人脸。
(2)目前的方法是使用数千张切割好的人脸图片,和上万张背景图片作为训练样本。
训练图片一般归一化到20*20的大小。
在这样大小的图片中,可供使用的haar特征数在1万个左右,然后通过机器学习算法—adaboost算法挑选数千个有效的haar特征来组成人脸检测器。
(3)学习算法训练出一个人脸检测器后,便可以在各个场合使用了。
使用时,将图像按比例依次缩放,然后在缩放后的图片的20*20的子窗口依次判别是人脸还是非人脸。
人脸检测的流程
人脸检测在实际中主要用于人脸识别的预处理,即在图像中准确标定出人脸的位置和大小。
目前人脸检测技术在门禁系统、智能监控系统中已得到了很好的应用。
另外,目前的笔记本电脑中也陆续开始使用人脸识别技术作为计算机登录的凭证。
近年来,在数码相机和手机中也集成了人脸检测算法,作为一个新的功能提供用户使用。
在这些应用中,人脸检测都是发挥着至关重要的作用
Haar-like矩形特征
通常的人脸检测方法是基于特征而不是基于像素的,原因是特征能够对特定区域进行编码,且基于特征的系统比基于像素的系统要快的多。
我们采用Haar-like特征构造弱分类器,对于每个矩形特征我们都可以得到一个弱分类器,由弱分类器算法训练一个最佳的阈值,并使其匪类错误率最小。
Haar-like特征,即很多人常说的Haar特征,是计算机视觉领域一种常用的特征描述算子。
它最早是由Papageorigiou等人用于人脸描述。
目前常用的Haar-like特征可以分为三类:
线性特征、边缘特征、点特征(中心特征)、对角线特征。
如下图所示:
显然,边缘特征有4种:
x方向,y方向,x倾斜方向,y倾斜方向;线特征有8种,点特征有2种,对角线特征有1种。
每一种特征的计算都是由黑色填充区域的像素值之和与白色填充区域的像素值之和的差值。
而计算出来的这个差值就是所谓的Haar-like特征的特征值。
1.haar-like特征
一看到Haar-like特征这玩意儿就头大的人举手。
好,很多人。
那么我先说下什么是特征,我把它放在下面的情景中来描述,假设在人脸检测时我们需要有这么一个子窗口在待检测的图片窗口中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。
那么这个特征如何表示呢?
好了,这就是大牛们干的好事了。
后人称这他们搞出来的这些东西叫Haar-Like特征。
下面是Viola牛们提出的Haar-like特征。
下面是Lienhart等牛们提出的Haar-like特征。
这些所谓的特征不就是一堆堆带条纹的矩形么,到底是干什么用的?
我这样给出解释,将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸。
为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,那么什么样的矩形特征怎么样的组合到一块可以更好的区分出人脸和非人脸呢,这就是AdaBoost算法要做的事了。
这里我们先放下积分图这个概念不管,为了让我们的思路连贯,我直接开始介绍AdaBoost算法。
2.Adaboost算法,弱分类器叠加之后变成强分类器
Adaboost 的物理意义可以表述为:
当已经提取的分类器对于某些样本分类正确,那么减小这些样本的权重。
当分类错误,增加这些样本的权重。
这样,后面训练提取的简单分类器就会更加强化对这些分类错误样本的训练。
一个典型的Adaboost训练算法可以被简单的看成是对特征进行贪心选择的过程。
一个简单的boosting问题包含了非常多的弱分类器,这些弱分类器通过加权投票被组合在一起,对于这个boosting问题来讲,最大的挑战就是怎么样来保证对于分类效果好的分类器赋予一个较高的权值,而对于分类效果不好的分类器赋予一个较低的权值。
Adaboost提供了一个很强有力的机制,把弱分类器和特征挂起勾来,把性能很好的分类器选择出来,并赋予相应的权值。
将弱分类器和特征挂钩起来的一个很直接的方法是,将弱分类器和特征做一一对应的关系,也就是说,一个弱分类器仅仅依赖一个特征。
为了实现这个机制,每一轮分类器的训练的过程就是选择一个矩形特征,使得这个特征能最好的将正训练样本和反训练样本分离开。
弱学习过程在每一轮训练过程中,对于每一个特征来说,都要确定一个最优阈值,使得该阈值对样本的分类效果最好。
这样,每一轮训练过程都可以得到一个分类效果最好的特征,而该特征所对应的弱分类器就是该轮所选出的弱分类器。
可以参考XX关于原始Adaboost介绍的文章:
http:
//stblog.baidu-
结合haar特征介绍Adaboost算法
2.1弱分类器的设计
最初的弱分类器可能只是一个最基本的Haar-like特征,计算输入图像的Haar-like特征值,和最初的弱分类器的特征值比较,以此来判断输入图像是不是人脸,然而这个弱分类器太简陋了,可能并不比随机判断的效果好,对弱分类器的孵化就是训练弱分类器成为最优弱分类器,注意这里的最优不是指强分类器,只是一个误差相对稍低的弱分类器,训练弱分类器实际上是为分类器进行设置的过程。
至于如何设置分类器,设置什么,我们首先分别看下弱分类器的数学结构。
数学结构
一个弱分类器
由子窗口图像x,一个特征f,指示不等号方向的p和阈值
组成。
P的作用是控制不等式的方向,使得不等式都是<号,形式方便。
“机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。
树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。
从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。
”(来自《维基百科》)
决策树包含:
分类树,回归树,分类和回归树(CART),CHAID 。
分类和回归的区别是,分类是当预计结果可能为两种类型(例如男女,输赢等)使用的概念。
回归是当局域结果可能为实数(例如房价,患者住院时间等)使用的概念。
决策树用途很广可以分析因素对事件结果的影响(详见维基百科),同时也是很常用的分类方法,我举个最简单的决策树例子,假设我们使用三个Haar-like特征f1,f2,f3来判断输入数据是否为人脸,可以建立如下决策树:
可以看出,在分类的应用中,每个非叶子节点都表示一种判断,每个路径代表一种判断的输出,每个叶子节点代表一种类别,并作为最终判断的结果。
一个弱分类器就是一个基本和上图类似的决策树,最基本的弱分类器只包含一个Haar-like特征,也就是它的决策树只有一层,被称为树桩(stump)。
最重要的就是如何决定每个结点判断的输出,要比较输入图片的特征值和弱分类器中特征,一定需要一个阈值,当输入图片的特征值大于该阈值时才判定其为人脸。
训练最优弱分类器的过程实际上就是在寻找合适的分类器阈值,使该分类器对所有样本的判读误差最低。
具体操作过程如下:
1)对于每个特征 f,计算所有训练样本的特征值,并将其排序。
扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值:
全部人脸样本的权重的和t1;
全部非人脸样本的权重的和t0;
在此元素之前的人脸样本的权重的和s1;
在此元素之前的非人脸样本的权重的和s0;
2)最终求得每个元素的分类误差
在表中寻找r值最小的元素,则该元素作为最优阈值。
有了该阈值,我们的第一个最优弱分类器就诞生了。
强分类器的诞生需要T轮的迭代,具体操作如下:
1. 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本; T为训练的最大循环次数;
2. 初始化样本权重为1/N ,即为训练样本的初始概率分布;
3. 第一次迭代训练N个样本,得到第一个最优弱分类器,步骤见2.2.2节
4. 提高上一轮中被误判的样本的权重;
5. 将新的样本和上次本分错的样本放在一起进行新一轮的训练。
6. 循环执行4-5步骤,T轮后得到T个最优弱分类器。
7.组合T个最优弱分类器得到强分类器,组合方式如下:
相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。
2.2弱分类器的强强联手
至今为止我们好像一直在讲分类器的训练,实际上Haar分类器是有两个体系的,训练的体系,和检测的体系。
训练的部分大致都提到了,还剩下最后一部分就是对筛选式级联分类器的训练。
我们看到了通过AdaBoost算法辛苦的训练出了强分类器,然而在现实的人脸检测中,只靠一个强分类器还是难以保证检测的正确率,这个时候,需要一个豪华的阵容,训练出多个强分类器将它们强强联手,最终形成正确率很高的级联分类器这就是我们最终的目标Haar分类器。
那么训练级联分类器的目的就是为了检测的时候,更加准确,这涉及到Haar分类器的另一个体系,检测体系,检测体系是以现实中的一幅大图片作为输入,然后对图片中进行多区域,多尺度的检测,所谓多区域,是要对图片划分多块,对每个块进行检测,由于训练的时候用的照片一般都是20*20左右的小图片,所以对于大的人脸,还需要进行多尺度的检测,多尺度检测机制一般有两种策略,一种是不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,效率不高,而另一种方法,是不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势。
在区域放大的过程中会出现同一个人脸被多次检测,这需要进行区域的合并,这里不作探讨。
无论哪一种搜索方法,都会为输入图片输出大量的子窗口图像,这些子窗口图像经过筛选式级联分类器会不断地被每一个节点筛选,抛弃或通过。
它的结构如图所示。
3.Cascadeclassifier 级联分类器
设K是一个级联检测器的层数,D是该级联分类器的检测率,F是该级联分类器的误识率,di是第i层强分类器的检测率,fi是第i层强分类器的误识率。
如果要训练一个级联分类器达到给定的F值和D值,只需要训练出每层的d值和f值,这样:
d^K = D,f^K = F
级联分类器的要点就是如何训练每层强分类器的d值和f值达到指定要求。
AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不很高,一般情况下,高检测率会导致高误识率,这是强分类阈值的划分导致的,要提高强分类器的检测率既要降低阈值,要降低强分类器的误识率就要提高阈值,这是个矛盾的事情。
据参考论文的实验结果,增加分类器个数可以在提高强分类器检测率的同时降低误识率,所以级联分类器在训练时要考虑如下平衡,一是弱分类器的个数和计算时间的平衡,二是强分类器检测率和误识率之间的平衡。
具体训练方法如下,我用伪码的形式给出:
1)设定每层最小要达到的检测率d,最大误识率f,最终级联分类器的误识率Ft;
2)P=人脸训练样本,N=非人脸训练样本,D0=1.0,F0=1.0;
3)i=0;
4)for :
Fi>Ft
●∙++i;
●∙ni=0;Fi=Fi-1;
●∙for :
Fi>f*Fi-1
⏹∙++ni;
⏹∙利用AdaBoost算法在P和N上训练具有ni个弱分类器的强分类器;
⏹∙衡量当前级联分类器的检测率Di和误识率Fi;
⏹∙for :
diØ∙降低第i层的强分类器阈值;
Ø∙衡量当前级联分类器的检测率Di和误识率Fi;
⏹∙N = Φ;
⏹∙利用当前的级联分类器检测非人脸图像,将误识的图像放入N;
通过一组对比实验可以看出:
基于肤色的人脸检测技术检测到的人脸范围大,不精确。
不管是对于担任连还是复杂背景下的多人脸,基于肤色的检测方法有较高的检测路,对于多姿态情况下也有较好的检测性能,但是犹豫此方法本身的特性,使得一些非人脸的区域也被检测出来,但只后续过程中的被检漏。
Adaboosting的人脸检测技术检测到的范围人脸范围小,相对精确。
但是有的人脸检测不到。
基于Adaboost的检测方法也有较高的检测率,切具有较低的检测率,由于此方法是基于灰度特征的,因此对于一些符合人脸灰度的正的区域也会检测为人脸。