我正在实施Viola-Jones论文中描述的 AdaBoost,以供我自己启迪。在对算法进行单元测试的过程中,我发现了一些奇怪的行为。这可能只是算法对预设数据的奇怪行为,或者我可能遗漏了一些东西。我想知道是哪种情况。
首先,我有:
2 instances of A type faces
1 instance of a B type face
3 instances of noise
--------------------
6 total instances
所以每张图片的初始权重为1/6
.
分类器选择的第一个特征识别 A 类人脸,但不是 B 类人脸,也不是任何噪声。因此,它的误差(以及增强分类器中的相关权重)为1/6
.
接下来更新权重(首先将正确分类的图像乘以(error / 1 - error)) == 0.2
产生:
A type face weight: 1/30
B type face weight: 1/6
noise image weight: 1/6
然后将权重归一化(总和为 1):
A type face weight: 1/22
B type face weight: 5/22
noise image weight: 5/22
第二个特征正确地选择了 B 型图像,而不是噪声或 A 型图像。因此,它有一个1/11
( 2/22
) 的误差,明显小于1/6
。
由于 Viola-Jones 提出的“默认”阈值(这是我们在本文后面部分进行级联和调整阈值之前)是权重的一半,并且只有两个权重,而第二个特征的权重更大(因为它有一个较低的错误),那么得到的增强分类器只能正确地分类 B 型人脸。
直观地说,我希望一个强分类器由一个检测 A 面孔的弱分类器和一个检测 B 面孔以检测 A 和 B 面孔的弱分类器组成。
我什至愿意接受我只会得到两者之一,因为 AdaBoost 是一种多数投票算法,并且只有 2 个选民可能会表现得很奇怪,但我希望它只会正确分类其中一张脸那么它将正确分类 A 面,因为它们的数量更多。
换句话说,我希望每个添加到强分类器的弱分类器的权重都会依次降低。
我错过了一步还是这只是过于简单的数据的奇怪行为?