33

"Required leaf false alarm rate achieved. Branch training terminated." 以下训练命令的可能原因是什么:

用于创建样本

-img imgs/CHE_one_wb.jpg -num 300 -bg imgs/negat.dat -vec imgs/vector.vec -info imgs/smpl/info.txt -maxxangle 0.1 -maxyangle 0 -maxzangle 0.1 -maxidev 100 -bgcolor 255 -bgthresh 0 -w 20 -h 35

-img imgs/CHE_one_wb.jpg -num 300 -bg imgs/negat.dat -info imgs/smpl/info.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -maxidev 100 -bgcolor 255 -bgthresh 0 -w 20 -h 35

火车

-data imgs/cascade/ -vec imgs/vector.vec -bg imgs/negat.dat -numPos 200 -numNeg 40 -numStages 10 -featureType LBP -maxFalseAlarmRate 0.9 -w 20 -h 35

培训结果

在此处输入图像描述

4

6 回答 6

49

我已经实现了我的目标并训练了良好的级联。

  1. 首先,您需要几个原始样本(不要使用一个并将其与创建样本相乘)。我使用了 10 张不同的啤酒瓶照片,每张照片创建了 20000 个样本,然后我将所有样本与 2000 个样本合并到一个矢量文件中。
  2. -w 20 -h 35 应该匹配原始图像的纵横比
  3. 正样本与负样本的关系应该在 2:1 左右(应该有更多的正样本)
  4. 您应该自己选择的阶段数(对我来说是12-13)。您设置的阶段越多,您的级联就越精确,但您也可以过度训练您的级联,它不会找到任何东西。级联的精度由最后阶段的acceptanceRatio显示,它应该在这个值附近0.000412662或更低。

但是如果你得到像这样的acceptanceRatio7.83885e-07 ,你的级联可能已经过度训练并且它不会找到任何东西,试着设置更少的阶段。

!!!还有一件更重要的事情,当你训练你的级联时,你应该在你的阶段上从 2 或 3 个阶段开始有多个功能。如果您只有一个功能,您将无法获得良好的级联。您应该处理训练图像(负样本和正样本)。正常训练将如下所示:

在此处输入图像描述

对于培训,我使用了-data imgs/cascade/ -vec imgs/vector.vec -bg imgs/negat.dat -numPos 1900 -numNeg 900 -numStages 12 -featureType HAAR -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 24 -h 30命令

两种功能类型的工作方式几乎相同,有时 HAAR 稍微好一点,但比 LBP 慢得多。

于 2013-05-30T11:24:43.247 回答
7

与正数和阶段数相比,负数太少。

于 2013-04-17T11:00:24.893 回答
7

如果您有少量数据,则需要更少的阶段来达到您设置的所需误报率。这意味着级联分类器“足够好”,因此不必进一步增长。总的误报率实际上是乘以每个阶段的比率,所以在一个点之后,就达到了该值。

在您的选项中,您将其设置为 0.9。考虑让它更高,比如 0.95 或更高。

除此之外,您的数据集很小,因此在训练期间验证它们时算法更容易获得良好的结果。数据集越小,分类器越容易训练,因此需要的阶段就越少。但这并不意味着在真实数据上运行时会更好。此外,如果您保持较低的训练规模并设置较高的比率,请考虑分类器将需要更多阶段才能完成并且会更复杂,但它很可能会在训练集上过度训练。

总而言之,如果您拥有的正面和负面的性质使它们易于分离,那么您不需要这么多样本。当然,这取决于您训练算法的目的。根据您的样本数量,您放置的 10 个阶段很多,因此算法会提前终止(不一定是坏的)。

当我训练人脸时,我想我有大约 1000 个正面(包括所有的旋转/偏差)和 2-3 千个负面,如果我没记错的话,需要一个大约 11-13 个级别的分类器。

Naotoshi Neo的教程对我帮助很大。

另外,正如 Safir 所提到的,我现在注意到的是,与正样本相比,负样本太少了。应该至少在数量上相等,最好是正数的 1.5 - 2 倍左右。

于 2013-04-17T13:05:56.717 回答
6

您设置 maxFalseAlarmRate=0.9。
这意味着在每个阶段中,不超过 90% 的 40 个负样本(即 36 个样本)应该位于正边界内。当算法设法将至少 4 个样本置于该边界之外时,它可以进入下一阶段。
这工作了几个阶段,直到发生(只是偶然)从一开始就少于 36 个样本已经在正边界内(请记住,负样本提取是一个随机过程)。所以当算法应该操作分离时,它已经完成了它的工作,它不知道如何进行。

于 2015-04-26T20:06:10.967 回答
1

我在正确训练我的级联时也遇到了一些问题。我遵循@Dmitry Zaytsev 编写的步骤,但我无法获得正确的 cascade.xml。我总是有这样的消息:

“达到要求的叶子误报率。分支训练终止。”

或者

“最可能的原因是给定 vec 文件中的样本数量不足。”

最后我成功了。我想分享我的想法,即使我不完全确定它们是否正确。把它们当作我自己的经验,记住我不是开发人员。

参数 -w 和 -h 真的很有意义。当我发现向量的样本应该具有可能的最小尺寸时,一切都开始正常工作,并且我从经验丰富的开发人员那里读到 24 是一个很好的最小尺寸。我得到了轴(宽度和高度)之间的关系,我使用 -w 24 和 -h 66 作为我的形状检测器。

另外,当我得到背景图像时,我意识到了一些事情。大小关心。100 x 100 像素这是一个很好的尺寸(在教程中看到)但我想相信的是尺寸必须大于矢量样本的图像!这意味着如果您使用:

opencv_createsamples -vec yourvectorsamplesimages.vec -info path/to/data/file.info -num NumOfPositivesImages -w 24 -h 66

-w-h值必须低于 100。我认为这是因为当我之后使用 opencv_traincascade 时,这是我唯一一次得到正确的火车 cascade.xml,正如 @Dmitry Zaytsev 之前所说的那样。

我知道我的信息不严谨,也可能是错误的,但是为了获得正确的 cascade.xml 挣扎了 4 天,导致我建立了这种关系。

只是想提供帮助,因为您的信息对我有所帮助。:-)

谢谢

于 2019-08-08T11:21:26.450 回答
0

这不是错误!鉴于提供的样本和训练设置,您的级联已经达到了预期的潜力。要么添加更多数据,要么让您的要求更加苛刻!现在它只是说,和你要求的一样好......

你现在有三种方式...

  1. 在 -numStages 中添加更多阶段以获得您的阶段,例如,如果您想获得 10 个阶段,您可以在参数 -numStages 14 中写入,您将获得 10 或 11 个阶段。

2.你可以通过增加你的数据来摆脱这个,我的意思是你的正面图像和负面图像的数量。“尽量保持积极而不是消极”

3.我在某个地方读过这个,所以我不知道它是否有效。您可以通过增加 -minHitRate 0.995 和 -maxFalseAlarmRate 0.5 来做到这一点,这两个参数有它们的默认值,您可以通过将它们增加到 0.998 和 0.7 并继续这样做来解决您的问题。

但就像我说的,这不是一个错误。

于 2018-01-26T09:06:51.353 回答