我正在按照Viola-Jones 论文所述的方法实现AdaBoost算法以增强自己的学识。在单元测试该算法的过程中,我发现了一些奇怪的行为。这可能是算法对预设数据的反应不同导致的,也可能是我漏掉了什么。我想知道是哪种情况。
首先,我有:
每个图像的初始权重为
分类器选择的第一个特征可以识别A型脸,但不能识别B型脸和任何噪音。因此,它有一个错误(以及在增强分类器中的相关权重)为
接下来,权重更新(首先将正确分类的图像乘以
然后对权重进行归一化(总和为1):
第二个特征正确选择B类型的图像,但不选择噪声或A类型的图像。因此,它的误差为1/11 (2/22),明显低于1/6。
由于Viola-Jones提出的“默认”阈值(这是在我们到达级联和在本文后面调整阈值之前)是权重的一半,而且只有两个权重,第二个特征的权重较大(因为它的误差更小),那么得到的增强分类器仅能正确分类B类型的脸。
直观地说,我希望由检测A类型脸部的弱分类器和检测B类型脸部的弱分类器组成的强分类器可以检测到A和B类型的脸部。
我甚至愿意接受只得到两者中的一个,因为AdaBoost算法是一种多数表决算法,并且可能会在只有两个投票者的情况下表现奇怪,但是如果它只能正确分类其中一个脸部,则我期望它可以正确分类A类型的脸部,因为A类型的脸部更多。
换句话说,我希望每个添加到强分类器中的弱分类器的权重逐渐降低。
我是否错过了某个步骤,还是这只是对过度简单数据的奇怪行为?
首先,我有:
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算法是一种多数表决算法,并且可能会在只有两个投票者的情况下表现奇怪,但是如果它只能正确分类其中一个脸部,则我期望它可以正确分类A类型的脸部,因为A类型的脸部更多。
换句话说,我希望每个添加到强分类器中的弱分类器的权重逐渐降低。
我是否错过了某个步骤,还是这只是对过度简单数据的奇怪行为?