著名的VJ人脸检测算法就是一种基于Adaboost分类器的方法。该检测器由Paul Viola和Michael Jones在2001年的 Robust Real-Time Face Detection 提出。在当年的硬件条件下VJ算法可以达到每秒15帧图像的处理速度,是人脸检测技术发展的一个里程碑。虽然性能跟现在基于深度学习的方法没法比,但肯定也是值得去拜读的。

VJ算法利用积分图加速法快速提取图像的类Harr特征,然后使用Adaboost算法训练得到若干个强分类器,组成级联结构,对人脸和背景进行最后的分类。论文的三大贡献分别为:积分图加速法提取类Harr特征,基于Adaboost的学习算法,使用级联的方式组合强分类器。我们分开叙述。

1. 积分图加速法提取类Harr特征

VJ人脸检测器中所用到的类Harr特征

类Harr特征属于一种卷积运算模板,可以用其捕捉图像的边缘、变化等信息。而人脸的五官有着和轮廓有着独特的亮度和边缘信息,很符合类Harr特征的特点。在众多的类Harr特征模板中,Viola和Jones选取了四个可以提取边缘特征,线性特征以及对角线特征的模板。
类Harr特征值由以下操作得到:将类Harr特征模板放在图像上之后,用白色区域所覆盖的图像像素和减去黑色区域所覆盖图像中的像素和,在线性特征模板中,会对黑色区域像素之和乘以2,这是为了抵消黑白区域面积不相等所带来的影响。通过改变类Haar特征模板的位置及大小,可以在检测窗内穷举出上万个特征**,因此计算量巨大。

积分图加速法

  由类Harr特征值的计算过程可以看出,其中涉及了大量的像素求和运算,为了更快地提取图像的类Harr特征,作者使用了一种称为积分图(Integral Image)的方法。假设有一张图像,其坐标(x, y)处的积分图可以定义为:
I(x,y)=∑x′≤x∑y′≤yf(x′,y′)I(x, y) = \sum_{x^{\prime} \leq x} \sum_{y^{\prime} \leq y} f\left(x^{\prime}, y^{\prime}\right)I(x,y)=∑x′≤x​∑y′≤y​f(x′,y′)

在提取类Harr特征之前,首先计算出整幅图像的积分图。那么在提取特征时,图中矩形ABCD的像素和可以利用积分图表示如下:
Sabcd=I(D)−I(B)−I(C)+I(A)S_{a b c d}=I(D)-I(B)-I(C)+I(A)Sabcd​=I(D)−I(B)−I(C)+I(A)

积分图加速法大大降低了运算量。

2. Adaboost学习算法

提到了大量类Harr特征值之后,就该使用Adaboost算法做分类训练了
关于Adaboost的好文推荐:详解AdaBoost原理, 这里我只记录关键点吧。
Boosting是一种将弱分类器组合起来形成强分类器的算法框架。这种“三个臭皮匠顶个诸葛亮”的思路是有理论基础的。
Boosting 体现了提升思想,每一个弱学习器重点关注前一个训练器不足的地方进行训练,通过加权投票的方式,得出预测结果。Boosting学习是串行的,弱学习器的学习有先后顺序。
而Adaboost是其中的一种,采用了exponential loss function(其实就是用指数的权重),根据不同的loss function还可以有其他算法,比如L2Boosting, logitboost。

2.1 Boosting

Boosting其架构如下图:

在Boosting的迭代式训练时,每个训练样本的初始权值是相同的,训练中根据弱学习器的误差计算弱学习器的权重,并调整样本的权重来改变样本的分布,使先前弱学习器难分的样本在后续训练中得到更大的关注,循环该过程,直到弱学习器的数目达到指定数量(是一个超参)。最终将所有弱学习器进行组合加权,得到集成的强学习器。
弱分类器:
一个检测窗中包含大量的类Harr特征,对于检测窗x中的第j个特征值,可以训
练一个如下式所示的弱分类器:
hj(x)={1如果 pjfj(x)<pjθj0其他 h_{j}(x)=\left\{\begin{array}{ll} 1 & \text { 如果 } p_{j} f_{j}(x)<p_{j} \theta_{j} \\ 0 & \text { 其他 } \end{array}\right.hj​(x)={10​ 如果 pj​fj​(x)<pj​θj​ 其他 ​
其中fj(x)f_{j}(x)fj​(x)表示检测窗第j个特征值,θ\thetaθ表示阈值,p表示不等号方向,训弱分类器就是在当前特定样本分布下,确定fj(x)f_{j}(x)fj​(x)的一个阈值,使hj(x)h_{j}(x)hj​(x)的分类错误率降到最低。

2.2 Adaboost(Adaptive Boosting)的算法过程

  1. 初始化训练样本的权值分布 D1D_{1}D1​。假设有N个训练样本数据,则每一个训练样本最开始时,都会被赋予相同的权值:W1=1/NW_{1} = 1/NW1​=1/N。

  2. (a) 选取一个当前误差率最低的弱分类器 h 作为第 t 个基本分类器 HtH_{t}Ht​ , 并 计算弱分类器 ht:X→{−1,1}h_{t}: X \rightarrow\{-1,1\}ht​:X→{−1,1}, 该弱分类器在分布 DtD_{t}Dt​ 上的误差为:
    et=P(Ht(xi)≠yi)=∑i=1NwtiI(Ht(xi)≠yi)e_{t}=P\left(H_{t}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{N} w_{t i} I\left(H_{t}\left(x_{i}\right) \neq y_{i}\right)et​=P(Ht​(xi​)=yi​)=∑i=1N​wti​I(Ht​(xi​)=yi​)

    那么由上述式子可知, Hf(x)H_{\mathrm{f}}(x)Hf​(x) 在训练数据集上的误差率 ewe_{\mathrm{w}}ew​ 就是被 Hr(x)H_{\mathrm{r}}(x)Hr​(x) 误分类 样本的权值之和。

    (b) 更新每个弱分类器在最终分类器中的权重 (弱分类器权重用 α\alphaα 表示):
    αt=12ln⁡(1−etet)\alpha_{t}=\frac{1}{2} \ln \left(\frac{1-e_{t}}{e_{t}}\right)αt​=21​ln(et​1−et​​)
    显然,误差越小,权重越大,这是一种指数更新弱分类器权值的形式。
    (c) 更新训练样本的权值分布 Dr+1D_{\mathrm{r}+1}Dr+1​ :
    Dt+1(x)=Dt(x)Zt×{exp⁡(−αt),if ht(x)=f(x)exp⁡(αt),if ht(x)≠f(x)=Dt(x)exp⁡(−αtf(x)ht(x))Zt\begin{array}{l} \mathcal{D}_{t+1}(\boldsymbol{x})=\frac{\mathcal{D}_{t}(\boldsymbol{x})}{Z_{t}} \times\left\{\begin{array}{ll} \exp \left(-\alpha_{t}\right), & \text { if } h_{t}(\boldsymbol{x})=f(\boldsymbol{x}) \\ \exp \left(\alpha_{t}\right), & \text { if } h_{t}(\boldsymbol{x}) \neq f(\boldsymbol{x}) \end{array}\right.\\ =\frac{\mathcal{D}_{t}(\boldsymbol{x}) \exp \left(-\alpha_{t} f(\boldsymbol{x}) h_{t}(\boldsymbol{x})\right)}{Z_{t}} \end{array}Dt+1​(x)=Zt​Dt​(x)​×{exp(−αt​),exp(αt​),​ if ht​(x)=f(x) if ht​(x)=f(x)​=Zt​Dt​(x)exp(−αt​f(x)ht​(x))​​
    其中 αt\alpha_{t}αt​ 为弱分类器的权重,ZtZ_{t}Zt​ 为归一化常数 ,以确保D是一个分布, Zt=2et(1−et)Z_{t}=2 \sqrt{e_{t}\left(1-e_{t}\right)}Zt​=2et​(1−et​)​
    可以看出,训练样本权值的更新仍然是使用指数函数的形式,因为相比0-1损失函数指数函数有更好的数学性质。

  3. 最后, 按弱分类器权重 αt\alpha_{t}αt​ 组合各个弱分类器, 即
    f(x)=∑i=1TαiHt(x)f(x)=\sum_{i=1}^{T} \alpha_{i} H_{t}(x)f(x)=∑i=1T​αi​Ht​(x)

    通过符号函数 sign⁡\operatorname{sign}sign 的作用, 得到一个强分类器为:
    Hfinal=sig⁡n(f(x))=sign⁡(∑t=1TαtHt(x))H_{f i n a l}=\operatorname{sig} n(f(x))=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} H_{t}(x)\right)Hfinal​=sign(f(x))=sign(∑t=1T​αt​Ht​(x))

第二步中的训练样本权重更新源头是基于误差率e的,所以可以推导出直接使用e更新训练样本权值的公式:
错误分类样本, 权值更新 : Dt+1(x)=Dt(x)2etD_{t+1}(x)=\frac{D_{t}(x)}{2 e_{t}}Dt+1​(x)=2et​Dt​(x)​
正确分类样本, 权值更新 : Dt+1(x)=Dt(x)2(1−et)D_{t+1}(x)=\frac{D_{t}(x)}{2\left(1-e_{t}\right)}Dt+1​(x)=2(1−et​)Dt​(x)​

3. 强分类器的级联

在VJ人脸检测器中,最终的分类器是由若干个Adaboost强分类器级联而成。在级联结构中排在前面的强分类器由一些最能够代表人脸特征的少量弱分类器组成,这样可快速过滤掉大部分非面部区域,排在后面的强分类器构造越来越复杂,对检测子窗口要求越来越严格,用来判断较难辩识的区域。

VJ人脸检测器中强分类器组成的联结构示意图:

现在看VJ的性能是很差的,但该工作是里程碑式的,这里记录一下。

人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)相关推荐

  1. 长文干货!走近人脸检测:从?VJ?到深度学习(上)

    http://mt.sohu.com/20160413/n444091833.shtml 作者:邬书哲 中科院计算所智能信息处理重点实验室VIPL课题组博士生 研究方向:目标检测,尤其关注基于深度学习 ...

  2. 长文干货!走近人脸检测:从VJ到深度学习(上)(下)

    长文干货!走近人脸检测:从VJ到深度学习(下) http://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650324508&idx= ...

  3. 长文干货!走近人脸检测:从 VJ 到深度学习(上)

    转载自微信公众号:深度学习大讲堂 本文分上下两篇,上篇主要介绍人脸检测的基本流程,以及传统的VJ人脸检测器及其改进,下篇介绍基于深度网络的检测器,以及对目前人脸检测技术发展的思考与讨论.为了节省篇幅, ...

  4. 基于wxpython+MySQL--实现人脸检测识别的宿舍人脸检测系统

    基于wxpython+MySQL--实现人脸检测识别的宿舍人脸检测系统 一.功能需求 二.数据库建立 2.1 初始化数据库 2.2 压缩/解压数据流 2.3 输入数据 三.宿舍管理 3.1 新建录入 ...

  5. CoLab - 图像人脸检测_框出人脸

    CoLab - 图像人脸检测_框出人脸 此文章教你如何使用谷歌Colaboratory实现静止图片的人脸检测和划框框. CoLab最大好处:GPU计算速度快! 注: · 国内登陆Colab需使用到梯梯 ...

  6. 人脸检测和识别:人脸检测(Python)

    在静态图像或者视频中检测人脸的操作非常相似.视频人脸检测只是从摄像头读出每帧图像,然后采用静态图像中的人脸检测方法进行检测.至于视频人脸检测涉及到的其他处理过程,例如轨迹跟踪,将在以后完善.本文只介绍 ...

  7. 走近人脸检测:从VJ到深度学习(下)

    转载自:https://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650324508&idx=1&sn=b103ea6912 ...

  8. 【OpenCV-Python】——Haar人脸检测深度学习人脸检测EigenFaces/FisherFaces/LBPH人脸识别

    目录 前言: 1.人脸检测 1.1 基于Haar的人脸检测 1.2 基于深度学习的人脸检测 2.人脸识别 2.1 EigenFaces人脸识别 2.2 FisherFaces人脸识别 2.3 LBPH ...

  9. java 人脸检测_Java+OpenCV实现人脸检测并自动拍照

    java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBas ...

最新文章

  1. C++中null与0的区别
  2. 英语作业介绍一项发明计算机,介绍电脑的发明的英语作文
  3. php flash chat,FlashChat lt;= 4.5.7 (aedating4CMS.php) Remote File Include Vulnerability
  4. 前沿 | 加州理工大学什么是Imitation Learning(模仿学习)
  5. linux网络子系统研究:数据收发简略流程图
  6. Bitcoin是什么意思
  7. 区块链技术对大数据有哪些影响
  8. mysql实时写入查询_MySQL实时写入表
  9. 怎样查看PPT中的字数
  10. 离散实验五 判断关系R 是否为等价关系(给定 R 的关系矩阵,据此判断所给关系 R 是否为等价关系)
  11. 【正则】常用正则公式
  12. Android AGP 7.0 适配,开始强制 JDK 11
  13. 解忧杂货铺----读后感
  14. 业务规范之springboot整合swagger2
  15. 如何使用 Kubernetes 部署 Flink 应用
  16. uni-app H5打包上线流程
  17. portalv15安装 tia_TIA PORTAL V15安装顺序-工业支持中心-西门子中国
  18. 杭电考研计算机专业课_2019杭电计算机考研初试科目、参考书目、报录比汇总...
  19. 警察蜀黍权威数据告诉你,广东少男最易遭受网络诈骗
  20. iOS Mac小白必备的基本操作

热门文章

  1. 微信公众号之在图片上添加热点链接
  2. 养成类游戏——动物餐厅开发制作
  3. linux根据修改日期删除,在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?...
  4. 软件的生命周期SDLC
  5. POJ2126 多项式分解定理
  6. python怎么弄成白色背景_python – 在matplotlib中为colorbar添加白色背景
  7. SDN控制器测试专题一:基础知识篇
  8. 你的睡眠时间和睡眠质量达标了么?
  9. DPDK 与DPDK-Pktgen 安装
  10. 【※主题下载の命零电脑桌面主题※】