假设我们在样本库中有六个样本,如下:
其中,
序号:代表样本在库中的顺序
特征值:指对于某特征模板F,其在样本图像上计算得到的特征值
是否人脸:用1代表该样本是人脸,-1代表该样本不是人脸
也就是说,这个样本集中,有三张有人,另有三张非人脸的图片。
在这个例子中,我们的目的是求出在每一个步骤中样本的权重,也即多项式的每一项式子的系数,最终得到一个完整的由多项式表示的强分类器。
根据上文中的计算步骤,第一步需要先初始化训练数据的权值分布。
按照步骤1的方法,在开始的时候,我们为每个样本都赋予一个相同的权重,即整体权重除以样本数量:
然后进入第一轮迭代。
这时候我们得到如下数据:
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
特征值 | 200 | 205 | 206 | 210 | 215 | 219 |
是否人脸 | 1 | 1 | -1 | -1 | 1 | -1 |
第一轮权重 | 0.167 | 0.167 | 0.167 | 0.167 | 0.167 | 0.167 |
第二步,求第一轮迭代的分类器(第一个弱分类器)。
在这里,我们选择一个最简单的分类函数:特征值小于等于一个阈值t识别为人脸,大于阈值识别为非认脸;或者相反,大于等于一个阈值则识别为人脸,小于阈值识别为非人脸。即
或
现在开始选择阈值,可选阈值t1={200, 205, 206, 210, 215, 219}。
当t1=200时,如果函数选择大于等于阈值为人脸,则正确识别的有3个,错误识别的有3个,错误率为0.5;反之,如果函数选择小于等于阈值为人脸,则正确识别的有4个,错误识别的有2个,错误率e为:
e = 2 * 0.167 = 0.334
显然函数选择小于等于阈值识别率较高,此时分类函数为:
我们再看,当t1=205时,如果选择x<=205,错误识别的有1个,错误率为0.167;若选择x>=205,则错误识别的有4个,错误率为0.167*4 = 0.668,显然选择x<=205识别率较高。
同样,当t1=206时,错误率为0.167*2 = 0.334。
当t1=210时,错误率为0.167*3 = 0.501。
当t1=215时,错误率为0.167*2 = 0.334。
当t1=219时,错误率为0.167*3 = 0.501。
这样列举下来,当x<=205时,识别率最高,此时仅有一个识别错误,错误率为0.167。所以我们得到第一轮的基本分类器Gm(x)为
然后我们根据基本分类器Gm(x)在训练数据集上的分类误差率计算公式
得到第一轮迭代中分类器的误差率为
e1 = 0.167*1 = 0.167
接着我们根据Gm(x)的系数计算公式
计算得到G1(x)的系统为:
接下来,我们进行第二轮迭代。
这里紧接第二步计算得到的系数,更新训练数据集的权值分布。计算公式如下:
这里,Zm是规范化因子
它使Dm+1成为一个概率分布。
那么我们看到在上一轮迭代中,使用t1=205的基本分类器G1(x),正确识别的样本有200, 205, 206, 210, 219,它们在上一轮迭代中的权重都为0.167,我们根据公式来进行计算第1个样本200的新权重。
再计算z1得到
z1 = 0.747
代入w2,1计算公式中,可以求得第1个样本200的新权重为0.1。依此类推,同样可求得205, 206, 210, 219各个样本的权重同样为0.1。而在G1(x)中,错误识别的样本只有第5个样本215,同样依据上文中的计算公式,可以得到其新权重为0.5。于是我们得到下表,w2行为第二轮迭代所使用到的新数据集的权重,在这里,识别错误的样本的权重被提升了。
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
特征值 | 200 | 205 | 206 | 210 | 215 | 219 |
是否人脸 | 1 | 1 | -1 | -1 | 1 | -1 |
第一轮权重 | 0.167 | 0.167 | 0.167 | 0.167 | 0.167 | 0.167 |
G1(x) | 1 | 1 | -1 | -1 | -1 | -1 |
系数 | 0.8047 | 0.8047 | 0.8047 | 0.8047 | 0.8047 | 0.8047 |
z1 | 0.747 | 0.747 | 0.747 | 0.747 | 0.747 | 0.747 |
w2 | 0.100 | 0.100 | 0.100 | 0.100 | 0.500 | 0.100 |
重复步骤一,选择识别率最高的阈值t2。
当t2=200,选择x>=200,错误识别的样本206,210,219,误差率为
e2 = +0.1+0.1+0.1 = 0.3
当t2=205,选择x>=205,误差率为0.4。
当t2=206,选择x>=206,误差率为0.5
当t2=210,选择x>=210,误差率为0.4。
当t2=215,选择x<=215,误差率为0.2。
当t2=219,选择x<=219,误差率为0.3。
综上可见,选择x<=215作为分类器,误差率最小,即G2(x)为
此时e2为0.2。
计算得到G2(x)的系数a2为
可知系数a2为0.6931。
然后继续进行迭代。首先更新训练集的权重,得到下表。
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
特征值 | 200 | 205 | 206 | 210 | 215 | 219 |
是否人脸 | 1 | 1 | -1 | -1 | 1 | -1 |
w2 | 0.100 | 0.100 | 0.100 | 0.100 | 0.500 | 0.100 |
然后继续求新的训练集权重,具体过程同上,这里不再详述。第二轮迭代结果如下:
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
特征值 | 200 | 205 | 206 | 210 | 215 | 219 |
是否人脸 | 1 | 1 | -1 | -1 | 1 | -1 |
w2 | 0.100 | 0.100 | 0.100 | 0.100 | 0.500 | 0.100 |
g2(x) | 1 | 1 | 1 | 1 | 1 | -1 |
a2 | 0.693 | 0.693 | 0.693 | 0.693 | 0.693 | 0.693 |
w3 | 0.063 | 0.063 | 0.250 | 0.250 | 0.313 | 0.063 |
接下来我们进行第三轮迭代,首先仍然是更新训练集的权重:
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
特征值 | 200 | 205 | 206 | 210 | 215 | 219 |
是否人脸 | 1 | 1 | -1 | -1 | 1 | -1 |
w3 | 0.063 | 0.063 | 0.250 | 0.250 | 0.313 | 0.063 |
重复步骤一,选择识别率最高的阈值t3。
当t3=200时,选择x<=200,误差率为0.375
当t3=205时,选择x<=205,误差率为0.313
当t3=206时,选择x<=206,误差率为0.562
当t3=210时,选择x>=210,误差率为0.438
当t3=215时,选择x>=215,误差率为0.188
当t3=219时,选择x>=219,误差率为0.5
可见选择x>=215作为分类器,误差率最小,即G3(x)为
此时e3=0.188。
计算得到G3(x)的系数a3为
如此重复迭代下去,每一步得到一个基本分类器Gm(x)和一个系数ax,迭代到什么时候结束呢?有两个条件可选,一个条件是设定迭代的次数,达到次数则停止;另一个条件是根据构造的强分类器的准确率,比如说准确率达到99%,则停止迭代。
根据第一个条件,假设强分类器的准确率仍然很低,但是迭代次数已经到达上限,此时无法求得一个有效的分类器,说明特征模板在图像该位置提取不到有用的特征。
根据第二个条件,如果强分类器得到较高准确率,说明特征模板在图像该位置提取到了有用的特征。
这里基本分类器(弱分类器)是如何构造成强分类器的呢?强分类器函数如下:
G(x) = sign(a1G1(x) + a2G2(x) +…+amGm(x))
假如说我们迭代到第三轮就结束了,那么就是
G(x) = sign(0.8047G1(x) + 0.693G2(x) + 0.733G3(x)
我们将原始数据代入一下,发现分类结果与真实数据是100%符合。
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
特征值 | 200 | 205 | 206 | 210 | 215 | 219 |
是否人脸 | 1 | 1 | -1 | -1 | 1 | -1 |
x<=205 | 205 | 205 | 205 | 205 | 205 | 205 |
a1 | 0.8047 | 0.8047 | 0.8047 | 0.8047 | 0.8047 | 0.8047 |
a1G1(x) | 0.8047 | 0.8047 | -0.8047 | -0.8047 | -0.8047 | -0.8047 |
x<=215 | 215 | 215 | 215 | 215 | 215 | 215 |
a2 | 0.693 | 0.693 | 0.693 | 0.693 | 0.693 | 0.693 |
a2G2(x) | 0.693 | 0.693 | 0.693 | 0.693 | 0.693 | -0.693 |
x>=215 | 215 | 215 | 215 | 215 | 215 | 215 |
a3 | 0.733 | 0.733 | 0.733 | 0.733 | 0.733 | 0.733 |
a3G3(x) | -0.733 | -0.733 | -0.733 | -0.733 | 0.733 | 0.733 |
G(x) | 1 | 1 | -1 | -1 | 1 | -1 |
关于AdaBoost算法的用例这里就讲完了,如果你有兴趣,可以自己找一些数据,按此方法再多验证一些例子。
通过Haar特征模板扫描整幅图像,得到了一组强分类器之后,再把它们“级联起来”,参考下面这张图,就组成了一个完整的人脸检测算法(眼睛,鼻子,嘴巴等等什么都有了)。
假设每个强分类器的识别率(人脸被识别为人脸)只有99%,误识率为50%(非人脸被识别为人脸),那么整个应用软件的识别率有多高呢?这里我们假设这个人脸检测算法是由20个强分类器级联组成的,那么0.99的20次方,用计算器算一下,大概只有82%,也就是说有18%的人脸没有检测出来,这个成功率还是有点偏低。换过来算,如果想让检测软件整体的识别率达到99%,那么每个强分类器的识别率必须达到0.9995,如果整体想达到98%,则单个分类器必须达到0.999的识别率。
相反,误识别率反而不需要那么低。即使每个强分类器的误识率高达50%,在经过20个级联分类器的筛选之后,0.5的20次方也只有0.00000095,也就是说一百万张非人脸,只有一张被错误识别为人脸。
网上有一组图,可以很形象地说明AdaBoost算法的工作原理,这里摘录下来,作为本小节的结尾。(原文地址:https://blog.csdn.net/einstellung/article/details/89352853)