Haar特征+Adaboost的人脸识别C实现,部分简单的功能借助Opencv实现,数据是MIT人脸数据。
程序的实现主要是参考《Rapid Object Detection using a Boosted cascade of simple features》及
《基于Adaboost算法的人脸检测》 – 北京大学,赵楠。
因为觉得别人的博客写的比论文的好理解,所以以下内容多是别人博客内容整理后写下的。
1、Haar(-like)特征
Haar(-like)特征因类似Haar小波而得名, 它反映了图像局部的灰度变化。例如,脸部的一些特征能由矩形特征简单的描述,如下图所示。
上图中两个矩阵特征,表示出人脸的某些特征。比如中间一副表示眼睛区域的颜色比脸颊区域的颜色深,右边一副表示鼻梁两侧比鼻梁的颜色要深。同样,其它目标,如眼睛等,也可以用一些矩形特征来表示。在给定有限数据的情况下,基于特征的检测能够编码特定区域的状态,而且基于特征的系统要比基于像素的系统要快的多。
矩形特征对一些简单的图形结构,比如边缘、线段,比较敏感,但是其只能描述特定走向(水平,垂直、对角)的结构,因此比较粗略。
常用的矩形特征(又称为–特征模板):
这些所谓的特征矩形具体作用是什么呢? 将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值。如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好。所以这些方块的目的就是把人脸特征化,以区分人脸和非人脸。
为了增加区分度,可以对多个矩形计算得到一个区分度更大的特征值,那么什么样的矩形特征怎样组合到一块可以更好的区分出人脸和非人脸呢?这个就是AdaBoost算法要做的是了。Opencv的Haar分类器就是基于扩展后的特征库实现的。
1.1、特征模板个数
特征模板可以在子窗口内以“任意”“尺度”“任意”放置,每一种形态称为一个特征。找出子窗口所有特征,是进行弱分类训练的基础。
《1》、子窗口内的条件矩形
如图所示一个mm大小的子窗口,可以计算这么大的子窗口内存在多少个矩形特征。
以mm像素分辨率的检测器为例,其内部存在的满足特定条件的所有矩形的总数可以这么计算:
对于m*m子窗口,我们只需要确定了矩形左上顶点A(x1, y1)和右下顶点B(x2, y2),既可以确定一个矩形;如果这个矩形还必须满足下面两个条件( 称为(s,t)条件,满足(s,t)条件的矩形称为条件矩形):
不同大小窗口对应的特征矩形数量:
基于Haar(-like)特征的特点,论文利用 积分图来实现特征计算的加速。
2、Adaboost
Adaboost是一种迭代方法,其核心思想是针对不同的训练集训练同一个弱分类器,然后把在不同训练集上得到的弱分类器集合起来,构成一个最终的强分类器。
具体弱分类的训练及选取,强分类的训练可以参考AdaBoost 人脸检测介绍(3) : AdaBoost算法流程或看《基于Adaboost算法的人脸检测》 – 北京大学,赵楠这篇论文,两者说的都很详细。
上诉两者均提到的弱分类的流程中有排序特征值这个操作,如下所示:
其根据— 存在优势的矩形特征,能够在一定的置信范围内区分人脸和非人脸。由于是使用统计的方法计算人脸图像和非人脸图像的差别,因此最后得到的区分阈值,也只能是在某个概率范围内准确地进行区分。
这个是结论,具体论证过程同样能在论文或提到的博客中找到(为什么能用haar特征进行分类),此处就不粘贴复制了。
代码中样本分布权值更新的实现参考的是《Rapid Object Detection using a Boosted cascade of simple features》论文的,和大多数博客提到的有差别。
demo代码实现了多个强分类器级联。
2.1、算法优缺点
优点:
《1》、Adaboost提供了一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不同对特征进行筛选;
《2》、Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度。无论是人造数据还是真实数据,Adaboost都能显著的提高学习精度;
《3》、Adaboost算法不需要预先知道弱分类器的错误上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应的调整假定的错误率,执行的效率高;
《4》、Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器。
缺点:
在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,到时Adaboost算法容易受噪声干扰。此外,Adaboost依赖于弱分类器,而弱分类器的训练时间往往过长。
3、demo
4、参考
adaboost算法流程:https://blog.csdn.net/nk_wavelet/article/details/52601567
adaboost算法举例:https://blog.csdn.net/nk_wavelet/article/details/52612464
https://blog.csdn.net/v_july_v/article/details/40718799
https://blog.csdn.net/qq_37398834/article/details/84071596
详细:https://blog.csdn.net/nk_wavelet/article/details/52590487
haar特征:https://www.cnblogs.com/zhehan54/p/6723956.html