[我的站点](http://whbzju.github.io/blog/archives/)html
#概述 前段时间接触了一阵子人脸识别,只能说是初窥门道,在这里作个总结。本文不涉及具体的算法原理,由于我都是参考别人的资料,只认为没法写的更好,在这边作个概括总结。 现需求以下:从摄像头视频中识别出你本身或朋友的人脸python
要实现这个需求,大致分为两个步骤,分别为人脸检测和人脸识别,即先要从摄像头中识别出人脸,即人脸检测,其次对检测到的人脸进行识别,即人脸识别。本文基于Opencv的人脸算法实现。git
##人脸检测流程github
##人脸识别流程算法
#Opencv相关资料介绍 opencv在2.4后引入了人脸识别相关模块,原来只有人脸检测部分。在Opencv官网,有较详细的介绍,看 !目录,在该目录中重点要看这篇!Face Recognition with OpenCV.api
这应该是一个德国人写的,在教程中他提到了3个算法:机器学习
前面两个算法都是利用子空间的原理,有必定的类似性,分别以PCA和LDA为基础。后者以特征选取为主,作法思路都不大同样,建议分开看。该教程中对算法的描述过于简洁,不适合初学者看,建议寻找相关资料进一步阅读。 ##PCA-主成分分析法 PCA在不少地方都有应用,是一个十分简单有效的方法。其思想归纳起来即降维,它认为原始数据中包含了大量的噪音和冗余,经过协方差矩阵的对角化能够获得一个子空间,该子空间的维度大大下降,却神奇的保留了原始数据中的显著特征。ide
该算法的具体原理可参考斯坦福大学的公开课,Andrew.Ng的机器学习课程,里面有一章节专门讲pca,若以为看视频太慢,能够直接看讲义,讲的很清楚。国内有几个博客做者对它进行了翻译,推荐:学习
!主成分分析(Principal components analysis)-最大方差解释翻译
!机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
该算法涉及较多的线性代数知识,忘掉的同窗建议复习下相关内容。
##LDA-线性判别分析 fisherface的FDA是在LDA基础之上的一种算法。关于线性判别的思想以下:它认为在PCA中,PCA把数据做为一个总体来看,即数据源中全部的显著特征都会被保留下来,若是一我的的脸在强光下和弱光下,pca生成的子空间有显著的差别,而他们倒是同一张脸。LDA的思想是寻找一个分割平面(在二维中即直线),来区分两种不一样类别的数据,既可以区分两个不一样的人脸,进行归类。所以,它的目标就是怎么要找到这个平面,达到最好的区分效果。
一样,该算法的具体原理仍是推荐Andrew.Ng的机器学习公开课。国内也有相关介绍,可是他们的数学推导让我不满意。
!线性判别分析(Linear Discriminant Analysis)(一) !线性判别分析(Linear Discriminant Analysis)(二)
##LBPH 该算法较上面两者容易理解,这里不作详细介绍,你们本身查找相关资料便可。
##Demo 上面教程中提到几个算法opencv中都有例子实现,固然要作2.4以上。教程讲了demo的位置和具体的使用。 全部的Demo须要一我的脸库,教程中提供了几个,能够下载。下载下来的人脸库须要预处理,即打上标签,做者提供了python脚步,你们可使用。
有个demo值得关注,它实现了咱们的需求,它有个专门的教程:!Face Recognition in Videos with OpenCV. 不过要想识别本身的脸,必须将本身的脸裁剪下来保存到人脸库中进行训练。
我不想本身拍照片去裁剪,个人作法是利用demo中的人脸检测算法,将个人人脸检测到,而后保存成灰度图,放到人脸库中。PS:这里有个问题,opencv自带的人脸检测分类器有可能会误捡,会把空白的墙壁当作人脸。个人作法是,在视频中指定一个矩形框,在这个矩形框中进行人脸检测,这样能够大大下降误捡率。实际操做中能够调整位置,让本身的人脸出如今矩形框中。
#Haar-like特征Adaboost级联分类器 完成了人脸识别的Demo验证,你们必定很好奇人脸检测是怎么实现的。opencv里面自带的检测算法原至两篇论文: P. Viola and M. Jones. Rapid object detection using a boosted cascade of simple features. R. Lienhart and J. Maydt. An Extended Set of Haar-like Features for Rapid Object Detection.
##总体感受--如何训练本身的分类器 你们能够参考这篇!教程,利用opencv自带的例子训练一个分类器感受感受。 训练分类器会遇到不少问题,人脸样本和非人类样本的比例有较高的要求,stage越高越难训练,训练时间也会随之快速增加,并且效果还不能保证,博主训练出来的分类器和opencv自带的分类器效果是无法比啊!
##算法原理 我不打算这这里描述它的原理,首先是这方面资料已经不少,我没法作到写的更好,其次是展开后篇幅太长,内容太多,我不想写了,哈哈。 若想较好的理解,直接看上面提到的两篇论文。若英文水平不行,能够看北大有个学生写的毕业论文:基于 AdaBoost 算法的人脸检测,做者:赵楠,还不错。
Haar-like特征须要理解积分图的概念,Adaboost包括弱分类器、强分类器和级联分类器。其中级联分类器较比较麻烦。
#总结 Opencv是个好东西,有个直接能运行的demo,比光秃秃的理论好多了,依靠它搭个自娱自乐的小工程没问题。人脸识别的水很深,本文提到的算法是opencv里面就有的,还有不少算法待各位本身有兴趣去研究。