之前有过训练opencv中的cascade classifier,这里给出每个参数的详细解释,默认的输出参数如下,
【POS count: consumed 1400:1445】
在训练本级强分类器时,能够使用1400个正样本图像,而这1400个正样本图像是从1445个正样本图像集中选取出来的,也就是说此时有45个正样本没有被识别出来。前面的1400正式opencv_traincascade.exe命令中参数numPos所指定的数量,有时这个值会小于numPos,说明numPos设置过大,并且最小识别率设置的较小,从而导致正样本图像数量不足。后面的1445可以用来表示当前级联分类器的识别率,即由0-stage, 1-stage, 2-stage组成的级联分类器的识别率。此时的识别率为96.885%m,因为1400/1445=0.96885
在训练本级强分类器时,能够使用4000个负样本图像,这个数正式opencv_traincascade.exe命令参数中numNeg所指定的数量,当然这个数也有可能小于numNeg,这是因为前面信息中POS count的数值不等于numPos所致,具体数值的大小见源码分析。后面的0.000438297表示负样本的接受率,也就是当前强分类器之前的所有强分类器(0-stage, 1-stage, 2-stage)构成的级联分类器的错误率,即经过当前级联分类器预测后,这些被预测为正样本而实际为负样本的4000幅图像是从多少个负样本图像中得到的。
级联分类器的特点是后一级的强分类器只接收那些前面分类器认为是正样本的数据,把负样本预测为正样本,这种情况会随着训练级数的增加,困难程度也在增加,当然这种困难程度还与opencv_traincascade.exe命令中所设置的最大错误率maxFalseAlarmRate有关,错误率设置的越低,困难程度会越大。
以本级为例,这4000个负样本是从九百多万个负样本中选择出来的,计算公式为:4000/0.000438297=9126169.29044。在本例的最后一级强分类器的训练中,这个数值甚至会高达十亿。所以训练过程中的时间消耗主要就在这里。
在没有显示该行信息之前,终端输出的是下列信息: NEG current samples: XXXX。XXXX代表着当前时刻得到的负样本数量,这个数值会逐渐增加,当增加到4000时,则会正常显示上面的信息。当此时得到的级联分类器的错误率小于我们所设置的错误率时,系统会停止训练,因为当前得到的级联分类器已经满足了要求,无需在训练下去了。例如,当已得到了3个强分类器,0-stages, 1-stages, 2-stages 现在要训练第四个强分类器3-stages,当这个强分类器训练好之后,这4个强分类器构成的级联分类器应该满足的最大错误率为:0.25*0.25*0.25*0.25=0.00390625
【Precalculation time: 8】
表示预先计算特征值所消耗的时间,即在没有构建强分类器之前,我们就把一部分特征值计算好了,该值与opencv_traincascade.exe命令中的参数precalcValBufSize和precalcIdxBufSize有关,也就是我们事先为此开辟的内存越大,所保存的特征值就越多,因此计算这些特征值所花费的时间就越长。由于在构建强分类器之前,要用到的特征值都已计算好,所以构建强分类器的时间就大大缩短了。
【N HR FA】
9 0.996429 0.667
N表示当前强分类器的弱分类器(即决策树)的训练得到的数量,HR表示当前强分类器的识别率,FA表示当前强分类器的错误率。我们从倒数第2行开始,此时训练得到了10棵决策树,识别率为99.6429%,错误率为66.7%,识别率满足了要求,即大于最小识别率99%,但是错误率不满足要求,即它最大错误率为50%,所以还需要继续训练,当又得到一颗决策树时,(此时有10棵决策时),识别率和错误率都满足了要求。(99.5714% > 99%,43.5% < 50%)
表示此时该级的强分类器已经得到,因为识别率和错误率都满足了要求,所以此级分类器的训练结束。
【Training until now has taken 2 days 17 hours 55 minutes 49 seconds】
表示到目前为止,训练级联分类器共用时2天17时55分49秒
领取专属 10元无门槛券
私享最新 技术干货