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

这篇具有很好参考价值的文章主要介绍了人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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


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

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

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

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

积分图加速法

  由类Harr特征值的计算过程可以看出,其中涉及了大量的像素求和运算,为了更快地提取图像的类Harr特征,作者使用了一种称为积分图(Integral Image)的方法。假设有一张图像,其坐标(x, y)处的积分图可以定义为:
I ( x , y ) = ∑ x ′ ≤ x ∑ y ′ ≤ y f ( 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)=xxyyf(x,y)

在提取类Harr特征之前,首先计算出整幅图像的积分图。那么在提取特征时,图中矩形ABCD的像素和可以利用积分图表示如下:
S a b c d = 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其架构如下图:
人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)

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

2.2 Adaboost(Adaptive Boosting)的算法过程

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

  2. (a) 选取一个当前误差率最低的弱分类器 h 作为第 t 个基本分类器 H t H_{t} Ht , 并 计算弱分类器 h t : X → { − 1 , 1 } h_{t}: X \rightarrow\{-1,1\} ht:X{1,1}, 该弱分类器在分布 D t D_{t} Dt 上的误差为:
    e t = P ( H t ( x i ) ≠ y i ) = ∑ i = 1 N w t i I ( H t ( x i ) ≠ y i ) 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=1NwtiI(Ht(xi)=yi)

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

    (b) 更新每个弱分类器在最终分类器中的权重 (弱分类器权重用 α \alpha α 表示):
    α t = 1 2 ln ⁡ ( 1 − e t e t ) \alpha_{t}=\frac{1}{2} \ln \left(\frac{1-e_{t}}{e_{t}}\right) αt=21ln(et1et)
    显然,误差越小,权重越大,这是一种指数更新弱分类器权值的形式。
    (c) 更新训练样本的权值分布 D r + 1 D_{\mathrm{r}+1} Dr+1 :
    D t + 1 ( x ) = D t ( x ) Z t × { exp ⁡ ( − α t ) ,  if  h t ( x ) = f ( x ) exp ⁡ ( α t ) ,  if  h t ( x ) ≠ f ( x ) = D t ( x ) exp ⁡ ( − α t f ( x ) h t ( x ) ) Z t \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)=ZtDt(x)×{exp(αt),exp(αt), if ht(x)=f(x) if ht(x)=f(x)=ZtDt(x)exp(αtf(x)ht(x))
    其中 α t \alpha_{t} αt 为弱分类器的权重, Z t Z_{t} Zt 为归一化常数 ,以确保D是一个分布, Z t = 2 e t ( 1 − e t ) Z_{t}=2 \sqrt{e_{t}\left(1-e_{t}\right)} Zt=2et(1et)
    可以看出,训练样本权值的更新仍然是使用指数函数的形式,因为相比0-1损失函数指数函数有更好的数学性质。

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

    通过符号函数 sign ⁡ \operatorname{sign} sign 的作用, 得到一个强分类器为:
    H f i n a l = sig ⁡ n ( f ( x ) ) = sign ⁡ ( ∑ t = 1 T α t H t ( 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αtHt(x))

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

3. 强分类器的级联

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

VJ人脸检测器中强分类器组成的联结构示意图:
人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)

现在看VJ的性能是很差的,但该工作是里程碑式的,这里记录一下。文章来源地址https://www.toymoban.com/news/detail-464154.html

到了这里,关于人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog设计“111”检测器与“01110”检测器并测试所有情况

    使用Quartus+modelsim完成本次设计 分析 分析题目,得到其有限状态机为下图: 代码实现 Testbench 结果 Modelsim结果如下图所示,分析可知实现了题目要求。 逻辑综合出来的电路如下图所示:即只有S3状态才会输出OUT=1。 其中的state的状态机如下图所示(RLT viewer中所示),可见其与

    2024年02月08日
    浏览(46)
  • 1001序列检测器

    multisim仿真文件:1001序列检测器(mealy机)-单片机文档类资源-CSDN下载 modelsim仿真文件:1001序列检测器modelsim仿真和测试文件-单片机文档类资源-CSDN下载 实验报告:1001序列检测器实验报告-单片机文档类资源-CSDN下载 电 子 科 技 大 学 课程设计名称:           1001 序列检

    2024年02月06日
    浏览(33)
  • OpenCV分类检测器训练

    OpenCV中有两个程序可以训练级联分类器: opencv_haartraining 和opencv_traincascade。opencv_traincascade 是一个新程序,使用OpenCV 2.x API 以C++ 编写。这二者主要的区别是 opencv_traincascade 支持 Haar、Hog和 LBP(Local Binary Patterns) 三种特征,并易于增加其他的特征。与Haar特征相比,LBP特征是整数

    2024年02月17日
    浏览(32)
  • ChatGPT检测器(Detector)

    现阶段可使用的Detector如以下所示,在网页端有5个(3个支持中文),api有3个途径,代码运行成功的有一个。 名称 地址 特性 GPTZero https://gptzero.me/ 支持中英文,判定较为严格,有开源代码 OpenAI GPT2 Output Detector https://openai-openai-detector.hf.space/ 支持中英文,判定宽松 Hello-Simple

    2023年04月27日
    浏览(28)
  • 简易温度检测器电路原理

    在日常生活中,对温度的及时检测能够减免火灾的发生,所以今天就说说温度检测器。 实际功能 在常温下显示数字0,随着温度的升高,数码管逐步显示1、3、8,分别代表三档温度,并且在显示8的时候,LED灯开始闪烁,代表温度过高而报警,当温度下降时,数码管的显示状态

    2024年02月09日
    浏览(29)
  • 实验 5 巴克码检测器

    5.1 实 验 目 的 (1) 了解通信领域中经常使用的巴克码检测器的设计方法。 (2) 掌握使用状态机设计时序电路的方法。 5.2 实 验 仪 器 与 器 材 (1) EDA 开发软件 一 套 (2) 微 机 一 台 (3) 实验开发系统 一 台 (4) 打印机 一 台 (5) 其他器件与材料 若 干 5.3 实 验 说 明 巴 克 码 检 测

    2024年02月01日
    浏览(29)
  • 序列检测器的verilog实现

    设计一个序列检测同步时序逻辑电路,要实现的功能如下: 当已有输入码流出现序列 111000或101110时输出检测信号为1 ,否则输出为0。在时序上检测到完整序列的 下一个时钟周期 输出检测结果。输入信号有效为1时表示当前输入有效,否则表示无效。之前输入依旧计入序列中

    2024年02月06日
    浏览(40)
  • OpenCV 如何实现边缘检测器

    返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现拉普拉斯算子的离散模拟 下一篇 :OpenCV系列文章目录(持续更新中......) 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::Canny 实现 Canny 边缘检测器。 Canny Edge探测器 [48]由John F. Canny于1986年开发。Canny 算法

    2024年04月25日
    浏览(29)
  • 简单的状态机设计——序列检测器

    1.序列检测器 序列检测器是时序数字电路中非常常见的设计之一。它的逻辑功能是将一个指定的序列从数字码流中识别出来。 2.例1:\\\"10010\\\"序列检测器 对串行输入的数据进行检测,检测“10010”。设X为数字码流输入,Z为检出标记输出,高电平表示“发现指定序列”,低电平表

    2024年02月11日
    浏览(29)
  • 【目标检测】Grounding DINO:开集目标检测器(CVPR2023)

    文章来自清华大学和IDEA(International Digital Economy Academy) 论文: 《Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection》 github: https://github.com/IDEA-Research/GroundingDINO Grounding DINO,一种开集目标检测方案, 将基于Transformer的检测器DINO与真值预训练相结合 。开集检

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包