在使用opencv自带的分类器haarcascade_frontalface_alt.xml进行人脸识别的基础认识后,决定自己训练一个分类器看一下效果。该过程大致可分为三个阶段:样本采集、分类器训练和运用训练好的分类器进行人脸检测。
1、样本的采集
在训练前,我们需要进行正样本及负样本的采集。
正样本采用的是ORL人脸数据库中的部分图像,本次共选用63张图像,初始图像大小为92*112,但在训练时出现了内存不足的问题,因此将其尺寸归一化为20*20。部分截图如下:
负样本采用的是weizmann团队http://www.wisdom.weizmann.ac.il/~vision/Seg_Evaluation_DB/dl.html 网站上的图像分割数据库里面的灰色图像,总共200幅图片,大小大约在300*200像素,截图如下所示:
图像采集完毕后,将其分别放在两个文件夹pos_img(正样本)和neg_img(负样本)下。再新建一个xml文件夹,xml文件夹存放后面训练过程中产生的数据模型,最后opencv会将其转换生成一个xml文件,也就是最终的分类器。
然后,从OpenCv安装目录中查找出如下两个exe可执行文件:
opencv_createsamples.exe:用于创建样本描述文件,后缀名是.vec。专门为OpenCV训练准备,只有正样本需要,负样本不需要。
opencv_haartraining.exe:是OpenCV自带的一个工具,封装了haar特征提取以及adaboost分类器训练过程。
一般来说,正负样本数目比例为1:3时训练结果较好,但是不是绝对。由于每个样本的差异性不同等因素,所以没有绝对的比例关系。但是负样本需要比正样本多,因为原则上说负样本的多样性越大越好,我们才能有效降低误检率,而不仅仅是通过正样本的训练让其能识别物体。在本次训练中,我选择了63个正样本和200个负样本,均为灰度