最近在做人脸检测的Haartraining训练分类器,发现训练到最后误检率很低时分类器总是卡到某一层就不在继续进行,像是进入了死循环,程序代码与参数输入应该是没有任何问题的,所以我从网上找这方面的资料,最后在OpenCV的中文论坛看到一个帖,终于找到原因了。具体如下:
1、问题出现在取负样本的那个函数icvGetHaarTrainingDataFromBG中;
当剩下所有的negtive样本在临时的cascade Classifier中evaluate的结果都是0(也就是拒绝了),随机取样本的数目到几百万都是找不到误检测的neg样本了,因而没法跳出循环!
2、解决方法是,增大负样本数目,增大负样本之间的变化!
P.S. 因为负样本原则应该是无强大而且多样性越大越好,这在现实中是不可行的,所以我们采集的负样本一般无论从数量上还是多样性上都很难满足要求,所以出现上述问题就很正常了,不过此时的分类器已经完全额、可以使用,因为它的误检率已经很低,从实用性上时没有任何问题的。
另外,帖中还提到:
负样本不需要做成和正样本一样大小的,所以你搜集个几千张各种照片就够用了,比如网页素材库啊什么的,只要保证你的负样本里不包含检测目标就行了。另外训练的时候,负样本不要一下子都加进去,不够了再加,否则会在找负样本上耗费很多时间。
也就是说,训练的时候如果发现很慢了,就ctrl+c停下来,修改bg_data.list,提供新的bg图像。
呵呵,现在感觉Haartraining太工程化了,到最后有点重复操作,所以觉得没必要在很多问题上深究,会用就行了。