深圳 seo 外贸网站建设 多语种,wordpress 活动报名插件,wordpress分类信息发布系统,答题网站开发在人脸检测中#xff0c;Viola-Jones算法是一种非常经典的算法#xff0c;该算法在2001年的CVPR上提出#xff0c;因其高效快速的检测而被广泛使用。
这个算法用来检测正面的人脸图像#xff0c;对于侧脸图像的检测不是很稳健。
算法可以被分为以下几个部分#xff1a; …在人脸检测中Viola-Jones算法是一种非常经典的算法该算法在2001年的CVPR上提出因其高效快速的检测而被广泛使用。
这个算法用来检测正面的人脸图像对于侧脸图像的检测不是很稳健。
算法可以被分为以下几个部分
利用Haar特征描述人脸特征建立积分图像利用该图像快速获取几种不同的矩形特征利用Adaboost算法进行训练建立层级分类器非极大值抑制
1 利用Haar特征描述人脸特征
人脸有一些特征一张正脸图像中人眼睛区域会比脸颊区域暗嘴唇区域也会比四周的区域暗但鼻子区域会比两边脸颊要亮。 基于这些特征VJ使用了四种矩形特征如下图所示 其中AB为边界特征C为细线特征D为对角线特征
那么Haar特征是如何作用于正脸图像的呢 如上图所示Haar特征分别对白色区域和黑色区域的像素求和然后求这两种和的差
这可以通过图像卷积实现。 2 积分图像
对于积分图像中的任何一点该点的积分图像值等于位于该点左上角所有像素之和
表达式如下 积分图像满足如下公式 积分图像同时还满足 上图为一张原始图像其标示了四个区域A, B , C ,D
1 处像素点对应的在积分图像中的值为sum(A);
2 处像素点对应的在积分图像中的值为sum(AB);
3 处像素点对应的在积分图像中的值为sum(AC);
4 处像素点对应的在积分图像中的值为sum(ABCD);
则
区域D所有的像素点灰度值之和为
sum(ABCD) - sum(AC) - sum(AB) sum(A)
3 获取图像特征
VJ在论文中提到24*24大小的图像可以产生约160000个矩形特征那么160000是怎么得到的呢
VJ使用的矩形特征可以归为三类
二邻接矩形横竖两种情况如矩形特征AB最少需要2个像素点表示
三邻接矩形如矩形特征C最少需要3个像素点表示也有横竖两种情况
四邻接矩形如矩形特征D最少需要4个像素点表示只有一种情况
对于24*24大小的图像每种邻接矩形可能的大小为
二邻接矩形最小1*2长度每次加2宽度加1
1*21*41*6...1*24
2*22*42*6...2*24
...
24*24
三邻接矩形最小1*3长度加3宽度加1
1*31*61*9...1*24
2*32*62*9...2*24
...
24*24
四邻接矩形最小2*2长度加2宽度加2
2*22*42*6...1*24
4*24*44*6...4*24
...
24*24
根据图像卷积一个W*H的图像与m*n的filter卷积得到的图像大小为W-m1*H-n1(默认stride为1)
新图像的每一个像素点的值就是原图一个m*n的local patch 与m*n的filter的乘积和。
新图像有多少个像素点原图就有多少个m*n的矩形。
这么多矩形可以通过编程算出借用未雨绸缪的代码。
这段代码中横竖矩形窗口的数量是一样的代码里只计算一种然后乘以2就行了。
import numpy as npa np.zeros((3, 2), dtypeint)
Count np.zeros(3, dtypeint)
a[0, :] [1, 2]
a[1, :] [1, 3]
a[2, :] [2, 2]
Img_size 24for ii in range(3):rec_h a[ii, 0]rec_w a[ii, 1]for xx in range(rec_h, Img_size1, rec_h):for yy in range(rec_w, Img_size1, rec_w):Count[ii] Count[ii](Img_size-xx1)*(Img_size-yy1)print Count[ii]Total Count[0]*2Count[1]*2Count[2]
print (Total: , Total)
最后可以得到
二邻接矩形43200
三邻接矩形27600
四邻接矩形20736
最终总的矩形特征为43200×227600×220736162336
所以一个24*24的图像最终可以产生162336个矩形特征。
并不是所有特征都是有用的那么如何提取出有用的特征呢
AdaBoost特征分类器具有特征选择的能力。 4 利用AdaBoost算法进行训练
4.1 AdaBoost分类器
AdaBoost 将一系列的弱分类器通过线性组合构成一个强分类器如下所示 是一个强分类器是一个弱分类器其为一个简单的阈值函数 为阈值为系数。
4.2 训练弱分类器
计算所有训练样本的特征值并将其从小到大排序随机选取一个特征值作为阈值
把所有元素分为两部分小于阈值的一部分分类为人脸大于阈值的一部分分类为非人脸。
如下图所示红色表示人脸蓝色表示非人脸。 假如有5个样本前两个为人脸后三个为非人脸用11000表示。
如果阈值在第一个之前通过弱分类器判定为00000有两个误差
如果阈值在第一个和第二个之间通过弱分类器判定为10000有1个误差
如果阈值在第二个和第三个之间通过弱分类器判定为11000有0个误差
依次类推这样共有6个误差然后从中找到一个误差最小的当成阈值
这样就训练好了一个最优的弱分类器。
4.3 训练强分类器
假设有N个训练样本,其中有个正样本个负样本如果是人脸图像
则, 否则
其步骤如下 每一级分类器使用的训练集中的负样本都是上一级被错分的即false positive误检率或假阳性。
这使得下一级分类器更加关注那些更难的容易被错分的样本。 5 级联分类器cascade of classifiers
在正常的图像中人脸区域只是占了很小的一部分如果使用所有的特征进行训练的话运算量非常大。
级为了简化任务把若干个adaboost 分类器级联起来一开始使用少量的特征将大部分的非人脸区域剔除掉后面再利用更复杂的特征将更复杂的非人脸区域剔除掉。 如果级联分类器的识别率(true positive rate)为D误识率false positive rate为F,
第 层的分类器的识别率为, 误识率为,
则 其中 K 为分类器的个数
假如每一级的分类器都具有非常高的检测率99.9%
同时误检率也保持相当高50%。
那么如果级联20个这样的小adaboost分类器
人脸的识别率有 但是误检率有 5.1 级联分类器的训练
论文中给出了一种很有效的方法
设定每一层最大的可接受误检率 f, 和每一层最小的检测率 d.设定级联分类器的总体误检率初始化总体误检率为识别率循环计数器 i0循环如果当前 F 大于 时继续增加一层adaboost分类器在训练每一层分类器时如果目前该层的特征没有达到该层的 标准继续添加新的特征。添加新特征时持续降低该特征的阈值(一般而言高阈值的分类器的检测率和误检率都会比较低)直到该层分类器的检测率,然后更新
在论文中VJ分类器一共有38层含有6060个特征前7层的特征数为2-10-25-25-50-50-50 6 非极大值抑制NMS
在人脸识别中一张脸会出现非常多的窗口如下图所示 假设有N个窗口根据分类器的分类概率从小到大排序概率最大的框记为Z
非极大值抑制的工作步骤如下
从最大概率矩形框Z开始分别判断其它框与X框的重叠度是否大于设定的阈值假设其中的BC框超过了阈值就扔掉BC并保留Z框从剩下的矩形框中选择概率最大的假设为Y然后判断其它框与X框的重叠度是否大于设定的阈值大于扔掉并保留框Y一直重复这个过程直到最后一个框
论文中有些地方不够详细可能比较符合微软研究院的风格吧。
相关链接
论文传送门Viola-Jones人脸检测
AdaBoost算法集成算法-AdaBoost 本文参考了论文原文和网上的资料是笔者自己对Viola-Jones算法的理解可能会有些偏差请读者指正。