Haar特征+Adaboost人脸识别C实现

2023-05-16

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大小的子窗口,可以计算这么大的子窗口内存在多少个矩形特征。
在这里插入图片描述
   以m
m像素分辨率的检测器为例,其内部存在的满足特定条件的所有矩形的总数可以这么计算:
对于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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haar特征+Adaboost人脸识别C实现 的相关文章

随机推荐

  • 12c容器数据库相关操作:登录12c(容器数据库)、如何在oracle 12c中创建普通用户、 ORACLE 12C之CDB与PDB 、修改pdb名称

    一 登录12c 容器数据库 sqlplus as sysdba SQL gt show pdbs CON ID CON NAME OPEN MODE RESTRICTED 2 PDB SEED READ ONLY NO 3 XINBAOGG
  • 程序员没有项目经验,如何写出漂亮的简历

    前言 国庆假期已经结束啦 xff08 文末送福利 xff09 已经嗨完了7天7夜 有些人还没从假期中醒过来 却也有人高兴不起来 因为在这个 金九银十 一些同学还没找到满意的工作呢 特别是对于没有工作经验的应届生来说 做出一份可以进面试的简历
  • 我用Python写了个金融数据爬虫,半小时干了组里实习生一周的工作量

    前言 最近 xff0c 越来越多的研究员 基金经理甚至财务会计领域的朋友 xff0c 向小编咨询 xff1a 金融人需要学Python么 xff1f 事实上在2022年 xff0c 这已经不是一个问题了 Python已成为国内很多顶级投行
  • 程序员必读的10本经典书(含资源)建议收藏

    这是本文的目录 前言01 代码整洁之道 02 程序员的自我修养 03 程序员修炼之道 04 计算机程序的构造与解释 05 编程珠玑 06 程序是怎么跑起来的 07 自学是门手艺 08 Python编程 09 黑客与画家 10 图解 HTTP
  • 小米只能进fastboot和rec救砖

    Bl锁已解 xff0c 手机变砖 xff0c 只能进fastboot和rec模式 xff0c 我们通常有以下方式解决 1 如果你是因为动了某个分区镜像而导致变砖的 xff0c 可以到手机官方网站寻找对应版本刷机包提取动过的镜像 xff0c
  • C#开发串口调试助手的详细教程

    一 串口助手是什么 xff1f 通过电脑串口 xff08 包括USB口 xff09 收发数据并且显示的应用软件 xff0c 一般用于电脑与嵌入式系统的通讯 xff0c 借助于它来调试串口通讯或者系统的运行状态 也可以用于采集其他系统的数据
  • 怎样使用类和对象——静态成员

    静态数据成员 用立方体类box定义两个对象 xff0c 引用不同对象中的静态数据成员 span class token macro property span class token directive hash span span cla
  • STM32CubeMX代码第一次烧录后无法再识别STM32

    本文记录的是我在烧录时出现的问题 xff0c 具体细节会因为使用的软件或者STM32不同而不同 在使用STM32CubeMX生成的代码 xff0c 经过keil5编写后 xff0c 使用usb接口烧录进STM32然后发现keil5中再也识别
  • 算法练习2之单链表求和

    笔试题目 xff1a 1 用单向链表表示十进制整数 xff0c 求两个正整数的和 如下图 xff0c 1234 43 34 61 1268 xff0c 注意 单向链表的方向 xff0c 不允许使用其他的数据结构 题目分析 xff1a 题目中
  • git基础

    1 git的相关配置 git自带一个git config工具来帮忙配置变量 xff0c git中这些变量存储在3个不同的位置并且有相关命令进行配置 xff0c 如下 xff1a git config system xff1a 存储在 etc
  • 单例模式----双重检查锁

    双重检查锁 双重检查锁 xff1a 双检锁 xff1a 单例模式中用volatile和synchronized来满足双重检查锁机制 xff1b 在实现单例模式的时候往往会忽略掉多线程的情况 xff0c 就是写的代码在单线程的情况下是没问题的
  • 【CSDN】 关于博客中图片水印有关问题

    默认效果 https img blog csdnimg cn 20210202141712123 png x oss process 61 image watermark type ZmFuZ3poZW5naGVpdGk shadow 10
  • C++(一)— cout输出格式 (待完善)

    C 43 43 cout输出格式 ios dec以10进制表示整数ios hex以16进制表示整数ios oct以8进制表示整数ios showbase为整数添加一个表示其进 制的前缀ios internal在符号位和数值的中间插入需要数里
  • 判断两台设备是否属于同一子网的简易程序(C++实现)

    给定ip地址与子网掩码 xff0c 通过与运算判断是否属于同一子网 xff1a span class token macro property span class token directive hash span span class
  • Win11中换源失败

    按照之前在win10中的换源方法 xff0c 在 condarc中换源 xff0c 因为pip时下载网速依旧很慢 xff0c 所以发现换源并不成功 xff0c 并且没有在下载的时候有如下图所示的换源语句 Looking in indexes
  • px4连接不了mavros的原因

    本人多次试过机载重装系统后初次安装mavros 出现mavros连接不上的问题 一 USB接口电压不够 我之前遇到过的一种就是当px4通过USB线接入机载 xff0c 启动mavros时 xff0c 一直连接不上 xff0c 而且px4上常
  • Jetson Xaiver NX 安装 librealsense2-SDK

    在Jetson Xaiver NX上使用英特尔的相机 xff0c 我们需要安装相机的驱动 xff0c 以下提供两种方法进行安装 注 xff1a 采用手动安装方法可以驱动D400系列的相机 但驱动不了T265 xff0c 如果需要同时驱动D4
  • PX4机载连接通过IP连接电脑QGC地面站

    PX4接入Jetson系列机载时 xff0c 因为Jetson系列机载为ARM架构 xff0c 没有对应的QGC地面站可以安装使用 在平时的连接都是通过将PX4接USB线连接至电脑 xff0c 通过电脑的QGC进行各种校准和参数更改 接入机
  • 一次成功流水帐 ros中使用serial包实现串口通信debug和教程汇总

    会参考以下几个教程 xff0c 但是这几个都不完整 ros中使用serial包实现串口通信 鲁班班班七号的博客 CSDN博客 ros 串口通信 ROS使用serial库编译时出现 未定义的引用 解决办法 学术马的博客 CSDN博客 ros编
  • Haar特征+Adaboost人脸识别C实现

    Haar特征 43 Adaboost的人脸识别C实现 xff0c 部分简单的功能借助Opencv实现 xff0c 数据是MIT人脸数据 程序的实现主要是参考 Rapid Object Detection using a Boosted ca