版权声明:免责声明: 本人在此发文(包括但不限于汉字、拼音、拉丁字母)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人局部或全部同意、支持或者反对观点。如需要详查请直接与键盘生产厂商法人代表联系 .挖井挑水无水表,不会网购无快递
前段时间弄过一下人脸识别相关的东西,记录一下
撰写不易,转载需注明出处:http://blog.youkuaiyun.com/jscese/article/details/54409627本文来自 【jscese】的博客!
概念
FaceDetect
人脸检测 在一张图像中判断是否存在人脸并找出人脸所在的位置
FaceRecognize
人脸识别 在人脸检测的基础上收集人脸数据集合进行处理保存信息,将输入人脸与保存的信息进行比对校验,得到是否为其中某个人脸
特征值
以某种特定规则对输入源进行处理得到具有唯一性质量化的值,在人脸识别中特征值的提取有
HOG-方向梯度直方图 , HAAR-like特征 , LBP-局部二进制模式 三种方法
前面转载的博客有介绍:图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
分类器
根据特征值界定输入事物是否属于已知某种类别的过滤条件组合,未知类别的算聚类器,弱分类器:分类器的正确率高于随机分类(50%),强分类器:能满足预期分类并且正确率很高的分类器
Adaboost
迭代算法,同一个训练集合下训练多个弱分类器,把弱分类器迭代组合成一个强分类器
算法具体原理实现:
这里写链接内容
这里写链接内容
级联分类器
将多个同类型的分类器联合起来进行推算整合以得到符合目标的最终分类器的方法
最终的分类处理流程如下图:
adaboost训练出来的强分类器一般具有较小的误识率,但检测率并不很高,一般情况下,高检测率会导致高误识率,这是强分类阈值的划分导致的,要提高强分类器的检测率既要降低阈值,要降低强分类器的误识率就要提高阈值
级联强分类器的策略是,将若干个强分类器由简单到复杂排列,希望经过训练使每个强分类器都有较高检测率,而误识率可以放低,比如几乎99%的人脸可以通过,但50%的非人脸也可以通过,这样如果有20个强分类器级联,那么他们的总识别率为0.99*20 98%,错误接受率也仅为0.5*20 0.0001%。这样的效果就可以满足现实的需要了
设K是一个级联检测器的层数,D是该级联分类器的检测率,F是该级联分类器的误识率,di是第i层强分类器的检测率,fi是第i层强分类器的误识率。如果要训练一个级联分类器达到给定的F值和D值,只需要训练出每层的d值和f值,这样:
D*K = D,f*K = F
级联分类器的要点就是如何训练每层强分类器的d值和f值达到指定要求
算法伪代码如下:
1)设定每层最小要达到的检测率d,最大误识率f,最终级联分类器的误识率Ft;
2)P=人脸训练样本,N=非人脸训练样本,D0=1.0,F0=1.0;
3)i=0;
4)for : Fi>Ft
++i;
ni=0;Fi=Fi-1;
for : Fi>f*Fi-1
++ni;
利用AdaBoost算法在P和N上训练具有ni个弱分类器的强分类器;
衡量当前级联分类器的检测率Di和误识率Fi;
for : di<d*Di-1;
降低第i层的强分类器阈值;
衡量当前级联分类器的检测率Di和误识率Fi;
N = Φ;
利用当前的级联分类器检测非人脸图像,将误识的图像放入N;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
分类器生成及使用
一个高准确率的级联分类器的主要生成步骤如下:
1.大量样本集合,特征值的提取
2.通过adaboost 训练多个弱分类器并迭代为强分类器
3.多层级联强分类器,得到最终的级联分类器
这些训练流程完成之后结果以xml的方式保存起来,就是分类器文件,OpenCV中包含了以上的实现,并且已经存放了许多已经训练好的不同类型的不同特征值提取生成的的级联分类器
Opencv中可以直接加载这些分类器文件,并且给出了便捷的API
OpenCV 中的人脸识别
人脸检测:
Opencv源码中的分类器存放路径:opencv-2.4.13\data\
其中有hog haar lbp 分类目录,还有针对gpu使用的分类器文件,当使用gpu 或者 ocl时候需要加载此类分类器文件
Cpu进行的人脸检测实现类为 CascadeClassifier ,在 objdetect 模块中,主要api实现文件:
opencv-2.4.13\modules\objdetect\src\cascadedetect.cpp
调用opencl处理的类 OclCascadeClassifier, 在ocl模块中实现:
opencv-2.4.13\modules\ocl\src\haar.cpp
还包含了gpu-cuda处理的检测,属于windows的范畴 opencv-2.4.13\modules\gpu\src\cascadeclassifier.cpp
检测包含的主要api:
CV_WRAP bool load( const string& filename );
- 1