假设我们在样本库中有六个样本,如下:

其中,

序号:代表样本在库中的顺序

特征值:指对于某特征模板F,其在样本图像上计算得到的特征值

是否人脸:用1代表该样本是人脸,-1代表该样本不是人脸

也就是说,这个样本集中,有三张有人,另有三张非人脸的图片。

在这个例子中,我们的目的是求出在每一个步骤中样本的权重,也即多项式的每一项式子的系数,最终得到一个完整的由多项式表示的强分类器。

根据上文中的计算步骤,第一步需要先初始化训练数据的权值分布。

按照步骤1的方法,在开始的时候,我们为每个样本都赋予一个相同的权重,即整体权重除以样本数量:

然后进入第一轮迭代。

这时候我们得到如下数据:

序号123456
特征值200205206210215219
是否人脸11-1-11-1
第一轮权重0.1670.1670.1670.1670.1670.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行为第二轮迭代所使用到的新数据集的权重,在这里,识别错误的样本的权重被提升了。

序号123456
特征值200205206210215219
是否人脸11-1-11-1
第一轮权重0.1670.1670.1670.1670.1670.167
G1(x)11-1-1-1-1
系数0.80470.80470.80470.80470.80470.8047
z10.747 0.747 0.747 0.747 0.747 0.747
w20.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。

然后继续进行迭代。首先更新训练集的权重,得到下表。

序号123456
特征值200205206210215219
是否人脸11-1-11-1
w20.100 0.100 0.100 0.100 0.500 0.100

然后继续求新的训练集权重,具体过程同上,这里不再详述。第二轮迭代结果如下:

序号123456
特征值200205206210215219
是否人脸11-1-11-1
w20.100 0.100 0.100 0.100 0.500 0.100
g2(x)11111-1
a20.693 0.693 0.693 0.693 0.693 0.693
w30.063 0.063 0.250 0.250 0.313 0.063

接下来我们进行第三轮迭代,首先仍然是更新训练集的权重:

序号123456
特征值200205206210215219
是否人脸11-1-11-1
w30.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%符合。

序号123456
特征值200205206210215219
是否人脸11-1-11-1
x<=205205205205205205205
a10.80470.80470.80470.80470.80470.8047
a1G1(x)0.80470.8047-0.8047-0.8047-0.8047-0.8047
x<=215215215215215215215
a20.6930.6930.6930.6930.6930.693
a2G2(x)0.6930.6930.6930.6930.693-0.693
x>=215215215215215215215
a30.7330.7330.7330.7330.7330.733
a3G3(x)-0.733-0.733-0.733-0.7330.7330.733
G(x)11-1-11-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)