通过引入积分图的概念大大加速人脸特征值的计算。
通过Adaboost算法训练生成强分类器的过程。强分类器的生成需要进行T轮迭代。
1. 给定的训练样本集为S,总计N个样本,X和Y分别对应的是正样本(人脸样本)和负样本(非人脸样本);T为进行训练的循环次数。
2. 初始化样本额权重为1/N,即为训练样本的初始概率分布;
3. 第一次迭代训练N个样本,得到第一个最优弱分类器
4. 提高上一轮中被误判的样本权重,得到一个新的样本(权重不一样)
5. 将新的样本进行新一轮的训练。
6. 循环执行4—5步骤,T轮后得到T个最优弱分类器。
7. 组合T个最优弱分类器得到最终的强分类器。
(
作者此处没有标记到底底数是什么。。。。)
每一次进行迭代都会使本轮的分类器更加关注于上轮被分错的样本,从而降低了系统总的错误率,Adaboost算法核心是:让若有弱分类器进行投票,在把投票后的结果按弱分类器的错误率进行加权求和,并与平均投票结果进行比较得出最终的结果,可见,β越大,错误率越高,可见错误率越高,可见错误率越高的弱分类器在最后的权重也就越低。
Opencv中有关正脸的分类器有4种。
第一步,基于帧间差分法耳朵运动物体检测:帧间查分原理是对当前一帧的图像与上一帧的图像做差值,得到的图像称为差值图像,相对静止的图像在差值图像中无明显变化,而运动变化的物体差异很大,选定相应的阀值,对这个差值图像做二值化处理。对于阀值的选择可以通过实验而定。阀值太大只能捕捉到运动很快的目标,而阀值太小,环境的细微变化就会对其造成影响。
作者通过实验讲阀值设置成5,既能很好捕捉眨眼变化,又能滤过不少环境噪声。
第二步,二值图像预处理,提取连通域,并对提取到的连通域进行计算,对这个二值图像进行开操作即腐蚀膨胀处理,目的是为了进一步降低噪声和背景等细微变化对其的影响,并使眼部区域形成连通域。提取所有得到的连通域(有可能会因为背景运动变化,头部晃动等因素可能产生多处的连通域),根据人眼的特征来过滤掉不符合的连通域,只保留人眼的连通域。这里我们用的人眼特征有以下几点:1.人眼连通域必然是成对出现的
2.连通域的宽度和高度与人眼的匹配
3.两个连通域之间的水平和垂直距离
第三步,在第二步的基础上定位到人眼区域并生成人眼模版。人眼模版图像应该是一个张开的清晰的人眼。然后对人眼进行实时的跟踪,并同时计算人眼的实时匹配归一化相关系数。
f(x,y)为当前图像在(x,y) 为当前图像的平均灰度值,t(x,y)为在人眼模版的在(x,y)处的灰度值, 是人眼模版的平均灰度值。R为实时匹配的归一化相关系数,取值范围为(0,1),取值越接近1代表此时的人眼图像越接近人眼模版的图像。
(相关系数:
在样本容量n较小时,我们仅凭相关系数较大就判定变量x与y之间有密切的线性关系是不妥当的。)
第四步:眨眼检测。进行眨眼检测就是根据第三步实时的计算人眼的R值,当这个R值为0.85到1时,证明此时人眼正在正常的睁开状态,当人眼闭合的瞬间,这个R值马上就会降到0.5到0.55,当眼睛再次睁开R值又再次回到0.85到1,根据这个变化规律就可以捕捉到人眨眼的过程。
作者的实验结果表明:这种检测方法对环境和人脸变化要求不大,准确率在90%以上,错误的情况均为漏检,基本不会出现误报。可以杜绝照片入侵的可能性。
同时,也存在缺点,效率不高,依赖于使用者的眨眼频率,如果使用者长期不眨眼,系统在定位人眼和提取模版的时间大概用时要超过10s,而真正进行眨眼检测的时间却不足1s。针对上述不足,opencv中已经有训练好的haar级联强分离器,并使用离线人眼模版。
作者还介绍了 基于canny算子的边缘检测(市一中最优的边缘检测算法)结合hough变换(对圆形物体进行检测)的虹膜定位 。