教你使用开源opencv实现人脸检测
人脸检测是现在比较常用的功能,比如出租车司机人脸与司机驾照照片对比,门禁系统中进入者的人脸与人脸库中的人脸进行对比。要实现人脸对比,首先要实现的是人脸检测,在摄像头拍摄到的一张图片中,正确的检测到人脸的位置这就至关重要。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
1.人脸检测方法
目前人脸检测方法主要分为两大类,基于知识和基于统计。基于知识的人脸检测方法主要包括:模板匹配,人脸特征,形状与边缘,纹理特征,颜色特征。基于统计的人脸检测方法主要包括:主成分分析与特征脸法,神经网络模型,隐马尔可夫模型,支持向量机,Adaboost算法。基于知识的方法将人脸看成不同特征的特定组合,即通过人脸的眼睛、嘴巴、鼻子、耳朵等特征及其组合关系来检测人脸。基于统计的方法将人脸看成统一的二维像素矩阵,通过大量的样本构建人脸子空间,通过相似度的大小来判断人脸是否存在。
2.级联分类器简介
OpenCv能够实现对于物体的识别其中其主要作用的是他训练出的分类器,而分类器又可以分为强分类器和弱分类器,一个分类器的分类准确率在60%-80%,即:比随机预测略好,但准确率却不太高,我们可以称之为“弱分类器”,比如CART(classification and regression tree)。反之,如果分类精度90%以上,则是强分类器,弱分类器在adaptive boosting(Adaboost)的作用仅仅是提供了一个训练方向(就是看弱训练在那个特征(或者叫方向)上面的误差最大),然后在这个方向上面增强训练权值,即所谓强训练。最后组合起来的就是最终的结果。可以看到,弱训练只是要提供一个好的训练方向就行了,而强训练才是最终模型优良的关键,强分类器的设计在于如何组合。而级联分类器则是将多个强分类器组合起来,更进一步提高分类器的准确率,通过这一系列的训练方法,最终形成一个级联分类器,使准确率达到最高。
3.分类器的训练和使用
(1)分类器的训练
训练分类器可以使用OpenCv安装包中自带的两个程序(如图1)
图1 自带程序
其中opencv_createsamples.exe用来创建样本描述文件,即告诉训练器什么是正样本,opencv_traincascade.exe用来训练级联分类器,此外还需要在同级目录下创建正负样本文件夹pos和neg,再pos和neg中加入路径文件pos.txt和neg.txt,用于训练过程中目标的寻找,训练所用开源数据集(如图2)
图2 训练样本
做好准备工作后就开始训练分类器,首先进入目标位置(如图3)
图3 进入目标位置
这时候输入两个程序的名称可以看到是可以运行的(如图4、5)
图4 部分步骤
图5 部分步骤
之后开始创建正样本描述文件,执行以下命令(如图6)
opencv_createsamples.exe -vec pos.vec -info pos\pos.txt -bg neg\neg.txt -num 100 -w24 -h 24,便成功创建了样本描述文件pos.vec
图6 部分步骤
有了样本描述文件就可以正式训练我们的分类器了,再命令行窗口输入以下命令(如图7)
opencv_traincascade.exe -data xml -vec pos.vec -bg neg\neg.txt -numPos 85 -numNeg 400 -numStages 12 -featureType HAAR -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5
便开始训练分类器了,最终会在xml文件夹下生成一系列分类器,其中的cascade.xml就是我们生成的分类器(如图8)
图7 生成分类器
图8 分类器示意图
(2)分类器的使用
调用分类器(如图9)
图9 分类器调用
可以看到,训练的效果很理想,证明过程是正确的(如图10)
图10 结果示意图
OpenCv是一个功能强大的开源库,在人工智能图像识别领域有着重要的地位,因此掌握其原理十分必要,本次实验不仅学习到了OpenCv的基本知识还探究了OpenCv分类器的训练和使用,有了这个基础我们就可以收集不同的训练集进行不同方面的分类器训练,从而实现自己的需求。课后学生用不同的训练集实现了各种物体的自动检测,例如宠物狗、安全帽、自行车的检测(如图11)文章来源:https://uudwc.com/A/bEy9P
文章来源地址https://uudwc.com/A/bEy9P