首先,说几点:
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一般选具体的某个特征值。至于选小于等于还是大于等于就看这样选择后的错误率哪个更低。具体操作看下面演示。
;在这里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,则
。现在这个确定的函数叫做本次迭代的最优弱分类器函数。
同时计算一下这个函数f1的权重:
fw1=
=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)。
;本次迭代是求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,则本次迭代
.现在这个确定的函数叫做本次迭代的最优弱分类器函数。
同时计算一下这个函数f2的权重:
fw2=
= 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
.具体步骤不写了,最后得到
t3=140,选x>=140方式,分类错误3个,但是错误率最小e=0.0625*3=0.1875,则:
fw3= 0.5 * ln((1 –0.1875) / 0.1875) = 0.7332
这样不断迭代,就会产生一系列的:
对应的权重:
fw1,fw2,fw3,fw4。。。
迭代到什么时候结束呢,1种方式就是定一个最大迭代次数,比如迭代100次;2,根据构造的强分类器函数的准确率,比如强分类器函数准确率已经到99%,错误率低于2%了,就停止迭代。
那什么是强分类器函数?怎么构造呢?
强分类器函数G(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个
然后把他们级联起来。假设我们选的强分类器的标准是识别率(人脸被正确识别的比率)=99%,误识率(非人脸被识别为人脸的比率)=50%,那么20个强分类器级联后的总识别率为0.99^20=98%,错误接受率也仅为0.5^20 = 0.0001%。这样的效果就可以满足现实的需要了
具体操作如下图,我们输入一张待检测的图片,一般都比较大,然后对图片中进行多区域,多尺度的裁剪得到非常多的子窗口,把这些子窗口转成20*20后,如下图输入,先G1分类,如果pass,用G2分类...