opencv人脸检测总结

    主要参考了很多大神的总结,做了自己的整理,还没有完成,,后续不断完善补充

opencv人脸检测总结

一.人脸检测介绍

1. 人脸检测分类

 

基于知识方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。

基于统计的方法则将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。在这两种框架之下,发展了许多方法。

目前随着各种方法的不断提出和应用条件的变化,将知识模型与统计模型相结合。

在实际工程应用中,用得广泛的人脸检测算法还是基于Adaboost的这些算法,主要是其计算量小,特别适合在嵌入式端实现,或者是基于浅层的神经网络检测算法。随着芯片技术的发展,带有深度学习网络的芯片将会越来越普遍,这样基于深度学习的人脸检测算法将会成为主流。

2. 人脸检测原理

人脸检测属于目标检测(object detection) 的一部分,主要涉及两个方面。

1.先对要检测的目标对象进行概率统计,从而知道待检测对象的一些特征,建立起目标检测模型。

2.用得到的模型来匹配输入的图像,如果有匹配则输出匹配的区域,否则什么也不做。

 主要介绍一个opencv人脸检测。Opencv人脸检测主要用的是Adaboost算法。

 

二.Opencv人脸检测

 

在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征,下面详细介绍一下Haar特征。

 

OpenCV在人脸检测上使用的是haar特征的级联表,这个级联表中包含的是boost的分类器。

.人脸的Haar特征分类器是什么?

 

人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值。当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的。

首先,采用样本的haar特征进行分类器的训练,从而得到一个级联的boost分类器。训练的方式包含两方面:

 

1. 正例样本,即待检测目标样本

2. 反例样本,其他任意的图片

 

首先将这些图片统一成相同的尺寸,这个过程被称为归一化,然后进行统计。一旦分类器建立完成,就可以用来检测输入图片中的感兴趣区域的检测了,一般来说,输入的图片会大于样本,那样,需要移动搜索窗口,为了检索出不同大小的目标,分类器可以按比例的改变自己的尺寸,这样可能要对输入图片进行多次的扫描。

 

什么是级联的分类器呢?级联分类器是由若干个简单分类器级联成的一个大的分类器,被检测的窗口依次通过每一个分类器,可以通过所有分类器的窗口即可判定为目标区域。

 

Haar特征

 

 

 边界特征,包含四种

 线性特征,包含8种

 中心围绕特征,包含两种

 

在扫描待检测图片的时候,以边界特征中的(a)为例,正如前面提到的那样,计算机中的图片是一个数字组成的矩阵,程序先计算整个窗口中的灰度值x,然后计算矩形框中的黑色灰度值y,然后计算(x-2y)的值,得到的数值与x做比较,如果这个比值在某一个范围内,则表示待检测图片的当前扫描区域符合边界特征(a),然后继续扫描。

 

三.Opencv 人脸检测步骤

  1. 读入图片
  2. 彩色图片转化为灰度图片,因为harr特征从灰度图中提取。
  3. 进行灰度图直方图均衡化操作
  4. 检测人脸

Opencv人脸检测弱点:

Viola and Jones提出了开创性算法,他们通过Haar-Like特征和AdaBoost去训练级联分类器获得实时效果很好的人脸检测器,然而研究指出当人脸在非约束环境下,该算法检测效果极差。这里说的非约束环境是对比于约束情况下人脸数单一、背景简单、直立正脸等相对理想的条件而言的,随着人脸识别、人脸跟踪等的大规模应用,人脸检测面临的要求越来越高(如上图):人脸尺度多变、数量冗大、姿势多样包括俯拍人脸、戴帽子口罩等的遮挡、表情夸张、化妆伪装、光照条件恶劣、分辨率低甚至连肉眼都较难区分等。

  • 人脸检测难点

人脸检测是个复杂的极具挑战性的模式识别问题,主要难点如下:

1)姿态。人脸与摄像机镜头的相对位置决定了人脸姿态的多样性,上下俯仰角、左右偏角、竖直面旋转角都不一样。

2)遮挡。人脸在图像里可能会被其它人脸遮挡或者被背景等遮挡,这样只漏出局部的人脸。另外,人脸附属物也会导致遮挡,如眼镜、口罩、长发、胡须等。

3)光照。不同光谱、光源位置、光照强度等都会对人脸外观产生影响,如背光环境下,人脸一般偏暗甚至细节都看不清;而在单一强光源下,人脸则会呈现出“阴阳脸”。

五.小知识补充

 

BP是一种按照误差逆向传播算法训练的多层前馈神经网络。

神经网络包括了多层神经网络(可以当做普通的神经网络)和卷积神经网络等,而卷积神经网络又属于深度学习中最为重要的算法。我们这所谓的层指的神经网络的层数,但是也并不是层数多了就是深度学习,深度学习一定是层数多最起码3层以上吧!

1.“深度学习”和“多层神经网络”的区别?

关于“深度学习”和“多层神经网络”的区别? 借用知乎上比较理性和感性的认识 分析一下从广义上说深度学习的网络结构也是多层神经网络的一种。

 

传统意义上的多层神经网络是只有输入层、隐藏层、输出层。其中隐藏层的层数根据需要而定,没有明确的理论推导来说明到底多少层合适。

而深度学习中最著名的卷积神经网络CNN,在原来多层神经网络的基础上,加入了特征学习部分,这部分是模仿人脑对信号处理上的分级的。具体操作就是在原来的全连接的层前面加入了部分连接的卷积层与降维层,而且加入的是一个层级。 输入层 - 卷积层 -降维层 -卷积层 - 降维层 – …. – 隐藏层 -输出层。

 

简单来说,多层神经网络做的步骤是:特征映射到值,特征是人工挑选。

深度学习步骤是: 信号->特征->值,特征是由网络自己选择。

两种网络被设计出来,所要解决的问题和目的不同。

作者:杨延生  来源:知乎链接:https://www.zhihu.com/question/26017374/answer/31868340

作者:Bipolar Bear来源:知乎链接:https://www.zhihu.com/question/26017374/answer/127924427

2. 多层神经网络

多层神经网络与universal approximation theorem [1] (泛逼近性原理,不知这样翻译可对?)相伴而生。

    该理论指出,单隐藏层(hidden layer)非线性前馈神经网络,可以在实数空间近似任何连续函数。上世纪80 90年代,Backpropagation 刚刚开始大行其道,利用这一算法,只需知道输入和输出便可训练网络参数,从而得到一个神经网络“黑箱”。之所以称为黑箱,是因为无需知道y=f(x) 中f的表达式是什么,也能轻易做函数计算,因为f(objective function)就是网络本身。多层神经网络的座右铭是:“函数是什么我不管,反正我能算!“。

当然多层神经网络并非天下无敌,它有三个主要限制:

  1. 在面对大数据时,需要人为提取原始数据的特征作为输入。必须忽略不相关的变量,同时保留有用的信息。这个尺度很难掌握,多层神经网络会把蹲在屋顶的Kitty和骑在猫奴头上的Kitty识别为不同的猫咪,又会把二哈和狼归类为同一种动物。前者是对不相关变量过于敏感,后者则因无法提取有实际意义的特征。
  2. 想要更精确的近似复杂的函数,必须增加隐藏层的层数,这就产生了梯度扩散问题@青青子衿。所谓“强弩之末势不能穿鲁缟“。
  3. 无法处理时间序列数据(比如音频),因为多层神经网络不含时间参数。随着人工智能需求的提升,我们想要做复杂的图像识别,做自然语言处理,做语义分析翻译,等等。多层神经网络显然力不从心。

3.深度学习

那么深度模型是如何解决以上三个问题的?

 

  • 深度学习自动选择原始数据的特征。举一个图像的例子,将像素值矩阵输入深度网络(这里指常用于图像识别的卷积神经网络CNN),网络第一层表征物体的位置、边缘、亮度等初级视觉信息。第二层将边缘整合表征物体的轮廓……之后的层会表征更加抽象的信息,如猫或狗这样的抽象概念。所有特征完全在网络中自动呈现,并非出自人工设计。更重要的一点是这种随着层的深入,从具象到抽象的层级式表征跟大脑的工作原理吻合,视网膜接收图像从LGN到视皮层、颞叶皮层再到海马走的是同样的路数[2]!
  • 深度网络的学习算法。一种方法是改变网络的组织结构,比如用卷积神经网络代替全连接(full connectivity)网络,训练算法仍依据Backpropagating gradients的基本原理。另一种则是彻底改变训练算法,我尝试过的算法有Hessian-free optimization[3],recursive least-squares(RLS) 等。
  • 使用带反馈和时间参数的Recurrent neural network 处理时间序列数据。从某种意义上讲,Recurrent neural network可以在时间维度上展开成深度网络,可以有效处理音频信息(语音识别和自然语言处理等),或者用来模拟动力系统。

 

 

猜你喜欢

转载自blog.csdn.net/Alisa_xf/article/details/81627496
今日推荐