如何正确训练级联

Rom*_*ych 32 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

培训结果

在此输入图像描述

Rom*_*ych 49

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

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

但是如果你acceptanceRatio这样7.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慢得多.

  • 在answers.opencv.org上,一些有资格的人恰恰相反:2:1的比例介于负数和正数之间.我不相信任何简单的规则.adaboost算法能够利用您拥有的尽可能多的样本.积极和消极. (6认同)

小智 7

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


Geo*_*lis 7

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

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

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

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

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

Naotoshi Neo的教程给了我很多帮助.

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


Giu*_*ini 6

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