100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Haar人脸检测:Haar特征 + Adaboost+ 级联分类器及改进

Haar人脸检测:Haar特征 + Adaboost+ 级联分类器及改进

时间:2020-07-23 07:55:08

相关推荐

Haar人脸检测:Haar特征 + Adaboost+ 级联分类器及改进

目录

前言

内容目录

1.人脸检测的实现原理

1.人脸区域的特征提取

2.图片中的人脸锁定

3.cascade级联分类器

2.Adaboost与cascade

3.代码实现

4.Haar特征提取以及AdaBoost算法的改进

1.Haar特征提取改进

2.AdaBoost算法改进

前言

最近准备开始系统的学习AI,之前都是零零散散的在用一些SVM这些,对其架构原理一知半解

人脸检测的流程概括: Haar提取特征 +Adaboost + cascade级联分类器

内容目录

1.人脸检测的实现原理

2.Adaboost与cascade

3.代码实现

4.Haar特征提取以及AdaBoost算法的改进

1.人脸检测的实现原理

1.人脸区域的特征提取

以Haar特征分类器为基础的对象检测技术是一种非常有效的对象检测技术,多用于人脸检测、行人检测等。Haar-like特征是计算机视觉领域一种常见的特征描述算子,也叫做Haar特征。

Haar 特征就是用下图中的黑白矩形掩膜中 所有黑色区域对应灰度人脸图像素值sum- 白色区域像素值sum,通过这些可在一定程度上体现人脸灰度分布特征。

比如第一排的黑白矩形掩膜可以提取边缘特征 第二排提取线条特征 第三排提取中点特征,一共14个特征掩膜在上图红框内滑动 通过平移、放大提取特征。比如论文《Rapid Object Detection using a Boosted Cascade of Simple Features》中单个掩膜矩形为24*24像素,则一张图片可获得超过180000个特征。

Haar特征值反应了图像的灰度变化情况,当然如果每张图检测中要通过至少180000个特征去匹配太过于繁杂,也不可能应用。

所以能不能从这180000取出 部分有效性最强的 一些特征结合起来用于分类,其他的全部舍弃。比如脸部的一些特征 可以 通过矩形特征简单描述: 嘴巴比周围颜色深,眼睛要比脸颊颜色深,鼻梁两侧要比鼻梁颜色深。

为了提取出这些有效性最强的特征,进行了如下实验:将180000中所有特征应用于某数据集中的所有图像(正样本为人脸照,负样本为非人脸照),。然后统计180000个特征中所有特征的错误率,选取错误率最低的那部分特征,作者最终从180000中选取了最好的6061个特征,说明这6061个特征市 界定 人脸 和非人脸图像 有效性最强错误率最低的特征。

2.图片中的人脸锁定

为了找到图像中不同位置的目标,需要连次移动检测窗口(窗口中的Haar特征相应也随若移动),这样就可以遍历到图像中的每一一个位置。 而为了检测到不同大小的目标,一.般有两种做法:逐步缩小图像或者逐步放大检测窗口,这样即可遍历到图像中不同大小的目标。

所以又出现了新的问题,虽然前面将180000个特征降到了6000多个特征,降低了复杂度,但是要在一个大图里面 进行不同尺寸,不同位置的遍历检测人脸 这复杂度依旧是极大的!!!

所以大佬们提出了级联分类器的概念,如下一段所释。

3.cascade级联分类器

从每一幅图像所得到的子窗口的数量是非常庞大的,而这些子窗口中占绝大多数的往往是背景而不是主体的人脸。这样,就会有很多的计算成本浪费在了那些非主体的背景上,从而大大降低了速度。Cascade的想法就是用尽可能少的运算量把不是主体的背景快速的筛选掉,留下更有可能是人脸的子窗口,进行后续更加复杂的计算。

级联分类器则采取了"设关卡"的模式,通过一关,进入下一关,直到所有关卡通过,其中某一关没通过,直接淘汰。

将6000多个特征分成不同组,在不同分类阶段使用,通常前面的检测阶段特征检测很少,越往后越多。研究发现,分类器判断 非人脸正确率很高, 判断人脸正确率一般。

所以一个窗口第一阶段的测试都过不了,直接判断为非人脸,反之进入下一阶段测试,直到所有阶段测完,则判断为人脸,如下流程。

2.Adaboost与cascade

AdaBoost算法就是提取若干的简单特征组成若干个弱分类器(单个或组合特征构成),再由若干个弱分类器组成一个强分类器。对应到上面的步骤中就是从180000个特征中取出6061个有效性最大的特征,这种自适应选择特征的算法就是AdaBoost。(具体的AdaBoost算法这里不过多阐述,大家可以找些论文看看)

cascade介绍如<3.cascade级联分类器>所释

3.代码实现

import cv2import numpy as npimport pandas as pdimport matplotlib.pyplot as pltdef show(src):src = cv2.cvtColor(src,cv2.COLOR_BGR2RGB)plt.imshow(src)plt.axis('off')plt.show()imag1 = cv2.imread(r'填图片路径')show(imag1)

detectMultiScale()参数解释:

image:输入图像scaleFactor=1.1;这个是每次缩小图像的比例,默认是1.1minNeighbors=3:匹配成功所需要的周围矩形框的数目,每- -个特征匹配到的区域都是-一个矩形框,只有多个矩形框同时存在的时候,才认为是匹配成 功minSize:匹配人脸的最小范围flags=0:可以取如下这些值: CASCADE_ DO_ CANNY_ PRUNING=1, 利用canny边缘检测来排除一些边缘很少或 者很多的图像区域 CASCADE_ SCALE_ IMAGE=2, 正常比例检测 CASCADE_ FIND_ BIGGESTOBJECT=4,只检测最大的物体 CASCADEDO_ ROUGH_ SEARCH=8初略的检测

#级联分类器detector = cv2.CascadeClassifier(r'...\haarcascade_frontalface_alt.xml')rects = detector.detectMultiScale(imag1, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)for (x,y,w,h) in rects:#画矩形框cv2.rectangle(imag1,(x,y),(x+w,y+h),(0,255,0),2)show(imag1)

可以看出对于歪斜的人脸没有检测到,说明训练集中歪斜图像较少且相对于正脸歪脸相对来说比较难测

备注: 可能会有同志没有或者找不到 opencv自带的haarcascade_frontalface_alt.xml 文件,haarcascade_frontalface_alt.xml哪里找到呢?可以去opencv安装包里找找或者检索,如果实在找不到,评论区留言一下我看到就发给你们!

(后面会写一篇博文并贴出代码 自己收集数据集训练得出XXX.xml)

4.Haar特征提取以及AdaBoost算法的改进

1.Haar特征提取改进

有学者提出了对haar提出了如下改进,目前常用的base haar特征集对某些人脸特征的提取并不充分,下图为增添的haar特征:

三种特征都可表示局部人脸灰度分布模式,其中:a类特征可以表示眼睛相对于脸颊灰度值更低,也可表示嘴巴相对于下巴灰度值更低。b类特征是对a类的完善,它将眼皮和更多的脸颊区域纳人考虑范围。c类特征表示眼皮相对于眉毛和眼睛灰度值更高。

2.AdaBoost算法改进

弱分类器有两个错误来源:①将人脸误判为非人脸而产生的错误;②将非人脸误判为人脸

而产生的错误。现行的AdaBoost算法,把上述两种判决错误同等对待

但现实生活中所接触的图片一般是人脸占的区域相对很小,而背景所占区域相对较大,因此在图像中检测到人脸可看作小概率事件所以人脸错判为非人脸区域所产生的错误比将非人脸误判为人脸区域的错误影响更大。在强分类器的级联过程中,只有通过所有的强分类才会判为人脸,即某个人脸区域在某级强分类器被误判为非人脸,这个人脸窗口将永远的被排除,该错误无法补救;而若把非人脸在某一级强分类器被误判为人脸区域,它很可能被后边的强分类器排除,即这种错误可能在

后续处理中得到一定的抑制。

针对以上两种情况,在原有的弱分类器训练算法的基础上进行改进,改进算法权重规则。(具体改进方法有许多大家可以找些资料,这里就不做赘述hh)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。