如何正确训练级联

时间:2013-04-17 10:51:17

标签: opencv

"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

培训结果

enter image description here

6 个答案:

答案 0 :(得分:49)

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

  1. 首先,您需要一些原始样本(不要使用其中一个并将其与创建样本相乘)。我已经使用了10张不同的啤酒瓶照片,每个我创建了200个样品,然后我将所有样品合并到一个含有2000个样品的矢量文件中。
  2. -w 20 -h 35应匹配原始图像的宽高比
  3. 阳性样本与阴性的关系应该在2:1左右(应该有更多阳性样本)
  4. 您应该自己选择的阶段数(对我来说是12-13)。您设置的阶段越精确,您的级联就越多,但您也可以推翻您的级联,它将找不到任何东西。级联的精度由 acceptanceRatio 在最后一个阶段显示,它应该在此值0.000412662或更低的值附近。
  5. 但是如果你得到 acceptanceRatio 这样的7.83885e-07,你的级联可能会过度训练并且找不到任何东西,试着设置更少的阶段。

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

    enter image description here

    对于培训,我使用了-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慢得多。

答案 1 :(得分:7)

与阳性数量和阶段数相比,阴性数量太少。

答案 2 :(得分:7)

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

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

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

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

当我训练面孔时,如果我没记错的话,我认为我有大约一千个正面(包括所有旋转/偏差)和2-3万个底片,需要一个大约11-13级的分类器。

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

此外,我现在注意到,正如萨菲尔所提到的,与积极的样本相比,你的负面样本太少了。它应该至少相等,最好是正数的1.5-2倍。

答案 3 :(得分:6)

你设置maxFalseAlarmRate = 0.9 这意味着在每个阶段中,40个阴性样本(即36个样本)中不应超过90%应位于阳性边界内。当算法设法将该边界放在至少4个样本之外时,它可以进入下一阶段 这工作了几个阶段,直到它发生(仅仅偶然),从一开始就有少于36个样本已经在正边界内(消极样本提取是一个随机过程)。 因此,当算法应该运行分离时,它已经完成了它的工作,并且它不知道如何处理。

答案 4 :(得分: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时,这是我唯一获得适当训练的机会如@Dmitry Zaytsev之前所述,cascade.xml。

我知道我的消息并不严格,也可能是错误的,但是为了获得适当的层叠而奋斗了4天。xml导致我建立了这种关系。

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

谢谢

答案 5 :(得分:0)

这不是错误!鉴于提供的样本和培训的设置,您的级联已达到其预期的潜力。要么添加更多数据,要么使您的要求更加严苛!现在它只是陈述,确实和你要求的一样好......

你现在有三种方法......

  1. 在-numStages中添加更多阶段以获得您的舞台,例如,如果您想要在参数-numStages 14中编写10个阶段,您将获得10或11个阶段。
  2. 2.你可以通过增加你的数据摆脱这个我的意思是你的正面图像和负面图像的数量。 “尽量保持积极因素而非负面因素”

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

    但就像我说这不是错误。