实时人脸检测 (Real-Time Face Detection)

 
最近需要用到人脸检测,于是找了篇引用广泛的论文实现了一下:Robust Real-TimeFace Detection。实现的过程主要有三个步骤:人脸数据准备,算法实现,算法调试。
    人脸数据集的准备:网上有很多免费的和付费的。比如这里有个 网页介绍了一些常用的人脸数据库。我这里只是人脸检测(不是人脸识别),只要有人脸就可以了,所以我下载了几个数据集,然后把它们混在一起用(后面也因此产生了一些问题)。
    算法大意很简单:可以把它看作是一个二分类的问题。给定一张图片后,程序会用一个矩形框扫描整张图片,然后每次判断当前矩形框是不是人脸。
    方法的核心在于扫描框的分类。这里采用了AdaBoost的学习方法。AdaBoost的思想是,把一些简单的弱分类器组合起来得到一个强大的分类器。学习过程中,每个弱分类器会根据数据学到一个权重,一般由它的分类误差来确定,误差越小,权重越大。数据也有权重,根据每次弱分类器的分类结果来定,比如当前分错的数据权重需要增加。
    因为AdaBoost由很多弱分类器构成,理论上弱分类器越多,分类能力越强,但是计算量也更大。由于实时性的要求,这里采用了分层的思想:训练出多层的AdaBoost分类器,层次靠前的分类器包含的弱分类器数量少一些。这是一个树结构。每层的AdaBoost分类器会过滤掉非人脸数据,只有完全通过的数据才会判定为人脸。
    大致步骤理解起来很容易,实现过程中也会遇到很多参数需要调节,下面就我遇到的一些问题做一些讨论:
  • 首先是数据集的准备。人脸数据好说,非人脸数据怎么准备呢?可以找一些有人脸的图片作为训练集,目的是使得分类器在这些训练集中的误判率(falsepositiverate)最小。穷举出所有的扫描框会扫到的子图片不太现实,因为这样数据量实在是太大了。我这里先随机采样一些图片,然后用这些图片作为非人脸数据,学习出一个分类器,然后再用这个分类器去测试训练集,把误判的数据收集起来,和前面的非人脸数据混合起来,再训练。训练过程中我发现,第一次随机采样的数据很好分类,很快就能训练出一个分类器,越到后面,数据越不好分,训练的时间也越久。原文说他们第一次的分类器采用了两个弱分类器就能过滤掉50%的非人脸数据,其实这句话是没有意义的,并不能说明它的分类器好,只能说明它的数据集比较弱。
  • 数据噪音问题:在训练的过程中,数据刚开始还比较容易分类,前面几层AdaBoost能过滤掉大半部分的非人脸数据,但是到了后面,每层AdaBoost能过滤掉的非人脸数据就很少了(因为每层AdaBoost分类器要保证人脸分对的几率在99.9%以上)。后来我查看了数据,发现人脸数据集中有一些非人脸数据,并且非人脸数据集中有一些人脸。这就是数据噪音。可以考虑先过滤掉噪音再进行训练。其实在多层次的AdaBoost训练过程中,每层过滤出来的人脸数据差不多就是质量不好的,里面也会包含噪音。训练到最后很难过滤掉的非人脸数据,也往往包含了大量的噪音数据。可以通过多次的快速训练(调节参数使其训练速度加快),来过滤掉这些噪音数据。
  • 每一层AdaBoost的弱分类器数量:理论上弱分类器的数量可以根据检测率和误判率来确定,但是这样确定出来的数量往往偏小。虽然这样分类速度会很快,由于这里每一个弱分类器就代表了一个HaarFeature,Feature过少的话,即使训练集上误差很小,测试的时候,分类能力也很弱。这里可以人为的制定一些策略,比如某层的弱分类器数量有个下限之类的,来权衡速度与分类能力。
  • 理想的情况下,一个人脸只响应一个扫描框。但是实际情况是,人脸附近可能会响应几个扫描框。这就需要合并这些扫描框。合并的策略也是很多的,简单的可以通过重叠率来合并,也可以通过聚类方法合并。但是要考虑到速度问题,我采用了重叠率的计算来合并,简单快速。
  • 训练过程中,最好能可视化一些中间结果。一来可以检测代码实现是否有Bug,二来也可以通过这些中间结果,来帮助自己更好的理解这个算法的过程。比如每层过滤掉的人脸和非人脸数据,每层AdaBoost选择了哪些Feature,每层AdaBoost的误判率是多少等等。其中特别是Feature的选择,不同的训练集,选择出来的Feature是不一样的。如果训练集里的人脸对齐的比较好,那么HaarFeature的矩形块会比较大,如果人脸对齐不好或者颜色差异大,那么HaarFeature的矩形框会比较的窄小。仔细想想,好像确实是这样。
  • HaarFeature的选择:穷举出所有可能的Feature,计算量和存储量会比较大,可以考虑均匀采样出可接受的数量的Feature。采样也可以加入一些随机性。采样也会影响弱分类器数量的选择,因为采样的缘故,可能某些好的Feature没有采样到,那么在增加弱分类器数量之前可以考虑尝试多次采样不同的Feature来训练。训练过程中我发现,多次尝试不同的采样结果确实是有帮助的。另外HaarFeature的矩形框不能太小,不然在计算多分辨率的时候,Feature值误差会比较大。
    训练过程中,我觉得数据和Feature的选择是很重要的。这里用的HaarFeature,很简单,同样分类能力也是受限的,比如人脸的姿态,光照影响。要提升分类能力,一方面可以在数据上做文章,可以建立更多类型的数据集,比如正面人脸集,侧面人脸集,各种不同光照下的数据集。这么做局限性很大。另一方面可以设计出更好的Feature,或者是学习出更好的Feature(FeatureLearning)。最后,这个算法实现的源代码在https://github.com/liguocn/MagicLib里的RealTimeFaceDetection.h/.cpp里面。 
下面贴上一个结果:
实时人脸检测 <wbr>(Real-Time <wbr>Face <wbr>Detection)

人脸检测做好后,可以利用这个检测器,生成更多的人脸数据。我在网上下载了很多图片,特别是一些集体照,然后把这些人脸检测出来,再均匀缩放到128*128大小。这样就可以得到了一些人脸数据,下面是一个文件小截图:
实时人脸检测 <wbr>(Real-Time <wbr>Face <wbr>Detection)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
人脸检测是计算机视觉领域中的一项重要技术,主要用于识别图像或视频中的人脸。它是人脸识别、人脸跟踪以及人机交互等许多应用的基础。 人脸检测的目标是在一幅图像或视频中准确地定位人脸的位置和大小。一般来说,人脸检测主要包含以下几个步骤: 首先,图像预处理。对于输入的图像,需要进行预处理来提高人脸检测的准确性和效率。常见的预处理操作包括灰度化、直方图均衡化、图像滤波等。 其次,特征提取。通过使用一系列的特征提取算法,可以从图像中提取出与人脸相关的信息。常见的特征提取方法包括Haar特征、LBP特征和HoG特征等。 然后,采用分类器进行人脸与非人脸的区分。在这一步中,常用的分类器有支持向量机(SVM)、AdaBoost和深度学习中的卷积神经网络(CNN)等。这些分类器可以通过训练一组带有已知标签的图像样本来得到,从而实现人脸与非人脸的区分。 最后,采用人脸定位算法确定人脸在图像中的精确位置和大小。人脸定位算法可以使用传统的模板匹配方法,也可以基于深度学习的方法,如YOLO和SSD等。 总之,人脸检测是一项基础且十分重要的计算机视觉技术。它的应用广泛,包括人脸识别、人脸跟踪、表情分析、年龄性别识别等。随着深度学习技术的发展,人脸检测的准确性和性能将得到进一步的提高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值