人脸检测算法之Haar-Adaboost分类器原理

作者: hexter | 来源:发表于2019-07-20 09:01 被阅读61次

    首先,说几点:

    1、人脸检测就是在一幅图片中检测出有无人脸,人脸在图片中的哪块区域。通常人脸检测完了之后就交给人脸识别,具体识别是谁。

    2、Haar-Adaboost进行人脸检测的流程如下:

        a,收集一批人脸图片(如20000张)和非人脸图片(如40000张)。然后各个图片放缩到20*20像素。

        b,把这些图片作为训练数据输入Haar-Adaboost训练,最终得到满足要求(比如是准确率到98%)的分类器模型。

        c,正式使用时,输入一张大图片,检测里面人脸检测时,在这张图片各个位置截取不同大小的矩形,然后放缩到20*20,输入到b里训练好的Haar-Adaboos分类器里,如果分类器返回的结果是人脸,那么这个矩形框就是检测到的人脸区域。

    本文介绍的是b这个步骤是怎么操作的

    1,Haar简单介绍

        Haar-like算法是一种计算图像特征值的方法(比如这样图按我的算法计算出的特征值为1011,我的计算方法是把图片左右一分为二,左边的各像素求和减去右边各像素求和,这也是一种图片特征值计算方法)。

        Haar-like算法就是类似我示例说的方式,最初只定义了4个模板形式,如图。这些模板的长宽可以自由选择不同的尺寸。

    计算方法也很简单,先确定模板的长宽,然后把模板mask到图片某个位置上(比如,我把模板A的大小设为6*6,把它放到20*20图片的4,5这个作为位置,那么覆盖了一片6*6的区域)。对于图中的A, B和D这类特征,特征数值计算公式为:v=Sum白-Sum黑,而对于C来说,计算公式如下:v=Sum白-2*Sum黑。这样就求出了这个图片在模板A,大小6*6,位置4,5下的特征值。

    然后你会发现,虽然只有4个模板,但是模板的尺寸可以选不同尺寸,mask到图片的位置也可以不同,这样可以得到同一个图片不同的类型特征值。就算是求同一个24*24大小图片的特征值,我们按不同模版类型、模板大小、模板位置可以得到16万种不同的类型的特征值。

    下面是cv里的模板,有14种模板,那类型特征值种类更多

    那么,对于一个输入的图片,我们有上万种特征,下面要做的就是这么多类型的特征,哪些类型比较有用,哪些类型比较没价值。哪些权重组合起来效果比较好。

    这个挑选组合的工作就是Adaboost和级联来做的了。通过Adaboost迭代来挑选哪些类型特征更有价值。

    Adaboost

    Adaboost的原理本文不讲,只讲Adaboost是怎么操作最终通过模型特征值来分类是否人脸的。

    1,先选一种类型特征,比如选模板A,尺寸6*6,在图片位置(4,5)求出的各个训练图片的Haar-like值为特征值;

    2,输入训练图片(20000张人脸,40000张非人脸,尺寸20*20).这样的话每个训练图片都得到一个整数的特征值。为简单示例,假设3张人脸,3张非人脸。得到值以后排序后如下。

    表1

    对于这样的训练数据,我们选一个最简单的分类函数(Adaboost里叫作弱分类器函数):特征值小于等于某个阈值t1就认为是人脸,大于阈值就是非人脸,或者相反,特征值小于等于某个阈值t1就认为是人非脸,大于阈值就是人脸。这里的t1一般选具体的某个特征值。至于选小于等于还是大于等于就看这样选择后的错误率哪个更低。具体操作看下面演示。

    y=f_{1}(x)= \left\{ if (x<=t_{1})=1;else =-1  \right\} 或y=f_{1}(x)= \left\{ if (x>=t_{1})=1;else =-1  \right\} ;在这里t1是个常数,需要由输入训练数据后根据错误率来得到的值;选大于等于还是小雨等于就看训练样本输入后的错误率情况。

    那怎么求这个t1呢?这样操作

    第一轮迭代

    因为这是第一轮迭代计算,上面的每个训练样本赋值初始化权重w1=(0.167, 0.167, 0.167, 0.167, 0.167, 0.167)也就是样本数量分之一为初始权值。

    从表1数据我们知道t1可以=100、110、120、130、140、150

    若按 t1=100,选x < =100方式比较好,不信可以试试选x>=100方式。此时错判2个,错误率e=2 * 0.167 = 0.334

    若按t1=110,选x < =110方式比较好。此时错判1个,错误率e=1 * 0.167 = 0.167

    若按t1=120,选x < =120方式比较好。此时错判2个,错误率e=2 * 0.167 = 0.334

    同理t1=130。此时错判3个,错误率e=3 * 0.167 = 0.501

    同理t1=140,此时错判2个,错误率e=2 * 0.167 = 0.334

    同理t1=150,...

    可见t1=110时,选x < =110,错误率最小e=0.167,则

    y=f_{1}(x)= \left\{ if (x<=110)=1;else =-1  \right\} 。现在这个确定的函数叫做本次迭代的最优弱分类器函数。

    同时计算一下这个函数f1的权重:

    fw1=\frac{1}{2} \ln \frac{1-e}{e} =0.5 * ln((1 – 0.167) / 0.167) = 0.8047

    这样第一轮迭代完成,下面进行第二轮迭代

    1. 更新样本权重

    在上一次迭代中我们选了t1=110,测试样本中只有特征值是140的测试是误判的,其他都是正确。

    正确的样本是:100, 110, 120, 130, 150,上次迭代的权重都是0.167,这次样本权重调整方式为:

    w2=w1 * exp(-fw1) =0.167 * exp(-0.8047)= 0.075

    而x =140的样本,则样本权重调整为:

    w2=w1 * exp(fw1) =0.167 * exp(0.8047) = 0.373

    新样本权重总和为0.075 * 5 + 0.373 = 0.748

    规一化后,

    x = 100, 110, 120, 130, 150时,样本权重更新为:

    w2=0.075 / 0.748 = 0.10

    x = 140时, 样本权重更新为:

    w2=0.373 / 0.748 = 0.50

    调整后,新的样本权重为(0.1, 0.1, 0.1, 0.1, 0.5, 0.1)。

    y=f_{2}(x)= \left\{ if (x<=t_{2})=1;else =-1  \right\} 或y=f_{2}(x)= \left\{ if (x>=t_{2})=1;else =-1  \right\} ;本次迭代是求t2,方法同上。此时的函数又叫做弱分类器函数,求出t2后就得到了本次迭代的最优弱分类器函数。

    同理

    若按t2=100分类。选x >=100方式比较好,误判3个,错误率e=0.1*3 = 0.3

    若按t2=110分类,选x>=110比较好,虽然误判4个,但此时错误率e=0.1 * 4 = 0.4

    若按t2=120分类,选x>=120比较好,此时误判5个,错误率e=0.1 *5= 0.5

    若按t2=130分类,选x>=130比较好,此时误判4个,错误率e=0.1 * 4 = 0.4

    若按t2=140分类,选x<=140比价好,此时误判2个,错误率e=2 * 0.1 = 0.2

    若按t2=150分类,选x<=150比价好,此时误判3个,错误率e=3 * 0.1 = 0.3

    可见t2=140时,选x < =140错误率最小e=0.2,则本次迭代

    y=f_{2}(x)= \left\{ if (x<=140)=1;else =-1  \right\} .现在这个确定的函数叫做本次迭代的最优弱分类器函数。

    同时计算一下这个函数f2的权重:

    fw2=\frac{1}{2} \ln \frac{1-e}{e} = 0.5 * ln((1 –0.2) / 0.2) = 0.6931

    这样第二轮迭代完成,下面进行第三轮迭代

    同样的更新样本权重

    由于f2里t2=140时,x = 100, 110, 150时,分类是正确,那么这几个样本权重调整为:

    w3=w2 * exp(-fw2) =0.1 * exp(-0.6931) = 0.05

    x = 140时,分类正确,则样本权重为:

    w3=w2 * exp(-fw2) =0.5 * exp(-0.6931) = 0.25

    x = 120,130时,分类错误,则样本权重为:

    w3=w2 * exp(fw2) =0.1 * exp(0.6931) = 0.20

    新样本权重总和为 0.05 * 3 + 0.25 + 0.20 * 2 = 0.8

    规一化后,

    x = 100, 110, 150时,样本权重更新为:

    w3=0.05 / 0.8 = 0.0625

    x = 140时, 样本权重更新为:

    w3=0.25 / 0.8 = 0.3125

    x = 120, 130时, 样本权重更新为:

    w3=0.20 / 0.8 = 0.250

    综上,新的样本权重为(0.0625, 0.0625, 0.250, 0.250, 0.3125, 0.0625)。

    同样:这次求t3

    y=f_{3}(x)= \left\{ if (x<=t_{3})=1;else =-1  \right\} 或y=f_{3}(x)= \left\{ if (x>=t_{3})=1;else =-1  \right\}

    .具体步骤不写了,最后得到

    t3=140,选x>=140方式,分类错误3个,但是错误率最小e=0.0625*3=0.1875,则:

    y=f_{3}(x)= \left\{ if (x>=140)=1;else =-1  \right\}

    fw3= 0.5 * ln((1 –0.1875) / 0.1875) = 0.7332

    这样不断迭代,就会产生一系列的:

    f_{1} (x),f_{2} (x),f_{3} (x),f_{4} (x),。。。

    对应的权重:

    fw1,fw2,fw3,fw4。。。

    迭代到什么时候结束呢,1种方式就是定一个最大迭代次数,比如迭代100次;2,根据构造的强分类器函数的准确率,比如强分类器函数准确率已经到99%,错误率低于2%了,就停止迭代。

    那什么是强分类器函数?怎么构造呢?

    强分类器函数G(x) =sign(fw1*f_{1} (x)+fw2*f_{2} (x)+fw3*f_{3} (x)+fw4*f_{4} (x),。。。)

    假如我们迭代3次结束了。

    此时的强分类器为G(x) =sign( 0.8047 * f1(x) + 0.6931 * f2(x) + 0.7332 * f3(x))。

    可以试一下把训练样本输入这个G(x) 看看是否判别正确。

    我们发现按G(x)分类的所有样本均分类正确,则这个强分类器的错误率为0 / 6 = 0。最终强分类器为:

    G(x) = sign(0.8047 * f1(x) + 0.6931 * f2(x) + 0.7332 * f3(x))。

    终于讲完了Adaboost通过训练某一个类型特征来得到了强分类器函数。前面说到就算一个24*24*的图像对于Harr的4种模板都有16万种类型特征.

    那么就求出它们各自的强分类器函数了。肯定有些类型特征迭代很少的次数就得到强分类器了,有些迭代报表都没有得到强分类器。

    这样就按照迭代的效果,挑选出一批满意的类型特征的强分类器函数,比如20个G_{i} i(x);i=1..20

    然后把他们级联起来。假设我们选的强分类器的标准是识别率(人脸被正确识别的比率)=99%,误识率(非人脸被识别为人脸的比率)=50%,那么20个强分类器级联后的总识别率为0.99^20=98%,错误接受率也仅为0.5^20  = 0.0001%。这样的效果就可以满足现实的需要了

    具体操作如下图,我们输入一张待检测的图片,一般都比较大,然后对图片中进行多区域,多尺度的裁剪得到非常多的子窗口,把这些子窗口转成20*20后,如下图输入,先G1分类,如果pass,用G2分类...

    相关文章

      网友评论

        本文标题:人脸检测算法之Haar-Adaboost分类器原理

        本文链接:https://www.haomeiwen.com/subject/dmkslctx.html