打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
人脸检测算法之Haar

首先,说几点:

1、人脸检测就是在一幅图片中检测出有无人脸,人脸在图片中的哪块区域。通常人脸检测完了之后就交给人脸识别,具体识别是谁。

2、Haar-Adaboost进行人脸检测的流程如下:

a,收集一批人脸图片(如20000张)和非人脸图片(如40000张)。然后各个图片放缩到20*20像素。

b,把这些图片作为训练数据输入Haar-Adaboost训练,最终得到满足要求(比如是准确率到98%)的分类器模型。

c,正式使用时,输入一张大图片,检测里面人脸检测时,在这张图片各个位置截取不同大小的矩形,然后放缩到20*20,输入到b里训练好的Haar-Adaboos分类器里,如果分类器返回的结果是人脸,那么这个矩形框就是检测到的人脸区域。

本文介绍的是b这个步骤是怎么操作的

1,Haar简单介绍

Haar-like算法是一种计算图像特征值的方法(比如这样图按我的算法计算出的特征值为1011,我的计算方法是把图片左右一分为二,左边的各像素求和减去右边各像素求和,这也是一种图片特征值计算方法)。

Haar-like算法就是类似我示例说的方式,最初只定义了4个模板形式,如图。这些模板的长宽可以自由选择不同的尺寸。

计算方法也很简单,先确定模板的长宽,然后把模板mask到图片某个位置上(比如,我把模板A的大小设为6*6,把它放到20*20图片的4,5这个作为位置,那么覆盖了一片6*6的区域)。对于图中的A, B和D这类特征,特征数值计算公式为:v=Sum白-Sum黑,而对于C来说,计算公式如下:v=Sum白-2*Sum黑。这样就求出了这个图片在模板A,大小6*6,位置4,5下的特征值。

然后你会发现,虽然只有4个模板,但是模板的尺寸可以选不同尺寸,mask到图片的位置也可以不同,这样可以得到同一个图片不同的类型特征值。就算是求同一个24*24大小图片的特征值,我们按不同模版类型、模板大小、模板位置可以得到16万种不同的类型的特征值。

下面是cv里的模板,有14种模板,那类型特征值种类更多

那么,对于一个输入的图片,我们有上万种特征,下面要做的就是这么多类型的特征,哪些类型比较有用,哪些类型比较没价值。哪些权重组合起来效果比较好。

这个挑选组合的工作就是Adaboost和级联来做的了。通过Adaboost迭代来挑选哪些类型特征更有价值。

Adaboost

Adaboost的原理本文不讲,只讲Adaboost是怎么操作最终通过模型特征值来分类是否人脸的。

1,先选一种类型特征,比如选模板A,尺寸6*6,在图片位置(4,5)求出的各个训练图片的Haar-like值为特征值;

2,输入训练图片(20000张人脸,40000张非人脸,尺寸20*20).这样的话每个训练图片都得到一个整数的特征值。为简单示例,假设3张人脸,3张非人脸。得到值以后排序后如下。

表1

对于这样的训练数据,我们选一个最简单的分类函数(Adaboost里叫作弱分类器函数):特征值小于等于某个阈值t1就认为是人脸,大于阈值就是非人脸,或者相反,特征值小于等于某个阈值t1就认为是人非脸,大于阈值就是人脸。这里的t1一般选具体的某个特征值。至于选小于等于还是大于等于就看这样选择后的错误率哪个更低。具体操作看下面演示。

;在这里t1是个常数,需要由输入训练数据后根据错误率来得到的值;选大于等于还是小雨等于就看训练样本输入后的错误率情况。

那怎么求这个t1呢?这样操作

第一轮迭代

因为这是第一轮迭代计算,上面的每个训练样本赋值初始化权重w1=(0.167, 0.167, 0.167, 0.167, 0.167, 0.167)也就是样本数量分之一为初始权值。

从表1数据我们知道t1可以=100、110、120、130、140、150

若按 t1=100,选x < =100方式比较好,不信可以试试选x>=100方式。此时错判2个,错误率e=2 * 0.167 = 0.334

若按t1=110,选x < =110方式比较好。此时错判1个,错误率e=1 * 0.167 = 0.167

若按t1=120,选x < =120方式比较好。此时错判2个,错误率e=2 * 0.167 = 0.334

同理t1=130。此时错判3个,错误率e=3 * 0.167 = 0.501

同理t1=140,此时错判2个,错误率e=2 * 0.167 = 0.334

同理t1=150,...

可见t1=110时,选x < =110,错误率最小e=0.167,则

。现在这个确定的函数叫做本次迭代的最优弱分类器函数。

同时计算一下这个函数f1的权重:

fw1=

=0.5 * ln((1 – 0.167) / 0.167) = 0.8047

这样第一轮迭代完成,下面进行第二轮迭代

1. 更新样本权重

在上一次迭代中我们选了t1=110,测试样本中只有特征值是140的测试是误判的,其他都是正确。

正确的样本是:100, 110, 120, 130, 150,上次迭代的权重都是0.167,这次样本权重调整方式为:

w2=w1 * exp(-fw1) =0.167 * exp(-0.8047)= 0.075

而x =140的样本,则样本权重调整为:

w2=w1 * exp(fw1) =0.167 * exp(0.8047) = 0.373

新样本权重总和为0.075 * 5 + 0.373 = 0.748

规一化后,

x = 100, 110, 120, 130, 150时,样本权重更新为:

w2=0.075 / 0.748 = 0.10

x = 140时, 样本权重更新为:

w2=0.373 / 0.748 = 0.50

调整后,新的样本权重为(0.1, 0.1, 0.1, 0.1, 0.5, 0.1)。

;本次迭代是求t2,方法同上。此时的函数又叫做弱分类器函数,求出t2后就得到了本次迭代的最优弱分类器函数。

同理

若按t2=100分类。选x >=100方式比较好,误判3个,错误率e=0.1*3 = 0.3

若按t2=110分类,选x>=110比较好,虽然误判4个,但此时错误率e=0.1 * 4 = 0.4

若按t2=120分类,选x>=120比较好,此时误判5个,错误率e=0.1 *5= 0.5

若按t2=130分类,选x>=130比较好,此时误判4个,错误率e=0.1 * 4 = 0.4

若按t2=140分类,选x<=140比价好,此时误判2个,错误率e=2 * 0.1 = 0.2

若按t2=150分类,选x<=150比价好,此时误判3个,错误率e=3 * 0.1 = 0.3

可见t2=140时,选x < =140错误率最小e=0.2,则本次迭代

.现在这个确定的函数叫做本次迭代的最优弱分类器函数。

同时计算一下这个函数f2的权重:

fw2=

= 0.5 * ln((1 –0.2) / 0.2) = 0.6931

这样第二轮迭代完成,下面进行第三轮迭代

同样的更新样本权重

由于f2里t2=140时,x = 100, 110, 150时,分类是正确,那么这几个样本权重调整为:

w3=w2 * exp(-fw2) =0.1 * exp(-0.6931) = 0.05

x = 140时,分类正确,则样本权重为:

w3=w2 * exp(-fw2) =0.5 * exp(-0.6931) = 0.25

x = 120,130时,分类错误,则样本权重为:

w3=w2 * exp(fw2) =0.1 * exp(0.6931) = 0.20

新样本权重总和为 0.05 * 3 + 0.25 + 0.20 * 2 = 0.8

规一化后,

x = 100, 110, 150时,样本权重更新为:

w3=0.05 / 0.8 = 0.0625

x = 140时, 样本权重更新为:

w3=0.25 / 0.8 = 0.3125

x = 120, 130时, 样本权重更新为:

w3=0.20 / 0.8 = 0.250

综上,新的样本权重为(0.0625, 0.0625, 0.250, 0.250, 0.3125, 0.0625)。

同样:这次求t3

.具体步骤不写了,最后得到

t3=140,选x>=140方式,分类错误3个,但是错误率最小e=0.0625*3=0.1875,则:

fw3= 0.5 * ln((1 –0.1875) / 0.1875) = 0.7332

这样不断迭代,就会产生一系列的:

对应的权重:

fw1,fw2,fw3,fw4。。。

迭代到什么时候结束呢,1种方式就是定一个最大迭代次数,比如迭代100次;2,根据构造的强分类器函数的准确率,比如强分类器函数准确率已经到99%,错误率低于2%了,就停止迭代。

那什么是强分类器函数?怎么构造呢?

强分类器函数G(x) =

假如我们迭代3次结束了。

此时的强分类器为G(x) =sign( 0.8047 * f1(x) + 0.6931 * f2(x) + 0.7332 * f3(x))。

可以试一下把训练样本输入这个G(x) 看看是否判别正确。

我们发现按G(x)分类的所有样本均分类正确,则这个强分类器的错误率为0 / 6 = 0。最终强分类器为:

G(x) = sign(0.8047 * f1(x) + 0.6931 * f2(x) + 0.7332 * f3(x))。

终于讲完了Adaboost通过训练某一个类型特征来得到了强分类器函数。前面说到就算一个24*24*的图像对于Harr的4种模板都有16万种类型特征.

那么就求出它们各自的强分类器函数了。肯定有些类型特征迭代很少的次数就得到强分类器了,有些迭代报表都没有得到强分类器。

这样就按照迭代的效果,挑选出一批满意的类型特征的强分类器函数,比如20个

然后把他们级联起来。假设我们选的强分类器的标准是识别率(人脸被正确识别的比率)=99%,误识率(非人脸被识别为人脸的比率)=50%,那么20个强分类器级联后的总识别率为0.99^20=98%,错误接受率也仅为0.5^20  = 0.0001%。这样的效果就可以满足现实的需要了

具体操作如下图,我们输入一张待检测的图片,一般都比较大,然后对图片中进行多区域,多尺度的裁剪得到非常多的子窗口,把这些子窗口转成20*20后,如下图输入,先G1分类,如果pass,用G2分类...

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Haar特征与积分图
浅析人脸检测之Haar分类器方法
基于Adaboost算法的人脸检测分类器
OpenCV学习笔记(十六)
决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结
AdaBoost算法的训练过程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服