用haar特征训练自己的分类器


OpenCV给我们提供了很多训练分类器的方法和程序。对于人脸检测的分类器训练叫做海尔训练,我们可以用这些方法创建我们自己的分类器。

(一)数据准备:

  • 正样本(人脸)
            我们需要收集只含有脸部的图像。The UMIST Face Database 有着类似Video般的连续脸部图像,不论是正脸的还是侧脸的。我以为训练这些图像能生成一个面部表情鲁棒性很好的脸部检测器。然而我想得太过美好了,事实上效果一般。后来我又用了基于CMU PIE Database的正面脸部数据库,它包含了许多不同光照条件的图像,可是效果与前面类似,都不理想。MIT CBCL Face Data是另一种选择,它囊括了2429张正脸图像,其中也有一些不同的表情与光强。原本是很适合海尔训练的,然而该库的图像原始大小只有19*19,这样,我们就无法进行检测更好尺寸的人脸的实验。
            OpenCV的开发者有可能使用了FERET数据库。
  • 负样本(背景)
            我们同样需要收集一些我们不感兴趣的对象(也就是不含有人脸的图像)来生成海尔练级分类器。
  • 测试自然状态的图像(人脸在背景中)
            我们可以利用createsamples utility来综合测试图像集,不过有个专门的测试自然状态的图像集合就更好了。
            OpenCV的开发者使用了CMU-MIT Frontal Face Test Set去进行他们关于这类图像的实验。这个集合有个有关范围的描述,涵盖了眼睛、鼻子和嘴唇的中心及两端的方位信息,然而并没有由矩形区域来表示的人脸定位。
            但是,比如人脸区域的矩形可以由以下方法计算得出:
            以鼻子的高度作为矩形的上沿,以嘴巴的高度作为矩形的下沿,以嘴巴的左端作为矩形的左边缘,以嘴巴的右端作为矩形的右边缘。
            虽然此法不够完美,不过看起来还算可行。
  • 如何手动快速生成图像
            我使用的软件是imageclipper,这个软件不仅对海尔训练有帮助,而且也可应用于计算机视觉和机器学习研究等领域。它有如下特点:
            自动打开同一目录下的图像序列;以帧为单位打开视频文件;通过某快捷键方便剪切图像并跳至下一幅图像;直接用鼠标左键选定并剪切图像中的区域;通过鼠标右键移动或重置图像区域;所选定的区域也可显示在下一幅图中。


1.海尔训练
现在,我们使用haartraining.exe来训练我们自己的分类器。训练语句如下:

Usage: ./haartraining
  -data <dir_name>
  -vec <vec_file_name>
  -bg <background_file_name>
  [-npos <number_of_positive_samples = 2000>]
  [-nneg <number_of_negative_samples = 2000>]
  [-nstages <number_of_stages = 14>]
  [-nsplits <number_of_splits = 1>]
  [-mem <memory_in_MB = 200>]
  [-sym (default)] [-nonsym]
  [-minhitrate <min_hit_rate = 0.995000>]
  [-maxfalsealarm <max_false_alarm_rate = 0.500000>]
  [-weighttrimming <weight_trimming = 0.950000>]
  [-eqw]
  [-mode <BASIC (default) | CORE | ALL>]
  [-w <sample_width = 24>]
  [-h <sample_height = 24>]
  [-bt <DAB | RAB | LB | GAB (default)>]
  [-err <misclass (default) | gini | entropy>]
  [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>]
  [-minpos <min_number_of_positive_samples_per_cluster = 500>]


Kuranov et. al. 指出,20*20的样本识别的正确率最高。另外,对于18*18的尺寸,四分裂节点表现最好。而对于20*20的样本,两节点显然更好。分裂节点数分别是2、3或4的弱树分类器间的差小于它们的中间节点。
此外,关于20阶训练有个说法。假设我的测试集合代表了学习任务,我可以期望一个报错率是0.5^20≈9.6e-07,识对率是0.999^20≈0.98。
所以,使用20*20的样本大小,并且Nsplit=2, Nstages=20, MINhitrate=0.9999(default: 0.995), MAXfalsealarm=0.5(default: 0.5), weighttrimming=0.95(default: 0.95)是比较优的组合。

$ haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 7000 -nneg 3019 -w 20 -h 20 -nonsym -mem 512 -mode ALL


"-nonsym"选项用于没有垂直(左-右)对称的对象类。如果对象类是垂直对称的,例如正脸,则用"-sym (default)"。这样会增大运算速度,因为类海尔特征只有一半投入使用。
"-mode ALL"使用了类海尔特征的扩展集。默认只使用竖直特征,ALL除了能使用竖直特征,还能使用转角为45°的特征集合。
"-mem 512"是以MB为单位的预计算可使用的内存大小。默认是200MB。
另外还有一些选项没有用到:

[-bt <DAB | RAB | LB | GAB (default)>]
[-err <misclass (default) | gini | entropy>]
[-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>]
[-minpos <min_number_of_positive_samples_per_cluster = 500>]


#你可以使用OpenMP(multi-processing).
#一次训练持续三天。

2.生成XML文件
当海尔训练过程完全结束,它将会生成一个xml文件。
如果你想要将一个中级海尔训练输出目录树转化为一个xml文件,在目录OpenCV/samples/c/convert_cascade.c下有个程序可供使用。
输入的格式为:

$ convert_cascade --size="<sample_width>x<sampe_height>" <haartraining_ouput_dir> <ouput_file>


举例:

$ convert_cascade --size="20x20" haarcascade haarcascade.xml
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值